diff --git a/.env b/.env index 4a927090..eea2869d 100644 --- a/.env +++ b/.env @@ -1,19 +1,17 @@ DB_HOST=localhost DB_LOGGING=1 +DB_NAME="json-api-db" DB_USERNAME="postgres" DB_PASSWORD="postgres" -#DB_NAME="json-api-db" -DB_NAME="postgres" DB_PORT=5432 DB_TYPE=postgres #DB_USERNAME="root" -#DB_PASSWORD="password" -#DB_NAME="example_new" +#DB_PASSWORD="mysql" #DB_PORT=3306 #DB_TYPE=mysql -ORM_TYPE=microorm -#ORM_TYPE=typeorm +#ORM_TYPE=microorm +ORM_TYPE=typeorm diff --git a/.eslintrc.json b/.eslintrc.json index 22c9556b..3e21525e 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -19,6 +19,12 @@ ] } }, + { + "files": ["*.test-d.ts"], + "rules": { + "@typescript-eslint/ban-ts-comment": "off" + } + }, { "files": ["*.ts", "*.tsx"], "rules": {} diff --git a/.github/actions/action.yml b/.github/actions/action.yml index 71b6c894..f28a1067 100644 --- a/.github/actions/action.yml +++ b/.github/actions/action.yml @@ -1,34 +1,36 @@ -name: 'My composite action' -description: 'Checks out the repository and install' +name: Main action for Node.js +description: Setup Node.js + +inputs: + node-version: + description: Node.js version + required: false + default: 20.x + runs: - using: 'composite' + using: composite steps: - - name: Setup Node.js - uses: actions/setup-node@v4 + - name: Use Node.js ${{ inputs.node-version }} + uses: actions/setup-node@v3 with: - node-version: 20 + node-version: ${{ inputs.node-version }} registry-url: 'https://registry.npmjs.org' - - name: Restore cached npm dependencies - id: cache-dependencies-restore - uses: actions/cache/restore@v4 + cache: npm + + - name: Get npm cache directory + id: npm-cache-dir + shell: pwsh + run: echo "dir=$(npm config get cache)" >> ${env:GITHUB_OUTPUT} + + - name: Cache NPM dependencies + uses: actions/cache@v4 + id: npm-cache # use this to check for `cache-hit` ==> if: steps.npm-cache.outputs.cache-hit != 'true' with: - path: | - node_modules - ~/.cache/Cypress # needed for the Cypress binary - key: ${{ runner.os }}-npm-dependencies-${{ hashFiles('package-lock.json') }} - - name: Npm install - if: steps.cache-dependencies-restore.outputs.cache-hit != 'true' - run: npm ci + path: ${{ steps.npm-cache-dir.outputs.dir }} + key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-node- + + - name: Install Dependencies shell: bash - - name: Cache npm dependencies - id: cache-dependencies-save - uses: actions/cache/save@v4 - with: - path: | - node_modules - ~/.cache/Cypress # needed for the Cypress binary - key: ${{ steps.cache-dependencies-restore.outputs.cache-primary-key }} - - name: Derive appropriate SHAs for base and head for `nx affected` commands - uses: nrwl/nx-set-shas@v4 - with: - main-branch-name: "master" + run: npm ci diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..536591be --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,52 @@ +name: ⚙️ Build + +on: + workflow_call: + inputs: + mainBranch: + description: Type for main nx affect + required: false + default: "master" + type: string + secrets: + NX_CLOUD_ACCESS_TOKEN: + required: true +env: + NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Derive appropriate SHAs for base and head for `nx affected` commands + uses: nrwl/nx-set-shas@v4 + with: + main-branch-name: "master" + + - name: Setup Node.js + uses: ./.github/actions + + - name: Determine base for NX affected (if not master) + if: ${{ inputs.mainBranch != 'master' }} + shell: bash + run: | + LAST_TAG=$(git describe --tags --abbrev=0) + LAST_TAG_HASH=$(git rev-parse "$LAST_TAG") + CURRENT_COMMIT=$(git rev-parse HEAD) + echo "Using last tag hash as NX_BASE: $LAST_TAG_HASH" + echo "Using current commit as NX_HEAD: $CURRENT_COMMIT" + echo "NX_BASE=$LAST_TAG_HASH" >> $GITHUB_ENV + echo "NX_HEAD=$CURRENT_COMMIT" >> $GITHUB_ENV + + - name: Determine base for NX affected (if master) + if: ${{ inputs.mainBranch == 'master' }} + uses: nrwl/nx-set-shas@v4 + with: + main-branch-name: ${{ inputs.mainBranch }} + + - name: Build Libraries + run: npx nx affected --target=build --parallel=3 --exclude='*,!tag:type:publish' diff --git a/.github/workflows/ci.yml b/.github/workflows/bump-version-save.yml similarity index 52% rename from .github/workflows/ci.yml rename to .github/workflows/bump-version-save.yml index 0820cc30..25f4eb35 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/bump-version-save.yml @@ -1,32 +1,49 @@ -name: CI +name: Create Releases on: - pull_request: - branches: - - master - types: - - opened - - synchronize + workflow_dispatch: + inputs: + projects: + description: 'Package Bump' + required: true + default: 'json-api-nestjs,json-api-nestjs-sdk,nestjs-json-rpc,nestjs-json-rpc-sdk' + first-release: + description: 'Is first release?' + required: false + type: boolean + default: false + dry-run: + description: 'Is dry run?' + required: false + type: boolean + default: false jobs: - run-test: - name: Try build and run unit test + build-and-test: + name: "Build and test" runs-on: ubuntu-latest + permissions: + contents: "read" + actions: "read" steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Npm install uses: ./.github/actions - - name: Get branch names. - id: branch-names - uses: tj-actions/branch-names@v8 + - name: Get git hash + run: | + COMMIT=$(git show-ref --tags --hash | tail -n 1) + echo "NX_BASE=$(echo ${COMMIT})" >> $GITHUB_ENV + - name: Set GIST_SECRET to env + run: | + echo "GIST_SECRET=${{ secrets.GIST_SECRET }}" >> $GITHUB_ENV + echo "GIST_ID=${{ secrets.GIST_ID }}" >> $GITHUB_ENV - name: Restore cached .nx id: cache-nx-restore uses: actions/cache/restore@v4 with: path: | .nx - key: ${{ runner.os }}-nx-${{ steps.branch-names.outputs.current_branch }} - - run: git branch --track main origin/master + key: ${{ runner.os }}-nx-master - name: Test env: NX_REJECT_UNKNOWN_LOCAL_CACHE: 0 @@ -35,6 +52,8 @@ jobs: env: NX_REJECT_UNKNOWN_LOCAL_CACHE: 0 run: npx nx affected -t build --exclude='json-api-front,json-api-server,json-api-server-e2e,json-shared-type,microorm-database,typeorm-database,@nestjs-json-api/source,type-for-rpc' + - name: Upload test coverage badge + run: npx nx affected -t upload-badge --exclude='json-api-front,json-api-server,shared-utils,json-api-server-e2e,json-shared-type,microorm-database,typeorm-database,@nestjs-json-api/source,type-for-rpc' - name: Save cached .nx id: cache-dependencies-save uses: actions/cache/save@v4 @@ -46,7 +65,7 @@ jobs: runs-on: ubuntu-latest name: Try run e2e test needs: - - run-test + - build-and-test services: # Label used to access the service container postgres: @@ -71,21 +90,17 @@ jobs: fetch-depth: 0 - name: Npm install uses: ./.github/actions - - name: Get branch names. - id: branch-names - uses: tj-actions/branch-names@v8 - name: Restore cached .nx id: cache-nx-restore uses: actions/cache/restore@v4 with: path: | .nx - key: ${{ runner.os }}-nx-${{ steps.branch-names.outputs.current_branch }} + key: ${{ runner.os }}-nx-master - run: git branch --track main origin/master - run: npm run typeorm migration:run - run: npm run seed:run - run: npx nx affected -t e2e --parallel=1 - - run: npx nx affected -t e2e-micro --parallel=1 - name: Save cached .nx id: cache-dependencies-save uses: actions/cache/save@v4 @@ -93,3 +108,31 @@ jobs: path: | .nx key: ${{ steps.cache-nx-restore.outputs.cache-primary-key }} + bump-version: + name: "Bump version" + needs: + - run-e2e-test + runs-on: ubuntu-latest + permissions: + contents: "write" + actions: "read" + id-token: "write" + timeout-minutes: 10 + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + token: ${{ secrets.PAT }} + - name: Npm install + uses: ./.github/actions + - name: Bump version + run: | + git config --global user.email "actions@github.com" + git config --global user.name "GitHub Actions" + npx nx release --skip-publish --first-release=${{ github.event.inputs.first-release }} --projects=${{ github.event.inputs.projects }} --dry-run=${{ github.event.inputs.dry-run }} + shell: bash + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_ACCESS_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_CONFIG_PROVENANCE: true diff --git a/.github/workflows/bump-version.yml b/.github/workflows/bump-version.yml index 25f4eb35..ddf27740 100644 --- a/.github/workflows/bump-version.yml +++ b/.github/workflows/bump-version.yml @@ -1,13 +1,14 @@ -name: Create Releases +name: ⚙️ Bump version + on: - workflow_dispatch: + workflow_call: inputs: projects: - description: 'Package Bump' + description: "Project list" required: true - default: 'json-api-nestjs,json-api-nestjs-sdk,nestjs-json-rpc,nestjs-json-rpc-sdk' - first-release: - description: 'Is first release?' + type: string + beta-release: + description: 'Is beta release?' required: false type: boolean default: false @@ -16,108 +17,22 @@ on: required: false type: boolean default: false + secrets: + NODE_AUTH_TOKEN: + required: true + GITHUB_TOKEN_SECRET: + required: true + PAT: + required: true + +env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_ACCESS_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN_SECRET }} + NPM_CONFIG_PROVENANCE: true + jobs: - build-and-test: - name: "Build and test" - runs-on: ubuntu-latest - permissions: - contents: "read" - actions: "read" - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: Npm install - uses: ./.github/actions - - name: Get git hash - run: | - COMMIT=$(git show-ref --tags --hash | tail -n 1) - echo "NX_BASE=$(echo ${COMMIT})" >> $GITHUB_ENV - - name: Set GIST_SECRET to env - run: | - echo "GIST_SECRET=${{ secrets.GIST_SECRET }}" >> $GITHUB_ENV - echo "GIST_ID=${{ secrets.GIST_ID }}" >> $GITHUB_ENV - - name: Restore cached .nx - id: cache-nx-restore - uses: actions/cache/restore@v4 - with: - path: | - .nx - key: ${{ runner.os }}-nx-master - - name: Test - env: - NX_REJECT_UNKNOWN_LOCAL_CACHE: 0 - run: npx nx affected -t test --parallel=3 --exclude='json-api-front,json-api-server,json-api-server-e2e,json-shared-type,microorm-database,typeorm-database,@nestjs-json-api/source,type-for-rpc' - - name: Build - env: - NX_REJECT_UNKNOWN_LOCAL_CACHE: 0 - run: npx nx affected -t build --exclude='json-api-front,json-api-server,json-api-server-e2e,json-shared-type,microorm-database,typeorm-database,@nestjs-json-api/source,type-for-rpc' - - name: Upload test coverage badge - run: npx nx affected -t upload-badge --exclude='json-api-front,json-api-server,shared-utils,json-api-server-e2e,json-shared-type,microorm-database,typeorm-database,@nestjs-json-api/source,type-for-rpc' - - name: Save cached .nx - id: cache-dependencies-save - uses: actions/cache/save@v4 - with: - path: | - .nx - key: ${{ steps.cache-nx-restore.outputs.cache-primary-key }} - run-e2e-test: - runs-on: ubuntu-latest - name: Try run e2e test - needs: - - build-and-test - services: - # Label used to access the service container - postgres: - # Docker Hub image - image: postgres - # Provide the password for postgres - env: - POSTGRES_PASSWORD: postgres - POSTGRES_DB: json-api-db - # Set health checks to wait until postgres has started - options: >- - --health-cmd pg_isready - --health-interval 10s - --health-timeout 5s - --health-retries 5 - ports: - # Maps tcp port 5432 on service container to the host - - 5432:5432 - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: Npm install - uses: ./.github/actions - - name: Restore cached .nx - id: cache-nx-restore - uses: actions/cache/restore@v4 - with: - path: | - .nx - key: ${{ runner.os }}-nx-master - - run: git branch --track main origin/master - - run: npm run typeorm migration:run - - run: npm run seed:run - - run: npx nx affected -t e2e --parallel=1 - - name: Save cached .nx - id: cache-dependencies-save - uses: actions/cache/save@v4 - with: - path: | - .nx - key: ${{ steps.cache-nx-restore.outputs.cache-primary-key }} bump-version: - name: "Bump version" - needs: - - run-e2e-test runs-on: ubuntu-latest - permissions: - contents: "write" - actions: "read" - id-token: "write" - timeout-minutes: 10 steps: - name: Checkout repository uses: actions/checkout@v4 @@ -130,9 +45,5 @@ jobs: run: | git config --global user.email "actions@github.com" git config --global user.name "GitHub Actions" - npx nx release --skip-publish --first-release=${{ github.event.inputs.first-release }} --projects=${{ github.event.inputs.projects }} --dry-run=${{ github.event.inputs.dry-run }} + npx nx release --skip-publish --projects=${{ inputs.projects }} --dry-run=${{ inputs.dry-run }} shell: bash - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_ACCESS_TOKEN }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NPM_CONFIG_PROVENANCE: true diff --git a/.github/workflows/compute-projects.yml b/.github/workflows/compute-projects.yml new file mode 100644 index 00000000..eb740adb --- /dev/null +++ b/.github/workflows/compute-projects.yml @@ -0,0 +1,100 @@ +name: ⚙️ Compute Projects + +on: + workflow_call: + inputs: + tagChoice: + description: "Тег для фильтрации проектов. Если задан, используется вместо чекбоксов." + required: false + default: "" + type: string + project1: + description: "Project 1" + required: false + default: "" + type: string + project2: + description: "Project 2" + required: false + default: "" + type: string + project3: + description: "Project 3" + required: false + default: "" + type: string + project4: + description: "Project 4" + required: false + default: "" + type: string + outputs: + finalProjects: + description: "Result Project" + value: ${{ steps.final.outputs.finalProjects }} + +jobs: + compute: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Node.js + uses: ./.github/actions + + - name: Get projects by tag + id: tag_projects + if: ${{ inputs.tagChoice != '' }} + shell: bash + run: | + echo "Using tag: ${{ inputs.tagChoice }}" + projects=$(npx nx show projects --exclude="*,!${{ inputs.tagChoice }}" --sep=',') + echo "projects=$projects" >> $GITHUB_OUTPUT + echo "Projects by tag: $projects" + + - name: Collect projects from select + id: select_projects + if: ${{ inputs.tagChoice == '' }} + shell: bash + run: | + final="" + for var in "${{ inputs.projectList1 }}" "${{ inputs.projectList2 }}" "${{ inputs.projectList3 }}"; do + if [ ! -z "$var" ]; then + if [ -z "$final" ]; then + final="$var" + else + final="$final,$var" + fi + fi + done + echo "Final projects: $final" + if [ -z "$final" ]; then + echo "ERROR: Не выбрано ни одного проекта." >&2 + exit 1 + fi + echo "selectProjects=$final" >> $GITHUB_OUTPUT + echo "Checkbox-selected projects: $final" + + - name: Determine final projects list + id: final + shell: bash + run: | + if [ -n "${{ inputs.tagChoice }}" ]; then + final="${{ steps.tag_projects.outputs.projects }}" + else + final="${{ steps.select_projects.outputs.selectProjects }}" + fi + final=$(echo "$final" | xargs) + echo "finalProjects=$final" >> $GITHUB_OUTPUT + echo "Final projects: $final" + if [ -z "$final" ]; then + echo "ERROR: No projects selected or found." >&2 + exit 1 + fi + + - name: Output final projects + run: | + echo "Final projects: ${{ steps.final.outputs.finalProjects }}" diff --git a/.github/workflows/create-release.yaml b/.github/workflows/create-release.yaml new file mode 100644 index 00000000..46c2daca --- /dev/null +++ b/.github/workflows/create-release.yaml @@ -0,0 +1,116 @@ +name: 📦 Create Release + +defaults: &project_options + - "" + - json-api-nestjs + - json-api-nestjs-sdk + - nestjs-json-rpc + - nestjs-json-rpc-sdk + - json-api-nestjs-microorm + - json-api-nestjs-shared + - json-api-nestjs-typeorm + +on: + workflow_dispatch: + inputs: + tagChoice: + description: "Select projects by tag" + required: false + default: "" + type: choice + options: + - "" + - tag:type:publish + - tag:lib:json-api-nestjs + - tag:lib:nestjs-json-rpc + project1: + description: "Select project" + required: false + default: "" + type: choice + options: *project_options + project2: + description: "Select project" + required: false + default: "" + type: choice + options: *project_options + project3: + description: "Select project" + required: false + default: "" + type: choice + options: *project_options + project4: + description: "Select project" + required: false + default: "" + type: choice + options: *project_options + beta-release: + description: 'Is beta release?' + required: false + type: boolean + default: false + dry-run: + description: 'Is dry run?' + required: false + type: boolean + default: false + + +jobs: + compute-projects: + uses: ./.github/workflows/compute-projects.yml + with: + tagChoice: ${{ github.event.inputs.tagChoice }} + project1: ${{ github.event.inputs.project1 }} + project2: ${{ github.event.inputs.project2 }} + project3: ${{ github.event.inputs.project3 }} + project4: ${{ github.event.inputs.project4 }} + + test: + need: [compute-projects] + uses: ./.github/workflows/test.yml + with: + mainBranch: "last-tag" + secrets: + NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} + + e2e-test: + needs: [test] + uses: ./.github/workflows/e2e-test.yaml + with: + mainBranch: "last-tag" + secrets: + NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} + + build: + needs: [test, e2e-test] + uses: ./.github/workflows/build.yml + with: + mainBranch: "last-tag" + secrets: + NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} + + upload-badge: + needs: [ test, e2e-test ] + uses: ./.github/workflows/upload-badge.yaml + with: + mainBranch: "last-tag" + secrets: + NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} + GIST_SECRET: ${{ secrets.GIST_SECRET }} + GIST_ID: ${{ secrets.GIST_ID }} + + bump-version: + needs: [build] + uses: ./.github/workflows/bump-version.yml + with: + projects: ${{ needs.compute-projects.outputs.finalProjects }} + beta-release: ${{ github.event.inputs.beta-release }} + dry-run: ${{ github.event.inputs.dry-run }} + secrets: + NPM_ACCESS_TOKEN: ${{ secrets.NPM_ACCESS_TOKEN }} + GITHUB_TOKEN_SECRET: ${{ secrets.GITHUB_TOKEN }} + PAT: ${{secrets.PAT}} diff --git a/.github/workflows/e2e-test.yaml b/.github/workflows/e2e-test.yaml new file mode 100644 index 00000000..eb0eb231 --- /dev/null +++ b/.github/workflows/e2e-test.yaml @@ -0,0 +1,63 @@ +name: ⚙️ E2E Test + + +on: + workflow_call: + inputs: + mainBranch: + description: Type for main nx affect + required: false + default: "master" + type: string + secrets: + NX_CLOUD_ACCESS_TOKEN: + required: true + +env: + NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} + + +jobs: + e2e-test: + runs-on: ubuntu-latest + services: + postgres: + image: postgres + env: + POSTGRES_PASSWORD: postgres + POSTGRES_DB: json-api-db + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + ports: + - 5432:5432 + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup Node.js + uses: ./.github/actions + + - name: Determine base for NX affected (if not master) + if: ${{ inputs.mainBranch != 'master' }} + shell: bash + run: | + LAST_TAG=$(git describe --tags --abbrev=0) + LAST_TAG_HASH=$(git rev-parse "$LAST_TAG") + CURRENT_COMMIT=$(git rev-parse HEAD) + echo "Using last tag hash as NX_BASE: $LAST_TAG_HASH" + echo "Using current commit as NX_HEAD: $CURRENT_COMMIT" + echo "NX_BASE=$LAST_TAG_HASH" >> $GITHUB_ENV + echo "NX_HEAD=$CURRENT_COMMIT" >> $GITHUB_ENV + + - name: Determine base for NX affected (if master) + if: ${{ inputs.mainBranch == 'master' }} + uses: nrwl/nx-set-shas@v4 + with: + main-branch-name: ${{ inputs.mainBranch }} + + - run: npm run typeorm migration:run + - run: npm run seed:run + - run: npx nx run json-api-server-e2e:e2e --parallel=1 + - run: npx nx run json-api-server-e2e:e2e-micro --parallel=1 diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml new file mode 100644 index 00000000..dc23c75c --- /dev/null +++ b/.github/workflows/pr.yml @@ -0,0 +1,22 @@ +name: 📝 PR Checks + +on: + [pull_request] + +jobs: + test: + uses: ./.github/workflows/test.yml + secrets: + NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} + + e2e-test: + needs: [test] + uses: ./.github/workflows/e2e-test.yaml + secrets: + NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} + + build: + needs: [test, e2e-test] + uses: ./.github/workflows/build.yml + secrets: + NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000..0b12ecee --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,51 @@ +name: ⚙️ Test + +on: + workflow_call: + inputs: + mainBranch: + description: Type for main nx affect + required: false + default: "master" + type: string + secrets: + NX_CLOUD_ACCESS_TOKEN: + required: true +env: + NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} + +jobs: + test: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Node.js + uses: ./.github/actions + + - name: Determine base for NX affected (if not master) + if: ${{ inputs.mainBranch != 'master' }} + shell: bash + run: | + LAST_TAG=$(git describe --tags --abbrev=0) + LAST_TAG_HASH=$(git rev-parse "$LAST_TAG") + CURRENT_COMMIT=$(git rev-parse HEAD) + echo "Using last tag hash as NX_BASE: $LAST_TAG_HASH" + echo "Using current commit as NX_HEAD: $CURRENT_COMMIT" + echo "NX_BASE=$LAST_TAG_HASH" >> $GITHUB_ENV + echo "NX_HEAD=$CURRENT_COMMIT" >> $GITHUB_ENV + + - name: Determine base for NX affected (if master) + if: ${{ inputs.mainBranch == 'master' }} + uses: nrwl/nx-set-shas@v4 + with: + main-branch-name: ${{ inputs.mainBranch }} + + - name: Test + run: npx nx affected --target=test --parallel=3 --passWithNoTests --exclude='*,!tag:type:publish' + + - name: TS Test + run: npx nx affected --target=ts-test --parallel=3 --passWithNoTests --exclude='*,!tag:type:publish' diff --git a/.github/workflows/upload-badge.yaml b/.github/workflows/upload-badge.yaml new file mode 100644 index 00000000..7f1d7a83 --- /dev/null +++ b/.github/workflows/upload-badge.yaml @@ -0,0 +1,53 @@ +name: 📈️ Upload Badge + +on: + workflow_call: + inputs: + mainBranch: + description: Type for main nx affect + required: false + default: "master" + secrets: + NX_CLOUD_ACCESS_TOKEN: + required: true + GIST_SECRET: + required: true + GIST_ID: + required: true +env: + NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} + GIST_SECRET: ${{ secrets.GIST_SECRET }} + GIST_ID: ${{ secrets.GIST_ID }} + +jobs: + test: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Node.js + uses: ./.github/actions + + - name: Determine base for NX affected (if not master) + if: ${{ inputs.mainBranch != 'master' }} + shell: bash + run: | + LAST_TAG=$(git describe --tags --abbrev=0) + LAST_TAG_HASH=$(git rev-parse "$LAST_TAG") + CURRENT_COMMIT=$(git rev-parse HEAD) + echo "Using last tag hash as NX_BASE: $LAST_TAG_HASH" + echo "Using current commit as NX_HEAD: $CURRENT_COMMIT" + echo "NX_BASE=$LAST_TAG_HASH" >> $GITHUB_ENV + echo "NX_HEAD=$CURRENT_COMMIT" >> $GITHUB_ENV + + - name: Determine base for NX affected (if master) + if: ${{ inputs.mainBranch == 'master' }} + uses: nrwl/nx-set-shas@v4 + with: + main-branch-name: ${{ inputs.mainBranch }} + + - name: Upload test coverage badge + run: npx nx affected --target=upload-badge --passWithNoTests --exclude='*,!tag:type:publish' diff --git a/.nxignore b/.nxignore new file mode 100644 index 00000000..93b40710 --- /dev/null +++ b/.nxignore @@ -0,0 +1,3 @@ +libs/**/*.test-d.ts +libs/json-api/**/___test___/ + diff --git a/README.md b/README.md index b268dff2..5f58d33f 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,8 @@ - **[JSON:API](https://jsonapi.org/)** – A specification for building RESTful APIs with standardized request and response formats. > **[json-api-nestjs](https://github.com/klerick/nestjs-json-api/tree/master/libs/json-api/json-api-nestjs)** - This package enables you to quickly set up a server API that adheres to the JSON:API specification, handling standard CRUD operations for your resources.
+ > **[json-api-nestjs-microorm](https://github.com/klerick/nestjs-json-api/tree/master/libs/json-api/json-api-nestjs-microorm)** - This package is adapter for MicroOrm.
+ > **[json-api-nestjs-typeorm](https://github.com/klerick/nestjs-json-api/tree/master/libs/json-api/json-api-nestjs-typeorm)** - This package is adapter for TypeOrm.
> **[json-api-nestjs-sdk](https://github.com/klerick/nestjs-json-api/tree/master/libs/json-api/json-api-nestjs-sdk)** - tool for client, call api over *json-api-nestjs* diff --git a/apps/json-api-front/project.json b/apps/json-api-front/project.json index bbd03fae..9f92b9d0 100644 --- a/apps/json-api-front/project.json +++ b/apps/json-api-front/project.json @@ -68,5 +68,6 @@ "buildTarget": "json-api-front:build" } } - } + }, + "implicitDependencies": ["json-api-nestjs-sdk"] } diff --git a/apps/json-api-server-e2e/jest.config.ts b/apps/json-api-server-e2e/jest.config.ts index f9502b7b..5c75a2f7 100644 --- a/apps/json-api-server-e2e/jest.config.ts +++ b/apps/json-api-server-e2e/jest.config.ts @@ -17,4 +17,16 @@ export default { }, moduleFileExtensions: ['ts', 'js', 'html'], coverageDirectory: '../../coverage/json-api-server-e2e', + moduleNameMapper: { + '^@klerick/json-api-nestjs$': + '/../../dist/libs/json-api/json-api-nestjs', + '^@klerick/json-api-nestjs-microorm$': + '/../../dist/libs/json-api/json-api-nestjs-microorm', + '^@klerick/json-api-nestjs-shared$': + '/../../dist/libs/json-api/json-api-nestjs-shared', + '^@klerick/json-api-nestjs-typeorm$': + '/../../dist/libs/json-api/json-api-nestjs-typeorm', + '^@klerick/json-api-nestjs-sdk$': + '/../../dist/libs/json-api/json-api-nestjs-sdk', + }, }; diff --git a/apps/json-api-server-e2e/project.json b/apps/json-api-server-e2e/project.json index 4c159112..c702eb4b 100644 --- a/apps/json-api-server-e2e/project.json +++ b/apps/json-api-server-e2e/project.json @@ -7,6 +7,11 @@ "projectType": "application", "targets": { "e2e": { + "dependsOn":[ { + "dependencies": true, + "target": "build", + "params": "ignore" + }], "executor": "@nx/jest:jest", "outputs": [ "{workspaceRoot}/coverage/{e2eProjectRoot}" @@ -18,6 +23,11 @@ } }, "e2e-micro": { + "dependsOn":[ { + "dependencies": true, + "target": "build", + "params": "ignore" + }], "executor": "@nx/jest:jest", "outputs": [ "{workspaceRoot}/coverage/{e2eProjectRoot}" diff --git a/apps/json-api-server-e2e/src/json-api/json-api-sdk/get-method.spec.ts b/apps/json-api-server-e2e/src/json-api/json-api-sdk/get-method.spec.ts index 50bbd940..34df9ff4 100644 --- a/apps/json-api-server-e2e/src/json-api/json-api-sdk/get-method.spec.ts +++ b/apps/json-api-server-e2e/src/json-api/json-api-sdk/get-method.spec.ts @@ -32,7 +32,7 @@ describe('GET method:', () => { beforeAll(async () => { jsonSdk = creatSdk(); - const addressesPromise = Array.from(new Array(2)).map(() => { + const addressesPromise = Array.from(new Array(5)).map(() => { const address = new Addresses(); address.city = faker.string.alpha(50); address.state = faker.string.alpha(50); @@ -61,7 +61,7 @@ describe('GET method:', () => { const addressIndex = index % 2 === 0 ? 0 : 1; const user = getUser(); user.isActive = !!addressIndex; - user.addresses = addressArray[addressIndex]; + user.addresses = addressArray[index]; return jsonSdk.jonApiSdkService.postOne(user); }); usersArray = await Promise.all(usersPromise); @@ -148,6 +148,16 @@ describe('GET method:', () => { users2.forEach((user) => { expect(user.isActive).toBe(false); }); + + const resultFindLike = await jsonSdk.jonApiSdkService.getAll(Users, { + filter: { + target: { + login: { [FilterOperand.like]: users2.at(0)?.login.slice(5, -5) }, + }, + }, + }); + expect(resultFindLike.length).toBe(1); + expect(resultFindLike.at(0)?.id).toBe(users2.at(0)?.id); }); it('Should be get entities with filter by relation target', async () => { diff --git a/apps/json-api-server-e2e/src/json-api/json-api-sdk/patch-methode.spec.ts b/apps/json-api-server-e2e/src/json-api/json-api-sdk/patch-methode.spec.ts index 09289a0f..5a2d61d6 100644 --- a/apps/json-api-server-e2e/src/json-api/json-api-sdk/patch-methode.spec.ts +++ b/apps/json-api-server-e2e/src/json-api/json-api-sdk/patch-methode.spec.ts @@ -29,7 +29,7 @@ describe('PATCH method:', () => { let comments: Comments; let commentsAfterSave: Comments; - let newCommentsAfterSave: Comments; + let newCommentsAfterSave: Comments | undefined = undefined; beforeEach(async () => { jsonSdk = creatSdk(); @@ -89,9 +89,7 @@ describe('PATCH method:', () => { newAddress ); - const newCommentsAfterSave = await jsonSdk.jonApiSdkService.postOne( - newComments - ); + newCommentsAfterSave = await jsonSdk.jonApiSdkService.postOne(newComments); userAfterSave.addresses = newAddressAfterSave; userAfterSave.comments = [newCommentsAfterSave]; @@ -104,8 +102,6 @@ describe('PATCH method:', () => { expect(userAfterUpdate.addresses).toEqual(newAddressAfterSave); newCommentsAfterSave.updatedAt = userAfterUpdate.comments[0].updatedAt; expect(userAfterUpdate.comments[0]).toEqual(newCommentsAfterSave); - - await jsonSdk.jonApiSdkService.deleteOne(newCommentsAfterSave); }); it('Should be update empty attributes with relations', async () => { diff --git a/apps/json-api-server-e2e/src/json-api/json-api-sdk/post-method.spec.ts b/apps/json-api-server-e2e/src/json-api/json-api-sdk/post-method.spec.ts index 226947cf..78fe67f0 100644 --- a/apps/json-api-server-e2e/src/json-api/json-api-sdk/post-method.spec.ts +++ b/apps/json-api-server-e2e/src/json-api/json-api-sdk/post-method.spec.ts @@ -26,7 +26,6 @@ describe('POST method:', () => { let addressAfterSave: Addresses; let user: Users; let userAfterSave: Users; - let bookListAfterSave: BookList; let comments: Comments; let commentsAfterSave: Comments; @@ -53,8 +52,6 @@ describe('POST method:', () => { if (commentsAfterSave) await jsonSdk.jonApiSdkService.deleteOne(commentsAfterSave); if (userAfterSave) await jsonSdk.jonApiSdkService.deleteOne(userAfterSave); - if (bookListAfterSave) - await jsonSdk.jonApiSdkService.deleteOne(bookListAfterSave); await jsonSdk.jonApiSdkService.deleteOne(addressAfterSave); }); diff --git a/apps/json-api-server-e2e/src/json-api/utils/run-application.ts b/apps/json-api-server-e2e/src/json-api/utils/run-application.ts index 74698971..ecb15d6d 100644 --- a/apps/json-api-server-e2e/src/json-api/utils/run-application.ts +++ b/apps/json-api-server-e2e/src/json-api/utils/run-application.ts @@ -17,6 +17,7 @@ import { AppModule } from '../../../../json-api-server/src/app/app.module'; import { JsonConfig } from '../../../../../libs/json-api/json-api-nestjs-sdk/src/lib/types'; import { WsAdapter } from '@nestjs/platform-ws'; import { Subject } from 'rxjs'; +import { NestExpressApplication } from '@nestjs/platform-express'; export const axiosAdapter = adapterForAxios(axios); let saveApp: INestApplication; @@ -28,7 +29,7 @@ export const run = async () => { const moduleRef = await Test.createTestingModule({ imports: [AppModule], }).compile(); - const app = moduleRef.createNestApplication({ + const app = moduleRef.createNestApplication({ bufferLogs: true, logger: false, }); @@ -36,6 +37,7 @@ export const run = async () => { // const app = await NestFactory.create(AppModule); app.setGlobalPrefix(globalPrefix); app.useWebSocketAdapter(new WsAdapter(app)); + app.set('query parser', 'extended'); await app.init(); await app.listen(port); diff --git a/apps/json-api-server-e2e/tsconfig.spec.json b/apps/json-api-server-e2e/tsconfig.spec.json index 30dc8a48..98c05597 100644 --- a/apps/json-api-server-e2e/tsconfig.spec.json +++ b/apps/json-api-server-e2e/tsconfig.spec.json @@ -10,7 +10,8 @@ "strictNullChecks": true, "noImplicitAny": true, "forceConsistentCasingInFileNames": true, - "noFallthroughCasesInSwitch": true + "noFallthroughCasesInSwitch": true, + "allowJs": true }, "include": [ "jest.config.ts", diff --git a/apps/json-api-server/project.json b/apps/json-api-server/project.json index 475e60ce..d05092b4 100644 --- a/apps/json-api-server/project.json +++ b/apps/json-api-server/project.json @@ -20,5 +20,6 @@ } } }, - "tags": [] + "tags": [], + "implicitDependencies": ["json-api-nestjs-typeorm", "json-api-nestjs-microorm", "json-api-nestjs-sdk"] } diff --git a/apps/json-api-server/src/app/app.module.ts b/apps/json-api-server/src/app/app.module.ts index 28b47579..6d200c5f 100644 --- a/apps/json-api-server/src/app/app.module.ts +++ b/apps/json-api-server/src/app/app.module.ts @@ -6,7 +6,6 @@ import { MicroOrmDatabaseModule } from '@nestjs-json-api/microorm-database'; import { ResourcesTypeModule } from './resources/type-orm/resources-type.module'; import { ResourcesMicroModule } from './resources/micro-orm/resources-micro.module'; import { RpcModule } from './rpc/rpc.module'; -import * as process from 'process'; const ormModule = process.env['ORM_TYPE'] === 'typeorm' diff --git a/apps/json-api-server/src/app/resources/micro-orm/controllers/extend-book-list/extend-book-list.controller.ts b/apps/json-api-server/src/app/resources/micro-orm/controllers/extend-book-list/extend-book-list.controller.ts index ab49a56f..de163385 100644 --- a/apps/json-api-server/src/app/resources/micro-orm/controllers/extend-book-list/extend-book-list.controller.ts +++ b/apps/json-api-server/src/app/resources/micro-orm/controllers/extend-book-list/extend-book-list.controller.ts @@ -1,10 +1,13 @@ import { ParseUUIDPipe } from '@nestjs/common'; import { JsonApi, JsonBaseController } from '@klerick/json-api-nestjs'; - import { BookList } from '@nestjs-json-api/microorm-database'; + @JsonApi(BookList, { pipeForId: ParseUUIDPipe, overrideRoute: 'override-book-list', allowMethod: ['getOne', 'postOne', 'deleteOne'], }) -export class ExtendBookListController extends JsonBaseController {} +export class ExtendBookListController extends JsonBaseController< + BookList, + 'id' +> {} diff --git a/apps/json-api-server/src/app/resources/micro-orm/controllers/extend-user/extend-user.controller.ts b/apps/json-api-server/src/app/resources/micro-orm/controllers/extend-user/extend-user.controller.ts index c2ba33f5..de2bd612 100644 --- a/apps/json-api-server/src/app/resources/micro-orm/controllers/extend-user/extend-user.controller.ts +++ b/apps/json-api-server/src/app/resources/micro-orm/controllers/extend-user/extend-user.controller.ts @@ -15,12 +15,14 @@ import { JsonApiService, Query as QueryType, QueryOne, - ResourceObject, - EntityRelation, PatchRelationshipData, - ResourceObjectRelationships, PostData, } from '@klerick/json-api-nestjs'; +import { + ResourceObjectRelationships, + ResourceObject, + RelationKeys, +} from '@klerick/json-api-nestjs-shared'; import { ExamplePipe } from '../../service/example.pipe'; import { ExampleService } from '../../service/example.service'; import { ControllerInterceptor } from '../../service/controller.interceptor'; @@ -38,28 +40,28 @@ import { AtomicInterceptor } from '../../service/atomic.interceptor'; @UseFilters(new HttpExceptionFilter()) @UseInterceptors(ControllerInterceptor) @JsonApi(Users) -export class ExtendUserController extends JsonBaseController { +export class ExtendUserController extends JsonBaseController { @InjectService() public service: JsonApiService; @Inject(ExampleService) protected exampleService: ExampleService; override getOne( id: string | number, - query: QueryOne + query: QueryOne ): Promise> { const t = query.fields?.target; return super.getOne(id, query); } - patchRelationship>( + patchRelationship>( id: string | number, relName: Rel, input: PatchRelationshipData - ): Promise> { + ): Promise> { return super.patchRelationship(id, relName, input); } // @UseInterceptors(AtomicInterceptor) - postOne(inputData: PostData): Promise> { + postOne(inputData: PostData): Promise> { return super.postOne(inputData); } @@ -67,7 +69,7 @@ export class ExtendUserController extends JsonBaseController { @UseFilters(HttpExceptionMethodFilter) @UseInterceptors(MethodInterceptor) getAll( - @Query(ExamplePipe) query: QueryType + @Query(ExamplePipe) query: QueryType ): Promise> { return super.getAll(query); } diff --git a/apps/json-api-server/src/app/resources/micro-orm/resources-micro.module.ts b/apps/json-api-server/src/app/resources/micro-orm/resources-micro.module.ts index 88248808..10b2c045 100644 --- a/apps/json-api-server/src/app/resources/micro-orm/resources-micro.module.ts +++ b/apps/json-api-server/src/app/resources/micro-orm/resources-micro.module.ts @@ -1,5 +1,6 @@ import { Module } from '@nestjs/common'; -import { JsonApiModule, MicroOrmJsonApiModule } from '@klerick/json-api-nestjs'; +import { JsonApiModule } from '@klerick/json-api-nestjs'; +import { MicroOrmJsonApiModule } from '@klerick/json-api-nestjs-microorm'; import { Users, Addresses, diff --git a/apps/json-api-server/src/app/resources/micro-orm/service/example.pipe.ts b/apps/json-api-server/src/app/resources/micro-orm/service/example.pipe.ts index a7b49347..ca0b2aac 100644 --- a/apps/json-api-server/src/app/resources/micro-orm/service/example.pipe.ts +++ b/apps/json-api-server/src/app/resources/micro-orm/service/example.pipe.ts @@ -7,8 +7,13 @@ import { import { Query } from '@klerick/json-api-nestjs'; import { Users } from '@nestjs-json-api/microorm-database'; -export class ExamplePipe implements PipeTransform, Query> { - transform(value: Query, metadata: ArgumentMetadata): Query { +export class ExamplePipe + implements PipeTransform, Query> +{ + transform( + value: Query, + metadata: ArgumentMetadata + ): Query { if (value.filter.target?.firstName?.eq === 'testCustomPipe') { const error = { code: 'invalid_arguments', diff --git a/apps/json-api-server/src/app/resources/type-orm/controllers/extend-book-list/extend-book-list.controller.ts b/apps/json-api-server/src/app/resources/type-orm/controllers/extend-book-list/extend-book-list.controller.ts index 170dab5b..8870dfcc 100644 --- a/apps/json-api-server/src/app/resources/type-orm/controllers/extend-book-list/extend-book-list.controller.ts +++ b/apps/json-api-server/src/app/resources/type-orm/controllers/extend-book-list/extend-book-list.controller.ts @@ -1,10 +1,13 @@ import { ParseUUIDPipe } from '@nestjs/common'; import { JsonApi, JsonBaseController } from '@klerick/json-api-nestjs'; - import { BookList } from '@nestjs-json-api/typeorm-database'; + @JsonApi(BookList, { pipeForId: ParseUUIDPipe, overrideRoute: 'override-book-list', allowMethod: ['getOne', 'postOne', 'deleteOne'], }) -export class ExtendBookListController extends JsonBaseController {} +export class ExtendBookListController extends JsonBaseController< + BookList, + 'id' +> {} diff --git a/apps/json-api-server/src/app/resources/type-orm/controllers/extend-user/extend-user.controller.ts b/apps/json-api-server/src/app/resources/type-orm/controllers/extend-user/extend-user.controller.ts index 87b4f842..faa1ae08 100644 --- a/apps/json-api-server/src/app/resources/type-orm/controllers/extend-user/extend-user.controller.ts +++ b/apps/json-api-server/src/app/resources/type-orm/controllers/extend-user/extend-user.controller.ts @@ -15,12 +15,14 @@ import { JsonApiService, Query as QueryType, QueryOne, - ResourceObject, - EntityRelation, PatchRelationshipData, - ResourceObjectRelationships, PostData, } from '@klerick/json-api-nestjs'; +import { + ResourceObjectRelationships, + ResourceObject, + RelationKeys, +} from '@klerick/json-api-nestjs-shared'; import { ExamplePipe } from '../../service/example.pipe'; import { ExampleService } from '../../service/example.service'; import { ControllerInterceptor } from '../../service/controller.interceptor'; @@ -38,26 +40,26 @@ import { AtomicInterceptor } from '../../service/atomic.interceptor'; @UseFilters(new HttpExceptionFilter()) @UseInterceptors(ControllerInterceptor) @JsonApi(Users) -export class ExtendUserController extends JsonBaseController { +export class ExtendUserController extends JsonBaseController { @InjectService() public service: JsonApiService; @Inject(ExampleService) protected exampleService: ExampleService; override getOne( id: string | number, - query: QueryOne + query: QueryOne ): Promise> { return super.getOne(id, query); } - patchRelationship>( + patchRelationship>( id: string | number, relName: Rel, input: PatchRelationshipData - ): Promise> { + ): Promise> { return super.patchRelationship(id, relName, input); } // @UseInterceptors(AtomicInterceptor) - postOne(inputData: PostData): Promise> { + postOne(inputData: PostData): Promise> { return super.postOne(inputData); } @@ -65,7 +67,7 @@ export class ExtendUserController extends JsonBaseController { @UseFilters(HttpExceptionMethodFilter) @UseInterceptors(MethodInterceptor) getAll( - @Query(ExamplePipe) query: QueryType + @Query(ExamplePipe) query: QueryType ): Promise> { return super.getAll(query); } diff --git a/apps/json-api-server/src/app/resources/type-orm/resources-type.module.ts b/apps/json-api-server/src/app/resources/type-orm/resources-type.module.ts index 397eb04b..a0852684 100644 --- a/apps/json-api-server/src/app/resources/type-orm/resources-type.module.ts +++ b/apps/json-api-server/src/app/resources/type-orm/resources-type.module.ts @@ -1,5 +1,6 @@ import { Module } from '@nestjs/common'; -import { JsonApiModule, TypeOrmJsonApiModule } from '@klerick/json-api-nestjs'; +import { JsonApiModule } from '@klerick/json-api-nestjs'; +import { TypeOrmJsonApiModule } from '@klerick/json-api-nestjs-typeorm'; import { Users, Addresses, diff --git a/apps/json-api-server/src/app/resources/type-orm/service/example.pipe.ts b/apps/json-api-server/src/app/resources/type-orm/service/example.pipe.ts index 9adda16d..3f4350e5 100644 --- a/apps/json-api-server/src/app/resources/type-orm/service/example.pipe.ts +++ b/apps/json-api-server/src/app/resources/type-orm/service/example.pipe.ts @@ -7,8 +7,13 @@ import { import { Query } from '@klerick/json-api-nestjs'; import { Users } from '@nestjs-json-api/typeorm-database'; -export class ExamplePipe implements PipeTransform, Query> { - transform(value: Query, metadata: ArgumentMetadata): Query { +export class ExamplePipe + implements PipeTransform, Query> +{ + transform( + value: Query, + metadata: ArgumentMetadata + ): Query { if (value.filter.target?.firstName?.eq === 'testCustomPipe') { const error = { code: 'invalid_arguments', diff --git a/apps/json-api-server/src/main.ts b/apps/json-api-server/src/main.ts index 12740930..cfe15691 100644 --- a/apps/json-api-server/src/main.ts +++ b/apps/json-api-server/src/main.ts @@ -9,26 +9,26 @@ import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; import { WsAdapter } from '@nestjs/platform-ws'; import { AppModule } from './app/app.module'; +import { NestExpressApplication } from '@nestjs/platform-express'; async function bootstrap() { - const app = await NestFactory.create(AppModule); + const app = await NestFactory.create(AppModule); app.useWebSocketAdapter(new WsAdapter(app)); const globalPrefix = 'api'; app.setGlobalPrefix(globalPrefix); const config = new DocumentBuilder() + .setOpenAPIVersion('3.1.0') .setTitle('JSON API swagger example') .setDescription('The JSON API list example') .setVersion('1.0') .build(); + app.set('query parser', 'extended'); SwaggerModule.setup( 'swagger', app, - () => ({ - ...SwaggerModule.createDocument(app, config), - openapi: '3.1.0', - }), + () => SwaggerModule.createDocument(app, config), {} ); await app.init(); diff --git a/apps/json-api-server/tsconfig.app.json b/apps/json-api-server/tsconfig.app.json index 4843ccf5..94727a51 100644 --- a/apps/json-api-server/tsconfig.app.json +++ b/apps/json-api-server/tsconfig.app.json @@ -17,9 +17,11 @@ "exclude": [ "jest.config.ts", "src/**/*.spec.ts", - "src/**/*.test.ts" + "src/**/*.test.ts", + "**/*.test-d.ts" ], "include": [ - "src/**/*.ts" + "src/**/*.ts", + "*.test-d.ts" ] } diff --git a/docker-compose.yaml b/docker-compose.yaml index 52340133..9518d9d6 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,11 +1,5 @@ version: '3.8' services: -# api-gate: -# container_name: api-gate -# restart: always -# build: apps/api-gate/ -# ports: -# - "3000:3000" postgres: image: postgres:15.1-alpine restart: always @@ -29,23 +23,20 @@ services: - pgadmin:/root/.pgadmin ports: - '8000:80' -# redis: -# image: redis:6.2-alpine -# restart: always -# ports: -# - '6379:6379' -# command: redis-server --save 20 1 --loglevel warning -# volumes: -# - redis:/data -# jaeger: -# image: jaegertracing/all-in-one:1.41 -# ports: -# - "16686:16686" -# - "14268:14268" + db: + image: mysql:latest + restart: always + environment: + MYSQL_ROOT_PASSWORD: mysql + ports: + - '3306:3306' + volumes: + - mysql-db:/var/lib/mysql + volumes: db: driver: local -# redis: -# driver: local + mysql-db: + driver: local pgadmin: driver: local diff --git a/libs/json-api/json-api-nestjs-microorm/.eslintrc.json b/libs/json-api/json-api-nestjs-microorm/.eslintrc.json new file mode 100644 index 00000000..0af28030 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/.eslintrc.json @@ -0,0 +1,30 @@ +{ + "extends": ["../../../.eslintrc.base.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.ts", "*.tsx"], + "rules": {} + }, + { + "files": ["*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.json"], + "parser": "jsonc-eslint-parser", + "rules": { + "@nx/dependency-checks": [ + "error", + { + "ignoredFiles": ["{projectRoot}/eslint.config.{js,cjs,mjs}"] + } + ] + } + } + ] +} diff --git a/libs/json-api/json-api-nestjs-microorm/README.md b/libs/json-api/json-api-nestjs-microorm/README.md new file mode 100644 index 00000000..e7361f24 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/README.md @@ -0,0 +1,53 @@ +# json-api-nestjs-microorm + +MocroOrm adapter for **[json-api-nestjs](https://github.com/klerick/nestjs-json-api/tree/master/libs/json-api/json-api-nestjs)** + +## Installation + +```bash +$ npm install @klerick/json-api-nestjs-microorm +``` + +## Configuration params + +The following interface is using for the configuration: + +```typescript +export type MicroOrmParam = { + arrayType?: string[]; //Custom type for indicate of array +}; + +``` + +## NOTE: MikroORM Default Named Context Issue in NestJS + +[@mikro-orm/nestjs](https://github.com/mikro-orm/nestjs) does not create a [default named context](https://github.com/mikro-orm/nestjs/discussions/214). + +As a result, the module initialization behaves differently depending on whether a single or multiple connections are used. +More specifically, the [dependency injection token for MikroORM differs](https://github.com/mikro-orm/nestjs/issues/213) between one and multiple database connections. + +To maintain a consistent JSON:API module configuration across different database adapters, +I decided **not to add extra conditional checks** in the setup. + +For everything to work correctly, @mikro-orm/nestjs should be integrated using the following module: +👉 [MicroORM Database Module](https://github.com/klerick/nestjs-json-api/blob/master/libs/microorm-database/src/lib/micro-orm-database.module.ts). + +```typescript +import ormConfig from './config'; + +// need set contextName and registerRequestContext +export const config: Options = { + contextName: 'default', + registerRequestContext: false, + ...ormConfig, +}; + +@Module({ + imports: [MikroOrmModule.forRoot(config), MikroOrmModule.forMiddleware()], + exports: [MikroOrmCoreModule], +}) +export class MicroOrmDatabaseModule {} +``` + + + diff --git a/libs/json-api/json-api-nestjs-microorm/jest.config.ts b/libs/json-api/json-api-nestjs-microorm/jest.config.ts new file mode 100644 index 00000000..840ada7c --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/jest.config.ts @@ -0,0 +1,10 @@ +export default { + displayName: 'json-api-nestjs-microorm', + preset: '../../../jest.preset.js', + testEnvironment: 'node', + transform: { + '^.+\\.[tj]s$': ['ts-jest', { tsconfig: '/tsconfig.spec.json' }], + }, + moduleFileExtensions: ['ts', 'js', 'html'], + coverageDirectory: '../../../coverage/libs/json-api/json-api-nestjs-microorm', +}; diff --git a/libs/json-api/json-api-nestjs-microorm/package.json b/libs/json-api/json-api-nestjs-microorm/package.json new file mode 100644 index 00000000..c6cf0637 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/package.json @@ -0,0 +1,22 @@ +{ + "name": "@klerick/json-api-nestjs-microorm", + "version": "0.0.1", + "type": "commonjs", + "main": "./src/index.js", + "types": "./src/index.d.ts", + "description": "MicroOrm adapter for JsonApi Plugin for NestJs", + "keywords": [ + "nestjs", + "nest", + "jsonapi", + "json-api", + "typeorm", + "microorm", + "CRUD" + ], + "dependencies": { + "tslib": ">2.3.0", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + } +} diff --git a/libs/json-api/json-api-nestjs-microorm/project.json b/libs/json-api/json-api-nestjs-microorm/project.json new file mode 100644 index 00000000..04be98fb --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/project.json @@ -0,0 +1,71 @@ +{ + "name": "json-api-nestjs-microorm", + "$schema": "../../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "{projectRoot}/src", + "projectType": "library", + "tags": [ + "type:lib", + "lib:json-api-nestjs", + "lib:json-api-nestjs-microorm", + "type:publish" + ], + "targets": { + "build": { + "dependsOn": [ + { + "projects": [ + "json-api-nestjs" + ], + "target": "build", + "params": "ignore" + } + ], + "executor": "@nx/js:tsc", + "outputs": [ + "{options.outputPath}" + ], + "options": { + "outputPath": "dist/{projectRoot}", + "tsConfig": "{projectRoot}/tsconfig.lib.json", + "packageJson": "{projectRoot}/package.json", + "main": "{projectRoot}/src/index.ts", + "assets": [ + "{projectRoot}/*.md" + ], + "buildableProjectDepsInPackageJsonType": "peerDependencies", + "generateExportsField": true, + "updateBuildableProjectDepsInPackageJson": true + } + }, + "upload-badge": { + "executor": "nx:run-commands", + "dependsOn": [ + { + "target": "test" + } + ], + "options": { + "commands": [ + "node tools/scripts/upload-badge.mjs json-api-nestjs-microorm" + ], + "cwd": "./", + "parallel": false, + "outputPath": "{workspaceRoot}/{projectRoot}" + } + }, + "nx-release-publish": { + "options": { + "packageRoot": "dist/{projectRoot}" + } + }, + "publish": { + "command": "node tools/scripts/publish.mjs json-api-nestjs-microorm {args.ver} {args.tag}", + "dependsOn": [ + "build" + ] + } + }, + "implicitDependencies": [ + "json-api-nestjs" + ] +} diff --git a/libs/json-api/json-api-nestjs-microorm/src/index.ts b/libs/json-api/json-api-nestjs-microorm/src/index.ts new file mode 100644 index 00000000..ce0685bf --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/index.ts @@ -0,0 +1 @@ +export * from './lib/micro-orm-json-api.module'; diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/constants/index.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/constants/index.ts new file mode 100644 index 00000000..9c5a0f01 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/constants/index.ts @@ -0,0 +1,7 @@ +export const ENTITY_METADATA_TOKEN = Symbol('ENTITY_METADATA_TOKEN'); +export const DEFAULT_ARRAY_TYPE = ['ArrayType', 'EnumArrayType']; +export const CURRENT_DATA_SOURCE_TOKEN = Symbol('CURRENT_DATA_SOURCE_TOKEN'); +export const CURRENT_ENTITY_REPOSITORY = Symbol('CURRENT_ENTITY_REPOSITORY'); +export const CURRENT_ENTITY_MANAGER_TOKEN = Symbol( + 'CURRENT_ENTITY_MANAGER_TOKEN' +); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/factory/index.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/factory/index.ts similarity index 58% rename from libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/factory/index.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/factory/index.ts index b8a13acc..c3f100cc 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/factory/index.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/factory/index.ts @@ -4,27 +4,26 @@ import { MikroORM, EntityRepository, MetadataStorage, + EntityClass, } from '@mikro-orm/core'; -import { camelToKebab } from '../../../utils/nestjs-shared'; +import { kebabCase } from 'change-case-commonjs'; import { getMikroORMToken } from '@mikro-orm/nestjs'; import { - CURRENT_DATA_SOURCE_TOKEN, - CURRENT_ENTITY_MANAGER_TOKEN, - CURRENT_ENTITY_REPOSITORY, - GLOBAL_MODULE_OPTIONS_TOKEN, + CheckRelationName, + CHECK_RELATION_NAME, + EntityParam, + RunInTransaction, + PrepareParams, RUN_IN_TRANSACTION_FUNCTION, ORM_SERVICE, - ENTITY_MAP_PROPS, -} from '../../../constants'; + MODULE_OPTIONS_TOKEN, + ENTITY_PARAM_MAP, + FIND_ONE_ROW_ENTITY, + FindOneRowEntity, +} from '@klerick/json-api-nestjs'; +import { getEntityName } from '@klerick/json-api-nestjs-shared'; -import { - EntityClass, - ObjectLiteral, - ResultMicroOrmModuleOptions, - RunInTransaction, -} from '../../../types'; -import { ZodEntityProps } from '../../mixin/types'; import { getProps, getRelation, @@ -33,11 +32,18 @@ import { getPrimaryColumnName, getPrimaryColumnType, getRelationProperty, + getArrayType, } from '../orm-helper'; -import { getEntityName } from '../../mixin/helper'; -import { ENTITY_METADATA_TOKEN } from '../constants'; +import { + ENTITY_METADATA_TOKEN, + CURRENT_DATA_SOURCE_TOKEN, + CURRENT_ENTITY_MANAGER_TOKEN, + CURRENT_ENTITY_REPOSITORY, +} from '../constants'; import { MicroOrmService } from '../service'; +import { MicroOrmParam } from '../type'; +import { MicroOrmUtilService } from '../service/micro-orm-util.service'; export function CurrentMicroOrmProvider( connectionName?: string @@ -59,13 +65,13 @@ export function CurrentEntityManager(): FactoryProvider { }; } -export function CurrentEntityRepository( +export function CurrentEntityRepository( entity: E ): FactoryProvider> { return { provide: CURRENT_ENTITY_REPOSITORY, useFactory: (entityManager: EntityManager) => - entityManager.getRepository(entity as unknown as EntityClass), + entityManager.getRepository(entity as unknown as EntityClass), inject: [CURRENT_ENTITY_MANAGER_TOKEN], }; } @@ -78,17 +84,29 @@ export function CurrentEntityMetadata(): FactoryProvider { }; } -export function EntityPropsMap( - entities: EntityClass[] -) { +export function CheckRelationNameFactory< + E extends object, + IdKey extends string = 'id' +>(): FactoryProvider> { + return { + provide: CHECK_RELATION_NAME, + inject: [MicroOrmUtilService], + useFactory(microOrmUtilService: MicroOrmUtilService) { + return (entity, value) => + !!microOrmUtilService.relationsName.find((i: any) => i === value); + }, + }; +} + +export function EntityPropsMap(entities: EntityClass[]) { return { - provide: ENTITY_MAP_PROPS, - inject: [ENTITY_METADATA_TOKEN, GLOBAL_MODULE_OPTIONS_TOKEN], + provide: ENTITY_PARAM_MAP, + inject: [ENTITY_METADATA_TOKEN, MODULE_OPTIONS_TOKEN], useFactory: ( metadataStorage: MetadataStorage, - config: ResultMicroOrmModuleOptions + config: PrepareParams ) => { - const mapProperty = new Map, ZodEntityProps>(); + const mapProperty = new Map, EntityParam>(); const arrayConfig = config.options.arrayType; for (const item of entities) { const metadata = metadataStorage.get(item); @@ -99,7 +117,8 @@ export function EntityPropsMap( propsNullable: getPropsNullable(metadata), primaryColumnName: getPrimaryColumnName(metadata), primaryColumnType: getPrimaryColumnType(metadata), - typeName: camelToKebab(className), + propsArrayType: getArrayType(metadata), + typeName: kebabCase(className), className: className, relations: getRelation(metadata), relationProperty: getRelationProperty(metadata), @@ -126,3 +145,22 @@ export function OrmServiceFactory() { useClass: MicroOrmService, }; } +export function FindOneRowEntityFactory< + E extends object, + IdKey extends string +>(): FactoryProvider> { + return { + provide: FIND_ONE_ROW_ENTITY, + inject: [MicroOrmUtilService], + useFactory(microOrmUtilService: MicroOrmUtilService) { + return async (entity, value) => { + return microOrmUtilService + .queryBuilder(entity) + .where({ + [microOrmUtilService.currentPrimaryColumn]: value, + }) + .getSingleResult(); + }; + }, + }; +} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/index.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/index.ts similarity index 100% rename from libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/index.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/index.ts diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/micro-orm-json-api.module.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/micro-orm-json-api.module.ts similarity index 68% rename from libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/micro-orm-json-api.module.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/micro-orm-json-api.module.ts index 6e9e443f..2cf56d9b 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/micro-orm-json-api.module.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/micro-orm-json-api.module.ts @@ -1,8 +1,12 @@ import { DynamicModule } from '@nestjs/common'; import { MikroOrmModule } from '@mikro-orm/nestjs'; +import { + PrepareParams, + MODULE_OPTIONS_TOKEN, + NestProvider, +} from '@klerick/json-api-nestjs'; +import { MicroOrmParam } from './type'; -import { NestProvider, ResultModuleOptions, ObjectLiteral } from '../../types'; -import { GLOBAL_MODULE_OPTIONS_TOKEN } from '../../constants'; import { CurrentEntityManager, CurrentEntityMetadata, @@ -11,14 +15,15 @@ import { OrmServiceFactory, RunInTransactionFactory, EntityPropsMap, + CheckRelationNameFactory, + FindOneRowEntityFactory, } from './factory'; import { MicroOrmUtilService } from './service/micro-orm-util.service'; export class MicroOrmJsonApiModule { - static module = 'microOrm' as const; - static forRoot(options: ResultModuleOptions): DynamicModule { + static forRoot(options: PrepareParams): DynamicModule { const optionProvider = { - provide: GLOBAL_MODULE_OPTIONS_TOKEN, + provide: MODULE_OPTIONS_TOKEN, useValue: options, }; @@ -37,7 +42,10 @@ export class MicroOrmJsonApiModule { EntityPropsMap(options.entities), ]; - const currentImport = [microOrmModule, ...(options.imports || [])]; + const currentImport = [ + microOrmModule, + ...((options.imports || []) as DynamicModule[]), + ]; return { module: MicroOrmJsonApiModule, @@ -47,11 +55,13 @@ export class MicroOrmJsonApiModule { }; } - static getUtilProviders(entity: ObjectLiteral): NestProvider { + static getUtilProviders(entity: object): NestProvider { return [ CurrentEntityRepository(entity), + CheckRelationNameFactory(), OrmServiceFactory(), MicroOrmUtilService, + FindOneRowEntityFactory(), ]; } } diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/addresses.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/addresses.ts similarity index 96% rename from libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/addresses.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/addresses.ts index 7952b916..8f8710ec 100644 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/addresses.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/addresses.ts @@ -6,7 +6,7 @@ import { ArrayType, } from '@mikro-orm/core'; -import { Users, IUsers } from '.'; +import { Users, IUsers } from './index'; export type IAddresses = Addresses; diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/comments.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/comments.ts similarity index 96% rename from libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/comments.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/comments.ts index 1f42db64..285f33a3 100644 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/comments.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/comments.ts @@ -6,7 +6,7 @@ export enum CommentKind { Note = 'NOTE', } -import { Users, IUsers } from '.'; +import { Users, IUsers } from './index'; export type IComments = Comments; diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/index.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/index.ts similarity index 100% rename from libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/index.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/index.ts diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/notes.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/notes.ts similarity index 100% rename from libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/notes.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/notes.ts diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/roles.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/roles.ts similarity index 96% rename from libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/roles.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/roles.ts index 3dcd026d..2420d19c 100644 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/roles.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/roles.ts @@ -6,7 +6,7 @@ import { Collection, } from '@mikro-orm/core'; -import { Users, IUsers } from '.'; +import { Users, IUsers } from './index'; export type IRoles = Roles; diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/user-groups.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/user-groups.ts similarity index 100% rename from libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/user-groups.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/user-groups.ts diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/users.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/users.ts similarity index 98% rename from libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/users.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/users.ts index 08d1f31c..17ba911f 100644 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/users.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/users.ts @@ -142,5 +142,5 @@ export class Users { fieldName: 'user_groups_id', nullable: true, }) - public userGroup!: UserGroups; + public userGroup!: UserGroups | null; } diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/index.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/index.ts similarity index 71% rename from libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/index.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/index.ts index ed7ef0d9..80dc335d 100644 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/index.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/index.ts @@ -1,7 +1,13 @@ import { Test, TestingModule } from '@nestjs/testing'; import { MikroOrmModule } from '@mikro-orm/nestjs'; import { EntityManager, MikroORM } from '@mikro-orm/core'; -import { QueryField } from '../../utils/nestjs-shared'; +import { QueryField } from '@klerick/json-api-nestjs-shared'; +import { + Query, + CURRENT_ENTITY, + MODULE_OPTIONS_TOKEN, + JsonApiTransformerService, +} from '@klerick/json-api-nestjs'; import { Addresses, @@ -11,8 +17,6 @@ import { UserGroups, Users, } from './entities'; -import { ObjectLiteral } from '../../types'; -import { Query } from '../../modules/mixin/zod'; import { CurrentEntityManager, @@ -21,16 +25,14 @@ import { CurrentMicroOrmProvider, OrmServiceFactory, EntityPropsMap, -} from '../../modules/micro-orm/factory'; -import { MicroOrmUtilService } from '../../modules/micro-orm/service/micro-orm-util.service'; -import { CURRENT_ENTITY, GLOBAL_MODULE_OPTIONS_TOKEN } from '../../constants'; +} from '../factory'; +import { MicroOrmUtilService } from '../service/micro-orm-util.service'; export * from './entities'; export * from './utils'; import { sharedConnect, initMikroOrm, pullAllData } from './utils'; -import { DEFAULT_ARRAY_TYPE } from '../../modules/micro-orm/constants'; -import { JsonApiTransformerService } from '../../modules/mixin/service/json-api-transformer.service'; +import { DEFAULT_ARRAY_TYPE } from '../constants'; export const entities = [Users, UserGroups, Roles, Comments, Addresses, Notes]; @@ -64,7 +66,7 @@ export async function pullData(em: EntityManager, count = 1) { } } -export function getModuleForPgLite( +export function getModuleForPgLite( entity: E, dbName = `test_db_${Date.now()}` ): Promise { @@ -76,6 +78,20 @@ export function getModuleForPgLite( CurrentEntityMetadata(), CurrentEntityRepository(entity), MicroOrmUtilService, + { + provide: JsonApiTransformerService, + useValue: { + transformData() { + return { + included: {}, + data: {}, + }; + }, + transformRel() { + return []; + }, + }, + }, { provide: CURRENT_ENTITY, useValue: entity, @@ -83,15 +99,17 @@ export function getModuleForPgLite( OrmServiceFactory(), EntityPropsMap(entities as any), { - provide: GLOBAL_MODULE_OPTIONS_TOKEN, + provide: MODULE_OPTIONS_TOKEN, useValue: { options: { arrayType: DEFAULT_ARRAY_TYPE } }, }, - JsonApiTransformerService, ], }).compile(); } -export function getDefaultQuery(): Query { +export function getDefaultQuery< + R extends object, + IdKey extends string = 'id' +>(): Query { return { [QueryField.filter]: { relation: null, @@ -104,5 +122,5 @@ export function getDefaultQuery(): Query { size: 1, number: 1, }, - } satisfies Query; + } as Query; } diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/utils/index.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/utils/index.ts similarity index 100% rename from libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/utils/index.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/utils/index.ts diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/utils/init-db.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/utils/init-db.ts similarity index 100% rename from libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/utils/init-db.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/utils/init-db.ts diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/utils/provider-entities.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/utils/provider-entities.ts similarity index 100% rename from libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/utils/provider-entities.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/utils/provider-entities.ts diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/utils/pull-data.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/utils/pull-data.ts similarity index 100% rename from libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/utils/pull-data.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/utils/pull-data.ts diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-helper/index.spec.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-helper/index.spec.ts similarity index 93% rename from libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-helper/index.spec.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/orm-helper/index.spec.ts index fbb9fbdd..c47befd4 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-helper/index.spec.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-helper/index.spec.ts @@ -10,7 +10,7 @@ import { mockDbPgLiteTestModule, Comments, UserGroups, -} from '../../../mock-utils/microrom'; +} from '../mock-utils'; import { CurrentMicroOrmProvider, CurrentEntityManager, @@ -19,7 +19,7 @@ import { import { DEFAULT_ARRAY_TYPE, ENTITY_METADATA_TOKEN } from '../constants'; -import { TypeField } from '../../mixin/types'; +import { TypeField } from '@klerick/json-api-nestjs'; import { getProps, @@ -29,7 +29,8 @@ import { getPrimaryColumnType, getRelation, getRelationProperty, -} from './'; + getArrayType, +} from './index'; describe('microorm-orm-helper-for-map', () => { let entityMetadataToken: MetadataStorage; @@ -118,6 +119,14 @@ describe('microorm-orm-helper-for-map', () => { expect(result).toBe(TypeField.number); }); + it('getArrayType', () => { + const result = getArrayType(entityMetadataToken.get(Users)); + expect(result).toEqual({ + testReal: TypeField.number, + testArrayNull: TypeField.number, + }); + }); + it('getRelation', () => { const result = getRelation(entityMetadataToken.get(Users)); expect(result.includes('id' as any)).toBe(false); diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/orm-helper/index.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-helper/index.ts new file mode 100644 index 00000000..a90f35a1 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-helper/index.ts @@ -0,0 +1,185 @@ +import { EntityKey, EntityMetadata } from '@mikro-orm/core'; +import { + EntityParam, + TypeField, + PrepareParams, +} from '@klerick/json-api-nestjs'; +import { MicroOrmParam } from '../type'; +import { DEFAULT_ARRAY_TYPE } from '../constants'; + +export const getRelation = ( + entityMetadata: EntityMetadata +) => + entityMetadata.relations.map( + (i) => i.name + ) as unknown as EntityParam['relations']; + +export const getProps = ( + entityMetadata: EntityMetadata +): EntityParam['props'] => { + const relations = getRelation(entityMetadata) as any; + + return entityMetadata.props + .map((i) => i.name) + .filter( + (i) => !relations.includes(i) + ) as unknown as EntityParam['props']; +}; + +export const getPropsType = ( + entityMetadata: EntityMetadata, + config: PrepareParams['options']['arrayType'] = DEFAULT_ARRAY_TYPE +): EntityParam['propsType'] => { + const field = getProps(entityMetadata); + + const result = {} as any; + for (const item of field) { + const props = + entityMetadata.properties[item as unknown as EntityKey]; + + let typeProps: TypeField = TypeField.string; + if (config.includes(props['type'])) { + result[item] = TypeField.array; + continue; + } + + switch (props.runtimeType) { + case 'Date': + typeProps = TypeField.date; + break; + case 'number': + typeProps = TypeField.number; + break; + case 'boolean': + typeProps = TypeField.boolean; + break; + case 'object': + typeProps = TypeField.object; + break; + default: + typeProps = TypeField.string; + } + result[item] = typeProps; + } + + return result; +}; + +export const getPropsNullable = ( + entityMetadata: EntityMetadata +): EntityParam['propsNullable'] => { + return getProps(entityMetadata) + .map((i) => { + // @ts-ignore + const props = entityMetadata.properties[i]; + return props.nullable || props.default !== undefined ? i : false; + }) + .filter((i) => !!i) as unknown as EntityParam['propsNullable']; +}; + +export const getPrimaryColumnName = ( + entityMetadata: EntityMetadata +) => + entityMetadata + .getPrimaryProp() + .name.toString() as EntityParam['primaryColumnName']; + +export const getPrimaryColumnType = ( + entityMetadata: EntityMetadata +): EntityParam['primaryColumnType'] => { + return ( + entityMetadata.getPrimaryProp().runtimeType === 'number' + ? TypeField.number + : TypeField.string + ) as EntityParam['primaryColumnType']; +}; + +export const getRelationProperty = ( + entityMetadata: EntityMetadata +): EntityParam['relationProperty'] => { + return entityMetadata.relations.reduce((acum, item) => { + // @ts-expect-error its dynamic creater + acum[item.name] = { + entityClass: item.entity() as any, + nullable: + item.kind === 'm:n' || item.kind === '1:m' + ? false + : (!!item.nullable as any), + isArray: item.kind === 'm:n' || item.kind === ('1:m' as any), + }; + + return acum; + }, {} as EntityParam['relationProperty']); +}; + +export const getArrayType = ( + repository: EntityMetadata, + config: PrepareParams['options']['arrayType'] = DEFAULT_ARRAY_TYPE +): EntityParam['propsArrayType'] => { + return Object.entries(getPropsType(repository, config)) + .filter(([name, type]) => type === TypeField.array) + .reduce((acum, [name]) => { + const fieldType = Reflect.get(repository.properties, name) + .columnTypes.at(0) + ?.replace('[]', ''); + + if (!fieldType) { + throw new Error('Metadata not found for field ' + name); + } + + switch (fieldType) { + case 'number': + case 'bigint': + case 'smallint': + case 'smalldecimal': + case 'decimal': + case 'double': + case 'tinyint': + case 'mediumint': + case 'int': + case 'float': + case 'dec': + case 'fixed': + case 'numeric': + case 'real': + case 'int2': + case 'int4': + case 'int8': + case 'integer': + acum[name] = TypeField.number; + break; + case 'character varying': + case 'varying character': + case 'char varying': + case 'nvarchar': + case 'national varchar': + case 'character': + case 'native character': + case 'varchar': + case 'char': + case 'nchar': + case 'national char': + case 'varchar2': + case 'nvarchar2': + case 'alphanum': + case 'shorttext': + case 'raw': + case 'binary': + case 'varbinary': + case 'string': + acum[name] = TypeField.string; + break; + case 'date': + case 'timetz': + case 'timestamptz': + case 'timestamp with local time zone': + case 'smalldatetime': + acum[name] = TypeField.date; + break; + case 'boolean': + acum[name] = TypeField.boolean; + } + + return acum; + }, {} as any); +}; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/delete-one/delete-one.spec.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/delete-one/delete-one.spec.ts similarity index 82% rename from libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/delete-one/delete-one.spec.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/delete-one/delete-one.spec.ts index 7563183a..46b6676d 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/delete-one/delete-one.spec.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/delete-one/delete-one.spec.ts @@ -1,17 +1,14 @@ import { EntityManager, MikroORM } from '@mikro-orm/core'; - +import { ORM_SERVICE } from '@klerick/json-api-nestjs'; import { dbRandomName, getModuleForPgLite, pullData, Users, -} from '../../../../mock-utils/microrom'; +} from '../../mock-utils'; import { MicroOrmService } from '../../service'; -import { - CURRENT_ENTITY_MANAGER_TOKEN, - ORM_SERVICE, -} from '../../../../constants'; +import { CURRENT_ENTITY_MANAGER_TOKEN } from '../../constants'; import { deleteOne } from './delete-one'; describe('delete-one', () => { @@ -44,9 +41,9 @@ describe('delete-one', () => { .execute('get', true); await deleteOne.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, checkData.id); const result = await microOrmServiceUser.microOrmUtilService diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/delete-one/delete-one.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/delete-one/delete-one.ts similarity index 73% rename from libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/delete-one/delete-one.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/delete-one/delete-one.ts index ccc07ab2..950f56cc 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/delete-one/delete-one.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/delete-one/delete-one.ts @@ -1,8 +1,7 @@ import { MicroOrmService } from '../../service'; -import { ObjectLiteral } from '../../../../types'; -export async function deleteOne( - this: MicroOrmService, +export async function deleteOne( + this: MicroOrmService, id: number | string ): Promise { const data = await this.microOrmUtilService diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/delete-relationship/delete-relationship.spec.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/delete-relationship/delete-relationship.spec.ts similarity index 68% rename from libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/delete-relationship/delete-relationship.spec.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/delete-relationship/delete-relationship.spec.ts index 16004280..fb8bd829 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/delete-relationship/delete-relationship.spec.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/delete-relationship/delete-relationship.spec.ts @@ -1,6 +1,7 @@ import { Collection, EntityManager, MikroORM } from '@mikro-orm/core'; import { faker } from '@faker-js/faker'; - +import { ORM_SERVICE } from '@klerick/json-api-nestjs'; +import { RelationKeys } from '@klerick/json-api-nestjs-shared'; import { Addresses, dbRandomName, @@ -12,16 +13,12 @@ import { Users, Comments, pullAddress, -} from '../../../../mock-utils/microrom'; +} from '../../mock-utils'; import { MicroOrmService } from '../../service'; -import { - CURRENT_ENTITY_MANAGER_TOKEN, - ORM_SERVICE, -} from '../../../../constants'; +import { CURRENT_ENTITY_MANAGER_TOKEN } from '../../constants'; import { deleteRelationship } from './delete-relationship'; -import { EntityRelation } from '../../../../utils/nestjs-shared'; describe('delete-relationship', () => { let mikroORMUsers: MikroORM; @@ -30,10 +27,11 @@ describe('delete-relationship', () => { let dbName: string; let addressForTest: Addresses; let addresses: Addresses; - let userGroup: UserGroups; + let userGroup: UserGroups | null; let notes: Collection; let roles: Collection; let comments: Collection; + let tmpUserObject: Users | undefined = undefined; let userObject: Users; let newUser: Users; beforeAll(async () => { @@ -65,8 +63,10 @@ describe('delete-relationship', () => { .getSingleResult(); if (!data) throw new Error(); - ({ roles, notes, userGroup, addresses, comments, ...userObject as any } = + + ({ roles, notes, userGroup, addresses, comments, ...tmpUserObject as any } = data); + userObject = tmpUserObject as any; const firstName = faker.person.firstName(); const lastName = faker.person.lastName(); newUser = { @@ -100,21 +100,29 @@ describe('delete-relationship', () => { const saveCount = roles.length; const [roles1, roles2] = roles; await deleteRelationship.call< - MicroOrmService, - Parameters>>, - ReturnType>> + MicroOrmService, + Parameters< + typeof deleteRelationship> + >, + ReturnType< + typeof deleteRelationship> + > >(microOrmServiceUser, userObject.id, 'roles', [ { type: 'roles', id: roles1.id.toString() }, ]); await deleteRelationship.call< - MicroOrmService, - Parameters>>, - ReturnType>> + MicroOrmService, + Parameters< + typeof deleteRelationship> + >, + ReturnType< + typeof deleteRelationship> + > >(microOrmServiceUser, userObject.id, 'userGroup', { type: 'user-groups', - id: userGroup.id.toString(), - }); + id: userGroup?.id.toString(), + } as any); const checkData = await microOrmServiceUser.microOrmUtilService .queryBuilder() @@ -133,9 +141,13 @@ describe('delete-relationship', () => { it('should be error', async () => { await expect( deleteRelationship.call< - MicroOrmService, - Parameters>>, - ReturnType>> + MicroOrmService, + Parameters< + typeof deleteRelationship> + >, + ReturnType< + typeof deleteRelationship> + > >(microOrmServiceUser, userObject.id, 'roles', { type: 'roles', id: '1000', @@ -144,9 +156,13 @@ describe('delete-relationship', () => { await expect( deleteRelationship.call< - MicroOrmService, - Parameters>>, - ReturnType>> + MicroOrmService, + Parameters< + typeof deleteRelationship> + >, + ReturnType< + typeof deleteRelationship> + > >(microOrmServiceUser, userObject.id, 'roles', [ { type: 'roles', @@ -157,9 +173,13 @@ describe('delete-relationship', () => { await expect( deleteRelationship.call< - MicroOrmService, - Parameters>>, - ReturnType>> + MicroOrmService, + Parameters< + typeof deleteRelationship> + >, + ReturnType< + typeof deleteRelationship> + > >(microOrmServiceUser, userObject.id, 'userGroup', [ { type: 'user-groups', @@ -169,9 +189,13 @@ describe('delete-relationship', () => { ).rejects.toThrow(); await expect( deleteRelationship.call< - MicroOrmService, - Parameters>>, - ReturnType>> + MicroOrmService, + Parameters< + typeof deleteRelationship> + >, + ReturnType< + typeof deleteRelationship> + > >(microOrmServiceUser, userObject.id, 'userGroup', { type: 'user-groups', id: '10000', diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/delete-relationship/delete-relationship.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/delete-relationship/delete-relationship.ts similarity index 73% rename from libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/delete-relationship/delete-relationship.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/delete-relationship/delete-relationship.ts index 1607e545..a61f54c4 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/delete-relationship/delete-relationship.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/delete-relationship/delete-relationship.ts @@ -1,30 +1,26 @@ -import { EntityRelation } from '../../../../utils/nestjs-shared'; - -import { ObjectLiteral, ValidateQueryError } from '../../../../types'; +import { NotFoundException } from '@nestjs/common'; +import { RelationKeys } from '@klerick/json-api-nestjs-shared'; +import { + ValidateQueryError, + PostRelationshipData, +} from '@klerick/json-api-nestjs'; -import { PostRelationshipData } from '../../../mixin/zod'; import { MicroOrmService } from '../../service'; -import { NotFoundException } from '@nestjs/common'; export async function deleteRelationship< - E extends ObjectLiteral, - Rel extends EntityRelation + E extends object, + IdKey extends string, + Rel extends RelationKeys >( - this: MicroOrmService, + this: MicroOrmService, id: number | string, rel: Rel, input: PostRelationshipData ): Promise { const idsResult = await this.microOrmUtilService.validateRelationInputData( - rel, + rel as any, input ); - - // const currentEntityRef = this.microOrmUtilService.entityManager.getReference( - // this.microOrmUtilService.entity, - // id as any - // ); - const currentEntityRef = await this.microOrmUtilService .queryBuilder() .where({ @@ -50,9 +46,10 @@ export async function deleteRelationship< const relRef = idsResult.map((i) => this.microOrmUtilService.entityManager.getReference(relEntity, i as any) ); - currentEntityRef[rel].remove(...relRef); + (currentEntityRef[rel] as any).remove(...relRef); } else { if ( + // @ts-ignore currentEntityRef[rel][this.microOrmUtilService.getPrimaryNameFor(rel)] == idsResult ) { diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-all/get-all.spec.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-all/get-all.spec.ts similarity index 87% rename from libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-all/get-all.spec.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-all/get-all.spec.ts index 9a823b3f..7d7b6289 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-all/get-all.spec.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-all/get-all.spec.ts @@ -1,6 +1,6 @@ import { EntityManager, MikroORM } from '@mikro-orm/core'; import { faker } from '@faker-js/faker'; - +import { ORM_SERVICE } from '@klerick/json-api-nestjs'; import { Addresses, dbRandomName, @@ -11,13 +11,10 @@ import { Roles, UserGroups, Users, -} from '../../../../mock-utils/microrom'; +} from '../../mock-utils'; import { MicroOrmService } from '../../service'; -import { - CURRENT_ENTITY_MANAGER_TOKEN, - ORM_SERVICE, -} from '../../../../constants'; +import { CURRENT_ENTITY_MANAGER_TOKEN } from '../../constants'; import { getAll } from './get-all'; @@ -55,9 +52,9 @@ describe('get-all', () => { const query = getDefaultQuery(); const { totalItems, items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, query); expect(totalItems).toBe(count); @@ -76,9 +73,9 @@ describe('get-all', () => { number: 2, }; const { totalItems, items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, query); expect(totalItems).toBe(count); @@ -110,9 +107,9 @@ describe('get-all', () => { number: 2, }; const { totalItems, items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, query); expect(totalItems).toBe(count); @@ -158,9 +155,9 @@ describe('get-all', () => { }; const { totalItems, items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, query); expect(totalItems).toBe(count); @@ -199,9 +196,9 @@ describe('get-all', () => { }; const { totalItems, items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, query); expect(totalItems).toBe(count); @@ -221,9 +218,9 @@ describe('get-all', () => { number: 1, }; const { totalItems, items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, query); expect(totalItems).toBe(count); @@ -253,9 +250,9 @@ describe('get-all', () => { target: select, }; const { totalItems, items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, query); expect(totalItems).toBe(count); @@ -289,9 +286,9 @@ describe('get-all', () => { roles: ['name', 'key'], }; const { totalItems, items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, query); expect(totalItems).toBe(count); @@ -316,9 +313,9 @@ describe('get-all', () => { query.include = ['roles']; const { totalItems, items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, query); expect(totalItems).toBe(count); @@ -347,9 +344,9 @@ describe('get-all', () => { addresses: ['city', 'state'], }; const { totalItems, items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, query); expect(totalItems).toBe(count); @@ -420,9 +417,9 @@ describe('get-all', () => { }, }; const { totalItems, items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, query); expect(totalItems).toBe(count); @@ -504,18 +501,18 @@ describe('get-all', () => { }, }; const { totalItems, items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, query); expect(totalItems).toBe(count); expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); const { totalItems: totalItems2, items: items2 } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, query2); expect(totalItems2).toBe(count2); @@ -559,9 +556,9 @@ describe('get-all', () => { }; const { totalItems, items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, query); expect(totalItems).toBe(count); @@ -598,9 +595,9 @@ describe('get-all', () => { }; const { totalItems: totalItems2, items: items2 } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, query2); expect(totalItems2).toBe(count2); @@ -644,9 +641,9 @@ describe('get-all', () => { }; const { totalItems: totalItems3, items: items3 } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, query3); expect(totalItems3).toBe(count3); expect(JSON.stringify(items3)).toBe(JSON.stringify(checkData3)); @@ -677,9 +674,9 @@ describe('get-all', () => { }; const { totalItems: totalItems4, items: items4 } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, query4); expect(totalItems4).toBe(count4); expect(JSON.stringify(items4)).toBe(JSON.stringify(checkData4)); @@ -723,9 +720,9 @@ describe('get-all', () => { }, }; const { totalItems: totalItems, items: items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, query); expect(totalItems).toBe(count); @@ -769,9 +766,9 @@ describe('get-all', () => { }, }; const { totalItems: totalItems1, items: items1 } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, query1); expect(totalItems1).toBe(count1); @@ -830,9 +827,9 @@ describe('get-all', () => { }; query.include = ['addresses']; const { totalItems: totalItems, items: items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, query); expect(totalItems).toBe(count); @@ -863,7 +860,7 @@ describe('get-all', () => { }, }) .getResult(); - const count = await quweryBuilder.clone().count(); + const count = await quweryBuilder.clone().count('id', true); const query = getDefaultQuery(); query.page = { size: 5, @@ -885,9 +882,9 @@ describe('get-all', () => { }; query.include = ['notes']; const { totalItems: totalItems, items: items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, query); expect(totalItems).toBe(count); @@ -944,9 +941,9 @@ describe('get-all', () => { query.include = ['roles']; const { totalItems: totalItems, items: items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, query); expect(totalItems).toBe(count); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-all/get-all.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-all/get-all.ts similarity index 83% rename from libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-all/get-all.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-all/get-all.ts index e33a71e5..4eda6378 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-all/get-all.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-all/get-all.ts @@ -1,22 +1,21 @@ -import { QueryFlag, serialize, wrap } from '@mikro-orm/core'; - -import { ObjectLiteral } from '../../../../types'; +import { QueryFlag, wrap } from '@mikro-orm/core'; +import { Query } from '@klerick/json-api-nestjs'; import { MicroOrmService } from '../../service'; -import { Query } from '../../../mixin/zod'; + import { getQueryForCount, getSortObject } from './get-query-for-count'; -export async function getAll( - this: MicroOrmService, - query: Query +export async function getAll( + this: MicroOrmService, + query: Query ): Promise<{ totalItems: number; items: E[]; }> { const { page } = query; const countSubQuery = getQueryForCount.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(this, ...[query]); const skip = (page.number - 1) * page.size; @@ -74,7 +73,7 @@ export async function getAll( const sortObject = getSortObject(query); const resultList = await this.microOrmUtilService - .prePareQueryBuilder(resultQueryBuilder, query) + .prePareQueryBuilder(resultQueryBuilder, query as any) .orderBy( Object.keys(sortObject).length > 0 ? sortObject diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-all/get-query-for-count.spec.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-all/get-query-for-count.spec.ts similarity index 85% rename from libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-all/get-query-for-count.spec.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-all/get-query-for-count.spec.ts index 3364e14e..5fd1e311 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-all/get-query-for-count.spec.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-all/get-query-for-count.spec.ts @@ -1,5 +1,6 @@ import { EntityManager, MikroORM } from '@mikro-orm/core'; -import { FilterOperand } from '../../../../utils/nestjs-shared'; +import { FilterOperand } from '@klerick/json-api-nestjs-shared'; +import { ORM_SERVICE } from '@klerick/json-api-nestjs'; import { UserGroups, Users, @@ -7,12 +8,9 @@ import { getDefaultQuery, dbRandomName, getModuleForPgLite, -} from '../../../../mock-utils/microrom'; +} from '../../mock-utils'; -import { - CURRENT_ENTITY_MANAGER_TOKEN, - ORM_SERVICE, -} from '../../../../constants'; +import { CURRENT_ENTITY_MANAGER_TOKEN } from '../../constants'; import { getQueryForCount } from './get-query-for-count'; import { MicroOrmService } from '../../service'; @@ -62,9 +60,9 @@ describe('get-query-for-count', () => { }; const result = getQueryForCount.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, ...[query]); expect(result.getFormattedQuery()).toBe( @@ -87,7 +85,7 @@ describe('get-query-for-count', () => { [FilterOperand.some]: ['test'], }, }, - }; + } as any; const query1 = getDefaultQuery(); query1.filter = { @@ -112,7 +110,7 @@ describe('get-query-for-count', () => { }, }, }, - }; + } as any; const query2 = getDefaultQuery(); query2.filter = { @@ -137,7 +135,7 @@ describe('get-query-for-count', () => { }, }, }, - }; + } as any; const query3 = getDefaultQuery(); query3.filter = { @@ -164,9 +162,9 @@ describe('get-query-for-count', () => { }; const result = getQueryForCount.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, ...[query]); expect(result.getFormattedQuery()).toBe( @@ -174,9 +172,9 @@ describe('get-query-for-count', () => { ); const result1 = getQueryForCount.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, ...[query1]); expect(result1.getFormattedQuery()).toBe( @@ -184,18 +182,18 @@ describe('get-query-for-count', () => { ); const result2 = getQueryForCount.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, ...[query2]); expect(result2.getFormattedQuery()).toBe( `select "Users".* from "public"."users" as "Users" left join "public"."users" as "u1" on "Users"."manager_id" = "u1"."id" left join "public"."addresses" as "a2" on "Users"."addresses_id" = "a2"."id" where "Users"."login" = 'test' and "Users"."login" != 'test2' and "Users"."is_active" = 'false' and "u1"."login" = 'test' and "a2"."city" = 'test' order by "Users"."id" asc` ); const result3 = getQueryForCount.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, ...[query3]); expect(result3.getFormattedQuery()).toBe( `select "Users".* from "public"."users" as "Users" where "Users"."login" = 'test' and "Users"."login" != 'test2' and "Users"."is_active" = 'false' and (exists (select 1 from "public"."users_have_roles" as "users_have_roles" left join "public"."roles" as "r1" on "users_have_roles"."role_id" = "r1"."id" where "users_have_roles"."user_id" = "Users"."id" and "r1"."key" = 'test' and "r1"."key" != 'test2' and "r1"."is_default" = 'false')) order by "Users"."id" asc` @@ -231,9 +229,9 @@ describe('get-query-for-count', () => { }; const result1 = getQueryForCount.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, ...[query1]); expect(result1.getFormattedQuery()).toBe( `select "Users".* from "public"."users" as "Users" left join "public"."users_have_roles" as "u2" on "Users"."id" = "u2"."user_id" left join "public"."roles" as "u1" on "u2"."role_id" = "u1"."id" where "u1"."key" = 'test' and "u1"."key" != 'test2' and "u1"."is_default" = 'false' order by "Users"."id" asc, "Users"."last_name" desc, "Users"."user_groups_id" asc, "u1"."name" desc` diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-all/get-query-for-count.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-all/get-query-for-count.ts similarity index 70% rename from libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-all/get-query-for-count.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-all/get-query-for-count.ts index ccc2dda6..fca707a5 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-all/get-query-for-count.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-all/get-query-for-count.ts @@ -1,20 +1,19 @@ -import { ObjectTyped } from '../../../../utils/nestjs-shared'; +import { ObjectTyped } from '@klerick/json-api-nestjs-shared'; +import { Query } from '@klerick/json-api-nestjs'; +import type { QBQueryOrderMap, EntityKey } from '@mikro-orm/core'; import { MicroOrmService } from '../../service'; -import { Query } from '../../../mixin/zod'; -import { ObjectLiteral } from '../../../../types'; -import type { QBQueryOrderMap, EntityKey } from '@mikro-orm/core'; -export function getSortObject( - query: Query +export function getSortObject( + query: Query ): QBQueryOrderMap { const { sort } = query; const sortObject: QBQueryOrderMap = {}; if (!sort) return sortObject; - const { target = {}, ...relation } = sort; + const { target = {}, ...relation } = sort as any; for (const [filed, sortType] of ObjectTyped.entries(target)) { - sortObject[filed] = sortType; + Reflect.set(sortObject, filed, sortType); } for (const [relationName, orderConfig = {}] of ObjectTyped.entries( @@ -29,9 +28,9 @@ export function getSortObject( return sortObject; } -export function getQueryForCount( - this: MicroOrmService, - query: Query +export function getQueryForCount( + this: MicroOrmService, + query: Query ) { const querySelect = this.microOrmUtilService.queryBuilder(); const sortObject = getSortObject(query); @@ -44,9 +43,9 @@ export function getQueryForCount( ); const expressionArrayForTarget = - this.microOrmUtilService.getFilterExpressionForTarget(query); + this.microOrmUtilService.getFilterExpressionForTarget(query as any); const expressionArrayForRelation = - this.microOrmUtilService.getFilterExpressionForRelation(query); + this.microOrmUtilService.getFilterExpressionForRelation(query as any); const resultExpression = [ ...expressionArrayForTarget, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-one/get-one.spec.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-one/get-one.spec.ts similarity index 82% rename from libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-one/get-one.spec.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-one/get-one.spec.ts index e6fcaf70..7aa063b9 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-one/get-one.spec.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-one/get-one.spec.ts @@ -1,18 +1,15 @@ import { EntityManager, MikroORM } from '@mikro-orm/core'; - +import { ORM_SERVICE } from '@klerick/json-api-nestjs'; import { dbRandomName, getDefaultQuery, getModuleForPgLite, pullData, Users, -} from '../../../../mock-utils/microrom'; +} from '../../mock-utils'; import { MicroOrmService } from '../../service'; -import { - CURRENT_ENTITY_MANAGER_TOKEN, - ORM_SERVICE, -} from '../../../../constants'; +import { CURRENT_ENTITY_MANAGER_TOKEN } from '../../constants'; import { getOne } from './get-one'; import { NotFoundException } from '@nestjs/common'; @@ -48,9 +45,9 @@ describe('get-one', () => { const query = getDefaultQuery(); if (!checkData) throw new Error('Result is null'); const result = await getOne.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, checkData.id, query); expect(JSON.stringify(result)).toBe(JSON.stringify(checkData)); @@ -79,9 +76,9 @@ describe('get-one', () => { manager: ['login'], }; const result = await getOne.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, checkData.id, query); expect(JSON.stringify(result)).toBe(JSON.stringify(checkData)); @@ -91,9 +88,9 @@ describe('get-one', () => { const query = getDefaultQuery(); try { await getOne.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, 1000, query); } catch (e) { expect(e).toBeInstanceOf(NotFoundException); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-one/get-one.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-one/get-one.ts similarity index 67% rename from libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-one/get-one.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-one/get-one.ts index 3e01eecb..f2c1e00c 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-one/get-one.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-one/get-one.ts @@ -1,20 +1,19 @@ import { NotFoundException } from '@nestjs/common'; -import { ObjectLiteral, ValidateQueryError } from '../../../../types'; -import { QueryOne } from '../../../mixin/zod'; +import { QueryOne, ValidateQueryError } from '@klerick/json-api-nestjs'; +import { wrap } from '@mikro-orm/core'; import { MicroOrmService } from '../../service'; -import { serialize, wrap } from '@mikro-orm/core'; -export async function getOne( - this: MicroOrmService, +export async function getOne( + this: MicroOrmService, id: number | string, - query: QueryOne + query: QueryOne ): Promise { const queryBuilder = this.microOrmUtilService.queryBuilder().where({ [this.microOrmUtilService.currentPrimaryColumn]: id, }); const resultItem = await this.microOrmUtilService - .prePareQueryBuilder(queryBuilder, query) + .prePareQueryBuilder(queryBuilder, query as any) .getSingleResult(); if (!resultItem) { diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-relationship/get-relationship.spec.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-relationship/get-relationship.spec.ts similarity index 69% rename from libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-relationship/get-relationship.spec.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-relationship/get-relationship.spec.ts index 4454590c..8cfb373f 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-relationship/get-relationship.spec.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-relationship/get-relationship.spec.ts @@ -1,10 +1,8 @@ -import { - Collection, - EntityManager, - MikroORM, - NotFoundError, -} from '@mikro-orm/core'; +import { Collection, EntityManager, MikroORM } from '@mikro-orm/core'; import { faker } from '@faker-js/faker'; +import { NotFoundException } from '@nestjs/common'; +import { ORM_SERVICE } from '@klerick/json-api-nestjs'; +import { RelationKeys } from '@klerick/json-api-nestjs-shared'; import { Addresses, @@ -17,17 +15,12 @@ import { Users, Comments, pullAddress, -} from '../../../../mock-utils/microrom'; +} from '../../mock-utils'; import { MicroOrmService } from '../../service'; -import { - CURRENT_ENTITY_MANAGER_TOKEN, - ORM_SERVICE, -} from '../../../../constants'; +import { CURRENT_ENTITY_MANAGER_TOKEN } from '../../constants'; import { getRelationship } from './get-relationship'; -import { NotFoundException } from '@nestjs/common'; -import { EntityRelation } from '../../../../utils/nestjs-shared'; describe('get-relationship', () => { let mikroORMUsers: MikroORM; @@ -36,11 +29,12 @@ describe('get-relationship', () => { let dbName: string; let addressForTest: Addresses; let addresses: Addresses; - let userGroup: UserGroups; + let userGroup: UserGroups | null; let notes: Collection; let roles: Collection; let comments: Collection; let userObject: Users; + let tmpUserObject: Users | undefined = undefined; let newUser: Users; beforeAll(async () => { dbName = dbRandomName(); @@ -74,8 +68,9 @@ describe('get-relationship', () => { if (!data) throw new Error(); - ({ roles, notes, userGroup, addresses, comments, ...userObject as any } = + ({ roles, notes, userGroup, addresses, comments, ...tmpUserObject as any } = data); + userObject = tmpUserObject as any; const firstName = faker.person.firstName(); const lastName = faker.person.lastName(); newUser = { @@ -107,25 +102,31 @@ describe('get-relationship', () => { it('should be ger result', async () => { const { addresses: addressesResult } = await getRelationship.call< - MicroOrmService, - Parameters>>, - ReturnType>> + MicroOrmService, + Parameters< + typeof getRelationship> + >, + ReturnType>> >(microOrmServiceUser, userObject.id, 'addresses'); expect(addressesResult.id).toBe(addresses.id); const { userGroup: userGroupResult } = await getRelationship.call< - MicroOrmService, - Parameters>>, - ReturnType>> + MicroOrmService, + Parameters< + typeof getRelationship> + >, + ReturnType>> >(microOrmServiceUser, userObject.id, 'userGroup'); - expect(userGroupResult.id).toBe(userGroup.id); + expect(userGroupResult?.id).toBe(userGroup?.id); const { roles: rolesResult } = await getRelationship.call< - MicroOrmService, - Parameters>>, - ReturnType>> + MicroOrmService, + Parameters< + typeof getRelationship> + >, + ReturnType>> >(microOrmServiceUser, userObject.id, 'roles'); for (const i of roles.map((i) => i.id)) { expect(rolesResult.map((i) => i.id)).toContain(i); @@ -135,9 +136,13 @@ describe('get-relationship', () => { it('should be error', async () => { await expect( getRelationship.call< - MicroOrmService, - Parameters>>, - ReturnType>> + MicroOrmService, + Parameters< + typeof getRelationship> + >, + ReturnType< + typeof getRelationship> + > >(microOrmServiceUser, '20000', 'roles') ).rejects.toThrow(NotFoundException); }); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-relationship/get-relationship.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-relationship/get-relationship.ts similarity index 70% rename from libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-relationship/get-relationship.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-relationship/get-relationship.ts index 09dbd99e..3f965b70 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-relationship/get-relationship.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-relationship/get-relationship.ts @@ -1,21 +1,22 @@ -import { EntityRelation } from '../../../../utils/nestjs-shared'; +import { RelationKeys } from '@klerick/json-api-nestjs-shared'; import { NotFoundException } from '@nestjs/common'; +import { ValidateQueryError } from '@klerick/json-api-nestjs'; +import { serialize } from '@mikro-orm/core'; import { MicroOrmService } from '../../service'; -import { ObjectLiteral, ValidateQueryError } from '../../../../types'; -import { serialize } from '@mikro-orm/core'; export async function getRelationship< - E extends ObjectLiteral, - Rel extends EntityRelation ->(this: MicroOrmService, id: number | string, rel: Rel): Promise { + E extends object, + IdKey extends string, + Rel extends RelationKeys +>(this: MicroOrmService, id: number | string, rel: Rel): Promise { const result = await this.microOrmUtilService .queryBuilder() .leftJoinAndSelect( `${this.microOrmUtilService.currentAlias}.${rel.toString()}`, rel.toString(), {}, - [this.microOrmUtilService.getPrimaryNameFor(rel)] + [this.microOrmUtilService.getPrimaryNameFor(rel as any)] ) .where({ [this.microOrmUtilService.currentPrimaryColumn]: id, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/index.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/index.ts similarity index 100% rename from libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/index.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/index.ts diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/patch-one/patch-one.spec.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/patch-one/patch-one.spec.ts similarity index 83% rename from libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/patch-one/patch-one.spec.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/patch-one/patch-one.spec.ts index 222ea525..539545d6 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/patch-one/patch-one.spec.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/patch-one/patch-one.spec.ts @@ -1,5 +1,6 @@ import { Collection, EntityManager, MikroORM } from '@mikro-orm/core'; import { faker } from '@faker-js/faker'; +import { ORM_SERVICE, PatchData } from '@klerick/json-api-nestjs'; import { Addresses, @@ -12,18 +13,14 @@ import { Users, Comments, pullAddress, -} from '../../../../mock-utils/microrom'; +} from '../../mock-utils'; import { MicroOrmService } from '../../service'; -import { - CURRENT_ENTITY_MANAGER_TOKEN, - ORM_SERVICE, -} from '../../../../constants'; +import { CURRENT_ENTITY_MANAGER_TOKEN } from '../../constants'; import { patchOne } from './patch-one'; import { - BadRequestException, NotFoundException, UnprocessableEntityException, } from '@nestjs/common'; @@ -35,11 +32,12 @@ describe('patch-one', () => { let dbName: string; let addresses: Addresses; let addressForTest: Addresses; - let userGroup: UserGroups; + let userGroup: UserGroups | null; let notes: Collection; let roles: Collection; let comments: Collection; let userObject: Users; + let tmpUserObject: Users | undefined = undefined; let newUser: Users; beforeAll(async () => { dbName = dbRandomName(); @@ -78,8 +76,9 @@ describe('patch-one', () => { .limit(1) .execute('get', true); - ({ roles, notes, userGroup, addresses, comments, ...userObject as any } = + ({ roles, notes, userGroup, addresses, comments, ...tmpUserObject as any } = data); + userObject = tmpUserObject as any; const firstName = faker.person.firstName(); const lastName = faker.person.lastName(); newUser = { @@ -122,9 +121,9 @@ describe('patch-one', () => { } = newUser; const result = await patchOne.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, userObject.id, { id: userObject.id.toString(), attributes: otherAttr, @@ -164,11 +163,7 @@ describe('patch-one', () => { .limit(2, 5) .getResult(); - const result = await patchOne.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, userObject.id, { + const patchData = { id: userObject.id.toString(), attributes: otherAttr, type: 'users', @@ -189,7 +184,13 @@ describe('patch-one', () => { data: setRoles.map((i) => ({ id: i.id.toString(), type: 'roles' })), }, }, - }); + } satisfies PatchData; + + const result = await patchOne.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, userObject.id, patchData as any); const fromDb = await microOrmServiceUser.microOrmUtilService .queryBuilder() @@ -210,23 +211,23 @@ describe('patch-one', () => { it('should be error', async () => { await expect( patchOne.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, 1, { attributes: {}, type: 'users', - }) + } as any) ).rejects.toThrow(UnprocessableEntityException); await expect( patchOne.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, 10000, { id: '10000', - attributes: {}, + attributes: {} as any, type: 'users', }) ).rejects.toThrow(NotFoundException); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/patch-one/patch-one.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/patch-one/patch-one.ts similarity index 78% rename from libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/patch-one/patch-one.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/patch-one/patch-one.ts index 3897f3c9..ec92a9a3 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/patch-one/patch-one.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/patch-one/patch-one.ts @@ -2,15 +2,14 @@ import { NotFoundException, UnprocessableEntityException, } from '@nestjs/common'; -import { ObjectTyped } from '../../../../utils/nestjs-shared'; -import { ObjectLiteral, ValidateQueryError } from '../../../../types'; +import { ObjectTyped } from '@klerick/json-api-nestjs-shared'; +import { PatchData, ValidateQueryError } from '@klerick/json-api-nestjs'; import { MicroOrmService } from '../../service'; -import { PatchData } from '../../../mixin/zod'; -export async function patchOne( - this: MicroOrmService, +export async function patchOne( + this: MicroOrmService, id: number | string, - inputData: PatchData + inputData: PatchData ): Promise { const { id: idBody, attributes, relationships } = inputData; @@ -45,8 +44,8 @@ export async function patchOne( for (const [props, val] of ObjectTyped.entries(attrTarget)) { if (!(props in attributes)) continue; - existEntity[props] = val; + Reflect.set(existEntity, props, val); } } - return this.microOrmUtilService.saveEntity(existEntity, relationships); + return this.microOrmUtilService.saveEntity(existEntity, relationships as any); } diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/patch-relationship/patch-relationship.spec.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/patch-relationship/patch-relationship.spec.ts similarity index 82% rename from libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/patch-relationship/patch-relationship.spec.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/patch-relationship/patch-relationship.spec.ts index 5018a6b2..32caa80c 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/patch-relationship/patch-relationship.spec.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/patch-relationship/patch-relationship.spec.ts @@ -1,6 +1,7 @@ import { Collection, EntityManager, MikroORM } from '@mikro-orm/core'; import { faker } from '@faker-js/faker'; - +import { ORM_SERVICE } from '@klerick/json-api-nestjs'; +import { RelationKeys } from '@klerick/json-api-nestjs-shared'; import { Addresses, dbRandomName, @@ -12,16 +13,12 @@ import { Users, Comments, pullAddress, -} from '../../../../mock-utils/microrom'; +} from '../../mock-utils'; import { MicroOrmService } from '../../service'; -import { - CURRENT_ENTITY_MANAGER_TOKEN, - ORM_SERVICE, -} from '../../../../constants'; +import { CURRENT_ENTITY_MANAGER_TOKEN } from '../../constants'; import { patchRelationship } from './patch-relationship'; -import { EntityRelation } from '../../../../utils/nestjs-shared'; describe('patch-relationship', () => { let mikroORMUsers: MikroORM; @@ -95,9 +92,13 @@ describe('patch-relationship', () => { const userGroup1 = faker.helpers.arrayElement(userGroup); const saveIdUserGroup = userGroup1.id; await patchRelationship.call< - MicroOrmService, - Parameters>>, - ReturnType>> + MicroOrmService, + Parameters< + typeof patchRelationship> + >, + ReturnType< + typeof patchRelationship> + > >(microOrmServiceUser, userObject.id, 'roles', [ { type: 'roles', id: roles1.id.toString() }, { type: 'roles', id: roles2.id.toString() }, @@ -105,9 +106,13 @@ describe('patch-relationship', () => { ]); await patchRelationship.call< - MicroOrmService, - Parameters>>, - ReturnType>> + MicroOrmService, + Parameters< + typeof patchRelationship> + >, + ReturnType< + typeof patchRelationship> + > >(microOrmServiceUser, userObject.id, 'userGroup', { type: 'user-groups', id: saveIdUserGroup.toString(), @@ -129,6 +134,6 @@ describe('patch-relationship', () => { expect(checkData?.roles.map((i) => i.id)).toHaveLength( [roles1.id, roles2.id, roles3.id].length ); - expect(checkData?.userGroup.id).toBe(saveIdUserGroup); + expect(checkData?.userGroup?.id).toBe(saveIdUserGroup); }); }); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/patch-relationship/patch-relationship.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/patch-relationship/patch-relationship.ts similarity index 71% rename from libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/patch-relationship/patch-relationship.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/patch-relationship/patch-relationship.ts index 38074d38..b207350c 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/patch-relationship/patch-relationship.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/patch-relationship/patch-relationship.ts @@ -1,24 +1,20 @@ -import { EntityRelation } from '../../../../utils/nestjs-shared'; - -import { ObjectLiteral } from '../../../../types'; -import { - PatchRelationshipData, - PostRelationshipData, -} from '../../../mixin/zod'; +import { RelationKeys } from '@klerick/json-api-nestjs-shared'; +import { PatchRelationshipData } from '@klerick/json-api-nestjs'; import { getRelationship } from '../get-relationship/get-relationship'; import { MicroOrmService } from '../../service'; export async function patchRelationship< - E extends ObjectLiteral, - Rel extends EntityRelation + E extends object, + IdKey extends string, + Rel extends RelationKeys >( - this: MicroOrmService, + this: MicroOrmService, id: number | string, rel: Rel, input: PatchRelationshipData ): Promise { const idsResult = await this.microOrmUtilService.validateRelationInputData( - rel, + rel as any, input ); const currentEntityRef = this.microOrmUtilService.entityManager.getReference( @@ -32,7 +28,9 @@ export async function patchRelationship< const relRef = idsResult.map((i) => this.microOrmUtilService.entityManager.getReference(relEntity, i as any) ); + // @ts-ignore currentEntityRef[rel].removeAll(); + // @ts-ignore currentEntityRef[rel].add(...relRef); } else { // @ts-ignore @@ -45,8 +43,8 @@ export async function patchRelationship< await this.microOrmUtilService.entityManager.flush(); return getRelationship.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(this, id, rel); } diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/post-one/post-one.spec.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/post-one/post-one.spec.ts similarity index 83% rename from libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/post-one/post-one.spec.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/post-one/post-one.spec.ts index 9132f0d6..77c158c1 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/post-one/post-one.spec.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/post-one/post-one.spec.ts @@ -1,5 +1,7 @@ import { Collection, EntityManager, MikroORM } from '@mikro-orm/core'; import { faker } from '@faker-js/faker'; +import { BadRequestException } from '@nestjs/common'; +import { ORM_SERVICE, PostData } from '@klerick/json-api-nestjs'; import { Addresses, @@ -12,16 +14,12 @@ import { Users, Comments, pullAddress, -} from '../../../../mock-utils/microrom'; +} from '../../mock-utils'; import { MicroOrmService } from '../../service'; -import { - CURRENT_ENTITY_MANAGER_TOKEN, - ORM_SERVICE, -} from '../../../../constants'; +import { CURRENT_ENTITY_MANAGER_TOKEN } from '../../constants'; import { postOne } from './post-one'; -import { BadRequestException } from '@nestjs/common'; describe('post-one', () => { let mikroORMUsers: MikroORM; @@ -30,11 +28,12 @@ describe('post-one', () => { let dbName: string; let addressForTest: Addresses; let addresses: Addresses; - let userGroup: UserGroups; + let userGroup: UserGroups | null; let notes: Collection; let roles: Collection; let comments: Collection; let userObject: Users; + let tmpUserObject: Users | undefined = undefined; let newUser: Users; beforeAll(async () => { dbName = dbRandomName(); @@ -73,8 +72,9 @@ describe('post-one', () => { .limit(1) .execute('get', true); - ({ roles, notes, userGroup, addresses, comments, ...userObject as any } = + ({ roles, notes, userGroup, addresses, comments, ...tmpUserObject as any } = data); + userObject = tmpUserObject as any; const firstName = faker.person.firstName(); const lastName = faker.person.lastName(); newUser = { @@ -117,9 +117,9 @@ describe('post-one', () => { } = newUser; const result = await postOne.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, { attributes: otherAttr, type: 'users', @@ -156,9 +156,9 @@ describe('post-one', () => { } = newUser; const result = await postOne.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, { id: id.toString(), attributes: otherAttr, @@ -196,11 +196,7 @@ describe('post-one', () => { ...otherAttr } = newUser; - const result = await postOne.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, { + const postData = { attributes: otherAttr, type: 'users', relationships: { @@ -229,10 +225,12 @@ describe('post-one', () => { })), }, userGroup: { - data: { - id: userGroup.id.toString(), - type: 'user-groups', - }, + data: userGroup + ? { + id: userGroup.id.toString(), + type: 'user-groups', + } + : null, }, manager: { data: { @@ -241,7 +239,13 @@ describe('post-one', () => { }, }, }, - }); + } satisfies PostData; + + const result = await postOne.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, postData as any); const { id: newId } = result; @@ -275,9 +279,9 @@ describe('post-one', () => { await expect( postOne.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, { attributes: otherAttr, type: 'users', @@ -288,15 +292,15 @@ describe('post-one', () => { type: 'addresses', }, }, - }, + } as any, }) ).rejects.toThrow(BadRequestException); await expect( postOne.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, { attributes: otherAttr, type: 'users', @@ -310,19 +314,18 @@ describe('post-one', () => { ], }, }, - }) + } as any) ).rejects.toThrow(BadRequestException); await expect( postOne.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(microOrmServiceUser, { attributes: otherAttr, type: 'users', relationships: { - // @ts-expect-error check run time error incorrectRel: { data: [ { @@ -332,7 +335,7 @@ describe('post-one', () => { ], }, }, - }) + } as any) ).rejects.toThrow(BadRequestException); }); }); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/post-one/post-one.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/post-one/post-one.ts similarity index 68% rename from libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/post-one/post-one.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/post-one/post-one.ts index 239733c6..8f593510 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/post-one/post-one.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/post-one/post-one.ts @@ -1,10 +1,9 @@ -import { ObjectLiteral } from '../../../../types'; +import { PostData } from '@klerick/json-api-nestjs'; import { MicroOrmService } from '../../service'; -import { PostData } from '../../../mixin/zod'; -export async function postOne( - this: MicroOrmService, - inputData: PostData +export async function postOne( + this: MicroOrmService, + inputData: PostData ): Promise { const { attributes, relationships, id } = inputData; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/post-relationship/post-relationship.spec.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/post-relationship/post-relationship.spec.ts similarity index 78% rename from libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/post-relationship/post-relationship.spec.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/post-relationship/post-relationship.spec.ts index 2444afa3..b97fbfc6 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/post-relationship/post-relationship.spec.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/post-relationship/post-relationship.spec.ts @@ -1,6 +1,7 @@ import { Collection, EntityManager, MikroORM } from '@mikro-orm/core'; import { faker } from '@faker-js/faker'; - +import { ORM_SERVICE } from '@klerick/json-api-nestjs'; +import { RelationKeys } from '@klerick/json-api-nestjs-shared'; import { Addresses, dbRandomName, @@ -12,17 +13,12 @@ import { Users, Comments, pullAddress, -} from '../../../../mock-utils/microrom'; +} from '../../mock-utils'; import { MicroOrmService } from '../../service'; -import { - CURRENT_ENTITY_MANAGER_TOKEN, - ORM_SERVICE, -} from '../../../../constants'; +import { CURRENT_ENTITY_MANAGER_TOKEN } from '../../constants'; import { postRelationship } from './post-relationship'; -import { BadRequestException } from '@nestjs/common'; -import { EntityRelation } from '../../../../utils/nestjs-shared'; describe('post-relationshipa', () => { let mikroORMUsers: MikroORM; @@ -85,14 +81,11 @@ describe('post-relationshipa', () => { jest.restoreAllMocks(); }); - afterAll(() => { - mikroORMUsers.close(true); - }); + afterAll(() => mikroORMUsers.close(true)); it('should be ok', async () => { - const roles1 = faker.helpers.arrayElement(roles); - const roles2 = faker.helpers.arrayElement(roles); - const roles3 = faker.helpers.arrayElement(roles); + const [roles1, roles2, roles3] = faker.helpers.arrayElements(roles, 3); + const userGroup1 = faker.helpers.arrayElement(userGroup); const saveIdUserGroup = userGroup1.id; @@ -108,9 +101,13 @@ describe('post-relationshipa', () => { const saveRolesIds = checkDataBefore?.roles.map((i) => i.id) || []; await postRelationship.call< - MicroOrmService, - Parameters>>, - ReturnType>> + MicroOrmService, + Parameters< + typeof postRelationship> + >, + ReturnType< + typeof postRelationship> + > >(microOrmServiceUser, userObject.id, 'roles', [ { type: 'roles', id: roles1.id.toString() }, { type: 'roles', id: roles2.id.toString() }, @@ -118,9 +115,13 @@ describe('post-relationshipa', () => { ]); await postRelationship.call< - MicroOrmService, - Parameters>>, - ReturnType>> + MicroOrmService, + Parameters< + typeof postRelationship> + >, + ReturnType< + typeof postRelationship> + > >(microOrmServiceUser, userObject.id, 'userGroup', { type: 'user-groups', id: saveIdUserGroup.toString(), @@ -135,13 +136,16 @@ describe('post-relationshipa', () => { }) .getSingleResult(); + const newRolesId = [roles1.id, roles2.id, roles3.id].filter( + (i) => !saveRolesIds.includes(i) + ); expect(checkData?.roles.map((i) => i.id)).toEqual( expect.arrayContaining([roles1.id, roles2.id, roles3.id]) ); expect(checkData?.roles.map((i) => i.id)).toHaveLength( - [roles1.id, roles2.id, roles3.id].length + saveRolesIds.length + newRolesId.length + saveRolesIds.length ); - expect(checkData?.userGroup.id).toBe(saveIdUserGroup); + expect(checkData?.userGroup?.id).toBe(saveIdUserGroup); }); }); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/post-relationship/post-relationship.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/post-relationship/post-relationship.ts similarity index 71% rename from libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/post-relationship/post-relationship.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/post-relationship/post-relationship.ts index 77e8edcb..6bc62197 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/post-relationship/post-relationship.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/post-relationship/post-relationship.ts @@ -1,21 +1,20 @@ -import { EntityRelation } from '../../../../utils/nestjs-shared'; - -import { ObjectLiteral } from '../../../../types'; -import { PostRelationshipData } from '../../../mixin/zod'; +import { RelationKeys } from '@klerick/json-api-nestjs-shared'; +import { PostRelationshipData } from '@klerick/json-api-nestjs'; import { getRelationship } from '../get-relationship/get-relationship'; import { MicroOrmService } from '../../service'; export async function postRelationship< - E extends ObjectLiteral, - Rel extends EntityRelation + E extends object, + IdKey extends string, + Rel extends RelationKeys >( - this: MicroOrmService, + this: MicroOrmService, id: number | string, rel: Rel, input: PostRelationshipData ): Promise { const idsResult = await this.microOrmUtilService.validateRelationInputData( - rel, + rel as any, input ); @@ -30,6 +29,7 @@ export async function postRelationship< const relRef = idsResult.map((i) => this.microOrmUtilService.entityManager.getReference(relEntity, i as any) ); + // @ts-ignore currentEntityRef[rel].add(...relRef); } else { // @ts-ignore @@ -42,8 +42,8 @@ export async function postRelationship< await this.microOrmUtilService.entityManager.flush(); return getRelationship.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(this, id, rel); } diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/service/index.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/service/index.ts similarity index 100% rename from libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/service/index.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/service/index.ts diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/service/micro-orm-util.service.spec.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/service/micro-orm-util.service.spec.ts similarity index 98% rename from libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/service/micro-orm-util.service.spec.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/service/micro-orm-util.service.spec.ts index 49af1af9..4c146c32 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/service/micro-orm-util.service.spec.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/service/micro-orm-util.service.spec.ts @@ -1,5 +1,5 @@ -import { FilterOperand } from '../../../utils/nestjs-shared'; import { MikroORM, RawQueryFragment } from '@mikro-orm/core'; +import { FilterOperand } from '@klerick/json-api-nestjs-shared'; import { TestingModule } from '@nestjs/testing/testing-module'; import { MicroOrmUtilService } from './micro-orm-util.service'; @@ -11,7 +11,7 @@ import { Roles, UserGroups, Users, -} from '../../../mock-utils/microrom'; +} from '../mock-utils'; describe('MicroOrmUtilService', () => { let mikroORMUserGroup: MikroORM; @@ -154,7 +154,7 @@ describe('MicroOrmUtilService', () => { [arrayField]: { [FilterOperand.some]: otherFiledValue1, }, - }; + } as any; const [ id, @@ -185,7 +185,7 @@ describe('MicroOrmUtilService', () => { [otherFiled]: { ['$' + FilterOperand.in]: otherFiledValue1, ['$' + FilterOperand.nin]: otherFiledValue1, - ['$' + FilterOperand.like]: otherFiledValue2, + ['$ilike']: `%${otherFiledValue2}%`, ['$' + FilterOperand.gt]: otherFiledValue3, }, }); @@ -373,7 +373,7 @@ describe('MicroOrmUtilService', () => { [FilterOperand.eq]: 'test', }, }, - }; + } as any; const [comments, userGroup] = microOrmUtilsServiceUsers.getFilterExpressionForRelation(query); @@ -414,7 +414,7 @@ describe('MicroOrmUtilService', () => { [FilterOperand.eq]: 'test', }, }, - }; + } as any; const [comments, userGroup] = microOrmUtilsServiceUsers.getFilterExpressionForRelation(query); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/service/micro-orm-util.service.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/service/micro-orm-util.service.ts similarity index 88% rename from libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/service/micro-orm-util.service.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/service/micro-orm-util.service.ts index 3401d88d..20a9a0ea 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/service/micro-orm-util.service.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/service/micro-orm-util.service.ts @@ -24,30 +24,44 @@ import { type Field, } from '@mikro-orm/knex'; import { - camelToKebab, - EntityRelation, + ASC, + CURRENT_ENTITY, + ValidateQueryError, + Query, + QueryOne, + Relationships, +} from '@klerick/json-api-nestjs'; +import { + RelationKeys, FilterOperand, ObjectTyped, -} from '../../../utils/nestjs-shared'; - +} from '@klerick/json-api-nestjs-shared'; +import { kebabCase } from 'change-case-commonjs'; import { - ASC, - CURRENT_ENTITY, CURRENT_ENTITY_MANAGER_TOKEN, CURRENT_ENTITY_REPOSITORY, -} from '../../../constants'; +} from '../constants'; -import { ObjectLiteral, ValidateQueryError } from '../../../types'; -import { Query, QueryOne, Relationships } from '../../mixin/zod'; -import { In } from 'typeorm'; -import { TupleOfEntityRelation } from '../../mixin/types'; -import { InputValidateData, ValidateReturn } from '../../type-orm/service'; +export type InputValidateData = { + type: string; + id: string; +}; -type RelationshipsResult = { - [K in EntityRelation]: E[K] extends Collection ? E[K] : E[K] | null; +export type ValidateReturn = T extends unknown[] + ? string[] + : T extends null + ? null + : string; + +type RelationshipsResult = { + [K in RelationKeys]: E[K] extends object + ? E[K] extends Collection + ? E[K] + : E[K] | null + : never; }; -function isRelationField( +function isRelationField( relationField: string[], field: any ): asserts field is EntityKey { @@ -61,6 +75,13 @@ function isRelationField( throw new BadRequestException([error]); } + +function isCollectionField( + targetInstance: any +): targetInstance is Collection { + return targetInstance instanceof Collection; +} + const getErrorObject = ( props: string, message: string @@ -71,7 +92,10 @@ const getErrorObject = ( }); Injectable(); -export class MicroOrmUtilService { +export class MicroOrmUtilService< + E extends object, + IdKey extends string = 'id' +> { @Inject(CURRENT_ENTITY_MANAGER_TOKEN) public readonly entityManager!: SqlEntityManager; @Inject(CURRENT_ENTITY_REPOSITORY) @@ -169,18 +193,18 @@ export class MicroOrmUtilService { .getEntityName(); } - queryBuilder( + queryBuilder( entity: EntityClass, alias: string ): QueryBuilder; - queryBuilder( + queryBuilder( entity: EntityClass ): QueryBuilder; - queryBuilder( + queryBuilder( alias: string ): QueryBuilder; - queryBuilder(): QueryBuilder; - queryBuilder( + queryBuilder(): QueryBuilder; + queryBuilder( ...arg: | [entity: EntityClass, alias: string] | [entity: EntityClass] @@ -212,8 +236,8 @@ export class MicroOrmUtilService { ); } - getFilterExpressionForTarget( - query: Query + getFilterExpressionForTarget( + query: Query ): QBFilterQuery[] { const result: QBFilterQuery[] = []; const filterTarget = this.getFilterObject(query, 'target'); @@ -228,8 +252,12 @@ export class MicroOrmUtilService { [tmpField]: {}, }; let subQueryExpression: QBFilterQuery | undefined; - for (const entries of ObjectTyped.entries(filter)) { - const [operand, value] = entries as [FilterOperand, string]; + + for (const entries of ObjectTyped.entries(filter as any)) { + const [operand, valueInput] = entries as [FilterOperand, string]; + + const value = + operand === FilterOperand.like ? `%${valueInput}%` : valueInput; if (!this.relationsName.includes(tmpField)) { const operandForMiroOrmResult = this.extractedResultOperand(operand); @@ -247,7 +275,7 @@ export class MicroOrmUtilService { break; } - if (include && include.includes(tmpField)) { + if (include && include.includes(tmpField as any)) { filterObject[tmpField.toString()]['$exists'] = operand === FilterOperand.ne; break; @@ -272,14 +300,14 @@ export class MicroOrmUtilService { return result; } - getConditionalForJoin( - query: Query, + getConditionalForJoin( + query: Query, key: string ): QBFilterQuery { const filterRelation = this.getFilterObject(query, 'relation'); if (!filterRelation) return {}; - if (!(key in filterRelation)) return {}; + if (!(key in (filterRelation as object))) return {}; for (const [key, reletionConditional] of ObjectTyped.entries( filterRelation @@ -305,6 +333,13 @@ export class MicroOrmUtilService { } private extractedResultOperand(operand: FilterOperand) { + if ( + operand === FilterOperand.like && + this.entityManager.getDriver().constructor.name === 'PostgreSqlDriver' + ) { + return '$ilike'; + } + return operand === 'regexp' ? '$re' : operand === 'some' @@ -312,8 +347,8 @@ export class MicroOrmUtilService { : (('$' + operand) as `$${FilterOperand}`); } - getFilterExpressionForRelation( - query: Query + getFilterExpressionForRelation( + query: Query ): QBFilterQuery[] { const result: QBFilterQuery[] = []; const filterRelation = this.getFilterObject(query, 'relation'); @@ -401,13 +436,13 @@ export class MicroOrmUtilService { prePareQueryBuilder( queryBuilder: QueryBuilder, - query: Query | QueryOne + query: Query | QueryOne ): QueryBuilder { const { fields, include } = query; const relationFields: Record = {}; if (fields) { - const { target, ...relations } = fields; + const { target, ...relations } = fields as any; Object.assign(relationFields, relations); if (target) { if (!target.includes(this.currentPrimaryColumn)) { @@ -430,7 +465,7 @@ export class MicroOrmUtilService { const mainAlias = this.currentAlias; const condition: QBFilterQuery = this.getConditionalForJoin( - query as Query, + query as Query, item ); @@ -454,7 +489,7 @@ export class MicroOrmUtilService { return queryBuilder; } - getPrimaryNameFor(rel: EntityRelation) { + getPrimaryNameFor(rel: RelationKeys) { const relationEntity = this.getRelation( rel as unknown as EntityKey ).entity() as EntityClass; @@ -462,13 +497,13 @@ export class MicroOrmUtilService { .name; } - private getFilterObject( - query: Query, + private getFilterObject( + query: Query, filterType: 'target' | 'relation' ) { const { filter } = query; if (!filter) return null; - return filter[filterType]; + return Reflect.get(filter, filterType); } private getSubQueryForRelation(propsName: EntityKey) { @@ -533,7 +568,7 @@ export class MicroOrmUtilService { } private async *asyncIterateFindRelationships( - relationships: NonNullable> + relationships: NonNullable> ): AsyncGenerator> { for (const entries of ObjectTyped.entries(relationships)) { const [props, dataItem] = entries; @@ -541,7 +576,7 @@ export class MicroOrmUtilService { const propsKey = props as unknown as EntityKey; if (dataItem === undefined) continue; - const { data } = dataItem; + const data = Reflect.get(dataItem as object, 'data'); if (data === undefined) continue; if (data === null) { yield { [props]: null } as RelationshipsResult; @@ -605,7 +640,7 @@ export class MicroOrmUtilService { async saveEntity( targetInstance: E, - relationships?: Relationships + relationships?: Relationships ): Promise { if (relationships) { for await (const item of this.asyncIterateFindRelationships( @@ -615,9 +650,9 @@ export class MicroOrmUtilService { if (!itemProps) continue; const [nameProps, data] = itemProps; - if ((targetInstance[nameProps] as any) instanceof Collection) { + if (isCollectionField(targetInstance[nameProps])) { targetInstance[nameProps].removeAll(); - targetInstance[nameProps].add(...(data as [])); + targetInstance[nameProps].add(data as []); } else { Object.assign(targetInstance, item); } @@ -630,19 +665,19 @@ export class MicroOrmUtilService { } async validateRelationInputData< - Rel extends EntityRelation, + Rel extends RelationKeys, In extends InputValidateData | InputValidateData[] >(rel: Rel, inputData: In): Promise>; async validateRelationInputData< - Rel extends EntityRelation, + Rel extends RelationKeys, In extends InputValidateData | InputValidateData[] >(rel: Rel, inputData: In): Promise>; async validateRelationInputData< - Rel extends EntityRelation, + Rel extends RelationKeys, In extends null | InputValidateData | InputValidateData[] >(rel: Rel, inputData: In): Promise>; async validateRelationInputData< - Rel extends EntityRelation, + Rel extends RelationKeys, In extends null | InputValidateData | InputValidateData[] >(rel: Rel, inputData: In): Promise> { const property = Reflect.get(this.metadata.properties, rel); @@ -687,12 +722,14 @@ export class MicroOrmUtilService { return result as ValidateReturn; } - const prepareData = isArray ? inputData : [inputData]; + const prepareData = ( + isArray ? inputData : [inputData] + ) as InputValidateData[]; const errors: ValidateQueryError[] = []; let i = 0; const relationEntity = this.getRelation(rel as any).entity(); - const typeName = camelToKebab( + const typeName = kebabCase( this.entityManager.getMetadata().get(relationEntity).className ); @@ -728,7 +765,8 @@ export class MicroOrmUtilService { } const resulDataMap = checkResult.reduce((acum, item) => { - acum[item[this.getPrimaryNameFor(rel)]] = true; + const idValue = (item[this.getPrimaryNameFor(rel)] || 'empty').toString(); + acum[idValue] = true; return acum; }, {} as Record); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/service/microorm-service.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/service/microorm-service.ts similarity index 53% rename from libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/service/microorm-service.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/service/microorm-service.ts index 2cf332fe..37e1ee96 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/service/microorm-service.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/service/microorm-service.ts @@ -1,21 +1,19 @@ +import { Inject } from '@nestjs/common'; import { - EntityRelation, QueryField, ResourceObject, ResourceObjectRelationships, -} from '../../../utils/nestjs-shared'; -import { Inject } from '@nestjs/common'; - -import { ObjectLiteral } from '../../../types'; -import { OrmService } from '../../mixin/types'; +} from '@klerick/json-api-nestjs-shared'; import { + JsonApiTransformerService, + OrmService, PatchData, PatchRelationshipData, PostData, PostRelationshipData, Query, QueryOne, -} from '../../mixin/zod'; +} from '@klerick/json-api-nestjs'; import { getAll, @@ -29,19 +27,26 @@ import { postRelationship, } from '../orm-methods'; import { MicroOrmUtilService } from './micro-orm-util.service'; -import { JsonApiTransformerService } from '../../mixin/service/json-api-transformer.service'; - -export class MicroOrmService implements OrmService { - @Inject(MicroOrmUtilService) microOrmUtilService!: MicroOrmUtilService; +import { RelationKeys } from '@klerick/json-api-nestjs-shared'; + +export class MicroOrmService + implements OrmService +{ + @Inject(MicroOrmUtilService) microOrmUtilService!: MicroOrmUtilService< + E, + IdKey + >; @Inject(JsonApiTransformerService) - jsonApiTransformerService!: JsonApiTransformerService; + jsonApiTransformerService!: JsonApiTransformerService; - async getAll(query: Query): Promise> { + async getAll( + query: Query + ): Promise> { const { page } = query; const { totalItems, items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(this, query); const { data, included } = this.jsonApiTransformerService.transformData( @@ -64,12 +69,12 @@ export class MicroOrmService implements OrmService { async getOne( id: number | string, - query: QueryOne - ): Promise> { + query: QueryOne + ): Promise> { const result = await getOne.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(this, id, query); const { data, included } = this.jsonApiTransformerService.transformData( result, @@ -84,30 +89,36 @@ export class MicroOrmService implements OrmService { async deleteOne(id: number | string): Promise { await deleteOne.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(this, id); } - async postOne(inputData: PostData): Promise> { + async postOne( + inputData: PostData + ): Promise> { const result = await postOne.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(this, inputData); const { relationships } = inputData; - const fakeQuery: Query = { + const fakeQuery: Query = { [QueryField.fields]: null, [QueryField.include]: Object.keys(relationships || {}), } as any; const resultForResponse = await getOne.call< - MicroOrmService, - Parameters>, - ReturnType> - >(this, result[this.microOrmUtilService.currentPrimaryColumn], fakeQuery); + MicroOrmService, + Parameters>, + ReturnType> + >( + this, + result[this.microOrmUtilService.currentPrimaryColumn] as any, + fakeQuery + ); const { data, included } = this.jsonApiTransformerService.transformData( resultForResponse, @@ -122,24 +133,24 @@ export class MicroOrmService implements OrmService { } async patchOne( id: number | string, - inputData: PatchData - ): Promise> { + inputData: PatchData + ): Promise> { await patchOne.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(this, id, inputData); const { relationships } = inputData; - const fakeQuery: Query = { + const fakeQuery: Query = { [QueryField.fields]: null, [QueryField.include]: Object.keys(relationships || {}), } as any; const resultForResponse = await getOne.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(this, id, fakeQuery); const { data, included } = this.jsonApiTransformerService.transformData( @@ -154,14 +165,14 @@ export class MicroOrmService implements OrmService { }; } - async getRelationship>( + async getRelationship>( id: number | string, rel: Rel - ): Promise> { + ): Promise> { const result = await getRelationship.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(this, id, rel); return { @@ -170,27 +181,27 @@ export class MicroOrmService implements OrmService { }; } - async deleteRelationship>( + async deleteRelationship>( id: number | string, rel: Rel, input: PostRelationshipData ): Promise { await deleteRelationship.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(this, id, rel, input); } - async postRelationship>( + async postRelationship>( id: number | string, rel: Rel, input: PostRelationshipData - ): Promise> { + ): Promise> { const result = await postRelationship.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(this, id, rel, input); return { @@ -199,15 +210,15 @@ export class MicroOrmService implements OrmService { }; } - async patchRelationship>( + async patchRelationship>( id: number | string, rel: Rel, input: PatchRelationshipData - ): Promise> { + ): Promise> { const result = await patchRelationship.call< - MicroOrmService, - Parameters>, - ReturnType> + MicroOrmService, + Parameters>, + ReturnType> >(this, id, rel, input); return { diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/type.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/type.ts similarity index 100% rename from libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/type.ts rename to libs/json-api/json-api-nestjs-microorm/src/lib/type.ts diff --git a/libs/json-api/json-api-nestjs-microorm/tsconfig.json b/libs/json-api/json-api-nestjs-microorm/tsconfig.json new file mode 100644 index 00000000..86622aca --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/tsconfig.json @@ -0,0 +1,23 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "module": "commonjs", + "forceConsistentCasingInFileNames": true, + "strict": true, + "importHelpers": true, + "noImplicitOverride": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "noPropertyAccessFromIndexSignature": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/libs/json-api/json-api-nestjs-microorm/tsconfig.lib.json b/libs/json-api/json-api-nestjs-microorm/tsconfig.lib.json new file mode 100644 index 00000000..dbf54fd7 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/tsconfig.lib.json @@ -0,0 +1,16 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../dist/out-tsc", + "declaration": true, + "types": ["node"], + "target": "es2021", + "strictNullChecks": true, + "noImplicitAny": true, + "strictBindCallApply": true, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src/**/*.ts"], + "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"] +} diff --git a/libs/json-api/json-api-nestjs-microorm/tsconfig.spec.json b/libs/json-api/json-api-nestjs-microorm/tsconfig.spec.json new file mode 100644 index 00000000..0e95750a --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/tsconfig.spec.json @@ -0,0 +1,27 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../dist/out-tsc", + "module": "commonjs", + "moduleResolution": "node10", + "types": [ + "jest", + "node" + ], + "paths": { + "@klerick/json-api-nestjs-shared": [ + "libs/json-api/json-api-nestjs-shared/src/index.ts" + ], + "@klerick/json-api-nestjs": [ + "libs/json-api/json-api-nestjs/src/index.ts" + ] + }, + "allowJs": true + }, + "include": [ + "jest.config.ts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} diff --git a/libs/json-api/json-api-nestjs-sdk/.eslintrc.json b/libs/json-api/json-api-nestjs-sdk/.eslintrc.json index fae1b244..0af28030 100644 --- a/libs/json-api/json-api-nestjs-sdk/.eslintrc.json +++ b/libs/json-api/json-api-nestjs-sdk/.eslintrc.json @@ -1,6 +1,6 @@ { - "extends": ["../../../.eslintrc.json"], - "ignorePatterns": ["!**/*", "**/*.spec.ts"], + "extends": ["../../../.eslintrc.base.json"], + "ignorePatterns": ["!**/*"], "overrides": [ { "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], @@ -18,13 +18,12 @@ "files": ["*.json"], "parser": "jsonc-eslint-parser", "rules": { - "@nx/dependency-checks": "error" - } - }, - { - "files": ["*.ts"], - "rules": { - "@angular-eslint/prefer-standalone": "off" + "@nx/dependency-checks": [ + "error", + { + "ignoredFiles": ["{projectRoot}/eslint.config.{js,cjs,mjs}"] + } + ] } } ] diff --git a/libs/json-api/json-api-nestjs-sdk/jest.config.ts b/libs/json-api/json-api-nestjs-sdk/jest.config.ts index ccd15445..167a2eaa 100644 --- a/libs/json-api/json-api-nestjs-sdk/jest.config.ts +++ b/libs/json-api/json-api-nestjs-sdk/jest.config.ts @@ -1,4 +1,3 @@ -/* eslint-disable */ export default { displayName: 'json-api-nestjs-sdk', preset: '../../../jest.preset.js', diff --git a/libs/json-api/json-api-nestjs-sdk/ng-package.json b/libs/json-api/json-api-nestjs-sdk/ng-package.json deleted file mode 100644 index cb77cf59..00000000 --- a/libs/json-api/json-api-nestjs-sdk/ng-package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", - "dest": "../../../tmp/angular-lib/ngModule", - "lib": { - "entryFile": "../../index.ts" - } -} diff --git a/libs/json-api/json-api-nestjs-sdk/package.json b/libs/json-api/json-api-nestjs-sdk/package.json index 0d4e14c1..8963af37 100644 --- a/libs/json-api/json-api-nestjs-sdk/package.json +++ b/libs/json-api/json-api-nestjs-sdk/package.json @@ -1,39 +1,46 @@ { - "name": "json-api-nestjs-sdk", + "name": "@klerick/json-api-nestjs-sdk", "version": "9.0.0", - "engines": { - "node": ">= 16.0.0" - }, "description": "Helper for client JsonAPi Plugin for NestJs", - "contributors": [ - { - "email": "klerick666@gmain.com", - "name": "Aleksandr Kharkovey" - } - ], - "repository": { - "type": "git", - "url": "https://github.com/klerick/nestjs-json-api.git" - }, - "private": false, - "license": "MIT", - "main": "./src/index.js", - "files": [ - "**/*" - ], "keywords": [ "nestjs", "nest", "jsonapi", "json-api", "typeorm", + "microorm", "CRUD" ], - "peerDependencies": { - "@angular/common": ">=19.0.0 <20.0.0", - "@angular/core": ">=19.0.0 <20.0.0", - "axios": "^1.6.0", - "reflect-metadata": "^0.1.13", - "tslib": "^2.3.0" + "dependencies": { + "tslib": ">2.3.0", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "exports": { + "./package.json": "./package.json", + ".": { + "types": "./mjs/src/index.d.ts", + "node": "./cjs/src/index.js", + "require": "./cjs/src/index.js", + "module": "./mjs/src/index.js", + "default": "./mjs/src/index.js" + }, + "./ngModule": { + "types": "./mjs/src/ngModule.d.ts", + "node": "./cjs/src/ngModule.js", + "require": "./cjs/src/ngModule.js", + "module": "./mjs/src/ngModule.js", + "default": "./mjs/src/ngModule.js" + } + }, + "main": "./cjs/src/index.js", + "module": "./mjs/src/index.js", + "types": "./mjs/src/index.d.ts", + "typesVersions": { + "*": { + "ngModule": [ + "./mjs/src/ngModule.d.ts" + ] + } } } diff --git a/libs/json-api/json-api-nestjs-sdk/project.json b/libs/json-api/json-api-nestjs-sdk/project.json index bba56381..7fa3ec1e 100644 --- a/libs/json-api/json-api-nestjs-sdk/project.json +++ b/libs/json-api/json-api-nestjs-sdk/project.json @@ -1,113 +1,105 @@ { "name": "json-api-nestjs-sdk", "$schema": "../../../node_modules/nx/schemas/project-schema.json", - "sourceRoot": "libs/json-api/json-api-nestjs-sdk/src", + "sourceRoot": "{projectRoot}/src", "projectType": "library", + "tags": ["type:lib", "lib:json-api-nestjs", "lib:json-api-nestjs-sdk", "type:publish"], "targets": { - "compile-for-angular": { - "executor": "@nx/angular:package", - "outputs": ["{workspaceRoot}/dist/{projectRoot}"], - "options": { - "project": "libs/json-api/json-api-nestjs-sdk/ng-package.json" - }, - "configurations": { - "production": { - "tsConfig": "libs/json-api/json-api-nestjs-sdk/tsconfig-mjs.lib.json" - }, - "development": { - "tsConfig": "libs/json-api/json-api-nestjs-sdk/tsconfig-mjs.lib.json" - } - }, - "defaultConfiguration": "production" - }, - "build": { - "executor": "nx:run-commands", + "build-cjs": { "dependsOn": [ - "build-cjs" + { + "projects": [ + "json-api-nestjs-shared" + ], + "target": "build", + "params": "ignore" + } ], - "options": { - "outputPath": "dist/libs/json-api/json-api-nestjs-sdk", - "commands": [ - "node tools/scripts/preparation-hybrid-npm-package.mjs json-api-nestjs-sdk", - "node tools/scripts/preparation-npm-package.mjs json-api-nestjs-sdk" - ], - "cwd": "./", - "parallel": false - } - }, - "build-cjs": { "executor": "@nx/js:tsc", "outputs": ["{options.outputPath}"], - "dependsOn": [ - "build-mjs" - ], "options": { - "outputPath": "dist/libs/json-api/json-api-nestjs-sdk/cjs", - "main": "libs/json-api/json-api-nestjs-sdk/src/index.ts", - "tsConfig": "libs/json-api/json-api-nestjs-sdk/tsconfig.lib.json", - "assets": ["libs/json-api/json-api-nestjs-sdk/*.md"], - "external": "none", - "updateBuildableProjectDepsInPackageJson": true, + "outputPath": "dist/{projectRoot}/cjs", + "main": "{projectRoot}/src/index.ts", + "tsConfig": "{projectRoot}/tsconfig.lib.json", + "assets": [{ + "glob": "*.md", + "input": "{projectRoot}", + "output": "../" + }], "buildableProjectDepsInPackageJsonType": "peerDependencies", + "generateExportsField": true, + "updateBuildableProjectDepsInPackageJson": true, "additionalEntryPoints": [ - "libs/json-api/json-api-nestjs-sdk/src/ngModule.ts" + "{projectRoot}/src/ngModule.ts" ], - "generateExportsField": true + "externalBuildTargets": ["build-cjs"] } }, "build-mjs": { + "dependsOn": [ + { + "projects": [ + "json-api-nestjs-shared" + ], + "target": "build", + "params": "ignore" + } + ], "executor": "@nx/js:tsc", "outputs": ["{options.outputPath}"], "options": { - "outputPath": "dist/libs/json-api/json-api-nestjs-sdk/mjs", - "main": "libs/json-api/json-api-nestjs-sdk/src/index.ts", - "tsConfig": "libs/json-api/json-api-nestjs-sdk/tsconfig-mjs.lib.json", - "assets": ["libs/json-api/json-api-nestjs-sdk/*.md"], - "external": "none", - "updateBuildableProjectDepsInPackageJson": true, + "outputPath": "dist/{projectRoot}/mjs", + "main": "{projectRoot}/src/index.ts", + "tsConfig": "{projectRoot}/tsconfig-mjs.lib.json", + "assets": [{ + "glob": "*.md", + "input": "{projectRoot}", + "output": "../" + }], "buildableProjectDepsInPackageJsonType": "peerDependencies", + "generateExportsField": true, + "updateBuildableProjectDepsInPackageJson": true, "additionalEntryPoints": [ - "libs/json-api/json-api-nestjs-sdk/src/ngModule.ts" - ], - "generateExportsField": true + "{projectRoot}/src/ngModule.ts" + ] } }, - "publish": { - "command": "node tools/scripts/publish.mjs json-api-nestjs-sdk {args.ver} {args.tag}", - "dependsOn": ["build"] - }, - "lint": { - "executor": "@nx/eslint:lint", - "outputs": ["{options.outputFile}"] - }, - "test": { - "executor": "@nx/jest:jest", - "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], - "options": { - "jestConfig": "libs/json-api/json-api-nestjs-sdk/jest.config.ts", - "codeCoverage": true, - "coverageReporters": ["json-summary"] - } - }, - "upload-badge": { + "build": { "executor": "nx:run-commands", "dependsOn": [ - { - "target": "test" - } + "build-cjs", "build-mjs" ], "options": { - "outputPath": "{workspaceRoot}/libs/json-api/json-api-nestjs-sdk", - "commands": ["node tools/scripts/upload-badge.mjs json-api-nestjs-sdk"], + "outputPath": "dist/{projectRoot}", + "commands": [ + { + "command": "cp dist/{projectRoot}/cjs/package.json dist/{projectRoot}/package.json", + "forwardAllArgs": false + }, + { + "command": "mkdir -p node_modules/@klerick && rm -rf node_modules/@klerick/json-api-nestjs-sdk", + "forwardAllArgs": false + }, + { + "command": "ln -s $(pwd)/dist/{projectRoot} node_modules/@klerick/json-api-nestjs-sdk", + "forwardAllArgs": false + } + ], "cwd": "./", "parallel": false } }, "nx-release-publish": { "options": { - "packageRoot": "dist/libs/json-api/json-api-nestjs-sdk" + "packageRoot": "dist/{projectRoot}" } + }, + "publish": { + "command": "node tools/scripts/publish.mjs json-api-nestjs-sdk {args.ver} {args.tag}", + "dependsOn": [ + "build" + ] } }, - "tags": [] + "implicitDependencies": ["json-api-nestjs-shared"] } diff --git a/libs/json-api/json-api-nestjs-sdk/src/index.ts b/libs/json-api/json-api-nestjs-sdk/src/index.ts index 93246c39..7713ed70 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/index.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/index.ts @@ -1,11 +1,10 @@ -export { JsonApiUtilsService, JsonApiSdkService } from './lib/service'; -export * from './lib/json-api-js'; -export { adapterForAxios } from './lib/utils'; export { FilterOperand, ResourceObject, - AtomicOperations, - Operands, QueryField, - QueryParams, -} from './lib/types'; +} from '@klerick/json-api-nestjs-shared'; + +export { JsonApiUtilsService, JsonApiSdkService } from './lib/service'; +export * from './lib/json-api-js'; +export { adapterForAxios } from './lib/utils'; +export { AtomicOperations, Operands, QueryParams } from './lib/types'; diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/constants/index.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/constants/index.ts index 035321f4..a208dffe 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/constants/index.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/constants/index.ts @@ -1,3 +1 @@ export const ID_KEY = 'id'; -export const KEY_MAIN_INPUT_SCHEMA = 'atomic:operations'; -export const KEY_MAIN_OUTPUT_SCHEMA = 'atomic:results'; diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/service/atomic-operations.service.spec.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/service/atomic-operations.service.spec.ts index 7a517892..bc995b71 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/service/atomic-operations.service.spec.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/service/atomic-operations.service.spec.ts @@ -1,10 +1,8 @@ import { lastValueFrom, of } from 'rxjs'; +import { KEY_MAIN_OUTPUT_SCHEMA } from '@klerick/json-api-nestjs-shared'; import { AtomicOperationsService } from './atomic-operations.service'; -import { JsonApiUtilsService } from './'; +import { JsonApiUtilsService } from './index'; import { HttpInnerClient, JsonApiSdkConfig } from '../types'; -import { KEY_MAIN_OUTPUT_SCHEMA } from '../constants'; - -// jest.mock('../utils'); class Users { public id!: number; diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/service/atomic-operations.service.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/service/atomic-operations.service.ts index cd97146f..43250aff 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/service/atomic-operations.service.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/service/atomic-operations.service.ts @@ -1,18 +1,22 @@ -import { AtomicVoidOperation, GenerateAtomicBody } from '../utils'; -import { JsonApiUtilsService } from './json-api-utils.service'; +import { Observable } from 'rxjs'; +import { + KEY_MAIN_INPUT_SCHEMA, + KEY_MAIN_OUTPUT_SCHEMA, + RelationKeys, +} from '@klerick/json-api-nestjs-shared'; import { map } from 'rxjs/operators'; +import { GenerateAtomicBody } from '../utils'; +import { JsonApiUtilsService } from './json-api-utils.service'; + import { AtomicBody, AtomicOperations, - Entity as EntityObject, - EntityRelation, HttpInnerClient, JsonApiSdkConfig, ReturnIfArray, + AtomicVoidOperation, } from '../types'; -import { Observable } from 'rxjs'; -import { KEY_MAIN_INPUT_SCHEMA, KEY_MAIN_OUTPUT_SCHEMA } from '../constants'; type GetTypeBody = { [K in keyof T[number]]: GenerateAtomicBody; @@ -80,18 +84,16 @@ export class AtomicOperationsService ); } - deleteOne( - entity: Entity - ): AtomicOperations<[...T]>; - deleteOne( + deleteOne(entity: Entity): AtomicOperations<[...T]>; + deleteOne( entity: Entity, skipEmpty: true ): AtomicOperations<[...T]>; - deleteOne( + deleteOne( entity: Entity, skipEmpty: false ): AtomicOperations<[...T, 'EMPTY']>; - deleteOne( + deleteOne( entity: Entity, skipEmpty?: boolean ): AtomicOperations<[...T, 'EMPTY'] | [...T]> { @@ -102,28 +104,28 @@ export class AtomicOperationsService ); } - public patchOne( + public patchOne( entity: Entity ): AtomicOperations<[...T, Entity]> { return this.setToBody('patchOne', entity); } - public postOne( + public postOne( entity: Entity ): AtomicOperations<[...T, Entity]> { return this.setToBody('postOne', entity); } public deleteRelationships< - Entity extends EntityObject, - Rel extends EntityRelation + Entity extends object, + Rel extends RelationKeys >(entity: Entity, relationType: Rel): AtomicOperations { return this.setToBody('deleteRelationships', entity, relationType); } public patchRelationships< - Entity extends EntityObject, - Rel extends EntityRelation + Entity extends object, + Rel extends RelationKeys >( entity: Entity, relationType: Rel @@ -132,8 +134,8 @@ export class AtomicOperationsService } public postRelationships< - Entity extends EntityObject, - Rel extends EntityRelation + Entity extends object, + Rel extends RelationKeys >( entity: Entity, relationType: Rel @@ -141,39 +143,30 @@ export class AtomicOperationsService return this.setToBody('postRelationships', entity, relationType); } - private setToBody( + private setToBody( operationType: Extract, entity: Entity ): AtomicOperations; - private setToBody( + private setToBody( operationType: Extract, entity: Entity, skipEmpty: boolean ): AtomicOperations<[...T, 'EMPTY']>; - private setToBody( + private setToBody( operationType: Exclude, entity: Entity ): AtomicOperations<[...T, Entity]>; - private setToBody< - Entity extends EntityObject, - Rel extends EntityRelation - >( + private setToBody>( operationType: Extract, entity: Entity, relationType: Rel ): AtomicOperations; - private setToBody< - Entity extends EntityObject, - Rel extends EntityRelation - >( + private setToBody>( operationType: Exclude, entity: Entity, relationType: Rel ): AtomicOperations<[...T, ReturnIfArray]>; - private setToBody< - Entity extends EntityObject, - Rel extends EntityRelation - >( + private setToBody>( operationType: keyof AtomicVoidOperation, entity: Entity, relationType?: Rel | boolean diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/service/fetch-inner-client.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/service/fetch-inner-client.ts index 65b83e9e..3ec374f4 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/service/fetch-inner-client.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/service/fetch-inner-client.ts @@ -1,16 +1,18 @@ import { Observable } from 'rxjs'; import { fromFetch } from 'rxjs/fetch'; - +import { + ResourceObject, + RelationKeys, + ResourceObjectRelationships, +} from '@klerick/json-api-nestjs-shared'; import { ParamObject, HttpParams } from '../utils'; + import { HttpInnerClient, - RelationBodyData, - PostData, PatchData, - ResourceObject, + PostData, + RelationBodyData, AtomicBody, - EntityRelation, - ResourceObjectRelationships, AtomicResponse, } from '../types'; @@ -31,56 +33,111 @@ export class FetchInnerClient implements HttpInnerClient { return this.request(url, requestInit); } - get( + get< + T extends object, + R extends 'object' | 'array' = 'object', + IdKey extends string = string + >( + url: string, + params?: { params: ParamObject } + ): Observable>; + get< + T extends object, + IdKey extends string, + Rel extends RelationKeys + >( + url: string, + params?: { params: ParamObject } + ): Observable>; + get< + T extends object, + IdKey extends string, + Rel extends RelationKeys, + R extends 'object' | 'array' = 'object' + >( url: string, params?: { params: ParamObject } - ): Observable> { + ): Observable< + | ResourceObjectRelationships + | ResourceObject + > { let filterParams = {}; if (params) { ({ params: filterParams } = params); } - return this.request>( - this.getResultUrl(url, filterParams), - { - method: 'get', - } - ); + return this.request< + | ResourceObject + | ResourceObjectRelationships + >(this.getResultUrl(url, filterParams), { + method: 'get', + }); } - patch(url: string, body: PatchData): Observable>; - patch>( + patch( + url: string, + body: PatchData + ): Observable>; + patch< + T extends object, + IdKey extends string, + Rel extends RelationKeys + >( url: string, body: RelationBodyData | RelationBodyData[] - ): Observable>; - patch>( + ): Observable>; + patch< + T extends object, + IdKey extends string, + Rel extends RelationKeys + >( url: string, body: PatchData | RelationBodyData | RelationBodyData[] - ): Observable | ResourceObjectRelationships> { + ): Observable< + ResourceObject | ResourceObjectRelationships + > { return this.request< - ResourceObject | ResourceObjectRelationships + ResourceObject | ResourceObjectRelationships >(url, { method: 'patch', body: JSON.stringify(body), }); } - post(url: string, body: PostData): Observable>; - post( + post( + url: string, + body: PostData + ): Observable>; + post( url: string, body: AtomicBody ): Observable>; - post>( + post< + T extends object, + IdKey extends string, + Rel extends RelationKeys + >( url: string, body: RelationBodyData | RelationBodyData[] - ): Observable>; - post>( + ): Observable>; + post< + T extends object | object[], + IdKey extends string, + Rel extends RelationKeys + >( url: string, body: RelationBodyData | RelationBodyData[] | PostData | AtomicBody ): Observable< - ResourceObject | ResourceObjectRelationships | AtomicResponse + | ResourceObject + | ResourceObjectRelationships + | AtomicResponse > { return this.request< - ResourceObject | ResourceObjectRelationships + + | ResourceObject + | ResourceObjectRelationships + | T extends object[] + ? AtomicResponse + : never >(url, { method: 'post', body: JSON.stringify(body), diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/service/index.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/service/index.ts index da793b19..62bb8ffb 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/service/index.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/service/index.ts @@ -1,3 +1,3 @@ export * from './json-api-utils.service'; -export * from './json-api-sdk.service'; export * from './atomic-operations.service'; +export * from './json-api-sdk.service'; diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-sdk.service.spec.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-sdk.service.spec.ts index 66f1089e..23644f33 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-sdk.service.spec.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-sdk.service.spec.ts @@ -1,7 +1,7 @@ import { BehaviorSubject, of, take } from 'rxjs'; import { JsonApiSdkService } from './json-api-sdk.service'; import { HttpInnerClient, JsonApiSdkConfig } from '../types'; -import { JsonApiUtilsService } from './'; +import { JsonApiUtilsService } from './index'; import { EntityArray } from '../utils'; import { FetchInnerClient } from './fetch-inner-client'; diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-sdk.service.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-sdk.service.ts index a1f4aca6..063e38c2 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-sdk.service.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-sdk.service.ts @@ -1,20 +1,23 @@ +import { + RelationKeys, + ResourceObject, + EntityClass, +} from '@klerick/json-api-nestjs-shared'; + import { EMPTY, expand, Observable, reduce, throwError } from 'rxjs'; import { map } from 'rxjs/operators'; import { - Entity as EntityObject, - EntityRelation, - EntityType, HttpInnerClient, JsonApiSdkConfig, + PatchData, QueryParams, QueryParamsForOneItem, RelationBodyData, - ResourceObject, ReturnIfArray, } from '../types'; import { EntityArray, getTypeForReq } from '../utils'; -import { JsonApiUtilsService } from '../service'; +import { JsonApiUtilsService } from './json-api-utils.service'; export class JsonApiSdkService { constructor( @@ -23,47 +26,49 @@ export class JsonApiSdkService { private jsonApiSdkConfig: JsonApiSdkConfig ) {} - public getList( - entity: EntityType, + public getList( + entity: EntityClass, params?: QueryParams ): Observable> { const query = this.jsonApiUtilsService.getQueryStringParams(params); return this.http - .get( + .get( this.jsonApiUtilsService.getUrlForResource(entity.name), { params: query.toObject(), } ) .pipe( - map, EntityArray>((result) => { - const resource = params - ? this.jsonApiUtilsService.convertResponseData( - result, - params.include - ) - : this.jsonApiUtilsService.convertResponseData(result); - const { totalItems, pageSize, pageNumber } = Object.assign( - { - totalItems: 0, - pageNumber: 0, - pageSize: 0, - }, - result.meta - ); - - return new EntityArray(resource, { - totalItems, - pageNumber, - pageSize, - }); - }) + map, EntityArray>( + (result) => { + const resource = params + ? this.jsonApiUtilsService.convertResponseData( + result, + params.include + ) + : this.jsonApiUtilsService.convertResponseData(result); + const { totalItems, pageSize, pageNumber } = Object.assign( + { + totalItems: 0, + pageNumber: 0, + pageSize: 0, + }, + result.meta + ); + + return new EntityArray(resource, { + totalItems, + pageNumber, + pageSize, + }); + } + ) ); } - getAll( - entity: EntityType, + getAll( + entity: EntityClass, params?: QueryParams, push = true ): Observable> { @@ -108,8 +113,8 @@ export class JsonApiSdkService { return request; } - getOne( - entity: EntityType, + getOne( + entity: EntityClass, id: string | number, params?: QueryParamsForOneItem ): Observable { @@ -118,6 +123,7 @@ export class JsonApiSdkService { } const query = this.jsonApiUtilsService.getQueryStringParams(params); + return this.http .get( `${this.jsonApiUtilsService.getUrlForResource(entity.name)}/${id}`, @@ -132,9 +138,7 @@ export class JsonApiSdkService { ); } - public postOne( - entity: Entity - ): Observable { + public postOne(entity: Entity): Observable { const { attributes, relationships } = this.jsonApiUtilsService.generateBody(entity); const body = { @@ -153,10 +157,9 @@ export class JsonApiSdkService { .pipe(map((r) => this.jsonApiUtilsService.convertResponseData(r))); } - public patchOne( - entity: Entity - ): Observable { - if (!entity[this.jsonApiSdkConfig.idKey]) { + public patchOne(entity: Entity): Observable { + const id = Reflect.get(entity, this.jsonApiSdkConfig.idKey); + if (!id) { return throwError( () => new Error( @@ -167,29 +170,35 @@ export class JsonApiSdkService { const { attributes, relationships } = this.jsonApiUtilsService.generateBody(entity); + const body = { data: { - id: entity[this.jsonApiSdkConfig.idKey].toString(), + id: String(id), type: getTypeForReq(entity.constructor.name), - ...(Object.keys(attributes).length > 0 ? { attributes } : {}), - ...(Object.keys(relationships).length > 0 ? { relationships } : {}), }, - }; + } satisfies PatchData; + + if (Object.keys(relationships).length > 0) { + Reflect.set(body.data, 'relationships', relationships); + } + + if (attributes && Object.keys(attributes).length > 0) { + Reflect.set(body.data, 'attributes', attributes); + } return this.http .patch( `${this.jsonApiUtilsService.getUrlForResource( entity.constructor.name - )}/${entity[this.jsonApiSdkConfig.idKey]}`, + )}/${id}`, body ) .pipe(map((r) => this.jsonApiUtilsService.convertResponseData(r))); } - public deleteOne( - entity: Entity - ): Observable { - if (!entity[this.jsonApiSdkConfig.idKey]) { + public deleteOne(entity: Entity): Observable { + const id = Reflect.get(entity, this.jsonApiSdkConfig.idKey); + if (!id) { return throwError( () => new Error( @@ -199,20 +208,22 @@ export class JsonApiSdkService { } return this.http.delete( - `${this.jsonApiUtilsService.getUrlForResource(entity.constructor.name)}/${ - entity[this.jsonApiSdkConfig.idKey] - }` + `${this.jsonApiUtilsService.getUrlForResource( + entity.constructor.name + )}/${id}` ); } public getRelationships< - Entity extends EntityObject, - Rel extends EntityRelation + Entity extends object, + IdKey extends string = 'id', + Rel extends RelationKeys = RelationKeys >( entity: Entity, relationType: Rel ): Observable> { - if (!entity[this.jsonApiSdkConfig.idKey]) { + const id = Reflect.get(entity, this.jsonApiSdkConfig.idKey); + if (!id) { return throwError( () => new Error( @@ -222,12 +233,10 @@ export class JsonApiSdkService { } return this.http - .get( + .get( `${this.jsonApiUtilsService.getUrlForResource( entity.constructor.name - )}/${entity[this.jsonApiSdkConfig.idKey]}/relationships/${String( - relationType - )}` + )}/${id}/relationships/${String(relationType)}` ) .pipe( map((result) => this.jsonApiUtilsService.getResultForRelation(result)) @@ -235,13 +244,15 @@ export class JsonApiSdkService { } public patchRelationships< - Entity extends EntityObject, - Rel extends EntityRelation + Entity extends object, + IdKey extends string, + Rel extends RelationKeys >( entity: Entity, relationType: Rel ): Observable> { - if (!entity[this.jsonApiSdkConfig.idKey]) { + const id = Reflect.get(entity, this.jsonApiSdkConfig.idKey); + if (!id) { return throwError( () => new Error( @@ -260,18 +271,16 @@ export class JsonApiSdkService { } const body: RelationBodyData = { - data: this.jsonApiUtilsService.generateRelationshipsBody< - Entity[EntityRelation] - >(entity[relationType]), + data: this.jsonApiUtilsService.generateRelationshipsBody( + entity[relationType] as object + ), }; return this.http - .patch( + .patch( `${this.jsonApiUtilsService.getUrlForResource( entity.constructor.name - )}/${entity[this.jsonApiSdkConfig.idKey]}/relationships/${String( - relationType - )}`, + )}/${id}/relationships/${String(relationType)}`, body ) .pipe( @@ -280,13 +289,15 @@ export class JsonApiSdkService { } public postRelationships< - Entity extends EntityObject, - Rel extends EntityRelation + Entity extends object, + IdKey extends string, + Rel extends RelationKeys >( entity: Entity, relationType: Rel ): Observable> { - if (!entity[this.jsonApiSdkConfig.idKey]) { + const id = Reflect.get(entity, this.jsonApiSdkConfig.idKey); + if (!id) { return throwError( () => new Error( @@ -305,18 +316,16 @@ export class JsonApiSdkService { } const body = { - data: this.jsonApiUtilsService.generateRelationshipsBody< - Entity[EntityRelation] - >(entity[relationType]), + data: this.jsonApiUtilsService.generateRelationshipsBody( + entity[relationType] as object + ), }; return this.http - .post( + .post( `${this.jsonApiUtilsService.getUrlForResource( entity.constructor.name - )}/${entity[this.jsonApiSdkConfig.idKey]}/relationships/${String( - relationType - )}`, + )}/${id}/relationships/${String(relationType)}`, body ) .pipe( @@ -325,10 +334,12 @@ export class JsonApiSdkService { } public deleteRelationships< - Entity extends EntityObject, - Rel extends EntityRelation + Entity extends object, + IdKey extends string, + Rel extends RelationKeys >(entity: Entity, relationType: Rel): Observable { - if (!entity[this.jsonApiSdkConfig.idKey]) { + const id = Reflect.get(entity, this.jsonApiSdkConfig.idKey); + if (!id) { return throwError( () => new Error( @@ -347,18 +358,16 @@ export class JsonApiSdkService { } const body = { - data: this.jsonApiUtilsService.generateRelationshipsBody< - Entity[EntityRelation] - >(entity[relationType]), + data: this.jsonApiUtilsService.generateRelationshipsBody( + entity[relationType] as object + ), }; return this.http .delete( `${this.jsonApiUtilsService.getUrlForResource( entity.constructor.name - )}/${entity[this.jsonApiSdkConfig.idKey]}/relationships/${String( - relationType - )}`, + )}/${id}/relationships/${String(relationType)}`, body ) .pipe(map(() => void 0)); diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-utils.service.spec.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-utils.service.spec.ts index dd04a10e..b9d588f1 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-utils.service.spec.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-utils.service.spec.ts @@ -92,7 +92,7 @@ describe('JsonApiUtilsService', () => { const includeArray: string[] = ['param1', 'param2']; const httpParams = new HttpParams(); const queryParams: QueryParams = { - include: includeArray, + include: includeArray as any, }; const httpParamsWithIncludes = service['getIncludeParam']( @@ -308,6 +308,13 @@ describe('JsonApiUtilsService', () => { expect(typeof entityInstance).toBe('object'); expect(entityInstance.constructor.name).toBe('Test'); + + const entityInstance1 = service['createEntityInstance']( + 'test-test' + ) as any; + + expect(typeof entityInstance1).toBe('object'); + expect(entityInstance1.constructor.name).toBe('TestTest'); }); }); @@ -412,7 +419,7 @@ describe('JsonApiUtilsService', () => { } as any; const response = service['convertResponseData'](data, [ 'relationship1', - ]) as any; + ] as any) as any; expect(response[0].constructor.name).toBe('Type1'); expect(response[0][mockJsonApiSdkConfig.idKey]).toBe(1); expect(response[0]).toHaveProperty('attr1'); diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-utils.service.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-utils.service.ts index 6f029dce..13a4cc82 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-utils.service.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-utils.service.ts @@ -1,35 +1,33 @@ -import { createEntityInstance } from '../../shared'; - import { - Attributes, - Entity as EntityObject, - Entity, - EntityRelation, + createEntityInstance, + isObject, + ObjectTyped, + BaseAttribute, + RelationKeys, + MainData, + ResourceObject, + ResourceObjectRelationships, Include, +} from '@klerick/json-api-nestjs-shared'; +import { kebabCase } from 'change-case-commonjs'; +import { JsonApiSdkConfig, - MainData, QueryParams, - RelationData, Relationships, - ResourceObject, - ResourceObjectRelationships, ReturnIfArray, } from '../types'; -import { - camelToKebab, - getTypeForReq, - HttpParams, - isObject, - isRelation, - ObjectTyped, -} from '../utils'; + +import { getTypeForReq, HttpParams, isRelation } from '../utils'; import { ID_KEY } from '../constants'; +type Attributes = BaseAttribute['attributes']; +type RelationData = MainData; + export class JsonApiUtilsService { constructor(private jsonApiSdkConfig: JsonApiSdkConfig) {} public getUrlForResource(resource: string): string { - const url: string[] = [camelToKebab(resource).toLocaleLowerCase()]; + const url: string[] = [kebabCase(resource).toLocaleLowerCase()]; if (this.jsonApiSdkConfig.apiPrefix) { url.unshift(this.jsonApiSdkConfig.apiPrefix); } @@ -180,23 +178,23 @@ export class JsonApiUtilsService { return httpParams; } - convertResponseData( + convertResponseData( body: ResourceObject, includeEntity?: QueryParams['include'] ): E; - convertResponseData( - body: ResourceObject, + convertResponseData( + body: ResourceObject, includeEntity?: QueryParams['include'] ): E[]; - convertResponseData( - body: ResourceObject, + convertResponseData( + body: ResourceObject, includeEntity?: QueryParams['include'] ): E; - convertResponseData( - body: ResourceObject, + convertResponseData( + body: ResourceObject, includeEntity?: QueryParams['include'] ): E[]; - convertResponseData( + convertResponseData( body: ResourceObject | ResourceObject, includeEntity?: QueryParams['include'] ): E[] | E { @@ -213,7 +211,7 @@ export class JsonApiUtilsService { ...Object.entries(dataItem.attributes || []).reduce( (acum, [key, val]) => { acum[key] = this.jsonApiSdkConfig.dateFields.includes(key) - ? new Date(val) + ? new Date(String(val)) : val; return acum; @@ -235,9 +233,10 @@ export class JsonApiUtilsService { continue; } const relationship = dataItem.relationships[itemInclude]; - if (!(relationship && relationship.data)) { + if (!relationship || !('data' in relationship) || !relationship.data) { continue; } + const relationshipData = relationship.data; if (Array.isArray(relationshipData)) { @@ -245,7 +244,7 @@ export class JsonApiUtilsService { const result = this.findIncludeEntity(item, included); if (result) acum.push(result); return acum; - }, [] as E[EntityRelation][]) as E[EntityRelation]; + }, [] as E[RelationKeys][]) as E[RelationKeys]; } else { const relation = this.findIncludeEntity(relationshipData, included); if (relation) itemEntity[itemInclude] = relation; @@ -264,10 +263,10 @@ export class JsonApiUtilsService { return createEntityInstance(name); } - private findIncludeEntity>>( + private findIncludeEntity( item: R, included: Include[] - ): E[EntityRelation] | undefined { + ): E[RelationKeys] | undefined { const relatedIncluded = included.find( (includedItem) => includedItem.type === item.type && includedItem.id === item.id @@ -282,7 +281,7 @@ export class JsonApiUtilsService { ...Object.entries(relatedIncluded.attributes || []).reduce( (acum, [key, val]) => { acum[key] = this.jsonApiSdkConfig.dateFields.includes(key) - ? new Date(val) + ? new Date(String(val)) : val; return acum; @@ -290,15 +289,16 @@ export class JsonApiUtilsService { {} as Record ), }; + return Object.assign( - this.createEntityInstance( + this.createEntityInstance]>( item.type.toString() ) as object, entityObject - ) as E[typeof item.type]; + ) as E[RelationKeys]; } - generateBody(entity: E) { + generateBody(entity: E) { const attributes = Object.entries(entity) .filter(([key, val]) => { if (key === ID_KEY) return false; @@ -347,10 +347,11 @@ export class JsonApiUtilsService { } getResultForRelation< - Entity extends EntityObject, - Rel extends EntityRelation + Entity extends object, + IdKey extends string, + Rel extends RelationKeys >( - body: ResourceObjectRelationships + body: ResourceObjectRelationships ): ReturnIfArray { if (Array.isArray(body.data)) { return body.data.map( @@ -361,13 +362,13 @@ export class JsonApiUtilsService { } } - public generateRelationshipsBody( + public generateRelationshipsBody( relationshipEntity: RelationshipEntity | RelationshipEntity[] ): RelationData | RelationData[] { const generateRelationObj = ( relation: RelationshipEntity ): RelationData => ({ - id: String(relation[this.jsonApiSdkConfig.idKey]), + id: String(Reflect.get(relation, this.jsonApiSdkConfig.idKey)), type: getTypeForReq(relation.constructor.name), }); diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/token/index.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/token/index.ts index c6911405..0eee1588 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/token/index.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/token/index.ts @@ -1,7 +1,6 @@ import { InjectionToken } from '@angular/core'; -import { JsonApiSdkConfig } from '../types'; -import { AtomicFactory as TypeAtomicFactory } from '../types/atomic'; +import { JsonApiSdkConfig, AtomicFactory as TypeAtomicFactory } from '../types'; export const JSON_API_SDK_CONFIG = new InjectionToken( 'Main config object for sdk' diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/types/atomic.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/types/atomic-operation.ts similarity index 63% rename from libs/json-api/json-api-nestjs-sdk/src/lib/types/atomic.ts rename to libs/json-api/json-api-nestjs-sdk/src/lib/types/atomic-operation.ts index c438c99f..6457e4b2 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/types/atomic.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/types/atomic-operation.ts @@ -1,7 +1,8 @@ -import { Entity as EntityObject, EntityRelation } from './entity'; -import { ReturnIfArray } from './utils'; +import { RelationKeys } from '@klerick/json-api-nestjs-shared'; import { Observable } from 'rxjs'; +import { ReturnIfArray } from './utils'; + export interface AtomicRunGeneral { run(): Observable; } @@ -11,76 +12,56 @@ export interface AtomicRunPromise { } export interface AtomicMainOperations { - postOne( + postOne( entity: Entity ): AtomicOperations<[...T, Entity]>; - patchOne( + patchOne( entity: Entity ): AtomicOperations<[...T, Entity]>; - deleteOne( - entity: Entity - ): AtomicOperations<[...T]>; - deleteOne( + deleteOne(entity: Entity): AtomicOperations<[...T]>; + deleteOne( entity: Entity, skipEmpty: true ): AtomicOperations<[...T]>; - deleteOne( + deleteOne( entity: Entity, skipEmpty: false ): AtomicOperations<[...T, 'EMPTY']>; - patchRelationships< - Entity extends EntityObject, - Rel extends EntityRelation - >( + patchRelationships>( entity: Entity, relationType: Rel ): AtomicOperations<[...T, ReturnIfArray]>; - postRelationships< - Entity extends EntityObject, - Rel extends EntityRelation - >( + postRelationships>( entity: Entity, relationType: Rel ): AtomicOperations<[...T, ReturnIfArray]>; - deleteRelationships< - Entity extends EntityObject, - Rel extends EntityRelation - >( + deleteRelationships>( entity: Entity, relationType: Rel ): AtomicOperations<[...T]>; } export interface AtomicMainOperationsPromise { - postOne( + postOne( entity: Entity ): AtomicOperationsPromise<[...T, Entity]>; - patchOne( + patchOne( entity: Entity ): AtomicOperationsPromise<[...T, Entity]>; - deleteOne( + deleteOne( entity: Entity ): AtomicOperationsPromise<[...T]>; - patchRelationships< - Entity extends EntityObject, - Rel extends EntityRelation - >( + patchRelationships>( entity: Entity, relationType: Rel ): AtomicOperationsPromise<[...T, ReturnIfArray]>; - postRelationships< - Entity extends EntityObject, - Rel extends EntityRelation - >( + postRelationships>( entity: Entity, relationType: Rel ): AtomicOperationsPromise<[...T, ReturnIfArray]>; - deleteRelationships< - Entity extends EntityObject, - Rel extends EntityRelation - >( + deleteRelationships>( entity: Entity, relationType: Rel ): AtomicOperationsPromise<[...T]>; diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/types/atomic-type.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/types/atomic-type.ts new file mode 100644 index 00000000..8db6b354 --- /dev/null +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/types/atomic-type.ts @@ -0,0 +1,31 @@ +import { + KEY_MAIN_INPUT_SCHEMA, + KEY_MAIN_OUTPUT_SCHEMA, + Operation, + ResourceObject, +} from '@klerick/json-api-nestjs-shared'; +import { AtomicMainOperations } from './atomic-operation'; + +export type BodyType = { + op: Operation; + ref: { + type: string; + id?: string; + relationship?: string; + tmpId?: string; + }; + data?: any; +}; + +export type AtomicBody = { + [KEY_MAIN_INPUT_SCHEMA]: BodyType[]; +}; +export type AtomicResponse = { + [KEY_MAIN_OUTPUT_SCHEMA]: { + [K in keyof R]: R[K] extends object ? ResourceObject : never; + }; +}; + +export type AtomicVoidOperation = { + [K in keyof AtomicMainOperations<[]>]: (...arg: any) => void; +}; diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/types/config.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/types/config.ts new file mode 100644 index 00000000..5281f1ed --- /dev/null +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/types/config.ts @@ -0,0 +1,20 @@ +import { PartialByKeys } from './utils'; +import { HttpInnerClient } from './http-inner-client'; + +export type JsonApiSdkConfig = { + apiHost: string; + apiPrefix?: string; + idKey: string; + idIsNumber?: boolean; + operationUrl?: string; + dateFields: string[]; +}; + +export type JsonSdkConfig = PartialByKeys< + JsonApiSdkConfig, + 'idKey' | 'apiPrefix' | 'idIsNumber' | 'dateFields' | 'operationUrl' +>; + +export type JsonConfig = JsonSdkConfig & { + adapter?: HttpInnerClient; +}; diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/types/entity.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/types/entity.ts deleted file mode 100644 index 682c399a..00000000 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/types/entity.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { EntityField, EntityProps } from '../../shared'; - -export { EntityField, EntityProps }; - -export type EntityRelation = { - [P in keyof T]: T[P] extends EntityField ? never : P; -}[keyof T]; - -export type EntityType = { - new (): T; -}; - -export type Entity = { - [key: string]: any; -}; diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/types/filter-operand.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/types/filter-operand.ts index c1f1a670..ce2afdff 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/types/filter-operand.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/types/filter-operand.ts @@ -1,6 +1,4 @@ -import { FilterOperand } from '../../shared'; - -export { FilterOperand }; +import { FilterOperand } from '@klerick/json-api-nestjs-shared'; export type FilterOperandForString = Exclude< FilterOperand, diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/types/http-inner-client.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/types/http-inner-client.ts index 684b60a5..9ad912ad 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/types/http-inner-client.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/types/http-inner-client.ts @@ -1,41 +1,61 @@ import { Observable } from 'rxjs'; +import { + RelationKeys, + ResourceObject, + ResourceObjectRelationships, +} from '@klerick/json-api-nestjs-shared'; import { ParamObject } from '../utils'; -import { ResourceObject, ResourceObjectRelationships } from './response-body'; -import { EntityRelation } from './entity'; -import { - AtomicBody, - AtomicResponse, - PatchData, - PostData, - RelationBodyData, -} from './index'; +import { PostData, PatchData, RelationBodyData } from './http-request-params'; +import { AtomicBody, AtomicResponse } from './atomic-type'; export interface HttpInnerClient { - get( + get< + T extends object, + R extends 'object' | 'array' = 'object', + IdKey extends string = string + >( url: string, params?: { params: ParamObject } - ): Observable>; - get>( + ): Observable>; + get< + T extends object, + IdKey extends string, + Rel extends RelationKeys + >( url: string, params?: { params: ParamObject } - ): Observable>; + ): Observable>; - post(url: string, body: PostData): Observable>; + post( + url: string, + body: PostData + ): Observable>; post( url: string, body: AtomicBody ): Observable>; - post>( + post< + T extends object, + IdKey extends string, + Rel extends RelationKeys + >( url: string, body: RelationBodyData | RelationBodyData[] - ): Observable>; + ): Observable>; - patch(url: string, body: PatchData): Observable>; - patch>( + patch( + url: string, + body: PatchData + ): Observable>; + patch< + T extends object, + IdKey extends string, + Rel extends RelationKeys + >( url: string, body: RelationBodyData | RelationBodyData[] - ): Observable>; + ): Observable>; delete( url: string, diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/types/http-request-params.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/types/http-request-params.ts new file mode 100644 index 00000000..78f4e766 --- /dev/null +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/types/http-request-params.ts @@ -0,0 +1,34 @@ +import { + MainData, + BaseAttribute, + RelationKeys, + BaseMainData, +} from '@klerick/json-api-nestjs-shared'; + +export type Relationships< + Entity extends object, + IdKey extends string = 'id' +> = { + [P in RelationKeys]?: BaseMainData; +}; + +export type BaseRelationships< + Entity extends object, + IdKey extends string = 'id' +> = { relationships?: Relationships }; + +type PostMainData = Omit, 'id'> & { + id?: string; +}; + +export type PostData = { + data: PostMainData & BaseAttribute & BaseRelationships; +}; + +export type PatchData = { + data: MainData & BaseAttribute & BaseRelationships; +}; + +export type RelationBodyData = { + data: MainData | MainData[]; +}; diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/types/index.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/types/index.ts index 5269fa70..d0ebf4e6 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/types/index.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/types/index.ts @@ -1,69 +1,9 @@ -export * from './entity'; -export * from './query-params'; -export * from './response-body'; +export * from './http-inner-client'; +export * from './http-request-params'; +export * from './atomic-type'; +export * from './atomic-operation'; export * from './utils'; +export * from './config'; +export * from './query-params'; export * from './promise-json-api-sdk'; -export * from './atomic'; export * from './filter-operand'; -export * from './http-inner-client'; - -import { BodyType } from '../utils'; -import { - Attributes, - Relationships, - ResourceObject, - ResourceObjectRelationships, -} from './response-body'; -import { PartialByKeys } from './utils'; -import { KEY_MAIN_INPUT_SCHEMA, KEY_MAIN_OUTPUT_SCHEMA } from '../constants'; - -import { HttpInnerClient } from './http-inner-client'; - -export type JsonApiSdkConfig = { - apiHost: string; - apiPrefix?: string; - idKey: string; - idIsNumber?: boolean; - operationUrl?: string; - dateFields: string[]; -}; - -export type JsonSdkConfig = PartialByKeys< - JsonApiSdkConfig, - 'idKey' | 'apiPrefix' | 'idIsNumber' | 'dateFields' | 'operationUrl' ->; - -export type JsonConfig = JsonSdkConfig & { - adapter?: HttpInnerClient; -}; - -type MainData = { - type: string; - attributes: Attributes; - relationships?: Relationships; -}; -export type PostData = { - data: MainData; -}; -export type PatchData = { - data: { id: string } & Omit, 'attributes'> & - Partial, 'attributes'>>; -}; -export type RelationData = { id: string; type: string }; -export type RelationBodyData = { - data: RelationData | RelationData[]; -}; - -export type AtomicBody = { - [KEY_MAIN_INPUT_SCHEMA]: BodyType[]; -}; - -type ResponseData = { - [K in keyof T]: T[K] extends string | string[] - ? ResourceObjectRelationships - : ResourceObject; -}; - -export type AtomicResponse = { - [KEY_MAIN_OUTPUT_SCHEMA]: ResponseData; -}; diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/types/promise-json-api-sdk.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/types/promise-json-api-sdk.ts index 088eed08..7b4bc141 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/types/promise-json-api-sdk.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/types/promise-json-api-sdk.ts @@ -1,57 +1,62 @@ -import { Entity as EntityObject, EntityRelation, EntityType } from './entity'; +import { EntityClass, RelationKeys } from '@klerick/json-api-nestjs-shared'; + import { QueryParams, QueryParamsForOneItem } from './query-params'; import { EntityArray } from '../utils'; import { ReturnIfArray } from './utils'; export interface PromiseJsonApiSdkService { - getList( - entity: EntityType, + getList( + entity: EntityClass, params?: QueryParams ): Promise>; - getAll( - entity: EntityType, + getAll( + entity: EntityClass, params?: QueryParams ): Promise>; - getOne( - entity: EntityType, + getOne( + entity: EntityClass, id: string | number, params?: QueryParamsForOneItem ): Promise; - postOne(entity: Entity): Promise; - patchOne(entity: Entity): Promise; + postOne(entity: Entity): Promise; + patchOne(entity: Entity): Promise; - deleteOne(entity: Entity): Promise; + deleteOne(entity: Entity): Promise; getRelationships< - Entity extends EntityObject, - Rel extends EntityRelation + Entity extends object, + IdKey extends string = 'id', + Rel extends RelationKeys = RelationKeys >( entity: Entity, relationType: Rel ): Promise>; patchRelationships< - Entity extends EntityObject, - Rel extends EntityRelation + Entity extends object, + IdKey extends string = 'id', + Rel extends RelationKeys = RelationKeys >( entity: Entity, relationType: Rel ): Promise>; postRelationships< - Entity extends EntityObject, - Rel extends EntityRelation + Entity extends object, + IdKey extends string = 'id', + Rel extends RelationKeys = RelationKeys >( entity: Entity, relationType: Rel ): Promise>; deleteRelationships< - Entity extends EntityObject, - Rel extends EntityRelation + Entity extends object, + IdKey extends string = 'id', + Rel extends RelationKeys = RelationKeys >( entity: Entity, relationType: Rel diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/types/query-params.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/types/query-params.ts index 8a555ac8..66a4aa8c 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/types/query-params.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/types/query-params.ts @@ -1,24 +1,25 @@ -import { QueryField } from '../../shared'; -import { EntityProps, EntityRelation } from './entity'; -import { TypeOfArray } from './utils'; -import { Operands, OperandsRelation } from './filter-operand'; +import { + QueryField, + RelationKeys, + PropertyKeys, + TypeOfArray, +} from '@klerick/json-api-nestjs-shared'; +import { Operands, OperandsRelation } from './filter-operand'; export type SortType = 'ASC' | 'DESC'; -export { QueryField }; - -export type Includes = EntityRelation[]; +export type Includes = RelationKeys[]; type TargetField = { - target?: EntityProps[]; + target?: PropertyKeys[]; }; type RelationField = { - [K in EntityRelation]?: EntityProps>[]; + [K in RelationKeys]?: PropertyKeys>[]; }; type SortForEntity = { - [K in EntityProps]?: SortType; + [K in PropertyKeys]?: SortType; }; type TargetSort = { @@ -26,7 +27,7 @@ type TargetSort = { }; type RelationSort = { - [K in EntityRelation]?: SortForEntity>; + [K in RelationKeys]?: SortForEntity>; }; type Sort = TargetSort & RelationSort; @@ -39,11 +40,11 @@ export type Pagination = { }; type TargetRelationFilter = { - [P in EntityRelation]?: OperandsRelation; + [P in RelationKeys]?: OperandsRelation; }; type EntityFilter = { - [K in EntityProps]?: Operands; + [K in PropertyKeys]?: Operands; }; type TargetFilter = { @@ -51,7 +52,7 @@ type TargetFilter = { }; type RelationFilter = { - [K in EntityRelation]?: EntityFilter>; + [K in RelationKeys]?: EntityFilter>; }; export type Filter = TargetFilter & RelationFilter; diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/types/response-body.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/types/response-body.ts deleted file mode 100644 index 24813506..00000000 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/types/response-body.ts +++ /dev/null @@ -1,13 +0,0 @@ -export { - PageProps, - DebugMetaProps, - MainData, - Links, - Attributes, - Data, - Relationships, - Include, - ResourceData, - ResourceObject, - ResourceObjectRelationships, -} from '../../shared'; diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/types/utils.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/types/utils.ts index 233d219b..2671b748 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/types/utils.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/types/utils.ts @@ -1,19 +1,8 @@ -import { TypeOfArray } from '../../shared'; -export { TypeOfArray }; - -type IntersectionToObj = { - [K in keyof T]: T[K]; -}; -export type PartialByKeys = IntersectionToObj< - { - [P in keyof T as P extends K ? P : never]?: T[P]; - } & { - [P in Exclude]: T[P]; - } ->; - export type ReturnIfArray = I extends unknown[] ? O[] : O; +export type PartialByKeys = Omit & + Partial>; + export type FunctionProperty = T[K] extends ( ...args: any ) => any @@ -23,9 +12,3 @@ export type FunctionProperty = T[K] extends ( export type FunctionPropertyNames = { [K in keyof T]: T[K] extends (...args: any) => any ? K : never; }[keyof T]; - -export type Parameters unknown> = T extends ( - ...args: infer P -) => unknown - ? P - : never; diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/utils/adapter-for-axios.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/utils/adapter-for-axios.ts index fc5c32b4..27340bab 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/utils/adapter-for-axios.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/utils/adapter-for-axios.ts @@ -1,3 +1,8 @@ +import { + RelationKeys, + ResourceObject, + ResourceObjectRelationships, +} from '@klerick/json-api-nestjs-shared'; import { Axios, AxiosResponse, Method } from 'axios'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; @@ -5,13 +10,10 @@ import { map } from 'rxjs/operators'; import { AtomicBody, AtomicResponse, - EntityRelation, HttpInnerClient, PatchData, PostData, RelationBodyData, - ResourceObject, - ResourceObjectRelationships, } from '../types'; import { ParamObject } from './http-params'; @@ -55,18 +57,25 @@ class AxiosHttpClient implements HttpInnerClient { return this.request(url, 'DELETE'); } - get( + get( url: string, params?: { params: ParamObject } ): Observable>; - get>( + get< + T extends object, + IdKey extends string, + Rel extends RelationKeys + >( url: string, params?: { params: ParamObject } - ): Observable>; + ): Observable>; get< - T, + T extends object, R, - A = R extends EntityRelation ? ResourceObjectRelationships : never, + IdKey extends string = string, + A = R extends RelationKeys + ? ResourceObjectRelationships + : never, B = R extends 'object' | 'array' ? ResourceObject : never >(url: string, params?: { params: ParamObject }): Observable { return this.request( @@ -77,37 +86,59 @@ class AxiosHttpClient implements HttpInnerClient { ); } - patch(url: string, body: PatchData): Observable>; - patch>( + patch( + url: string, + body: PatchData + ): Observable>; + patch< + T extends object, + IdKey extends string, + Rel extends RelationKeys + >( url: string, body: RelationBodyData | RelationBodyData[] - ): Observable>; - patch>( + ): Observable>; + patch< + T extends object, + IdKey extends string, + Rel extends RelationKeys + >( url: string, body: PatchData | RelationBodyData | RelationBodyData[] - ): Observable | ResourceObjectRelationships> { + ): Observable< + ResourceObject | ResourceObjectRelationships + > { return this.request(url, 'PATCH', body); } - post(url: string, body: PostData): Observable>; + post( + url: string, + body: PostData + ): Observable>; post( url: string, body: AtomicBody ): Observable>; - post>( + post< + T extends object, + IdKey extends string, + Rel extends RelationKeys + >( url: string, body: RelationBodyData | RelationBodyData[] - ): Observable>; - post>( + ): Observable>; + post>( url: string, body: RelationBodyData | RelationBodyData[] | PostData | AtomicBody ): Observable< - ResourceObject | ResourceObjectRelationships | AtomicResponse + | ResourceObject + | ResourceObjectRelationships + | AtomicResponse > { return this.request< RelationBodyData | RelationBodyData[] | PostData | AtomicBody, | ResourceObject - | ResourceObjectRelationships + | ResourceObjectRelationships | AtomicResponse >(url, 'POST', body); } diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/utils/entity-array.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/utils/entity-array.ts index b02e1c7f..a2bedb40 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/utils/entity-array.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/utils/entity-array.ts @@ -1,4 +1,4 @@ -import { PageProps } from '../types'; +import { PageProps } from '@klerick/json-api-nestjs-shared'; export class EntityArray extends Array { constructor(items: T[], private pageProps: PageProps) { diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/utils/generate-atomic-body.spec.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/utils/generate-atomic-body.spec.ts index 4a278865..ad28e07e 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/utils/generate-atomic-body.spec.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/utils/generate-atomic-body.spec.ts @@ -1,4 +1,5 @@ -import { GenerateAtomicBody, Operation } from './generate-atomic-body'; +import { Operation } from '@klerick/json-api-nestjs-shared'; +import { GenerateAtomicBody } from './generate-atomic-body'; import { JsonApiUtilsService } from '../service'; import { JsonApiSdkConfig } from '../types'; diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/utils/generate-atomic-body.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/utils/generate-atomic-body.ts index f52f7b14..6ad80cef 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/utils/generate-atomic-body.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/utils/generate-atomic-body.ts @@ -1,36 +1,16 @@ -import { - AtomicMainOperations, - Entity as EntityObject, - EntityRelation, - JsonApiSdkConfig, -} from '../types'; -import { getTypeForReq } from './'; -import { JsonApiUtilsService } from '../service'; - -export enum Operation { - add = 'add', - update = 'update', - remove = 'remove', -} +import { Operation, RelationKeys } from '@klerick/json-api-nestjs-shared'; -export type BodyType = { - op: Operation; - ref: { - type: string; - id?: string; - relationship?: string; - tmpId?: string; - }; - data?: any; -}; +import { AtomicMainOperations, JsonApiSdkConfig, BodyType } from '../types'; +import { getTypeForReq } from './utils'; +import { JsonApiUtilsService } from '../service'; export type AtomicVoidOperation = { [K in keyof AtomicMainOperations<[]>]: (...arg: any) => void; }; export class GenerateAtomicBody< - Entity extends EntityObject = any, - Rel extends EntityRelation = any + Entity extends object = any, + Rel extends RelationKeys = any > implements AtomicVoidOperation { constructor( @@ -49,15 +29,13 @@ export class GenerateAtomicBody< const { relationships, attributes } = this.jsonApiUtilsService.generateBody(entity); + const id = Reflect.get(entity, this.jsonApiSdkConfig.idKey); - const idObj = - op === 'add' && !relationType - ? {} - : { id: entity[this.jsonApiSdkConfig.idKey].toString() }; + const idObj = op === 'add' && !relationType ? {} : { id: String(id) }; const data = relationType - ? this.jsonApiUtilsService.generateRelationshipsBody< - Entity[EntityRelation] - >(entity[relationType]) + ? this.jsonApiUtilsService.generateRelationshipsBody( + entity[relationType] as any + ) : { type: getTypeForReq(entity.constructor.name), attributes, @@ -67,9 +45,7 @@ export class GenerateAtomicBody< const rel = relationType ? { relationship: String(relationType) } : {}; const tmpId = - op === 'add' && entity[this.jsonApiSdkConfig.idKey] && !relationType - ? { tmpId: entity[this.jsonApiSdkConfig.idKey] } - : {}; + op === 'add' && id && !relationType ? { tmpId: String(id) } : {}; this.bodyData = { op, ref: { type, ...idObj, ...rel, ...tmpId }, @@ -85,8 +61,8 @@ export class GenerateAtomicBody< this.setToBody(Operation.add, entity); } patchOne(entity: Entity): void { - if (!entity[this.jsonApiSdkConfig.idKey]) { - new Error( + if (Reflect.get(entity, this.jsonApiSdkConfig.idKey) === undefined) { + throw new Error( 'Resource params should be instance of resource with id params' ); } @@ -94,8 +70,8 @@ export class GenerateAtomicBody< this.setToBody(Operation.update, entity); } deleteOne(entity: Entity, skipEmpty: boolean): void { - if (!entity[this.jsonApiSdkConfig.idKey]) { - new Error( + if (!Reflect.get(entity, this.jsonApiSdkConfig.idKey)) { + throw new Error( 'Resource params should be instance of resource with id params' ); } @@ -103,8 +79,8 @@ export class GenerateAtomicBody< this.setToBody(Operation.remove, entity); } patchRelationships(entity: Entity, relationType: Rel): void { - if (!entity[this.jsonApiSdkConfig.idKey]) { - new Error( + if (!Reflect.get(entity, this.jsonApiSdkConfig.idKey)) { + throw new Error( 'Resource params should be instance of resource with id params' ); } @@ -115,26 +91,30 @@ export class GenerateAtomicBody< this.setToBody(Operation.update, entity, relationType); } postRelationships(entity: Entity, relationType: Rel): void { - if (!entity[this.jsonApiSdkConfig.idKey]) { - new Error( + if (!Reflect.get(entity, this.jsonApiSdkConfig.idKey)) { + throw new Error( 'Resource params should be instance of resource with id params' ); } if (entity[relationType] === undefined) { - new Error(`${relationType.toString()} should not be undefined in entity`); + throw new Error( + `${relationType.toString()} should not be undefined in entity` + ); } this.setToBody(Operation.add, entity, relationType); } deleteRelationships(entity: Entity, relationType: Rel): void { - if (!entity[this.jsonApiSdkConfig.idKey]) { - new Error( + if (!Reflect.get(entity, this.jsonApiSdkConfig.idKey)) { + throw new Error( 'Resource params should be instance of resource with id params' ); } if (entity[relationType] === undefined) { - new Error(`${relationType.toString()} should not be undefined in entity`); + throw new Error( + `${relationType.toString()} should not be undefined in entity` + ); } this.setToBody(Operation.remove, entity, relationType); } diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/utils/index.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/utils/index.ts index 495bd3c5..2b358fdf 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/utils/index.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/utils/index.ts @@ -1,44 +1,5 @@ -import { camelToKebab } from '../../shared'; - -import { JsonApiSdkConfig, JsonSdkConfig } from '../types'; -import { ID_KEY } from '../constants'; - export * from './http-params'; +export * from './generate-atomic-body'; export * from './entity-array'; +export * from './utils'; export * from './adapter-for-axios'; -export * from './generate-atomic-body'; - -export { - camelToKebab, - ObjectTyped, - capitalizeFirstChar, - kebabToCamel, - isObject, -} from '../../shared'; - -export function resultConfig(partialConfig: JsonSdkConfig): JsonApiSdkConfig { - return { - ...partialConfig, - idKey: partialConfig.idKey ? partialConfig.idKey : ID_KEY, - idIsNumber: - partialConfig.idIsNumber === undefined - ? true - : !!partialConfig.idIsNumber, - dateFields: partialConfig.dateFields ? partialConfig.dateFields : [], - }; -} - -export function getTypeForReq(str: string): string { - return camelToKebab(str).toLowerCase(); -} - -export function isRelation(val: any): boolean { - const result = !( - val === null || - !val || - ['String', 'Boolean', 'Number', 'Date'].includes(val.constructor.name) - ); - - if (!result) return result; - return ID_KEY in val; -} diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/utils/utils.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/utils/utils.ts new file mode 100644 index 00000000..a4cd716d --- /dev/null +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/utils/utils.ts @@ -0,0 +1,31 @@ +import { kebabCase } from 'change-case-commonjs'; + +import { ID_KEY } from '../constants'; +import { JsonApiSdkConfig, JsonSdkConfig } from '../types'; + +export function isRelation(val: any): boolean { + const result = !( + val === null || + !val || + ['String', 'Boolean', 'Number', 'Date'].includes(val.constructor.name) + ); + + if (!result) return result; + return ID_KEY in val; +} + +export function getTypeForReq(str: string): string { + return kebabCase(str).toLowerCase(); +} + +export function resultConfig(partialConfig: JsonSdkConfig): JsonApiSdkConfig { + return { + ...partialConfig, + idKey: partialConfig.idKey ? partialConfig.idKey : ID_KEY, + idIsNumber: + partialConfig.idIsNumber === undefined + ? true + : !!partialConfig.idIsNumber, + dateFields: partialConfig.dateFields ? partialConfig.dateFields : [], + }; +} diff --git a/libs/json-api/json-api-nestjs-sdk/src/ngModule.ts b/libs/json-api/json-api-nestjs-sdk/src/ngModule.ts index 29276e19..57d8942c 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/ngModule.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/ngModule.ts @@ -1,3 +1,5 @@ +export { FilterOperand, ResourceObject } from '@klerick/json-api-nestjs-shared'; + export { AtomicFactory, provideJsonApi, @@ -5,9 +7,4 @@ export { getProviders, } from './lib/json-api-angular'; export { JsonApiUtilsService, JsonApiSdkService } from './lib/service'; -export { - FilterOperand, - ResourceObject, - AtomicOperations, - JsonSdkConfig, -} from './lib/types'; +export { AtomicOperations, JsonSdkConfig } from './lib/types'; diff --git a/libs/json-api/json-api-nestjs-sdk/src/shared/index.ts b/libs/json-api/json-api-nestjs-sdk/src/shared/index.ts deleted file mode 100644 index a0fe9b9f..00000000 --- a/libs/json-api/json-api-nestjs-sdk/src/shared/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './lib/utils'; -export * from './lib/types'; diff --git a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/entity-type.ts b/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/entity-type.ts deleted file mode 100644 index 5fbdd04f..00000000 --- a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/entity-type.ts +++ /dev/null @@ -1,17 +0,0 @@ -export type EntityField = - | string - | number - | bigint - | boolean - | string[] - | number[] - | null - | Date; - -export type EntityProps = { - [P in keyof T]: T[P] extends EntityField ? P : never; -}[keyof T]; - -export type EntityRelation = { - [P in keyof T]: T[P] extends EntityField ? never : P; -}[keyof T]; diff --git a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/index.ts b/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/index.ts deleted file mode 100644 index 33b70ba6..00000000 --- a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './utils-string.type'; -export * from './query-type'; -export * from './entity-type'; -export * from './response-body'; diff --git a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/query-type.ts b/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/query-type.ts deleted file mode 100644 index ddeead7a..00000000 --- a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/query-type.ts +++ /dev/null @@ -1,36 +0,0 @@ -export enum QueryField { - filter = 'filter', - sort = 'sort', - include = 'include', - page = 'page', - fields = 'fields', -} - -export enum FilterOperand { - eq = 'eq', - gt = 'gt', - gte = 'gte', - like = 'like', - lt = 'lt', - lte = 'lte', - ne = 'ne', - regexp = 'regexp', - in = 'in', - nin = 'nin', - some = 'some', -} - -export enum FilterOperandOnlyInNin { - in = 'in', - nin = 'nin', -} -export enum FilterOperandOnlySimple { - eq = 'eq', - gt = 'gt', - gte = 'gte', - like = 'like', - lt = 'lt', - lte = 'lte', - ne = 'ne', - regexp = 'regexp', -} diff --git a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/response-body.ts b/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/response-body.ts deleted file mode 100644 index 85dbdb49..00000000 --- a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/response-body.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { - EntityField, - EntityProps, - EntityRelation, - TypeOfArray, - ValueOf, -} from '.'; -import { Collection } from '@mikro-orm/core'; - -export type PageProps = { - totalItems: number; - pageNumber: number; - pageSize: number; -}; - -export type DebugMetaProps = Partial<{ - time: number; -}>; - -export type MainData = { - type: T; - id: string; -}; - -export type Links = { - self: string; - related?: string; -}; - -export type Attributes = { - [P in EntityProps]?: D[P] extends EntityField ? D[P] : TypeOfArray; -}; - -export type DataResult = E extends unknown[] - ? MainData[] - : E extends Collection - ? MainData[] - : MainData | null; - -export type Data = { - data?: DataResult; -}; - -export type Relationships = { - [P in EntityRelation]?: { - links: Links; - } & Data; -}; - -export type Include = ValueOf<{ - [P in EntityRelation]: ResourceData>; -}>; - -export type ResourceData = MainData & { - attributes?: Attributes; - relationships?: Relationships; - links: Omit; -}; - -export type MetaProps = R extends null ? T : T & R; - -export type ResourceObject< - T, - R extends 'object' | 'array' = 'object', - M = null -> = { - meta: R extends 'array' - ? MetaProps - : MetaProps; - data: R extends 'array' ? ResourceData[] : ResourceData; - included?: Include[]; -}; - -export type ResourceObjectRelationships> = { - meta: DebugMetaProps; -} & Required>; diff --git a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/utils-string.type.ts b/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/utils-string.type.ts deleted file mode 100644 index b861d238..00000000 --- a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/utils-string.type.ts +++ /dev/null @@ -1,26 +0,0 @@ -import type { Collection } from '@mikro-orm/core'; - -export type KebabCase = S extends `${infer C}${infer T}` - ? KebabCase extends infer U - ? U extends string - ? T extends Uncapitalize - ? `${Uncapitalize}${U}` - : `${Uncapitalize}-${U}` - : never - : never - : S; - -export type KebabToCamelCase = - S extends `${infer T}-${infer U}-${infer V}` - ? `${T}${Capitalize}${Capitalize>}` - : S extends `${infer T}-${infer U}` - ? `${Capitalize}${Capitalize>}` - : S; - -export type TypeOfArray = T extends (infer U)[] - ? U - : T extends Collection - ? U - : T; - -export type ValueOf = T[keyof T]; diff --git a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/index.ts b/libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/index.ts deleted file mode 100644 index a7799257..00000000 --- a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './string-utils'; -export * from './object-utils'; diff --git a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/object-utils.ts b/libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/object-utils.ts deleted file mode 100644 index 5d4ad26d..00000000 --- a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/object-utils.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { kebabToCamel } from './string-utils'; - -export const ObjectTyped = { - keys: Object.keys as (yourObject: T) => Array, - values: Object.values as (yourObject: U) => Array, - entries: Object.entries as ( - yourObject: O - ) => Array<[keyof O, O[keyof O]]>, - fromEntries: Object.fromEntries as ( - yourObjectEntries: [K, V][] - ) => Record, -}; - -export function isObject(item: unknown): item is object { - return typeof item === 'object' && !Array.isArray(item) && item !== null; -} - -export function createEntityInstance(name: string): E { - const entityName = kebabToCamel(name); - return Function('return new class ' + entityName + '{}')(); -} diff --git a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/string-utils.spec.ts b/libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/string-utils.spec.ts deleted file mode 100644 index 4596cd21..00000000 --- a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/string-utils.spec.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { - camelToKebab, - snakeToCamel, - isString, - kebabToCamel, -} from './string-utils'; - -describe('Test utils', () => { - it('camelToKebab', () => { - const result = camelToKebab('ApproverGroups'); - const result1 = camelToKebab('Users'); - - expect(result).toBe('approver-groups'); - expect(result1).toBe('users'); - }); - - it('snakeToCamel', () => { - const result = snakeToCamel('test_test'); - const result1 = snakeToCamel('test-test'); - const result2 = snakeToCamel('testTest'); - const result3 = snakeToCamel('event_incident_typeFK'); - expect(result).toBe('testTest'); - expect(result1).toBe('testTest'); - expect(result2).toBe('testTest'); - expect(result3).toBe('eventIncidentTypeFK'); - }); - - it('isString', () => { - expect(isString('string')).toBe(true); - expect(isString(String('string'))).toBe(true); - expect(isString(new Date())).toBe(false); - expect(isString(class {})).toBe(false); - }); - - it('kebabToCamel', () => { - const type = 'users-group'; - const type1 = 'users'; - - expect(kebabToCamel(type)).toBe('UsersGroup'); - expect(kebabToCamel(type1)).toBe('Users'); - }); -}); diff --git a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/string-utils.ts b/libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/string-utils.ts deleted file mode 100644 index 3b678710..00000000 --- a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/string-utils.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { KebabToCamelCase, KebabCase } from '../types'; - -export function isString(value: T): value is P { - return typeof value === 'string' || value instanceof String; -} - -export function snakeToCamel(str: string): string { - if (!str.match(/[\s_-]/g)) { - return str; - } - return str.replace(/([-_][a-z])/g, (group) => - group.toUpperCase().replace('-', '').replace('_', '') - ); -} - -export function camelToKebab(string: S): KebabCase { - return string - .replace(/((?<=[a-z\d])[A-Z]|(?<=[A-Z\d])[A-Z](?=[a-z]))/g, '-$1') - .toLowerCase() as KebabCase; -} - -export function upperFirstLetter(string: S): Capitalize { - return (string.charAt(0).toUpperCase() + string.slice(1)) as Capitalize; -} - -export function kebabToCamel(str: S): KebabToCamelCase { - return str - .split('-') - .map((i) => i.charAt(0).toUpperCase() + i.substring(1)) - .join('') as KebabToCamelCase; -} - -export function capitalizeFirstChar(str: string) { - return str - .split('-') - .map((i) => i.charAt(0).toUpperCase() + i.substring(1)) - .join(''); -} diff --git a/libs/json-api/json-api-nestjs-sdk/tsconfig-mjs.lib.json b/libs/json-api/json-api-nestjs-sdk/tsconfig-mjs.lib.json index b7ab9544..2fb411e3 100644 --- a/libs/json-api/json-api-nestjs-sdk/tsconfig-mjs.lib.json +++ b/libs/json-api/json-api-nestjs-sdk/tsconfig-mjs.lib.json @@ -1,19 +1,21 @@ { "extends": "./tsconfig.json", "compilerOptions": { - "types": ["node"], + "outDir": "../../../dist/out-tsc", + "declaration": true, "module": "es2015", "target": "ES2022", - "removeComments": false, - "declaration": true, + "types": [ + "node" + ] }, - "include": ["src/**/*.ts"], - "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"], - "angularCompilerOptions": { - "compilationMode": "partial", - "enableI18nLegacyMessageIdFormat": false, - "strictInjectionParameters": true, - "strictInputAccessModifiers": true, - "strictTemplates": true - } + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "jest.config.ts", + "src/**/*.spec.ts", + "src/**/*.test-d.ts", + "src/**/___test___/**/*.ts" + ] } diff --git a/libs/json-api/json-api-nestjs-sdk/tsconfig.json b/libs/json-api/json-api-nestjs-sdk/tsconfig.json index bf7d88a8..2e70621f 100644 --- a/libs/json-api/json-api-nestjs-sdk/tsconfig.json +++ b/libs/json-api/json-api-nestjs-sdk/tsconfig.json @@ -1,16 +1,14 @@ { "extends": "../../../tsconfig.base.json", "compilerOptions": { - "outDir": "../../../dist/out-tsc", + "module": "commonjs", "forceConsistentCasingInFileNames": true, "strict": true, + "importHelpers": true, "noImplicitOverride": true, - "noPropertyAccessFromIndexSignature": true, "noImplicitReturns": true, "noFallthroughCasesInSwitch": true, - "inlineSources": true, - "inlineSourceMap": true, - "sourceMap": false + "noPropertyAccessFromIndexSignature": true }, "files": [], "include": [], diff --git a/libs/json-api/json-api-nestjs-sdk/tsconfig.lib.json b/libs/json-api/json-api-nestjs-sdk/tsconfig.lib.json index 81ec818a..4befa7f0 100644 --- a/libs/json-api/json-api-nestjs-sdk/tsconfig.lib.json +++ b/libs/json-api/json-api-nestjs-sdk/tsconfig.lib.json @@ -1,8 +1,8 @@ { "extends": "./tsconfig.json", "compilerOptions": { - "module": "commonjs", - "declaration": false, + "outDir": "../../../dist/out-tsc", + "declaration": true, "types": ["node"] }, "include": ["src/**/*.ts"], diff --git a/libs/json-api/json-api-nestjs-sdk/tsconfig.spec.json b/libs/json-api/json-api-nestjs-sdk/tsconfig.spec.json index 69a251f3..237bf4b5 100644 --- a/libs/json-api/json-api-nestjs-sdk/tsconfig.spec.json +++ b/libs/json-api/json-api-nestjs-sdk/tsconfig.spec.json @@ -3,7 +3,14 @@ "compilerOptions": { "outDir": "../../../dist/out-tsc", "module": "commonjs", - "types": ["jest", "node"] + "moduleResolution": "node10", + "types": ["jest", "node"], + "paths": { + "@klerick/json-api-nestjs-shared": [ + "libs/json-api/json-api-nestjs-shared/src/index.ts" + ] + }, + "allowJs": true }, "include": [ "jest.config.ts", diff --git a/libs/json-api/json-api-nestjs-shared/README.md b/libs/json-api/json-api-nestjs-shared/README.md index 8703f1bf..45bd9c0f 100644 --- a/libs/json-api/json-api-nestjs-shared/README.md +++ b/libs/json-api/json-api-nestjs-shared/README.md @@ -1,11 +1,9 @@ # json-api-nestjs-shared -This library was generated with [Nx](https://nx.dev). +Helper module for **[json-api-nestjs](https://github.com/klerick/nestjs-json-api/tree/master/libs/json-api/json-api-nestjs)** -## Building +## Installation -Run `nx build json-api-nestjs-shared` to build the library. - -## Running unit tests - -Run `nx test json-api-nestjs-shared` to execute the unit tests via [Jest](https://jestjs.io). +```bash +$ npm install @klerick/json-api-nestjs-shared +``` diff --git a/libs/json-api/json-api-nestjs-shared/package.json b/libs/json-api/json-api-nestjs-shared/package.json index 25918d9b..9f57500f 100644 --- a/libs/json-api/json-api-nestjs-shared/package.json +++ b/libs/json-api/json-api-nestjs-shared/package.json @@ -1,10 +1,23 @@ { "name": "@klerick/json-api-nestjs-shared", "version": "0.0.1", + "description": "Shared Helper for JsonApi Plugin for NestJs", + "keywords": [ + "nestjs", + "nest", + "jsonapi", + "json-api", + "typeorm", + "microorm", + "CRUD" + ], "dependencies": { - "tslib": "^2.3.0" + "tslib": ">2.3.0", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" }, "type": "commonjs", - "main": "./src/index.js", - "typings": "./src/index.d.ts" + "main": "./cjs/src/index.js", + "types": "./cjs/src/index.d.ts", + "module": "./mjs/src/index.js" } diff --git a/libs/json-api/json-api-nestjs-shared/project.json b/libs/json-api/json-api-nestjs-shared/project.json index cdb32619..7696c291 100644 --- a/libs/json-api/json-api-nestjs-shared/project.json +++ b/libs/json-api/json-api-nestjs-shared/project.json @@ -1,29 +1,108 @@ { "name": "json-api-nestjs-shared", "$schema": "../../../node_modules/nx/schemas/project-schema.json", - "sourceRoot": "libs/json-api/json-api-nestjs-shared/src", + "sourceRoot": "{projectRoot}/src", "projectType": "library", - "release": { - "version": { - "generatorOptions": { - "packageRoot": "dist/{projectRoot}", - "currentVersionResolver": "git-tag" - } - } - }, - "tags": [], + "tags": ["type:lib", "lib:json-api-nestjs", "lib:json-api-nestjs-shared", "type:publish"], "targets": { - "build": { + "build-cjs": { "executor": "@nx/js:tsc", - "outputs": ["{options.outputPath}"], + "outputs": [ + "{options.outputPath}" + ], + "options": { + "outputPath": "dist/{projectRoot}/cjs", + "tsConfig": "{projectRoot}/tsconfig.lib.json", + "packageJson": "{projectRoot}/package.json", + "main": "{projectRoot}/src/index.ts", + "assets": [ + { + "glob": "*.md", + "input": "{projectRoot}", + "output": "../" + } + ], + "buildableProjectDepsInPackageJsonType": "peerDependencies", + "updateBuildableProjectDepsInPackageJson": true + } + }, + "build-mjs": { + "executor": "@nx/js:tsc", + "outputs": [ + "{options.outputPath}" + ], + "options": { + "outputPath": "dist/{projectRoot}/mjs", + "tsConfig": "{projectRoot}/tsconfig-mjs.lib.json", + "packageJson": "{projectRoot}/package.json", + "main": "{projectRoot}/src/index.ts", + "assets": [ + { + "glob": "*.md", + "input": "{projectRoot}", + "output": "../" + } + ] + } + }, + "build": { + "executor": "nx:run-commands", + "dependsOn": [ + "build-cjs", + "build-mjs" + ], + "options": { + "outputPath": "dist/{projectRoot}", + "commands": [ + { + "command": "[ ! -f dist/{projectRoot}/cjs/package.json ] || cp dist/{projectRoot}/cjs/package.json dist/{projectRoot}/package.json", + "forwardAllArgs": false + }, + { + "command": "mkdir -p node_modules/@klerick && rm -rf node_modules/@klerick/json-api-nestjs-shared", + "forwardAllArgs": false + }, + { + "command": "ln -s $(pwd)/dist/{projectRoot} node_modules/@klerick/json-api-nestjs-shared", + "forwardAllArgs": false + } + ], + "cwd": "./", + "parallel": false + } + }, + "ts-test": { + "executor": "nx:run-commands", "options": { - "outputPath": "dist/libs/json-api/json-api-nestjs-shared", - "tsConfig": "libs/json-api/json-api-nestjs-shared/tsconfig.lib.json", - "packageJson": "libs/json-api/json-api-nestjs-shared/package.json", - "main": "libs/json-api/json-api-nestjs-shared/src/index.ts", - "assets": ["libs/json-api/json-api-nestjs-shared/*.md"] + "commands": [ + "tsd --files \"src/**/*.test-d.ts\" -t src/lib/types/index.ts" + ], + "cwd": "{workspaceRoot}/{projectRoot}", + "parallel": false } }, + "upload-badge": { + "executor": "nx:run-commands", + "dependsOn": [ + { + "target": "test" + } + ], + "options": { + "commands": [ + "node tools/scripts/upload-badge.mjs json-api-nestjs-shared" + ], + "cwd": "./", + "parallel": false, + "outputPath": "{workspaceRoot}/{projectRoot}" + } + }, + "publish": { + "command": "node tools/scripts/publish.mjs json-api-nestjs-shared {args.ver} {args.tag}", + "dependsOn": [ + "build" + ] + }, "nx-release-publish": { "options": { "packageRoot": "dist/{projectRoot}" diff --git a/libs/json-api/json-api-nestjs-shared/src/index.ts b/libs/json-api/json-api-nestjs-shared/src/index.ts index a0fe9b9f..e54953b8 100644 --- a/libs/json-api/json-api-nestjs-shared/src/index.ts +++ b/libs/json-api/json-api-nestjs-shared/src/index.ts @@ -1,2 +1,3 @@ export * from './lib/utils'; export * from './lib/types'; +export * from './lib/constants'; diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/constants/index.ts b/libs/json-api/json-api-nestjs-shared/src/lib/constants/index.ts new file mode 100644 index 00000000..73cf7764 --- /dev/null +++ b/libs/json-api/json-api-nestjs-shared/src/lib/constants/index.ts @@ -0,0 +1,2 @@ +export const KEY_MAIN_INPUT_SCHEMA = 'atomic:operations'; +export const KEY_MAIN_OUTPUT_SCHEMA = 'atomic:results'; diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/types/entity-type.test-d.ts b/libs/json-api/json-api-nestjs-shared/src/lib/types/entity-type.test-d.ts new file mode 100644 index 00000000..8114f9df --- /dev/null +++ b/libs/json-api/json-api-nestjs-shared/src/lib/types/entity-type.test-d.ts @@ -0,0 +1,68 @@ +import { expectType } from 'tsd'; +import { Any } from 'ts-toolbelt'; + +import { Users } from '../utils/___test___/test-classes.helper'; + +import { RelationKeys, PropertyKeys, IsIterator } from './entity-type'; +import type { Collection } from '@mikro-orm/core'; + +type RelationId = 'addresses' | 'manager' | 'roles' | 'comments' | 'userGroup'; +type RelationName = 'roles'; +type PropertyId = + | 'id' + | 'login' + | 'firstName' + | 'testReal' + | 'testArrayNull' + | 'lastName' + | 'isActive' + | 'testDate' + | 'createdAt' + | 'updatedAt'; +type PropertyName = + | 'id' + | 'login' + | 'firstName' + | 'testReal' + | 'testArrayNull' + | 'lastName' + | 'isActive' + | 'testDate' + | 'createdAt' + | 'updatedAt' + | 'addresses' + | 'manager' + | 'comments' + | 'userGroup'; + +type IsEqualsRelationId = Any.Equals, RelationId>; +type IsEqualsRelationName = Any.Equals< + RelationKeys, + RelationName +>; +type IsNoEqualsRelationName = Any.Equals< + RelationKeys, + 'comments' +>; + +type IsEqualsPropertyId = Any.Equals, PropertyId>; +type IsEqualsPropertyName = Any.Equals< + PropertyKeys, + PropertyName +>; +type IsNoEqualsPropertyName = Any.Equals, 'roles'>; + +expectType(1); +expectType(1); +expectType(0); + +expectType(1); +expectType(1); +expectType(0); + +type ArrayUsers = Users[]; +type CollectionUsers = Collection; + +expectType>(1); +expectType>(1); +expectType>(0); diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/types/entity-type.ts b/libs/json-api/json-api-nestjs-shared/src/lib/types/entity-type.ts index 5fbdd04f..bc40ceed 100644 --- a/libs/json-api/json-api-nestjs-shared/src/lib/types/entity-type.ts +++ b/libs/json-api/json-api-nestjs-shared/src/lib/types/entity-type.ts @@ -1,17 +1,43 @@ -export type EntityField = - | string - | number - | bigint - | boolean - | string[] - | number[] - | null - | Date; - -export type EntityProps = { - [P in keyof T]: T[P] extends EntityField ? P : never; -}[keyof T]; - -export type EntityRelation = { - [P in keyof T]: T[P] extends EntityField ? never : P; -}[keyof T]; +import { Any } from 'ts-toolbelt'; + +export type HasId = Any.At extends undefined + ? 0 + : 1; + +export type CastIteratorType = T extends { + [Symbol.iterator](): Iterator; +} + ? U + : T; + +type RelationCheck = T extends never + ? 0 + : T extends Promise + ? HasId + : HasId, IdKey>; + +export type RelationKeys = { + [K in keyof E]: Exclude extends never + ? never + : RelationCheck, IdKey> extends 1 + ? K + : never; +}[keyof E]; + +export type PropertyKeys = keyof Omit< + E, + RelationKeys +>; + +export type IsIterator = T extends { + [Symbol.iterator](): Iterator; +} + ? 1 + : 0; + +export type TypeOfArray = T extends (infer U)[] ? U : T; + +export type ValueOf = T[keyof T]; +export type Constructor = new (...args: any[]) => T; +export type AnyEntity = T; +export type EntityClass = Constructor; diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/types/index.ts b/libs/json-api/json-api-nestjs-shared/src/lib/types/index.ts index 33b70ba6..e092f90f 100644 --- a/libs/json-api/json-api-nestjs-shared/src/lib/types/index.ts +++ b/libs/json-api/json-api-nestjs-shared/src/lib/types/index.ts @@ -1,4 +1,3 @@ -export * from './utils-string.type'; export * from './query-type'; export * from './entity-type'; export * from './response-body'; diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/types/query-type.ts b/libs/json-api/json-api-nestjs-shared/src/lib/types/query-type.ts index ddeead7a..f7dc00c1 100644 --- a/libs/json-api/json-api-nestjs-shared/src/lib/types/query-type.ts +++ b/libs/json-api/json-api-nestjs-shared/src/lib/types/query-type.ts @@ -34,3 +34,9 @@ export enum FilterOperandOnlySimple { ne = 'ne', regexp = 'regexp', } + +export enum Operation { + add = 'add', + update = 'update', + remove = 'remove', +} diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/types/response-body.test-d.ts b/libs/json-api/json-api-nestjs-shared/src/lib/types/response-body.test-d.ts new file mode 100644 index 00000000..bf4a3f66 --- /dev/null +++ b/libs/json-api/json-api-nestjs-shared/src/lib/types/response-body.test-d.ts @@ -0,0 +1,167 @@ +import { expectAssignable } from 'tsd'; + +import { + Attributes, + ResourceObject, + BaseMeta, + Include, + ResourceObjectRelationships, +} from './response-body'; +import { Users } from '../utils/___test___/test-classes.helper'; + +const CheckBaseMeta = { + meta: { time: 1 }, +} satisfies BaseMeta; + +const CheckBaseMetaExtend = { + meta: { time: 1, someData: '' }, +} satisfies BaseMeta<'object', { someData: string }>; + +const CheckBaseMetaForArray = { + meta: { time: 1, pageSize: 0, pageNumber: 0, totalItems: 0 }, +} satisfies BaseMeta<'array'>; + +expectAssignable(CheckBaseMeta); +expectAssignable>(CheckBaseMetaExtend); +expectAssignable>(CheckBaseMetaForArray); + +const CheckAttributes = { + firstName: '', + lastName: '', + login: '', + isActive: null, + testDate: new Date(), + testArrayNull: null, + testReal: [1], + createdAt: new Date(), + updatedAt: new Date(), +} satisfies Attributes; + +expectAssignable>(CheckAttributes); + +const CheckInclude = { + id: '1', + type: 'users', + attributes: CheckAttributes, + relationships: { + addresses: { + links: { + self: 'selflinks', + }, + }, + manager: { + links: { + self: 'selflinks', + }, + data: { + type: 'users', + id: 'dssd', + }, + }, + comments: { + links: { + self: 'selfLinks', + }, + data: [{ id: '1', type: 'comments' }], + }, + roles: { + links: { + self: 'selfLinks', + }, + data: [{ id: '1', type: 'roles' }], + }, + userGroup: { + links: { self: 'selfLinks' }, + data: null, + }, + }, + links: { self: 'selfLinks' }, +} satisfies Include; + +expectAssignable>(CheckInclude); + +const CheckResourceObject = { + meta: CheckBaseMeta.meta, + data: { + id: '1', + type: 'users', + attributes: CheckAttributes, + links: { self: 'selfLinks' }, + }, +} satisfies ResourceObject; + +const CheckResourceObjectArray = { + meta: CheckBaseMetaForArray.meta, + data: [ + { + id: '1', + type: 'users', + attributes: CheckAttributes, + relationships: { + addresses: { + links: { + self: 'selflinks', + }, + }, + manager: { + links: { + self: 'selflinks', + }, + data: { + type: 'users', + id: 'dssd', + }, + }, + comments: { + links: { + self: 'selfLinks', + }, + data: [{ id: '1', type: 'comments' }], + }, + roles: { + links: { + self: 'selfLinks', + }, + data: [{ id: '1', type: 'roles' }], + }, + userGroup: { + links: { self: 'selfLinks' }, + data: null, + }, + }, + links: { self: 'selfLinks' }, + }, + ], +} satisfies ResourceObject; + +expectAssignable>(CheckResourceObject); +expectAssignable>(CheckResourceObjectArray); + +const CheckResourceObjectRelationships = { + meta: { + time: 1, + }, + data: { + id: '1', + type: 'users-groups', + }, +} satisfies ResourceObjectRelationships; + +const CheckResourceObjectRelationshipsArray = { + meta: { + time: 1, + }, + data: [ + { + id: '1', + type: 'users-groups', + }, + ], +} satisfies ResourceObjectRelationships; + +expectAssignable>( + CheckResourceObjectRelationships +); +expectAssignable>( + CheckResourceObjectRelationshipsArray +); diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/types/response-body.ts b/libs/json-api/json-api-nestjs-shared/src/lib/types/response-body.ts index 85dbdb49..315304c8 100644 --- a/libs/json-api/json-api-nestjs-shared/src/lib/types/response-body.ts +++ b/libs/json-api/json-api-nestjs-shared/src/lib/types/response-body.ts @@ -1,11 +1,14 @@ import { - EntityField, - EntityProps, - EntityRelation, - TypeOfArray, - ValueOf, -} from '.'; -import { Collection } from '@mikro-orm/core'; + PropertyKeys, + RelationKeys, + IsIterator, + CastIteratorType, +} from './entity-type'; +import { ValueOf } from './entity-type'; + +export type DebugMetaProps = Partial<{ + time: number; +}>; export type PageProps = { totalItems: number; @@ -13,64 +16,117 @@ export type PageProps = { pageSize: number; }; -export type DebugMetaProps = Partial<{ - time: number; -}>; - export type MainData = { type: T; id: string; }; +export type BaseMainData< + Entity, + IdKey extends string, + Rel extends RelationKeys +> = { + data: IsIterator extends 1 + ? MainData[] + : [Extract] extends [never] + ? MainData + : MainData | null; +}; + +export type MetaProps = R extends null ? T : T & R; + +export type MetaPropsForArrayResourceObject = MetaProps< + PageProps, + DebugMetaProps +>; export type Links = { self: string; - related?: string; }; -export type Attributes = { - [P in EntityProps]?: D[P] extends EntityField ? D[P] : TypeOfArray; +export type BaseLinks = { + links: Links; }; -export type DataResult = E extends unknown[] - ? MainData[] - : E extends Collection - ? MainData[] - : MainData | null; +export type Attributes = { + [P in Exclude, IdKey>]?: Entity[P]; +}; -export type Data = { - data?: DataResult; +export type BaseAttribute< + Entity extends object, + IdKey extends string = 'id' +> = { + attributes?: Attributes; +}; + +export type Relationships< + Entity extends object, + IdKey extends string = 'id' +> = { + [P in RelationKeys]?: + | BaseLinks + | (BaseLinks & BaseMainData); }; -export type Relationships = { - [P in EntityRelation]?: { - links: Links; - } & Data; +export type BaseRelationships< + Entity extends object, + IdKey extends string = 'id' +> = { relationships?: Relationships }; + +export type Meta< + Type extends 'object' | 'array', + ExtendBase +> = Type extends 'array' + ? MetaProps + : MetaProps; + +export type BaseMeta< + Type extends 'object' | 'array' = 'object', + ExtendBase = null +> = { + meta: Meta; }; -export type Include = ValueOf<{ - [P in EntityRelation]: ResourceData>; +export type BaseResourceData< + Entity extends object, + Type extends 'object' | 'array' = 'object', + IdKey extends string = 'id' +> = { + data: Type extends 'array' + ? ResourceData[] + : ResourceData; +}; + +export type Include = ValueOf<{ + [Rel in RelationKeys]: CastIteratorType< + Entity[Rel] + > extends object + ? ResourceData> + : never; }>; -export type ResourceData = MainData & { - attributes?: Attributes; - relationships?: Relationships; - links: Omit; +export type BaseIncluded = { + included?: Include[]; }; -export type MetaProps = R extends null ? T : T & R; +export type ResourceData< + Entity extends object, + IdKey extends string = 'id' +> = MainData & + BaseAttribute & + BaseRelationships & + BaseLinks; export type ResourceObject< - T, - R extends 'object' | 'array' = 'object', - M = null -> = { - meta: R extends 'array' - ? MetaProps - : MetaProps; - data: R extends 'array' ? ResourceData[] : ResourceData; - included?: Include[]; -}; + Entity extends object, + Type extends 'object' | 'array' = 'object', + ExtendBase = null, + IdKey extends string = 'id' +> = BaseMeta & + BaseResourceData & + BaseIncluded; -export type ResourceObjectRelationships> = { - meta: DebugMetaProps; -} & Required>; +export type ResourceObjectRelationships< + Entity extends object, + IdKey extends string, + Rel extends RelationKeys +> = BaseMeta & BaseMainData; diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/types/utils-string.type.ts b/libs/json-api/json-api-nestjs-shared/src/lib/types/utils-string.type.ts deleted file mode 100644 index b861d238..00000000 --- a/libs/json-api/json-api-nestjs-shared/src/lib/types/utils-string.type.ts +++ /dev/null @@ -1,26 +0,0 @@ -import type { Collection } from '@mikro-orm/core'; - -export type KebabCase = S extends `${infer C}${infer T}` - ? KebabCase extends infer U - ? U extends string - ? T extends Uncapitalize - ? `${Uncapitalize}${U}` - : `${Uncapitalize}-${U}` - : never - : never - : S; - -export type KebabToCamelCase = - S extends `${infer T}-${infer U}-${infer V}` - ? `${T}${Capitalize}${Capitalize>}` - : S extends `${infer T}-${infer U}` - ? `${Capitalize}${Capitalize>}` - : S; - -export type TypeOfArray = T extends (infer U)[] - ? U - : T extends Collection - ? U - : T; - -export type ValueOf = T[keyof T]; diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/utils/___test___/test-classes.helper.ts b/libs/json-api/json-api-nestjs-shared/src/lib/utils/___test___/test-classes.helper.ts new file mode 100644 index 00000000..46754b8e --- /dev/null +++ b/libs/json-api/json-api-nestjs-shared/src/lib/utils/___test___/test-classes.helper.ts @@ -0,0 +1,56 @@ +import { Collection } from '@mikro-orm/core'; +type IUsers = Users; +export class Users { + public id!: number; + public login!: string; + public firstName!: string; + public testReal: number[] = []; + public testArrayNull!: number[] | null; + public lastName!: string | null; + public isActive!: null; + public testDate!: Date; + public createdAt: Date = new Date(); + public updatedAt: Date = new Date(); + + public addresses!: IAddresses; + public manager!: IUsers; + public roles = new Collection(this); + public comments!: Comments[]; + public userGroup!: UserGroups | null; +} +type IRoles = Roles; +export class Roles { + public id!: number; + public name!: string; + public key!: string; + public isDefault!: boolean; + createdAt: Date = new Date(); + updatedAt: Date = new Date(); +} +type IUserGroups = UserGroups; +export class UserGroups { + public id!: number; + public label!: string; +} +type IAddresses = Addresses; +export class Addresses { + public id!: number; + public city!: string; + public state!: string; + public country!: string; + public arrayField!: string[]; + createdAt: Date = new Date(); + updatedAt: Date = new Date(); +} +type IComments = Comments; +export class Comments { + public id!: number; + public kind!: CommentKind; + createdAt: Date = new Date(); + updatedAt: Date = new Date(); +} +export enum CommentKind { + Comment = 'COMMENT', + Message = 'MESSAGE', + Note = 'NOTE', +} diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/utils/index.ts b/libs/json-api/json-api-nestjs-shared/src/lib/utils/index.ts index a7799257..53a4561e 100644 --- a/libs/json-api/json-api-nestjs-shared/src/lib/utils/index.ts +++ b/libs/json-api/json-api-nestjs-shared/src/lib/utils/index.ts @@ -1,2 +1 @@ -export * from './string-utils'; export * from './object-utils'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/utils.spec.ts b/libs/json-api/json-api-nestjs-shared/src/lib/utils/object-utils.spec.ts similarity index 53% rename from libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/utils.spec.ts rename to libs/json-api/json-api-nestjs-shared/src/lib/utils/object-utils.spec.ts index fd1d708e..dd3134d9 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/utils.spec.ts +++ b/libs/json-api/json-api-nestjs-shared/src/lib/utils/object-utils.spec.ts @@ -1,6 +1,6 @@ -import { getEntityName, nameIt } from './'; +import { getEntityName } from './object-utils'; -describe('Test utils', () => { +describe('object utils', () => { it('getEntityName', () => { expect(getEntityName('Entity')).toBe('Entity'); expect(getEntityName(class EntityClass {})).toBe('EntityClass'); @@ -8,10 +8,4 @@ describe('Test utils', () => { const tmp = new EntityClassInst(); expect(getEntityName(tmp as any)).toBe('EntityClassInst'); }); - - it('nameIt', () => { - const newNameClass = 'newNameClass'; - const newClass = nameIt(newNameClass, class {}); - expect(getEntityName(newClass)).toBe(newNameClass); - }); }); diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/utils/object-utils.ts b/libs/json-api/json-api-nestjs-shared/src/lib/utils/object-utils.ts index 5d4ad26d..3dbec564 100644 --- a/libs/json-api/json-api-nestjs-shared/src/lib/utils/object-utils.ts +++ b/libs/json-api/json-api-nestjs-shared/src/lib/utils/object-utils.ts @@ -1,4 +1,4 @@ -import { kebabToCamel } from './string-utils'; +import { pascalCase } from 'change-case-commonjs'; export const ObjectTyped = { keys: Object.keys as (yourObject: T) => Array, @@ -15,7 +15,41 @@ export function isObject(item: unknown): item is object { return typeof item === 'object' && !Array.isArray(item) && item !== null; } +export function isString(value: T): value is P { + return typeof value === 'string' || value instanceof String; +} + export function createEntityInstance(name: string): E { - const entityName = kebabToCamel(name); + const entityName = pascalCase(name); return Function('return new class ' + entityName + '{}')(); } + +export const getEntityName = (entity: unknown): string => { + if (entity === null) throw new Error('Entity is null'); + + if (typeof entity === 'string') { + return entity; + } + + if (typeof entity === 'object' && 'name' in entity) { + return `${entity['name']}`; + } + + if ( + typeof entity === 'object' && + 'constructor' in entity && + 'name' in entity.constructor + ) { + return entity['constructor']['name']; + } + + if ( + typeof entity === 'function' && + 'constructor' in entity.prototype && + 'name' in entity.prototype.constructor + ) { + return entity.prototype.constructor.name; + } + + throw new Error('Entity is not object'); +}; diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/utils/string-utils.spec.ts b/libs/json-api/json-api-nestjs-shared/src/lib/utils/string-utils.spec.ts deleted file mode 100644 index 4596cd21..00000000 --- a/libs/json-api/json-api-nestjs-shared/src/lib/utils/string-utils.spec.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { - camelToKebab, - snakeToCamel, - isString, - kebabToCamel, -} from './string-utils'; - -describe('Test utils', () => { - it('camelToKebab', () => { - const result = camelToKebab('ApproverGroups'); - const result1 = camelToKebab('Users'); - - expect(result).toBe('approver-groups'); - expect(result1).toBe('users'); - }); - - it('snakeToCamel', () => { - const result = snakeToCamel('test_test'); - const result1 = snakeToCamel('test-test'); - const result2 = snakeToCamel('testTest'); - const result3 = snakeToCamel('event_incident_typeFK'); - expect(result).toBe('testTest'); - expect(result1).toBe('testTest'); - expect(result2).toBe('testTest'); - expect(result3).toBe('eventIncidentTypeFK'); - }); - - it('isString', () => { - expect(isString('string')).toBe(true); - expect(isString(String('string'))).toBe(true); - expect(isString(new Date())).toBe(false); - expect(isString(class {})).toBe(false); - }); - - it('kebabToCamel', () => { - const type = 'users-group'; - const type1 = 'users'; - - expect(kebabToCamel(type)).toBe('UsersGroup'); - expect(kebabToCamel(type1)).toBe('Users'); - }); -}); diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/utils/string-utils.ts b/libs/json-api/json-api-nestjs-shared/src/lib/utils/string-utils.ts deleted file mode 100644 index 3b678710..00000000 --- a/libs/json-api/json-api-nestjs-shared/src/lib/utils/string-utils.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { KebabToCamelCase, KebabCase } from '../types'; - -export function isString(value: T): value is P { - return typeof value === 'string' || value instanceof String; -} - -export function snakeToCamel(str: string): string { - if (!str.match(/[\s_-]/g)) { - return str; - } - return str.replace(/([-_][a-z])/g, (group) => - group.toUpperCase().replace('-', '').replace('_', '') - ); -} - -export function camelToKebab(string: S): KebabCase { - return string - .replace(/((?<=[a-z\d])[A-Z]|(?<=[A-Z\d])[A-Z](?=[a-z]))/g, '-$1') - .toLowerCase() as KebabCase; -} - -export function upperFirstLetter(string: S): Capitalize { - return (string.charAt(0).toUpperCase() + string.slice(1)) as Capitalize; -} - -export function kebabToCamel(str: S): KebabToCamelCase { - return str - .split('-') - .map((i) => i.charAt(0).toUpperCase() + i.substring(1)) - .join('') as KebabToCamelCase; -} - -export function capitalizeFirstChar(str: string) { - return str - .split('-') - .map((i) => i.charAt(0).toUpperCase() + i.substring(1)) - .join(''); -} diff --git a/libs/json-api/json-api-nestjs-shared/tsconfig-mjs.lib.json b/libs/json-api/json-api-nestjs-shared/tsconfig-mjs.lib.json new file mode 100644 index 00000000..4259d741 --- /dev/null +++ b/libs/json-api/json-api-nestjs-shared/tsconfig-mjs.lib.json @@ -0,0 +1,21 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "types": [ + "node" + ], + "module": "es2015", + "target": "ES2022", + "removeComments": false, + "declaration": true + }, + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "jest.config.ts", + "src/**/*.spec.ts", + "src/**/*.test-d.ts", + "src/**/___test___/**/*.ts" + ] +} diff --git a/libs/json-api/json-api-nestjs-shared/tsconfig.lib.json b/libs/json-api/json-api-nestjs-shared/tsconfig.lib.json index dbf54fd7..0acc1f8f 100644 --- a/libs/json-api/json-api-nestjs-shared/tsconfig.lib.json +++ b/libs/json-api/json-api-nestjs-shared/tsconfig.lib.json @@ -3,7 +3,9 @@ "compilerOptions": { "outDir": "../../../dist/out-tsc", "declaration": true, - "types": ["node"], + "types": [ + "node" + ], "target": "es2021", "strictNullChecks": true, "noImplicitAny": true, @@ -11,6 +13,14 @@ "forceConsistentCasingInFileNames": true, "noFallthroughCasesInSwitch": true }, - "include": ["src/**/*.ts"], - "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"] + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "jest.config.ts", + "src/**/*.spec.ts", + "src/**/*.test.ts", + "src/**/*.test-d.ts", + "src/lib/utils/___test___/**/*.ts" + ] } diff --git a/libs/json-api/json-api-nestjs-shared/tsconfig.spec.json b/libs/json-api/json-api-nestjs-shared/tsconfig.spec.json index ab55b7c7..cfccf319 100644 --- a/libs/json-api/json-api-nestjs-shared/tsconfig.spec.json +++ b/libs/json-api/json-api-nestjs-shared/tsconfig.spec.json @@ -4,7 +4,8 @@ "outDir": "../../../dist/out-tsc", "module": "commonjs", "moduleResolution": "node10", - "types": ["jest", "node"] + "types": ["jest", "node"], + "allowJs": true }, "include": [ "jest.config.ts", diff --git a/libs/json-api/json-api-nestjs-typeorm/.eslintrc.json b/libs/json-api/json-api-nestjs-typeorm/.eslintrc.json new file mode 100644 index 00000000..0af28030 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/.eslintrc.json @@ -0,0 +1,30 @@ +{ + "extends": ["../../../.eslintrc.base.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.ts", "*.tsx"], + "rules": {} + }, + { + "files": ["*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.json"], + "parser": "jsonc-eslint-parser", + "rules": { + "@nx/dependency-checks": [ + "error", + { + "ignoredFiles": ["{projectRoot}/eslint.config.{js,cjs,mjs}"] + } + ] + } + } + ] +} diff --git a/libs/json-api/json-api-nestjs-typeorm/README.md b/libs/json-api/json-api-nestjs-typeorm/README.md new file mode 100644 index 00000000..8121b63b --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/README.md @@ -0,0 +1,24 @@ +# json-api-nestjs-typeorm + +TypeOrm adapter for **[json-api-nestjs](https://github.com/klerick/nestjs-json-api/tree/master/libs/json-api/json-api-nestjs)** + +## Installation + +```bash +$ npm install @klerick/json-api-nestjs-typeorm +``` + + +## Configuration params + +The following interface is using for the configuration: + +```typescript +export type TypeOrmParam = { + useSoftDelete?: boolean // Use soft delete + runInTransaction?: any>( + isolationLevel: IsolationLevel, + fn: Func + ) => ReturnType // You can use cutom function for wrapping transaction in atomic operation, example: runInTransaction from https://github.com/Aliheym/typeorm-transactional +}; +``` diff --git a/libs/json-api/json-api-nestjs-typeorm/jest.config.ts b/libs/json-api/json-api-nestjs-typeorm/jest.config.ts new file mode 100644 index 00000000..51695ffd --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/jest.config.ts @@ -0,0 +1,10 @@ +export default { + displayName: 'json-api-nestjs-typeorm', + preset: '../../../jest.preset.js', + testEnvironment: 'node', + transform: { + '^.+\\.[tj]s$': ['ts-jest', { tsconfig: '/tsconfig.spec.json' }], + }, + moduleFileExtensions: ['ts', 'js', 'html'], + coverageDirectory: '../../../coverage/libs/json-api/json-api-nestjs-typeorm', +}; diff --git a/libs/json-api/json-api-nestjs-typeorm/package.json b/libs/json-api/json-api-nestjs-typeorm/package.json new file mode 100644 index 00000000..05a37cc8 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/package.json @@ -0,0 +1,22 @@ +{ + "name": "@klerick/json-api-nestjs-typeorm", + "version": "0.0.1", + "dependencies": { + "tslib": ">2.3.0", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "type": "commonjs", + "main": "./src/index.js", + "typings": "./src/index.d.ts", + "description": "MicroOrm adapter for JsonApi Plugin for NestJs", + "keywords": [ + "nestjs", + "nest", + "jsonapi", + "json-api", + "typeorm", + "microorm", + "CRUD" + ] +} diff --git a/libs/json-api/json-api-nestjs-typeorm/project.json b/libs/json-api/json-api-nestjs-typeorm/project.json new file mode 100644 index 00000000..74981bfb --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/project.json @@ -0,0 +1,51 @@ +{ + "name": "json-api-nestjs-typeorm", + "$schema": "../../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "{projectRoot}/src", + "projectType": "library", + "tags": ["type:lib", "lib:json-api-nestjs", "lib:json-api-nestjs-typeorm", "type:publish"], + "targets": { + "build": { + "executor": "@nx/js:tsc", + "outputs": ["{options.outputPath}"], + "options": { + "outputPath": "dist/{projectRoot}", + "tsConfig": "{projectRoot}/tsconfig.lib.json", + "packageJson": "{projectRoot}/package.json", + "main": "{projectRoot}/src/index.ts", + "assets": ["{projectRoot}/*.md"], + "buildableProjectDepsInPackageJsonType": "peerDependencies", + "generateExportsField": true, + "updateBuildableProjectDepsInPackageJson": true + } + }, + "nx-release-publish": { + "options": { + "packageRoot": "dist/{projectRoot}" + } + }, + "upload-badge": { + "executor": "nx:run-commands", + "dependsOn": [ + { + "target": "test" + } + ], + "options": { + "commands": [ + "node tools/scripts/upload-badge.mjs json-api-nestjs-typeorm" + ], + "cwd": "./", + "parallel": false, + "outputPath": "{workspaceRoot}/{projectRoot}" + } + }, + "publish": { + "command": "node tools/scripts/publish.mjs json-api-nestjs-typeorm {args.ver} {args.tag}", + "dependsOn": [ + "build" + ] + } + }, + "implicitDependencies": ["json-api-nestjs"] +} diff --git a/libs/json-api/json-api-nestjs-typeorm/src/index.ts b/libs/json-api/json-api-nestjs-typeorm/src/index.ts new file mode 100644 index 00000000..9d0183f3 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/index.ts @@ -0,0 +1 @@ +export * from './lib/type-orm-json-api.module'; diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/constants/index.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/constants/index.ts new file mode 100644 index 00000000..cbe48b77 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/constants/index.ts @@ -0,0 +1,8 @@ +export const SUB_QUERY_ALIAS_FOR_PAGINATION = 'subQueryWithLimitOffset'; +export const ALIAS_FOR_PAGINATION = 'aliasForPagination'; +export const DEFAULT_CONNECTION_NAME = 'default'; +export const CURRENT_ENTITY_REPOSITORY = Symbol('CURRENT_ENTITY_REPOSITORY'); +export const CURRENT_DATA_SOURCE_TOKEN = Symbol('CURRENT_DATA_SOURCE_TOKEN'); +export const CURRENT_ENTITY_MANAGER_TOKEN = Symbol( + 'CURRENT_ENTITY_MANAGER_TOKEN' +); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/factory/index.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/factory/index.ts similarity index 73% rename from libs/json-api/json-api-nestjs/src/lib/modules/type-orm/factory/index.ts rename to libs/json-api/json-api-nestjs-typeorm/src/lib/factory/index.ts index bfc13543..8d2e48ff 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/factory/index.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/factory/index.ts @@ -1,37 +1,31 @@ import { FactoryProvider } from '@nestjs/common'; import { getDataSourceToken } from '@nestjs/typeorm'; -import { camelToKebab } from '../../../utils/nestjs-shared'; -import { DataSource, EntityManager, Repository } from 'typeorm'; - import { - CURRENT_ENTITY_MANAGER_TOKEN, + EntityParam, + CheckRelationName, + FindOneRowEntity, + RunInTransaction, + PrepareParams, FIND_ONE_ROW_ENTITY, CHECK_RELATION_NAME, - ORM_SERVICE, RUN_IN_TRANSACTION_FUNCTION, - GLOBAL_MODULE_OPTIONS_TOKEN, + ORM_SERVICE, + MODULE_OPTIONS_TOKEN, + ENTITY_PARAM_MAP, +} from '@klerick/json-api-nestjs'; +import { getEntityName } from '@klerick/json-api-nestjs-shared'; + +import { kebabCase } from 'change-case-commonjs'; +import { DataSource, EntityManager, EntityTarget, Repository } from 'typeorm'; + +import { CURRENT_DATA_SOURCE_TOKEN, + CURRENT_ENTITY_MANAGER_TOKEN, CURRENT_ENTITY_REPOSITORY, - ENTITY_MAP_PROPS, -} from '../../../constants'; -import { - FindOneRowEntity, - CheckRelationNme, - ZodEntityProps, -} from '../../mixin/types'; -import { - ObjectLiteral, - EntityTarget, - ResultGeneralParam, - RequiredFromPartial, - ConfigParam, - RunInTransaction, - EntityClass, -} from '../../../types'; +} from '../constants'; import { TypeOrmService, TypeormUtilsService } from '../service'; -import { getEntityName } from '../../mixin/helper'; -import { TypeOrmJsonApiModule } from '../type-orm-json-api.module'; + import { TypeOrmParam } from '../type'; import { @@ -42,7 +36,9 @@ import { getPrimaryColumnName, getPrimaryColumnType, getRelationProperty, + getArrayType, } from '../orm-helper'; +import { EntityClass } from '@mikro-orm/core'; export function CurrentDataSourceProvider( connectionName?: string @@ -62,7 +58,7 @@ export function CurrentEntityManager(): FactoryProvider { }; } -export function CurrentEntityRepository( +export function CurrentEntityRepository( entity: E ): FactoryProvider> { return { @@ -73,14 +69,12 @@ export function CurrentEntityRepository( }; } -export function EntityPropsMap( - entities: EntityClass[] -) { +export function EntityPropsMap(entities: EntityClass[]) { return { - provide: ENTITY_MAP_PROPS, + provide: ENTITY_PARAM_MAP, inject: [CURRENT_ENTITY_MANAGER_TOKEN], useFactory: (entityManager: EntityManager) => { - const mapProperty = new Map, ZodEntityProps>(); + const mapProperty = new Map, EntityParam>(); for (const item of entities) { const entityRepo = entityManager.getRepository(item); @@ -92,7 +86,8 @@ export function EntityPropsMap( propsNullable: getPropsNullable(entityRepo), primaryColumnName: getPrimaryColumnName(entityRepo), primaryColumnType: getPrimaryColumnType(entityRepo), - typeName: camelToKebab(className), + propsArrayType: getArrayType(entityRepo), + typeName: kebabCase(className), className: className, relations: getRelation(entityRepo), relationProperty: getRelationProperty(entityRepo), @@ -103,9 +98,9 @@ export function EntityPropsMap( }; } -export function FindOneRowEntityFactory< - E extends ObjectLiteral ->(): FactoryProvider> { +export function FindOneRowEntityFactory(): FactoryProvider< + FindOneRowEntity +> { return { provide: FIND_ONE_ROW_ENTITY, inject: [CURRENT_ENTITY_REPOSITORY, TypeormUtilsService], @@ -132,14 +127,17 @@ export function FindOneRowEntityFactory< } export function CheckRelationNameFactory< - E extends ObjectLiteral ->(): FactoryProvider> { + E extends object, + IdKey extends string = 'id' +>(): FactoryProvider> { return { provide: CHECK_RELATION_NAME, inject: [TypeormUtilsService], - useFactory(typeormUtilsService: TypeormUtilsService) { + useFactory(typeormUtilsService: TypeormUtilsService) { return (entity, value) => - !!typeormUtilsService.relationFields.find((i) => i === value); + !!(typeormUtilsService.relationFields as any).find( + (i: any) => i === value + ); }, }; } @@ -147,14 +145,8 @@ export function CheckRelationNameFactory< export function RunInTransactionFactory(): FactoryProvider { return { provide: RUN_IN_TRANSACTION_FUNCTION, - inject: [GLOBAL_MODULE_OPTIONS_TOKEN, CURRENT_DATA_SOURCE_TOKEN], - useFactory( - options: ResultGeneralParam & { - type: typeof TypeOrmJsonApiModule; - options: RequiredFromPartial; - }, - dataSource: DataSource - ) { + inject: [MODULE_OPTIONS_TOKEN, CURRENT_DATA_SOURCE_TOKEN], + useFactory(options: PrepareParams, dataSource: DataSource) { const { options: { runInTransaction }, } = options; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/index.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/index.ts similarity index 100% rename from libs/json-api/json-api-nestjs/src/lib/modules/type-orm/index.ts rename to libs/json-api/json-api-nestjs-typeorm/src/lib/index.ts diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/addresses.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/addresses.ts similarity index 90% rename from libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/addresses.ts rename to libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/addresses.ts index 3f0c7dab..0861194f 100644 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/addresses.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/addresses.ts @@ -43,7 +43,7 @@ export class Addresses { name: 'array_field', type: 'varchar', nullable: true, - default: 'NULL', + default: () => 'NULL', array: true, }) public arrayField!: string[]; @@ -52,7 +52,7 @@ export class Addresses { name: 'created_at', type: 'timestamp', nullable: true, - default: 'CURRENT_TIMESTAMP', + default: () => 'CURRENT_TIMESTAMP(0)', }) public createdAt!: Date; @@ -60,7 +60,7 @@ export class Addresses { name: 'updated_at', type: 'timestamp', nullable: true, - default: 'CURRENT_TIMESTAMP', + default: () => 'CURRENT_TIMESTAMP(0)', }) public updatedAt!: Date; diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/comments.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/comments.ts similarity index 91% rename from libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/comments.ts rename to libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/comments.ts index c6f3ff8e..c9e03b70 100644 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/comments.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/comments.ts @@ -37,7 +37,7 @@ export class Comments { name: 'created_at', type: 'timestamp', nullable: true, - default: 'CURRENT_TIMESTAMP', + default: () => 'CURRENT_TIMESTAMP(0)', }) public createdAt!: Date; @@ -45,7 +45,7 @@ export class Comments { name: 'updated_at', type: 'timestamp', nullable: true, - default: 'CURRENT_TIMESTAMP', + default: () => 'CURRENT_TIMESTAMP(0)', }) public updatedAt!: Date; diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/index.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/index.ts similarity index 81% rename from libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/index.ts rename to libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/index.ts index ba42e083..ba4ffd16 100644 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/index.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/index.ts @@ -1,29 +1,25 @@ export * from './users'; export * from './roles'; -export * from './requests-have-pod-locks'; -export * from './requests'; -export * from './pods'; export * from './comments'; export * from './addresses'; export * from './user-groups'; export * from './notes'; +export * from './pods'; import { Users } from './users'; import { Roles } from './roles'; -import { Requests } from './requests'; -import { Pods } from './pods'; import { Comments } from './comments'; import { Addresses } from './addresses'; import { UserGroups } from './user-groups'; import { Notes } from './notes'; +import { Pods } from './pods'; export const Entities = [ Users, Roles, - Requests, - Pods, Comments, Addresses, UserGroups, Notes, + Pods, ]; diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/notes.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/notes.ts similarity index 89% rename from libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/notes.ts rename to libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/notes.ts index e8694aca..ff58e18f 100644 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/notes.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/notes.ts @@ -24,7 +24,7 @@ export class Notes { name: 'created_at', type: 'timestamp', nullable: true, - default: 'CURRENT_TIMESTAMP', + default: () => 'CURRENT_TIMESTAMP(0)', }) public createdAt!: Date; @@ -32,7 +32,7 @@ export class Notes { name: 'updated_at', type: 'timestamp', nullable: true, - default: 'CURRENT_TIMESTAMP', + default: () => 'CURRENT_TIMESTAMP(0)', }) public updatedAt!: Date; diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/pods.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/pods.ts similarity index 71% rename from libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/pods.ts rename to libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/pods.ts index b5fb898f..2876065c 100644 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/pods.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/pods.ts @@ -2,13 +2,10 @@ import { Column, CreateDateColumn, Entity, - ManyToMany, PrimaryColumn, UpdateDateColumn, } from 'typeorm'; -import { IRequests, Requests } from './index'; - export type IPods = Pods; @Entity('pods') @@ -28,7 +25,7 @@ export class Pods { name: 'created_at', type: 'timestamp', nullable: true, - default: 'CURRENT_TIMESTAMP', + default: () => 'CURRENT_TIMESTAMP(0)', }) public createdAt!: Date; @@ -36,10 +33,7 @@ export class Pods { name: 'updated_at', type: 'timestamp', nullable: true, - default: 'CURRENT_TIMESTAMP', + default: () => 'CURRENT_TIMESTAMP(0)', }) public updatedAt!: Date; - - @ManyToMany(() => Requests, (item) => item.podLocks) - public lockedRequests!: IRequests[]; } diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/roles.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/roles.ts similarity index 91% rename from libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/roles.ts rename to libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/roles.ts index 4689628a..b45112fb 100644 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/roles.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/roles.ts @@ -36,12 +36,11 @@ export class Roles { }) public isDefault!: boolean; - @Column({ name: 'created_at', type: 'timestamp', nullable: true, - default: 'CURRENT_TIMESTAMP', + default: () => 'CURRENT_TIMESTAMP(0)', }) public createdAt!: Date; @@ -49,7 +48,7 @@ export class Roles { name: 'updated_at', type: 'timestamp', nullable: true, - default: 'CURRENT_TIMESTAMP', + default: () => 'CURRENT_TIMESTAMP(0)', }) public updatedAt!: Date; diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/user-groups.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/user-groups.ts similarity index 100% rename from libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/user-groups.ts rename to libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/user-groups.ts diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/users.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/users.ts similarity index 88% rename from libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/users.ts rename to libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/users.ts index 070ae412..50ae3464 100644 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/users.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/users.ts @@ -73,25 +73,25 @@ export class Users { @Column({ name: 'test_date', - type: 'timestamp', + type: 'timestamp with time zone', nullable: true, - default: 'CURRENT_TIMESTAMP', + default: () => 'CURRENT_TIMESTAMP(0)', }) public testDate!: Date; @Column({ name: 'created_at', - type: 'timestamp', + type: 'timestamp with time zone', nullable: true, - default: 'CURRENT_TIMESTAMP', + default: () => 'CURRENT_TIMESTAMP(0)', }) public createdAt!: Date; @UpdateDateColumn({ name: 'updated_at', - type: 'timestamp', + type: 'timestamp with time zone', nullable: true, - default: 'CURRENT_TIMESTAMP', + default: () => 'CURRENT_TIMESTAMP(0)', }) public updatedAt!: Date; @@ -129,5 +129,5 @@ export class Users { @ManyToOne(() => UserGroups, (userGroup) => userGroup.id) @JoinColumn({ name: 'user_groups_id' }) - public userGroup!: UserGroups; + public userGroup!: UserGroups | null; } diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/index.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/index.ts new file mode 100644 index 00000000..ef80c3df --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/index.ts @@ -0,0 +1,216 @@ +import { + getDataSourceToken, + getRepositoryToken, + TypeOrmModule, +} from '@nestjs/typeorm'; +import { Test, TestingModule } from '@nestjs/testing'; +import { Provider } from '@nestjs/common'; +import { + CONTROLLER_OPTIONS_TOKEN, + MODULE_OPTIONS_TOKEN, + DEFAULT_PAGE_SIZE, + DEFAULT_QUERY_PAGE, + JsonApiTransformerService, + Query, +} from '@klerick/json-api-nestjs'; +import { QueryField } from '@klerick/json-api-nestjs-shared'; + +import { PGliteDriver, getPGliteInstance } from 'typeorm-pglite'; +import { DataSource, Repository } from 'typeorm'; + +import { DEFAULT_CONNECTION_NAME } from '../constants'; +import { + Addresses, + Comments, + Notes, + Roles, + UserGroups, + Users, + Pods, + Entities, +} from './entities'; +import { + CurrentDataSourceProvider, + CurrentEntityManager, + CurrentEntityRepository, + OrmServiceFactory, +} from '../factory'; + +let pGliteDriver: PGliteDriver; + +export { Addresses, Comments, Notes, Roles, UserGroups, Users, Pods, Entities }; + +export { pullAllData } from './pull-data'; + +export async function sharedConnect(): Promise { + if (pGliteDriver) { + return pGliteDriver; + } + // @ts-ignore + pGliteDriver = await import('@electric-sql/pglite/contrib/uuid_ossp').then( + ({ uuid_ossp }) => + new PGliteDriver({ + extensions: { uuid_ossp }, + }) + ); + + return pGliteDriver; +} + +const readOnlyDbName = `readonly_db_${Date.now()}`; + +export function dbRandomName(readOnly = false) { + if (readOnly) { + return readOnlyDbName; + } + return `test_db_${Date.now()}`; +} + +export function mockDbPgLiteTestModule(dbName = `test_db_${Date.now()}`) { + return TypeOrmModule.forRootAsync({ + async useFactory() { + const pgDriver = await sharedConnect(); + const synchronize = await initDb(pgDriver, dbName); + + return { + type: 'postgres', + driver: pgDriver.driver, + logging: false, + synchronize, + entities: Entities, + }; + }, + }); +} + +export async function initDb(pGliteDriver: PGliteDriver, testDbName: string) { + const pgLite = await getPGliteInstance(); + const result = await pgLite.query( + `select 1 from pg_database where datname = '${testDbName}'` + ); + + if ((result['rows'] as []).length === 0) { + await pgLite.query(`create database ${testDbName}`); + } + + return (result['rows'] as []).length === 0; +} + +export function providerEntities(): Provider[] { + return Entities.map((entitiy) => { + return { + provide: getRepositoryToken(entitiy, DEFAULT_CONNECTION_NAME), + useFactory(dataSource: DataSource) { + return dataSource.getRepository(entitiy); + }, + inject: [getDataSourceToken()], + }; + }); +} + +export async function getModuleForPgLite( + entity: E, + dbName = `test_db_${Date.now()}`, + ...providers: Provider[] +): Promise { + const dbModule = await mockDbPgLiteTestModule(dbName); + + return await Test.createTestingModule({ + imports: [dbModule], + providers: [ + ...providerEntities(), + CurrentDataSourceProvider(DEFAULT_CONNECTION_NAME), + CurrentEntityManager(), + CurrentEntityRepository(entity), + OrmServiceFactory(), + { + provide: JsonApiTransformerService, + useValue: { + transformData() { + return { + included: {}, + data: {}, + }; + }, + transformRel() { + return []; + }, + }, + }, + { + provide: CONTROLLER_OPTIONS_TOKEN, + useValue: { + requiredSelectField: false, + debug: false, + }, + }, + { + provide: MODULE_OPTIONS_TOKEN, + useValue: { + requiredSelectField: false, + debug: false, + }, + }, + ...providers, + ], + }).compile(); +} + +export function getRepository(module: TestingModule) { + const userRepository = module.get>( + getRepositoryToken(Users, DEFAULT_CONNECTION_NAME) + ); + + const addressesRepository = module.get>( + getRepositoryToken(Addresses, DEFAULT_CONNECTION_NAME) + ); + + const notesRepository = module.get>( + getRepositoryToken(Notes, DEFAULT_CONNECTION_NAME) + ); + + const commentsRepository = module.get>( + getRepositoryToken(Comments, DEFAULT_CONNECTION_NAME) + ); + const rolesRepository = module.get>( + getRepositoryToken(Roles, DEFAULT_CONNECTION_NAME) + ); + + const userGroupRepository = module.get>( + getRepositoryToken(UserGroups, DEFAULT_CONNECTION_NAME) + ); + + const podsRepository = module.get>( + getRepositoryToken(Pods, DEFAULT_CONNECTION_NAME) + ); + + return { + userRepository, + addressesRepository, + notesRepository, + commentsRepository, + rolesRepository, + userGroupRepository, + podsRepository, + }; +} + +export function getDefaultQuery< + R extends object, + IdKey extends string = 'id' +>(): Query { + const filter = { + relation: null, + target: null, + }; + return { + [QueryField.filter]: filter, + [QueryField.fields]: null, + [QueryField.include]: null, + [QueryField.sort]: null, + [QueryField.page]: { + size: DEFAULT_PAGE_SIZE, + number: DEFAULT_QUERY_PAGE, + }, + } as Query; +} diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/utils/pull-data.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/pull-data.ts similarity index 99% rename from libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/utils/pull-data.ts rename to libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/pull-data.ts index f28c693e..5499bb48 100644 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/utils/pull-data.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/pull-data.ts @@ -8,7 +8,7 @@ import { Roles, UserGroups, Users, -} from '../entities'; +} from './entities'; export async function pullAddress(addressRepo: Repository) { const address = new Addresses(); diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-helper/index.spec.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-helper/index.spec.ts new file mode 100644 index 00000000..3afa116f --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-helper/index.spec.ts @@ -0,0 +1,162 @@ +import { Repository } from 'typeorm'; +import { TypeField } from '@klerick/json-api-nestjs'; +import { + getRepository, + Users, + Addresses, + Notes, + Comments, + Roles, + UserGroups, + getModuleForPgLite, + dbRandomName, +} from '../mock-utils'; + +import { + getProps, + getRelation, + getPropsType, + getPropsNullable, + getPrimaryColumnName, + getPrimaryColumnType, + getRelationProperty, + getArrayType, +} from './'; + +import { TypeormUtilsService } from '../service'; + +describe('typeorm-orm-helper-for-map', () => { + const dbName = dbRandomName(); + let userRepository: Repository; + beforeAll(async () => { + const module = await getModuleForPgLite(Users, dbName, TypeormUtilsService); + ({ userRepository } = getRepository(module)); + }); + + it('getProps', () => { + const result = getProps(userRepository); + expect(result.includes('id')).toBe(true); + expect(result.includes('lastName')).toBe(true); + expect(result.includes('createdAt')).toBe(true); + expect(result.includes('updatedAt')).toBe(true); + expect(result.includes('isActive')).toBe(true); + expect(result.includes('login')).toBe(true); + expect(result.includes('firstName')).toBe(true); + expect(result.includes('testReal')).toBe(true); + expect(result.includes('testArrayNull')).toBe(true); + expect(result.includes('testDate')).toBe(true); + + expect(result.includes('userGroup' as any)).toBe(false); + expect(result.includes('notes' as any)).toBe(false); + expect(result.includes('comments' as any)).toBe(false); + expect(result.includes('roles' as any)).toBe(false); + expect(result.includes('manager' as any)).toBe(false); + expect(result.includes('addresses' as any)).toBe(false); + }); + + it('getPropsType', () => { + const result = getPropsType(userRepository); + + expect(result).toEqual({ + createdAt: 'date', + firstName: 'string', + id: 'number', + isActive: 'boolean', + lastName: 'string', + login: 'string', + testArrayNull: 'array', + testDate: 'date', + testReal: 'array', + updatedAt: 'date', + }); + }); + + it('getArrayType', () => { + const result = getArrayType(userRepository); + expect(result).toEqual({ + testReal: TypeField.number, + testArrayNull: TypeField.number, + }); + }); + + it('getPropsNullable', () => { + const result = getPropsNullable(userRepository); + expect(result).toEqual([ + 'firstName', + 'testReal', + 'testArrayNull', + 'lastName', + 'isActive', + 'testDate', + 'createdAt', + 'updatedAt', + ]); + }); + + it('getPrimaryColumnName', () => { + const result = getPrimaryColumnName(userRepository); + expect(result).toBe('id'); + }); + + it('getPrimaryColumnType', () => { + const result = getPrimaryColumnType(userRepository); + expect(result).toBe(TypeField.number); + }); + + it('getRelation', () => { + const result = getRelation(userRepository); + expect(result.includes('id' as any)).toBe(false); + expect(result.includes('lastName' as any)).toBe(false); + expect(result.includes('createdAt' as any)).toBe(false); + expect(result.includes('updatedAt' as any)).toBe(false); + expect(result.includes('isActive' as any)).toBe(false); + expect(result.includes('login' as any)).toBe(false); + expect(result.includes('firstName' as any)).toBe(false); + expect(result.includes('testReal' as any)).toBe(false); + expect(result.includes('testArrayNull' as any)).toBe(false); + expect(result.includes('testDate' as any)).toBe(false); + + expect(result.includes('userGroup')).toBe(true); + expect(result.includes('notes')).toBe(true); + expect(result.includes('comments')).toBe(true); + expect(result.includes('roles')).toBe(true); + expect(result.includes('manager')).toBe(true); + expect(result.includes('addresses')).toBe(true); + }); + + it('getRelationProperty', () => { + const result = getRelationProperty(userRepository); + expect(result).toEqual({ + addresses: { + entityClass: Addresses, + isArray: false, + nullable: true, + }, + comments: { + entityClass: Comments, + isArray: true, + nullable: false, + }, + manager: { + entityClass: Users, + isArray: false, + nullable: true, + }, + notes: { + entityClass: Notes, + isArray: true, + nullable: false, + }, + roles: { + entityClass: Roles, + isArray: true, + nullable: false, + }, + userGroup: { + entityClass: UserGroups, + isArray: false, + nullable: true, + }, + }); + }); +}); diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-helper/index.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-helper/index.ts new file mode 100644 index 00000000..65506d34 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-helper/index.ts @@ -0,0 +1,184 @@ +import { EntityParam, TypeField } from '@klerick/json-api-nestjs'; +import { Repository } from 'typeorm'; + +export const getRelation = (repository: Repository) => + repository.metadata.relations.map((i) => { + return i.propertyName; + }) as unknown as EntityParam['relations']; + +export const getProps = ( + repository: Repository +): EntityParam['props'] => { + const relations = getRelation(repository) as any[]; + + return repository.metadata.columns + .filter((i) => !relations.includes(i.propertyName)) + .map((r) => r.propertyName) as unknown as EntityParam['props']; +}; + +export const getPropsType = ( + repository: Repository +): EntityParam['propsType'] => { + const field = getProps(repository); + + const entity = repository.target as any; + const result = {} as any; + for (const item of field) { + let typeProps: TypeField = TypeField.string; + + const fieldMetadata = repository.metadata.columns.find( + (i) => i.propertyName === item + ); + + if (fieldMetadata?.isArray) { + result[item] = TypeField.array; + continue; + } + + switch ( + Reflect.getMetadata('design:type', entity['prototype'], item as any) + ) { + case Array: + typeProps = TypeField.array; + break; + case Date: + typeProps = TypeField.date; + break; + case Number: + typeProps = TypeField.number; + break; + case Boolean: + typeProps = TypeField.boolean; + break; + case Object: + typeProps = TypeField.object; + break; + default: + typeProps = TypeField.string; + } + + result[item] = fieldMetadata?.isArray ? TypeField.array : typeProps; + } + + return result; +}; + +export const getPropsNullable = ( + repository: Repository +): EntityParam['propsNullable'] => { + const relation = getRelation(repository) as any[]; + return repository.metadata.columns + .filter((i) => !relation.includes(i.propertyName)) + .map((i) => + i.isNullable || i.default !== undefined ? i.propertyName : false + ) + .filter((i) => !!i) as unknown as EntityParam['propsNullable']; +}; + +export const getPrimaryColumnName = ( + repository: Repository +) => { + const column = repository.metadata.primaryColumns.at(0); + if (!column) throw new Error('Primary column not found'); + + return column.propertyName as EntityParam['primaryColumnName']; +}; + +export const getPrimaryColumnType = ( + repository: Repository +): EntityParam['primaryColumnType'] => { + const target = repository.target as any; + const primaryColumn = repository.metadata.primaryColumns[0].propertyName; + + return ( + Reflect.getMetadata('design:type', target['prototype'], primaryColumn) === + Number + ? TypeField.number + : TypeField.string + ) as EntityParam['primaryColumnType']; +}; + +export const getRelationProperty = ( + repository: Repository +): EntityParam['relationProperty'] => { + return repository.metadata.relations.reduce((acum, item) => { + // @ts-expect-error its dynamic creater + acum[item.propertyName] = { + entityClass: item.inverseEntityMetadata.target, + nullable: item.isManyToMany || item.isOneToMany ? false : item.isNullable, + isArray: item.isManyToMany || item.isOneToMany, + }; + + return acum; + }, {} as EntityParam['relationProperty']); +}; + +export const getArrayType = ( + repository: Repository +): EntityParam['propsArrayType'] => { + return Object.entries(getPropsType(repository)) + .filter(([name, type]) => type === TypeField.array) + .reduce((acum, [name]) => { + const fieldMetadata = repository.metadata.columns.find( + (i) => i.propertyName === name + ); + if (!fieldMetadata) { + throw new Error('Metadata not found for field ' + name); + } + + switch (fieldMetadata.type) { + case 'number': + case 'bigint': + case 'smallint': + case 'smalldecimal': + case 'decimal': + case 'double': + case 'tinyint': + case 'mediumint': + case 'int': + case 'float': + case 'dec': + case 'fixed': + case 'numeric': + case 'real': + case 'int2': + case 'int4': + case 'int8': + case 'integer': + acum[name] = TypeField.number; + break; + case 'character varying': + case 'varying character': + case 'char varying': + case 'nvarchar': + case 'national varchar': + case 'character': + case 'native character': + case 'varchar': + case 'char': + case 'nchar': + case 'national char': + case 'varchar2': + case 'nvarchar2': + case 'alphanum': + case 'shorttext': + case 'raw': + case 'binary': + case 'varbinary': + case 'string': + acum[name] = TypeField.string; + break; + case 'date': + case 'timetz': + case 'timestamptz': + case 'timestamp with local time zone': + case 'smalldatetime': + acum[name] = TypeField.date; + break; + case 'boolean': + acum[name] = TypeField.boolean; + } + + return acum; + }, {} as any); +}; diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/delete-one/delete-one.spec.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/delete-one/delete-one.spec.ts new file mode 100644 index 00000000..574d98fc --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/delete-one/delete-one.spec.ts @@ -0,0 +1,39 @@ +import { TestingModule } from '@nestjs/testing'; +import { ORM_SERVICE } from '@klerick/json-api-nestjs'; + +import { OrmServiceFactory } from '../../factory'; + +import { Repository } from 'typeorm'; +import { TypeOrmService, TypeormUtilsService } from '../../service'; + +import { + dbRandomName, + getModuleForPgLite, + getRepository, + Users, +} from '../../mock-utils'; +import { pullUser } from '../../mock-utils/pull-data'; + +describe('deleteOne', () => { + const dbName = dbRandomName(); + let typeormService: TypeOrmService; + + let user: Users; + let userRepository: Repository; + + beforeAll(async () => { + const module: TestingModule = await getModuleForPgLite( + Users, + dbName, + TypeormUtilsService + ); + ({ userRepository } = getRepository(module)); + user = await pullUser(userRepository); + typeormService = module.get>(ORM_SERVICE); + }); + + it('Should be ok', async () => { + await typeormService.deleteOne(`${user.id}`); + expect(await userRepository.findOneBy({ id: user.id })).toBe(null); + }); +}); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/delete-one/delete-one.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/delete-one/delete-one.ts similarity index 77% rename from libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/delete-one/delete-one.ts rename to libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/delete-one/delete-one.ts index 1a6871d7..38c39080 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/delete-one/delete-one.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/delete-one/delete-one.ts @@ -1,9 +1,8 @@ import { FindOptionsWhere } from 'typeorm'; import { TypeOrmService } from '../../service'; -import { ObjectLiteral } from '../../../../types'; -export async function deleteOne( - this: TypeOrmService, +export async function deleteOne( + this: TypeOrmService, id: number | string ): Promise { const data = await this.repository.findOne({ diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/delete-relationship/delete-relationship.spec.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/delete-relationship/delete-relationship.spec.ts similarity index 70% rename from libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/delete-relationship/delete-relationship.spec.ts rename to libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/delete-relationship/delete-relationship.spec.ts index 627f0917..c23c3430 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/delete-relationship/delete-relationship.spec.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/delete-relationship/delete-relationship.spec.ts @@ -1,41 +1,26 @@ -import { getDataSourceToken } from '@nestjs/typeorm'; -import { Test, TestingModule } from '@nestjs/testing'; -import { IMemoryDb } from 'pg-mem'; +import { TestingModule } from '@nestjs/testing'; +import { + JsonApiTransformerService, + ORM_SERVICE, +} from '@klerick/json-api-nestjs'; import { Repository } from 'typeorm'; +import { TypeOrmService, TypeormUtilsService } from '../../service'; import { + dbRandomName, + getModuleForPgLite, Addresses, Comments, - entities, getRepository, - mockDBTestModule, Notes, - providerEntities, pullAllData, Roles, UserGroups, Users, -} from '../../../../mock-utils/typeorm'; - -import { - CONTROL_OPTIONS_TOKEN, - CURRENT_ENTITY, - DEFAULT_CONNECTION_NAME, - ORM_SERVICE, -} from '../../../../constants'; -import { - CurrentDataSourceProvider, - CurrentEntityManager, - CurrentEntityRepository, - EntityPropsMap, - OrmServiceFactory, -} from '../../factory'; -import { JsonApiTransformerService } from '../../../mixin/service/json-api-transformer.service'; -import { TypeOrmService, TypeormUtilsService } from '../../service'; -import { createAndPullSchemaBase } from '../../../../mock-utils'; +} from '../../mock-utils'; describe('deleteRelationship', () => { - let db: IMemoryDb; + const dbName = dbRandomName(); let typeormService: TypeOrmService; let transformDataService: JsonApiTransformerService; let typeormUtilsService: TypeormUtilsService; @@ -47,31 +32,11 @@ describe('deleteRelationship', () => { let userGroupRepository: Repository; beforeAll(async () => { - db = createAndPullSchemaBase(); - const module: TestingModule = await Test.createTestingModule({ - imports: [mockDBTestModule(db)], - providers: [ - ...providerEntities(getDataSourceToken()), - CurrentDataSourceProvider(DEFAULT_CONNECTION_NAME), - { - provide: CONTROL_OPTIONS_TOKEN, - useValue: { - requiredSelectField: false, - debug: false, - }, - }, - { - provide: CURRENT_ENTITY, - useValue: Users, - }, - EntityPropsMap(entities as any), - CurrentEntityManager(), - CurrentEntityRepository(Users), - TypeormUtilsService, - JsonApiTransformerService, - OrmServiceFactory(), - ], - }).compile(); + const module: TestingModule = await getModuleForPgLite( + Users, + dbName, + TypeormUtilsService + ); ({ userRepository, addressesRepository, @@ -134,7 +99,7 @@ describe('deleteRelationship', () => { const userGroupData = { type: 'user-groups', id: userGroups - .find((i) => checkUser.userGroup.id === i.id) + .find((i) => checkUser.userGroup?.id === i.id) ?.id.toString(), }; const rolesData = [ diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/delete-relationship/delete-relationship.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/delete-relationship/delete-relationship.ts similarity index 67% rename from libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/delete-relationship/delete-relationship.ts rename to libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/delete-relationship/delete-relationship.ts index 947553b5..bff17b7a 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/delete-relationship/delete-relationship.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/delete-relationship/delete-relationship.ts @@ -1,15 +1,14 @@ -import { EntityRelation } from '../../../../utils/nestjs-shared'; +import { PostRelationshipData } from '@klerick/json-api-nestjs'; +import { RelationKeys } from '@klerick/json-api-nestjs-shared'; -import { ObjectLiteral } from '../../../../types'; - -import { PostRelationshipData } from '../../../mixin/zod'; import { TypeOrmService } from '../../service'; export async function deleteRelationship< - E extends ObjectLiteral, - Rel extends EntityRelation + E extends object, + IdKey extends string, + Rel extends RelationKeys >( - this: TypeOrmService, + this: TypeOrmService, id: number | string, rel: Rel, input: PostRelationshipData diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-all/get-all.spec.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-all/get-all.spec.ts similarity index 79% rename from libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-all/get-all.spec.ts rename to libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-all/get-all.spec.ts index 3dd8ea02..c736c1e9 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-all/get-all.spec.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-all/get-all.spec.ts @@ -1,66 +1,29 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { getDataSourceToken } from '@nestjs/typeorm'; -import { QueryField } from '../../../../utils/nestjs-shared'; +import { TestingModule } from '@nestjs/testing'; +import { + JsonApiTransformerService, + ORM_SERVICE, +} from '@klerick/json-api-nestjs'; + import { Equal, Repository } from 'typeorm'; -import { IMemoryDb } from 'pg-mem'; + +import { TypeOrmService, TypeormUtilsService } from '../../service'; import { + dbRandomName, + getModuleForPgLite, Addresses, Comments, - entities, getRepository, - mockDBTestModule, Notes, - providerEntities, pullAllData, Roles, UserGroups, Users, -} from '../../../../mock-utils/typeorm'; -import { - CurrentDataSourceProvider, - CurrentEntityManager, - CurrentEntityRepository, - EntityPropsMap, - OrmServiceFactory, -} from '../../factory'; -import { - CONTROL_OPTIONS_TOKEN, - DEFAULT_CONNECTION_NAME, - ORM_SERVICE, - DEFAULT_QUERY_PAGE, - DEFAULT_PAGE_SIZE, - CURRENT_ENTITY, -} from '../../../../constants'; -import { ObjectLiteral as Entity } from '../../../../types'; - -import { Query } from '../../../mixin/zod'; - -import { TypeOrmService, TypeormUtilsService } from '../../service'; -import { createAndPullSchemaBase } from '../../../../mock-utils'; -import { JsonApiTransformerService } from '../../../mixin/service/json-api-transformer.service'; - -function getDefaultQuery() { - const filter = { - relation: null, - target: null, - }; - const defaultQuery: Query = { - [QueryField.filter]: filter, - [QueryField.fields]: null, - [QueryField.include]: null, - [QueryField.sort]: null, - [QueryField.page]: { - size: DEFAULT_PAGE_SIZE, - number: DEFAULT_QUERY_PAGE, - }, - }; - - return defaultQuery; -} + getDefaultQuery, +} from '../../mock-utils'; describe('getAll', () => { - let db: IMemoryDb; + const dbName = dbRandomName(); let typeormService: TypeOrmService; let transformDataService: JsonApiTransformerService; @@ -72,31 +35,11 @@ describe('getAll', () => { let userGroupRepository: Repository; beforeAll(async () => { - db = createAndPullSchemaBase(); - const module: TestingModule = await Test.createTestingModule({ - imports: [mockDBTestModule(db)], - providers: [ - ...providerEntities(getDataSourceToken()), - CurrentDataSourceProvider(DEFAULT_CONNECTION_NAME), - { - provide: CONTROL_OPTIONS_TOKEN, - useValue: { - requiredSelectField: false, - debug: false, - }, - }, - { - provide: CURRENT_ENTITY, - useValue: Users, - }, - EntityPropsMap(entities as any), - CurrentEntityManager(), - CurrentEntityRepository(Users), - TypeormUtilsService, - JsonApiTransformerService, - OrmServiceFactory(), - ], - }).compile(); + const module: TestingModule = await getModuleForPgLite( + Users, + dbName, + TypeormUtilsService + ); ({ userRepository, addressesRepository, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-all/get-all.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-all/get-all.ts similarity index 86% rename from libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-all/get-all.ts rename to libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-all/get-all.ts index e6c9fa3e..a010259f 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-all/get-all.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-all/get-all.ts @@ -1,10 +1,7 @@ -import { ObjectTyped, ResourceObject } from '../../../../utils/nestjs-shared'; +import { Query, ASC, DESC } from '@klerick/json-api-nestjs'; +import { ObjectTyped, ResourceObject } from '@klerick/json-api-nestjs-shared'; -import { ObjectLiteral } from '../../../../types'; -import { Query } from '../../../mixin/zod'; import { TypeOrmService } from '../../service'; -import { TupleOfEntityRelation } from '../../../mixin/types'; -import { ASC, DESC } from '../../../../constants'; import { ALIAS_FOR_PAGINATION, @@ -20,11 +17,11 @@ function getSortObject(params: any, relationName: string) { }, {} as OrderByCondition); } -export async function getAll( - this: TypeOrmService, - query: Query -): Promise> { - const { fields, filter, include, sort, page } = query; +export async function getAll( + this: TypeOrmService, + query: Query +): Promise> { + const { fields, include, sort, page } = query; let defaultSortObject: OrderByCondition = { [`${ @@ -46,9 +43,9 @@ export async function getAll( ...expressionArrayForTarget, ...expressionArrayForRelation, ]; - - if (sort) { - const { target, ...relation } = sort; + const sortCast = sort as Query, IdKey>['sort']; + if (sortCast) { + const { target, ...relation } = sortCast; const targetOrder = getSortObject( target || {}, this.typeormUtilsService.currentAlias @@ -60,7 +57,7 @@ export async function getAll( ...acum, ...getSortObject( order || {}, - this.typeormUtilsService.getAliasForRelation(name) + this.typeormUtilsService.getAliasForRelation(name as any) ), }; }, @@ -74,7 +71,7 @@ export async function getAll( defaultSortObject = resultOrder; } for (const item of ObjectTyped.keys(relation)) { - includeForCountQuery.add(item.toString()); + includeForCountQuery.add(item); } } @@ -111,8 +108,9 @@ export async function getAll( } for (const rel of [...includeForCountQuery]) { - const currentIncludeAlias = - this.typeormUtilsService.getAliasForRelation(rel); + const currentIncludeAlias = this.typeormUtilsService.getAliasForRelation( + rel as any + ); queryBuilderForCount.leftJoin( this.typeormUtilsService.getAliasPath(rel), currentIncludeAlias @@ -178,8 +176,8 @@ export async function getAll( includeRel.add(rel); } } - - if (fields) { + const fieldsCast = fields as Query, IdKey>['fields']; + if (fieldsCast) { if (include) { for (const rel of include) { const currentIncludeAlias = @@ -190,7 +188,7 @@ export async function getAll( } } - const { target, ...other } = fields; + const { target, ...other } = fieldsCast; if (target) { for (const item of target) { selectFields.add(`${this.typeormUtilsService.currentAlias}.${item}`); @@ -199,10 +197,10 @@ export async function getAll( for (const [rel, fields] of ObjectTyped.entries(other)) { const currentIncludeAlias = this.typeormUtilsService.getAliasForRelation( - rel as TupleOfEntityRelation[number] + rel as any ); if (!fields) continue; - for (const field of fields) { + for (const field of fields as []) { selectFields.add(`${currentIncludeAlias.toString()}.${field}`); } } @@ -241,8 +239,9 @@ export async function getAll( } for (const item of [...includeRel]) { - const currentIncludeAlias = - this.typeormUtilsService.getAliasForRelation(item); + const currentIncludeAlias = this.typeormUtilsService.getAliasForRelation( + item as any + ); if (!currentIncludeAlias) continue; resultQuery[selectFields.size > 0 ? 'leftJoin' : 'leftJoinAndSelect']( this.typeormUtilsService.getAliasPath(item), diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-one/get-one.spec.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-one/get-one.spec.ts similarity index 60% rename from libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-one/get-one.spec.ts rename to libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-one/get-one.spec.ts index 97fb1f30..a6b296e1 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-one/get-one.spec.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-one/get-one.spec.ts @@ -1,65 +1,29 @@ -import { getDataSourceToken } from '@nestjs/typeorm'; -import { Test, TestingModule } from '@nestjs/testing'; -import { QueryField } from '../../../../utils/nestjs-shared'; -import { IMemoryDb } from 'pg-mem'; +import { TestingModule } from '@nestjs/testing'; +import { NotFoundException } from '@nestjs/common'; +import { + JsonApiTransformerService, + ORM_SERVICE, +} from '@klerick/json-api-nestjs'; + import { Equal, Repository } from 'typeorm'; -import { ObjectLiteral as Entity } from '../../../../types'; +import { TypeOrmService, TypeormUtilsService } from '../../service'; + import { + dbRandomName, + getModuleForPgLite, + getDefaultQuery, Addresses, Comments, - entities, getRepository, - mockDBTestModule, Notes, - providerEntities, pullAllData, Roles, UserGroups, Users, -} from '../../../../mock-utils/typeorm'; - -import { - CONTROL_OPTIONS_TOKEN, - CURRENT_ENTITY, - DEFAULT_CONNECTION_NAME, - DEFAULT_PAGE_SIZE, - DEFAULT_QUERY_PAGE, - ORM_SERVICE, -} from '../../../../constants'; -import { - CurrentDataSourceProvider, - CurrentEntityManager, - CurrentEntityRepository, - EntityPropsMap, - OrmServiceFactory, -} from '../../factory'; -import { Query } from '../../../mixin/zod'; -import { NotFoundException } from '@nestjs/common'; -import { JsonApiTransformerService } from '../../../mixin/service/json-api-transformer.service'; -import { TypeOrmService, TypeormUtilsService } from '../../service'; -import { createAndPullSchemaBase } from '../../../../mock-utils'; - -function getDefaultQuery() { - const defaultQuery: Query = { - [QueryField.filter]: { - relation: null, - target: null, - }, - [QueryField.fields]: null, - [QueryField.include]: null, - [QueryField.sort]: null, - [QueryField.page]: { - size: DEFAULT_PAGE_SIZE, - number: DEFAULT_QUERY_PAGE, - }, - }; - - return defaultQuery; -} +} from '../../mock-utils'; describe('getOne', () => { - let db: IMemoryDb; let typeormService: TypeOrmService; let transformDataService: JsonApiTransformerService; @@ -71,31 +35,11 @@ describe('getOne', () => { let userGroupRepository: Repository; beforeAll(async () => { - db = createAndPullSchemaBase(); - const module: TestingModule = await Test.createTestingModule({ - imports: [mockDBTestModule(db)], - providers: [ - ...providerEntities(getDataSourceToken()), - CurrentDataSourceProvider(DEFAULT_CONNECTION_NAME), - { - provide: CONTROL_OPTIONS_TOKEN, - useValue: { - requiredSelectField: false, - debug: false, - }, - }, - { - provide: CURRENT_ENTITY, - useValue: Users, - }, - EntityPropsMap(entities as any), - CurrentEntityManager(), - CurrentEntityRepository(Users), - TypeormUtilsService, - JsonApiTransformerService, - OrmServiceFactory(), - ], - }).compile(); + const module: TestingModule = await getModuleForPgLite( + Users, + dbRandomName(), + TypeormUtilsService + ); ({ userRepository, addressesRepository, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-one/get-one.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-one/get-one.ts similarity index 83% rename from libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-one/get-one.ts rename to libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-one/get-one.ts index b092393f..b39eccc0 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-one/get-one.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-one/get-one.ts @@ -1,14 +1,13 @@ import { NotFoundException } from '@nestjs/common'; -import { ObjectTyped, ResourceObject } from '../../../../utils/nestjs-shared'; -import { ObjectLiteral, ValidateQueryError } from '../../../../types'; -import { QueryOne } from '../../../mixin/zod'; +import { ValidateQueryError, QueryOne } from '@klerick/json-api-nestjs'; +import { ObjectTyped, ResourceObject } from '@klerick/json-api-nestjs-shared'; import { TypeOrmService } from '../../service'; -export async function getOne( - this: TypeOrmService, +export async function getOne( + this: TypeOrmService, id: number | string, - query: QueryOne -): Promise> { + query: QueryOne +): Promise> { const { include, fields } = query; const selectFields = new Set(); const builder = this.repository.createQueryBuilder( @@ -22,7 +21,7 @@ export async function getOne( ) ); - const { target, ...other } = fields; + const { target, ...other } = fields as any; if (target) { for (const fieldItem of target) { selectFields.add(this.typeormUtilsService.getAliasPath(fieldItem)); @@ -35,7 +34,7 @@ export async function getOne( selectFields.add( this.typeormUtilsService.getAliasPath( itemFieldRel, - this.typeormUtilsService.getAliasForRelation(rel.toString()) + this.typeormUtilsService.getAliasForRelation(rel as any) ) ); } diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-relationship/get-relationship.spec.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-relationship/get-relationship.spec.ts similarity index 60% rename from libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-relationship/get-relationship.spec.ts rename to libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-relationship/get-relationship.spec.ts index 979323d1..2d6bac98 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-relationship/get-relationship.spec.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-relationship/get-relationship.spec.ts @@ -1,43 +1,27 @@ -import { getDataSourceToken } from '@nestjs/typeorm'; -import { Test, TestingModule } from '@nestjs/testing'; -import { IMemoryDb } from 'pg-mem'; +import { + JsonApiTransformerService, + ORM_SERVICE, +} from '@klerick/json-api-nestjs'; +import { TestingModule } from '@nestjs/testing'; +import { NotFoundException } from '@nestjs/common'; + import { Repository } from 'typeorm'; +import { TypeOrmService, TypeormUtilsService } from '../../service'; import { + dbRandomName, + getModuleForPgLite, Addresses, Comments, - entities, getRepository, - mockDBTestModule, Notes, - providerEntities, pullAllData, Roles, UserGroups, Users, -} from '../../../../mock-utils/typeorm'; - -import { - CONTROL_OPTIONS_TOKEN, - CURRENT_ENTITY, - DEFAULT_CONNECTION_NAME, - ORM_SERVICE, -} from '../../../../constants'; -import { - CurrentDataSourceProvider, - CurrentEntityManager, - CurrentEntityRepository, - EntityPropsMap, - OrmServiceFactory, -} from '../../factory'; - -import { NotFoundException } from '@nestjs/common'; -import { TypeOrmService, TypeormUtilsService } from '../../service'; -import { createAndPullSchemaBase } from '../../../../mock-utils'; -import { JsonApiTransformerService } from '../../../mixin/service/json-api-transformer.service'; +} from '../../mock-utils'; describe('getRelationship', () => { - let db: IMemoryDb; let typeormService: TypeOrmService; let transformDataService: JsonApiTransformerService; @@ -49,31 +33,11 @@ describe('getRelationship', () => { let userGroupRepository: Repository; beforeAll(async () => { - db = createAndPullSchemaBase(); - const module: TestingModule = await Test.createTestingModule({ - imports: [mockDBTestModule(db)], - providers: [ - ...providerEntities(getDataSourceToken()), - CurrentDataSourceProvider(DEFAULT_CONNECTION_NAME), - { - provide: CONTROL_OPTIONS_TOKEN, - useValue: { - requiredSelectField: false, - debug: false, - }, - }, - { - provide: CURRENT_ENTITY, - useValue: Users, - }, - EntityPropsMap(entities as any), - CurrentEntityManager(), - CurrentEntityRepository(Users), - TypeormUtilsService, - JsonApiTransformerService, - OrmServiceFactory(), - ], - }).compile(); + const module: TestingModule = await getModuleForPgLite( + Users, + dbRandomName(), + TypeormUtilsService + ); ({ userRepository, addressesRepository, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-relationship/get-relationship.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-relationship/get-relationship.ts similarity index 59% rename from libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-relationship/get-relationship.ts rename to libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-relationship/get-relationship.ts index be447e90..76ace4cd 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-relationship/get-relationship.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-relationship/get-relationship.ts @@ -1,33 +1,30 @@ +import { NotFoundException } from '@nestjs/common'; import { - EntityRelation, + RelationKeys, ResourceObjectRelationships, -} from '../../../../utils/nestjs-shared'; - -import { - InternalServerErrorException, - NotFoundException, -} from '@nestjs/common'; +} from '@klerick/json-api-nestjs-shared'; +import { ValidateQueryError } from '@klerick/json-api-nestjs'; import { TypeOrmService } from '../../service'; -import { ObjectLiteral, ValidateQueryError } from '../../../../types'; export async function getRelationship< - E extends ObjectLiteral, - Rel extends EntityRelation + E extends object, + IdKey extends string, + Rel extends RelationKeys >( - this: TypeOrmService, + this: TypeOrmService, id: number | string, rel: Rel -): Promise> { +): Promise> { const paramsId = 'paramsId'; - const result = await this.repository + const result = (await this.repository .createQueryBuilder() .select([ this.typeormUtilsService.getAliasPath( this.typeormUtilsService.currentPrimaryColumn ), this.typeormUtilsService.getAliasPath( - this.typeormUtilsService.getPrimaryColumnForRel(rel.toString()), - this.typeormUtilsService.getAliasForRelation(rel.toString()) + this.typeormUtilsService.getPrimaryColumnForRel(rel as any), + this.typeormUtilsService.getAliasForRelation(rel as any) ), ]) .where( @@ -39,12 +36,12 @@ export async function getRelationship< ) .leftJoin( this.typeormUtilsService.getAliasPath(rel.toString()), - this.typeormUtilsService.getAliasForRelation(rel.toString()) + this.typeormUtilsService.getAliasForRelation(rel as any) ) .setParameters({ [paramsId]: id, }) - .getOne(); + .getOne()) as E | null; if (!result) { const error: ValidateQueryError = { @@ -54,7 +51,7 @@ export async function getRelationship< }; throw new NotFoundException([error]); } - const data = this.transformDataService.transformRel(result, rel); + const data = this.transformDataService.transformRel(result, rel); return { meta: {}, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/index.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/index.ts similarity index 100% rename from libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/index.ts rename to libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/index.ts diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/patch-one/patch-one.spec.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/patch-one/patch-one.spec.ts similarity index 72% rename from libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/patch-one/patch-one.spec.ts rename to libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/patch-one/patch-one.spec.ts index 7e8ca456..94e7183e 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/patch-one/patch-one.spec.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/patch-one/patch-one.spec.ts @@ -1,43 +1,30 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { IBackup, IMemoryDb } from 'pg-mem'; -import { getDataSourceToken } from '@nestjs/typeorm'; +import { TestingModule } from '@nestjs/testing'; +import { + JsonApiTransformerService, + ORM_SERVICE, + PatchData, + PostData, +} from '@klerick/json-api-nestjs'; import { Repository } from 'typeorm'; +import { TypeOrmService, TypeormUtilsService } from '../../service'; + import { + dbRandomName, + getModuleForPgLite, Addresses, Comments, - entities, getRepository, - mockDBTestModule, Notes, - providerEntities, pullAllData, Roles, UserGroups, Users, -} from '../../../../mock-utils/typeorm'; -import { - CurrentDataSourceProvider, - CurrentEntityManager, - CurrentEntityRepository, - EntityPropsMap, - OrmServiceFactory, -} from '../../factory'; -import { - CONTROL_OPTIONS_TOKEN, - CURRENT_ENTITY, - DEFAULT_CONNECTION_NAME, - ORM_SERVICE, -} from '../../../../constants'; - -import { PatchData, PostData } from '../../../mixin/zod'; -import { TypeOrmService, TypeormUtilsService } from '../../service'; -import { createAndPullSchemaBase } from '../../../../mock-utils'; -import { JsonApiTransformerService } from '../../../mixin/service/json-api-transformer.service'; +} from '../../mock-utils'; +import { faker } from '@faker-js/faker'; +import { pullAddress, pullUser } from '../../mock-utils/pull-data'; describe('patchOne', () => { - let db: IMemoryDb; - let backaUp: IBackup; let typeormService: TypeOrmService; let transformDataService: JsonApiTransformerService; @@ -48,13 +35,13 @@ describe('patchOne', () => { let rolesRepository: Repository; let userGroupRepository: Repository; - const firstName = 'firstName test'; - const isActive = false; - const testDate = new Date(); - const login = 'login test'; + let firstName: string; + let isActive: boolean; + let testDate: Date; + let login: string; - let inputData: PostData; - let newData: PatchData; + let inputData: PostData; + let newData: PatchData; let notes: Notes[]; let users: Users[]; @@ -62,32 +49,20 @@ describe('patchOne', () => { let userGroup: UserGroups[]; let addresses: Addresses[]; - beforeAll(async () => { - db = createAndPullSchemaBase(); - const module: TestingModule = await Test.createTestingModule({ - imports: [mockDBTestModule(db)], - providers: [ - ...providerEntities(getDataSourceToken()), - CurrentDataSourceProvider(DEFAULT_CONNECTION_NAME), - { - provide: CONTROL_OPTIONS_TOKEN, - useValue: { - requiredSelectField: false, - debug: false, - }, - }, - { - provide: CURRENT_ENTITY, - useValue: Users, - }, - EntityPropsMap(entities as any), - CurrentEntityManager(), - CurrentEntityRepository(Users), - TypeormUtilsService, - JsonApiTransformerService, - OrmServiceFactory(), - ], - }).compile(); + beforeEach(async () => { + firstName = faker.person.firstName(); + isActive = false; + login = faker.internet.userName({ + lastName: firstName, + firstName: faker.person.lastName(), + }); + testDate = new Date(); + + const module: TestingModule = await getModuleForPgLite( + Users, + dbRandomName(), + TypeormUtilsService + ); ({ userRepository, @@ -119,8 +94,8 @@ describe('patchOne', () => { users: true, }, }); - addresses = await addressesRepository.find(); - + addresses = [await pullAddress(addressesRepository)]; + const manager = await pullUser(userRepository); inputData = { type: 'users', attributes: { @@ -155,7 +130,7 @@ describe('patchOne', () => { manager: { data: { type: 'users', - id: `${users[0].id}`, + id: `${manager.id}`, }, }, userGroup: { @@ -165,26 +140,30 @@ describe('patchOne', () => { }, }, }, - }; + } as any; await typeormService.postOne(inputData); - backaUp = db.backup(); + const changeUser = await userRepository.findOneBy({ login: inputData.attributes.login as string, }); if (!changeUser) { throw new Error('not found mock data'); } + const newLogin = `${changeUser.login} - newLogin`; + const newIsActive = !changeUser.isActive; newData = { ...inputData, id: `${changeUser.id}`, + attributes: { + ...(inputData.attributes || {}), + ...{ + login: newLogin, + isActive: newIsActive, + testDate: new Date(), + }, + }, }; - const newLogin = `${changeUser.login} - newLogin`; - const newIsActive = !changeUser.isActive; - - newData.attributes.login = newLogin; - newData.attributes.isActive = newIsActive; - newData.attributes.testDate = new Date(); newData.relationships = { ...newData.relationships, @@ -211,13 +190,12 @@ describe('patchOne', () => { }, ], }, - }; + } as any; }); afterEach(() => { jest.clearAllMocks(); jest.restoreAllMocks(); - backaUp.restore(); }); it('should be ok without relation', async () => { @@ -236,6 +214,7 @@ describe('patchOne', () => { const result = await userRepository.findOneBy({ id: parseInt(withoutRelationships.id as string, 10), }); + expect(spyOnTransformData).toBeCalledWith(result, { fields: null, include: [], @@ -285,14 +264,13 @@ describe('patchOne', () => { })); newData.relationships = { - ...newData.relationships, userGroup: { data: null, }, roles: { data: [], }, - }; + } as any; const returnData = await typeormService.patchOne( newData.id as string, @@ -304,17 +282,14 @@ describe('patchOne', () => { id: parseInt(newData.id as string, 10), }, relations: { - addresses: true, - notes: true, userGroup: true, roles: true, - manager: true, }, }); expect(spyOnTransformData).toBeCalledWith(result, { fields: null, - include: ['addresses', 'notes', 'roles', 'manager', 'userGroup'], + include: ['userGroup', 'roles'], }); expect(returnData).toHaveProperty('included'); }); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/patch-one/patch-one.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/patch-one/patch-one.ts similarity index 77% rename from libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/patch-one/patch-one.ts rename to libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/patch-one/patch-one.ts index 5551a31b..aec5e470 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/patch-one/patch-one.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/patch-one/patch-one.ts @@ -2,22 +2,21 @@ import { NotFoundException, UnprocessableEntityException, } from '@nestjs/common'; -import { DeepPartial } from 'typeorm'; import { ResourceObject, ObjectTyped, QueryField, -} from '../../../../utils/nestjs-shared'; +} from '@klerick/json-api-nestjs-shared'; +import { PatchData, Query, ValidateQueryError } from '@klerick/json-api-nestjs'; +import { DeepPartial } from 'typeorm'; -import { ObjectLiteral, ValidateQueryError } from '../../../../types'; -import { PatchData, Query } from '../../../mixin/zod'; import { TypeOrmService } from '../../service'; -export async function patchOne( - this: TypeOrmService, +export async function patchOne( + this: TypeOrmService, id: number | string, - inputData: PatchData -): Promise> { + inputData: PatchData +): Promise> { const { id: idBody, attributes, relationships } = inputData; if (`${id}` !== idBody) { @@ -31,7 +30,7 @@ export async function patchOne( } const paramsId = 'paramsId'; - const result = await this.repository + const result = (await this.repository .createQueryBuilder() .where( `${this.typeormUtilsService.getAliasPath( @@ -41,7 +40,7 @@ export async function patchOne( [paramsId]: id, } ) - .getOne(); + .getOne()) as E | null; if (!result) { const error: ValidateQueryError = { @@ -62,12 +61,12 @@ export async function patchOne( } } - const saveData = await this.typeormUtilsService.saveEntityData( + const saveData = (await this.typeormUtilsService.saveEntityData( result, relationships - ); + )) as E; - const fakeQuery: Query = { + const fakeQuery: Query = { [QueryField.fields]: null, [QueryField.include]: Object.keys(relationships || {}), } as any; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/patch-relationship/patch-relationship.spec.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/patch-relationship/patch-relationship.spec.ts similarity index 63% rename from libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/patch-relationship/patch-relationship.spec.ts rename to libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/patch-relationship/patch-relationship.spec.ts index 4e3c326a..27256569 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/patch-relationship/patch-relationship.spec.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/patch-relationship/patch-relationship.spec.ts @@ -1,41 +1,26 @@ -import { getDataSourceToken } from '@nestjs/typeorm'; -import { Test, TestingModule } from '@nestjs/testing'; -import { IMemoryDb } from 'pg-mem'; +import { TestingModule } from '@nestjs/testing'; +import { + JsonApiTransformerService, + ORM_SERVICE, +} from '@klerick/json-api-nestjs'; import { Repository } from 'typeorm'; +import { TypeOrmService, TypeormUtilsService } from '../../service'; + import { + dbRandomName, + getModuleForPgLite, Addresses, Comments, - entities, getRepository, - mockDBTestModule, Notes, - providerEntities, pullAllData, Roles, UserGroups, Users, -} from '../../../../mock-utils/typeorm'; - -import { - CONTROL_OPTIONS_TOKEN, - CURRENT_ENTITY, - DEFAULT_CONNECTION_NAME, - ORM_SERVICE, -} from '../../../../constants'; -import { - CurrentDataSourceProvider, - CurrentEntityManager, - CurrentEntityRepository, - EntityPropsMap, - OrmServiceFactory, -} from '../../factory'; -import { TypeOrmService, TypeormUtilsService } from '../../service'; -import { createAndPullSchemaBase } from '../../../../mock-utils'; -import { JsonApiTransformerService } from '../../../mixin/service/json-api-transformer.service'; +} from '../../mock-utils'; describe('patchRelationship', () => { - let db: IMemoryDb; let typeormService: TypeOrmService; let transformDataService: JsonApiTransformerService; let typeormUtilsService: TypeormUtilsService; @@ -47,31 +32,11 @@ describe('patchRelationship', () => { let userGroupRepository: Repository; beforeAll(async () => { - db = createAndPullSchemaBase(); - const module: TestingModule = await Test.createTestingModule({ - imports: [mockDBTestModule(db)], - providers: [ - ...providerEntities(getDataSourceToken()), - CurrentDataSourceProvider(DEFAULT_CONNECTION_NAME), - { - provide: CONTROL_OPTIONS_TOKEN, - useValue: { - requiredSelectField: false, - debug: false, - }, - }, - { - provide: CURRENT_ENTITY, - useValue: Users, - }, - EntityPropsMap(entities as any), - CurrentEntityManager(), - CurrentEntityRepository(Users), - TypeormUtilsService, - JsonApiTransformerService, - OrmServiceFactory(), - ], - }).compile(); + const module: TestingModule = await getModuleForPgLite( + Users, + dbRandomName(), + TypeormUtilsService + ); ({ userRepository, addressesRepository, @@ -102,6 +67,19 @@ describe('patchRelationship', () => { }); it('Should be ok', async () => { + jest + .spyOn(transformDataService, 'transformRel') + // @ts-ignore + .mockImplementation((item, rel) => { + if (Array.isArray(item[rel])) { + return item[rel].map((i) => ({ id: i['id'] })); + } else { + return { + id: item[rel] ? item[rel]['id'] : null, + }; + } + }); + const checkUser = await userRepository.findOne({ select: { id: true, @@ -134,7 +112,7 @@ describe('patchRelationship', () => { const userGroupData = { type: 'user-groups', id: userGroups - .find((i) => checkUser.userGroup.id !== i.id) + .find((i) => checkUser.userGroup?.id !== i.id) ?.id.toString(), }; const rolesData = [ @@ -150,21 +128,13 @@ describe('patchRelationship', () => { type: 'users', id: users.find((i) => checkUser.manager.id !== i.id)?.id.toString(), }; - const result = await typeormService.patchRelationship( - 1, - 'roles', - rolesData as any - ); - const result1 = await typeormService.patchRelationship( + await typeormService.patchRelationship(1, 'roles', rolesData as any); + await typeormService.patchRelationship( 1, 'userGroup', userGroupData as any ); - const result2 = await typeormService.patchRelationship( - 1, - 'manager', - managerData as any - ); + await typeormService.patchRelationship(1, 'manager', managerData as any); const checkUserAfterPost = await userRepository.findOne({ select: { @@ -189,11 +159,21 @@ describe('patchRelationship', () => { if (!checkUserAfterPost) { throw new Error('not found'); } + expect(checkUserAfterPost.manager.id.toString()).toBe(managerData.id); - expect(checkUserAfterPost.roles.map((i) => i.id.toString())).toEqual( - rolesData.map((i) => i.id) + + const rolesPatchId = rolesData.map((i) => i.id); + + checkUserAfterPost.roles.find((i) => + rolesPatchId.includes(i.id.toString()) ); - expect(checkUserAfterPost.userGroup.id.toString()).toBe(userGroupData.id); + + expect( + checkUserAfterPost.roles + .filter((i) => rolesPatchId.includes(i.id.toString())) + .map((i) => i.id.toString()) + ).toEqual(rolesData.map((i) => i.id)); + expect(checkUserAfterPost.userGroup?.id.toString()).toBe(userGroupData.id); await typeormService.patchRelationship(1, 'roles', []); await typeormService.patchRelationship(1, 'manager', null); @@ -223,12 +203,5 @@ describe('patchRelationship', () => { expect(checkUserAfterPatch.manager).toBe(null); expect(checkUserAfterPatch.roles).toEqual([]); - expect(result.data.map((i) => i.id)).toEqual( - checkUserAfterPost.roles.map((i) => i.id.toString()) - ); - expect(result2.data?.id).toEqual(checkUserAfterPost.manager.id.toString()); - expect(result1.data?.id).toEqual( - checkUserAfterPost.userGroup.id.toString() - ); }); }); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/patch-relationship/patch-relationship.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/patch-relationship/patch-relationship.ts similarity index 65% rename from libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/patch-relationship/patch-relationship.ts rename to libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/patch-relationship/patch-relationship.ts index 2ccbb0dd..4061d5d0 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/patch-relationship/patch-relationship.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/patch-relationship/patch-relationship.ts @@ -1,23 +1,22 @@ +import { PatchRelationshipData } from '@klerick/json-api-nestjs'; import { - EntityRelation, + RelationKeys, ResourceObjectRelationships, -} from '../../../../utils/nestjs-shared'; +} from '@klerick/json-api-nestjs-shared'; -import { ObjectLiteral } from '../../../../types'; - -import { PatchRelationshipData } from '../../../mixin/zod'; import { getRelationship } from '../get-relationship/get-relationship'; import { TypeOrmService } from '../../service'; export async function patchRelationship< - E extends ObjectLiteral, - Rel extends EntityRelation + E extends object, + IdKey extends string, + Rel extends RelationKeys >( - this: TypeOrmService, + this: TypeOrmService, id: number | string, rel: Rel, input: PatchRelationshipData -): Promise> { +): Promise> { const idsResult = await this.typeormUtilsService.validateRelationInputData( rel, input @@ -30,9 +29,9 @@ export async function patchRelationship< if (Array.isArray(idsResult)) { const data = await getRelationship.call< - TypeOrmService, + TypeOrmService, [number | string, Rel], - Promise> + Promise> >(this, id, rel); const idsToDelete = Array.isArray(data.data) ? data.data.map((i) => i.id) @@ -44,8 +43,8 @@ export async function patchRelationship< } return getRelationship.call< - TypeOrmService, + TypeOrmService, [number | string, Rel], - Promise> + Promise> >(this, id, rel); } diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/post-one/post-one.spec.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/post-one/post-one.spec.ts similarity index 64% rename from libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/post-one/post-one.spec.ts rename to libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/post-one/post-one.spec.ts index e3deab69..d5b4a27d 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/post-one/post-one.spec.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/post-one/post-one.spec.ts @@ -1,48 +1,33 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { IBackup, IMemoryDb } from 'pg-mem'; -import { getDataSourceToken } from '@nestjs/typeorm'; +import { TestingModule } from '@nestjs/testing'; +import { + JsonApiTransformerService, + ORM_SERVICE, + PostData, +} from '@klerick/json-api-nestjs'; import { Repository } from 'typeorm'; +import { TypeOrmService, TypeormUtilsService } from '../../service'; import { Addresses, + dbRandomName, + getModuleForPgLite, Comments, - entities, getRepository, - mockDBTestModule, Notes, Pods, - providerEntities, pullAllData, Roles, UserGroups, Users, -} from '../../../../mock-utils/typeorm'; -import { - CONTROL_OPTIONS_TOKEN, - CURRENT_ENTITY, - DEFAULT_CONNECTION_NAME, - ORM_SERVICE, -} from '../../../../constants'; - -import { PostData } from '../../../mixin/zod'; -import { - CurrentDataSourceProvider, - CurrentEntityManager, - CurrentEntityRepository, - EntityPropsMap, - OrmServiceFactory, -} from '../../factory'; -import { TypeOrmService, TypeormUtilsService } from '../../service'; -import { createAndPullSchemaBase } from '../../../../mock-utils'; -import { JsonApiTransformerService } from '../../../mixin/service/json-api-transformer.service'; +} from '../../mock-utils'; +import { faker } from '@faker-js/faker'; +import { pullUser } from '../../mock-utils/pull-data'; describe('postOne', () => { - let db: IMemoryDb; - let backaUp: IBackup; let typeormService: TypeOrmService; let transformDataService: JsonApiTransformerService; let podsRepository: Repository; - + // let typeormServicePods: TypeOrmService; let transformDataServicePods: JsonApiTransformerService; @@ -53,69 +38,38 @@ describe('postOne', () => { let rolesRepository: Repository; let userGroupRepository: Repository; - const firstName = 'firstName test'; - const isActive = false; - const testDate = new Date(); - const login = 'login test'; + let firstName: string; + let isActive: boolean; + let testDate: Date; + let login: string; - let inputData: PostData; + let inputData: PostData; let notes: Notes[]; let users: Users[]; let roles: Roles[]; let userGroup: UserGroups[]; - beforeAll(async () => { - db = createAndPullSchemaBase(); - const module: TestingModule = await Test.createTestingModule({ - imports: [mockDBTestModule(db)], - providers: [ - ...providerEntities(getDataSourceToken()), - CurrentDataSourceProvider(DEFAULT_CONNECTION_NAME), - { - provide: CONTROL_OPTIONS_TOKEN, - useValue: { - requiredSelectField: false, - debug: false, - }, - }, - { - provide: CURRENT_ENTITY, - useValue: Users, - }, - EntityPropsMap(entities as any), - CurrentEntityManager(), - CurrentEntityRepository(Users), - TypeormUtilsService, - JsonApiTransformerService, - OrmServiceFactory(), - ], - }).compile(); + beforeEach(async () => { + const dbName = dbRandomName(); + const module: TestingModule = await getModuleForPgLite( + Users, + dbName, + TypeormUtilsService + ); + firstName = faker.person.firstName(); + isActive = false; + login = faker.internet.userName({ + lastName: firstName, + firstName: faker.person.lastName(), + }); + testDate = new Date(); - const modulePods: TestingModule = await Test.createTestingModule({ - imports: [mockDBTestModule(db)], - providers: [ - ...providerEntities(getDataSourceToken()), - CurrentDataSourceProvider(DEFAULT_CONNECTION_NAME), - { - provide: CONTROL_OPTIONS_TOKEN, - useValue: { - requiredSelectField: false, - debug: false, - }, - }, - { - provide: CURRENT_ENTITY, - useValue: Users, - }, - EntityPropsMap(entities as any), - CurrentEntityManager(), - CurrentEntityRepository(Pods), - TypeormUtilsService, - JsonApiTransformerService, - OrmServiceFactory(), - ], - }).compile(); + const modulePods: TestingModule = await getModuleForPgLite( + Pods, + dbName, + TypeormUtilsService + ); ({ userRepository, @@ -134,7 +88,7 @@ describe('postOne', () => { rolesRepository, userGroupRepository ); - backaUp = db.backup(); + typeormService = module.get>(ORM_SERVICE); transformDataService = module.get>( JsonApiTransformerService @@ -188,13 +142,12 @@ describe('postOne', () => { }, }, }, - }; + } as any; }); afterEach(() => { jest.clearAllMocks(); jest.restoreAllMocks(); - backaUp.restore(); }); it('should be ok without relation and with id', async () => { @@ -211,7 +164,7 @@ describe('postOne', () => { attributes: { name: 'test', }, - }); + } as any); const result = await podsRepository.findOneBy({ id, }); @@ -252,7 +205,19 @@ describe('postOne', () => { data: {} as any, included: {} as any, })); - const returnData = await typeormService.postOne(inputData); + const users = await pullUser(userRepository); + const returnData = await typeormService.postOne({ + ...inputData, + relationships: { + ...inputData.relationships, + manager: { + data: { + type: 'users', + id: `${users.id}`, + }, + }, + } as any, + }); const result = await userRepository.findOne({ where: { login, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/post-one/post-one.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/post-one/post-one.ts similarity index 71% rename from libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/post-one/post-one.ts rename to libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/post-one/post-one.ts index 08ac0a1a..41ed1634 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/post-one/post-one.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/post-one/post-one.ts @@ -1,13 +1,13 @@ +import { PostData, Query } from '@klerick/json-api-nestjs'; +import { QueryField, ResourceObject } from '@klerick/json-api-nestjs-shared'; import { DeepPartial } from 'typeorm'; -import { QueryField, ResourceObject } from '../../../../utils/nestjs-shared'; -import { ObjectLiteral } from '../../../../types'; -import { PostData, Query } from '../../../mixin/zod'; + import { TypeOrmService } from '../../service'; -export async function postOne( - this: TypeOrmService, - inputData: PostData -): Promise> { +export async function postOne( + this: TypeOrmService, + inputData: PostData +): Promise> { const { attributes, relationships, id } = inputData; const idObject = id @@ -28,7 +28,7 @@ export async function postOne( entityTarget, relationships ); - const fakeQuery: Query = { + const fakeQuery: Query = { [QueryField.fields]: null, [QueryField.include]: Object.keys(relationships || {}), } as any; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/post-relationship/post-relationship.spec.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/post-relationship/post-relationship.spec.ts similarity index 59% rename from libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/post-relationship/post-relationship.spec.ts rename to libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/post-relationship/post-relationship.spec.ts index 5a936228..980b99fb 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/post-relationship/post-relationship.spec.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/post-relationship/post-relationship.spec.ts @@ -1,41 +1,26 @@ -import { getDataSourceToken } from '@nestjs/typeorm'; -import { Test, TestingModule } from '@nestjs/testing'; -import { IMemoryDb } from 'pg-mem'; +import { TestingModule } from '@nestjs/testing'; +import { + JsonApiTransformerService, + ORM_SERVICE, +} from '@klerick/json-api-nestjs'; import { Repository } from 'typeorm'; +import { TypeOrmService, TypeormUtilsService } from '../../service'; + import { + dbRandomName, + getModuleForPgLite, Addresses, Comments, - entities, getRepository, - mockDBTestModule, Notes, - providerEntities, pullAllData, Roles, UserGroups, Users, -} from '../../../../mock-utils/typeorm'; - -import { - CONTROL_OPTIONS_TOKEN, - CURRENT_ENTITY, - DEFAULT_CONNECTION_NAME, - ORM_SERVICE, -} from '../../../../constants'; -import { - CurrentDataSourceProvider, - CurrentEntityManager, - CurrentEntityRepository, - EntityPropsMap, - OrmServiceFactory, -} from '../../factory'; -import { TypeOrmService, TypeormUtilsService } from '../../service'; -import { createAndPullSchemaBase } from '../../../../mock-utils'; -import { JsonApiTransformerService } from '../../../mixin/service/json-api-transformer.service'; +} from '../../mock-utils'; describe('postRelationship', () => { - let db: IMemoryDb; let typeormService: TypeOrmService; let transformDataService: JsonApiTransformerService; let typeormUtilsService: TypeormUtilsService; @@ -47,31 +32,12 @@ describe('postRelationship', () => { let userGroupRepository: Repository; beforeAll(async () => { - db = createAndPullSchemaBase(); - const module: TestingModule = await Test.createTestingModule({ - imports: [mockDBTestModule(db)], - providers: [ - ...providerEntities(getDataSourceToken()), - CurrentDataSourceProvider(DEFAULT_CONNECTION_NAME), - { - provide: CONTROL_OPTIONS_TOKEN, - useValue: { - requiredSelectField: false, - debug: false, - }, - }, - { - provide: CURRENT_ENTITY, - useValue: Users, - }, - EntityPropsMap(entities as any), - CurrentEntityManager(), - CurrentEntityRepository(Users), - TypeormUtilsService, - JsonApiTransformerService, - OrmServiceFactory(), - ], - }).compile(); + const dbName = dbRandomName(); + const module: TestingModule = await getModuleForPgLite( + Users, + dbName, + TypeormUtilsService + ); ({ userRepository, addressesRepository, @@ -134,7 +100,7 @@ describe('postRelationship', () => { const userGroupData = { type: 'user-groups', id: userGroups - .find((i) => checkUser.userGroup.id !== i.id) + .find((i) => checkUser.userGroup?.id !== i.id) ?.id.toString(), }; const rolesData = [ @@ -150,22 +116,11 @@ describe('postRelationship', () => { type: 'users', id: users.find((i) => checkUser.manager.id !== i.id)?.id.toString(), }; - const result = await typeormService.postRelationship( - 1, - 'roles', - rolesData as any - ); - const result1 = await typeormService.postRelationship( - 1, - 'userGroup', - userGroupData as any - ); - const result2 = await typeormService.postRelationship( - 1, - 'manager', - managerData as any - ); + await typeormService.postRelationship(1, 'roles', rolesData as any); + await typeormService.postRelationship(1, 'userGroup', userGroupData as any); + + await typeormService.postRelationship(1, 'manager', managerData as any); const checkUserAfterPost = await userRepository.findOne({ select: { @@ -196,14 +151,12 @@ describe('postRelationship', () => { ...checkUser.roles.map((i) => i.id.toString()), ...rolesData.map((i) => i.id), ]); - expect(checkUserAfterPost.userGroup.id.toString()).toBe(userGroupData.id); + expect(checkUserAfterPost.userGroup?.id.toString()).toBe(userGroupData.id); - expect(result.data.map((i) => i.id)).toEqual( - checkUserAfterPost.roles.map((i) => i.id.toString()) - ); - expect(result2.data?.id).toEqual(checkUserAfterPost.manager.id.toString()); - expect(result1.data?.id).toEqual( - checkUserAfterPost.userGroup.id.toString() - ); + await typeormService.postRelationship(1, 'roles', [] as any); + expect(checkUserAfterPost?.roles.map((i) => i.id.toString())).toEqual([ + ...checkUser.roles.map((i) => i.id.toString()), + ...rolesData.map((i) => i.id), + ]); }); }); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/post-relationship/post-relationship.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/post-relationship/post-relationship.ts similarity index 64% rename from libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/post-relationship/post-relationship.ts rename to libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/post-relationship/post-relationship.ts index 7719cea0..93bbcce5 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/post-relationship/post-relationship.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/post-relationship/post-relationship.ts @@ -1,22 +1,22 @@ import { - EntityRelation, + RelationKeys, ResourceObjectRelationships, -} from '../../../../utils/nestjs-shared'; +} from '@klerick/json-api-nestjs-shared'; +import { PostRelationshipData } from '@klerick/json-api-nestjs'; -import { ObjectLiteral } from '../../../../types'; -import { PostRelationshipData } from '../../../mixin/zod'; import { getRelationship } from '../get-relationship/get-relationship'; import { TypeOrmService } from '../../service'; export async function postRelationship< - E extends ObjectLiteral, - Rel extends EntityRelation + E extends object, + IdKey extends string, + Rel extends RelationKeys >( - this: TypeOrmService, + this: TypeOrmService, id: number | string, rel: Rel, input: PostRelationshipData -): Promise> { +): Promise> { const idsResult = await this.typeormUtilsService.validateRelationInputData( rel, input @@ -33,8 +33,8 @@ export async function postRelationship< } return getRelationship.call< - TypeOrmService, + TypeOrmService, [number | string, Rel], - Promise> + Promise> >(this, id, rel); } diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/service/index.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/service/index.ts similarity index 61% rename from libs/json-api/json-api-nestjs/src/lib/modules/type-orm/service/index.ts rename to libs/json-api/json-api-nestjs-typeorm/src/lib/service/index.ts index b8e93ec7..e474ef06 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/service/index.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/service/index.ts @@ -1,2 +1,3 @@ export * from './type-orm.service'; export * from './typeorm-utils.service'; +export * from './type-orm-format.error.service'; diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/service/type-orm-format.error.service.spec.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/service/type-orm-format.error.service.spec.ts new file mode 100644 index 00000000..834bc14c --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/service/type-orm-format.error.service.spec.ts @@ -0,0 +1,103 @@ +import { TestingModule } from '@nestjs/testing'; +import { + ORM_SERVICE, + PostData, + ENTITY_PARAM_MAP, +} from '@klerick/json-api-nestjs'; +import { Repository } from 'typeorm'; + +import { TypeOrmService } from './type-orm.service'; +import { TypeormUtilsService } from './typeorm-utils.service'; +import { TypeOrmFormatErrorService } from './type-orm-format.error.service'; + +import { + dbRandomName, + getModuleForPgLite, + Addresses, + Comments, + getRepository, + Notes, + pullAllData, + Roles, + UserGroups, + Users, +} from '../mock-utils'; +import { ConflictException } from '@nestjs/common'; + +describe('getOne', () => { + let typeormService: TypeOrmService; + let typeOrmFormatErrorService: TypeOrmFormatErrorService; + let userRepository: Repository; + let addressesRepository: Repository; + let notesRepository: Repository; + let commentsRepository: Repository; + let rolesRepository: Repository; + let userGroupRepository: Repository; + let users: Users[]; + let firstUsers: Users; + + beforeAll(async () => { + const module: TestingModule = await getModuleForPgLite( + Users, + dbRandomName(), + TypeormUtilsService, + { + provide: TypeOrmFormatErrorService, + useClass: TypeOrmFormatErrorService, + }, + { + provide: ENTITY_PARAM_MAP, + useValue: { + keys() { + return [Users]; + }, + }, + } + ); + ({ + userRepository, + addressesRepository, + notesRepository, + commentsRepository, + rolesRepository, + userGroupRepository, + } = getRepository(module)); + await pullAllData( + userRepository, + addressesRepository, + notesRepository, + commentsRepository, + rolesRepository, + userGroupRepository + ); + typeormService = module.get>(ORM_SERVICE); + typeOrmFormatErrorService = module.get( + TypeOrmFormatErrorService + ); + users = await userRepository.find(); + const tmpFirstUser = users.at(0); + if (!tmpFirstUser) throw new Error('No first user'); + firstUsers = tmpFirstUser; + }); + + afterEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + it('Format error duplicate error', async () => { + const { id, userGroup, manager, roles, addresses, ...other } = firstUsers; + + const userPost: PostData = { + type: 'users', + attributes: other, + }; + try { + await typeormService.postOne(userPost); + } catch (error) { + expect(typeOrmFormatErrorService.formatError(error)).toBeInstanceOf( + ConflictException + ); + } + }); +}); diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/service/type-orm-format.error.service.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/service/type-orm-format.error.service.ts new file mode 100644 index 00000000..e66dc644 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/service/type-orm-format.error.service.ts @@ -0,0 +1,165 @@ +import { + ErrorFormatService, + EntityParam, + ValidateQueryError, + ENTITY_PARAM_MAP, +} from '@klerick/json-api-nestjs'; +import { + BadRequestException, + ConflictException, + HttpException, + Inject, + NotAcceptableException, +} from '@nestjs/common'; +import { + EntityMetadata, + QueryFailedError, + EntityTarget, + EntityManager, +} from 'typeorm'; +import { Driver } from 'typeorm/driver/Driver'; +import { DriverUtils } from 'typeorm/driver/DriverUtils'; +import { CURRENT_ENTITY_MANAGER_TOKEN } from '../constants'; + +export const formErrorString = ( + entityMetadata: EntityMetadata, + errorText: string +) => { + for (const column of entityMetadata.columns) { + const result = new RegExp(column.databaseName).test(errorText); + if (!result) continue; + + errorText = errorText.replace(column.databaseName, column.propertyName); + } + return errorText.replace(entityMetadata.tableName, entityMetadata.name); +}; + +const fieldNotNullOrDefault = ( + entityMetadata: EntityMetadata, + errorText: string, + detail?: string +) => { + const error: ValidateQueryError = { + code: 'invalid_arguments', + message: formErrorString(entityMetadata, errorText), + path: ['data', 'attributes'], + }; + + return new BadRequestException([error]); +}; + +const duplicateItems = ( + entityMetadata: EntityMetadata, + errorText: string, + detail?: string +) => { + errorText = 'Duplicate value'; + if (detail) { + const matches = detail.match(/(?<=\().+?(?=\))/gm); + if (matches) { + errorText = `Duplicate value in the "${matches[0]}"`; + } + } + + const error: ValidateQueryError = { + code: 'invalid_arguments', + message: detail ? formErrorString(entityMetadata, errorText) : errorText, + path: ['data', 'attributes'], + }; + + return new ConflictException([error]); +}; + +const invalidInputSyntax = ( + entityMetadata: EntityMetadata, + errorText: string, + detail?: string +) => { + const error: ValidateQueryError = { + code: 'invalid_arguments', + message: errorText, + path: [], + }; + return new BadRequestException([error]); +}; + +const entityHasRelation = ( + entityMetadata: EntityMetadata, + errorText: string, + detail?: string +) => { + const error: ValidateQueryError = { + code: 'invalid_arguments', + message: detail || errorText, + path: ['data', 'attributes'], + }; + return new NotAcceptableException([error]); +}; + +export const PostgresError = { + [23502]: fieldNotNullOrDefault, + [23505]: duplicateItems, + ['22P02']: invalidInputSyntax, + [22007]: invalidInputSyntax, + [22003]: invalidInputSyntax, + [23503]: entityHasRelation, +}; + +export class TypeOrmFormatErrorService extends ErrorFormatService { + @Inject(CURRENT_ENTITY_MANAGER_TOKEN) private entityManager!: EntityManager; + @Inject(ENTITY_PARAM_MAP) private readonly mapProperty!: Map< + EntityTarget, + EntityParam + >; + private _dbDriver: Driver | undefined = undefined; + + get dbDriver(): Driver { + if (!this._dbDriver) { + const firstEntity = [...this.mapProperty.keys()].at(0); + + if (!firstEntity) { + throw new Error('No entity found in map'); + } + + this._dbDriver = + this.entityManager.getRepository(firstEntity).manager.connection.driver; + } + + return this._dbDriver; + } + + override formatError(error: unknown): HttpException { + if (!(error instanceof QueryFailedError)) { + return super.formatError(error); + } + try { + return this.prepareDataBaseError(error); + } catch (error) { + return super.formatError(error); + } + } + + private prepareDataBaseError(error: QueryFailedError): HttpException { + if (DriverUtils.isPostgresFamily(this.dbDriver)) { + const { errorCode, errorMsg, detail, table } = { + errorCode: (error.driverError as any) + .code as keyof typeof PostgresError, + errorMsg: error.driverError.message, + detail: (error.driverError as any).detail, + table: (error.driverError as any).table, + }; + + const metadata = this.entityManager.connection.entityMetadatas.find( + (i) => i.tableName === table + ); + if (!metadata) { + return super.formatError(error); + } + if (PostgresError[errorCode]) { + return PostgresError[errorCode](metadata, errorMsg, detail); + } + } + + return super.formatError(error); + } +} diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/service/type-orm.service.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/service/type-orm.service.ts new file mode 100644 index 00000000..529b0859 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/service/type-orm.service.ts @@ -0,0 +1,145 @@ +import { Inject } from '@nestjs/common'; +import { + OrmService, + PatchData, + PatchRelationshipData, + PostData, + PostRelationshipData, + Query, + QueryOne, + EntityControllerParam, + JsonApiTransformerService, + CONTROLLER_OPTIONS_TOKEN, +} from '@klerick/json-api-nestjs'; +import { + ResourceObject, + RelationKeys, + ResourceObjectRelationships, +} from '@klerick/json-api-nestjs-shared'; + +import { Repository } from 'typeorm'; + +import { + getAll, + getOne, + deleteOne, + postOne, + patchOne, + getRelationship, + postRelationship, + deleteRelationship, + patchRelationship, +} from '../orm-methods'; + +import { TypeormUtilsService } from './typeorm-utils.service'; +import { CURRENT_ENTITY_REPOSITORY } from '../constants'; +import { TypeOrmParam } from '../type'; + +export class TypeOrmService + implements OrmService +{ + @Inject(TypeormUtilsService) + public typeormUtilsService!: TypeormUtilsService; + @Inject(JsonApiTransformerService) + public transformDataService!: JsonApiTransformerService; + @Inject(CONTROLLER_OPTIONS_TOKEN) + public config!: EntityControllerParam; + @Inject(CURRENT_ENTITY_REPOSITORY) public repository!: Repository; + + getAll( + query: Query + ): Promise> { + return getAll.call< + TypeOrmService, + Parameters>, + ReturnType> + >(this, query); + } + + deleteOne(id: number | string): Promise { + return deleteOne.call< + TypeOrmService, + Parameters>, + ReturnType> + >(this, id); + } + + deleteRelationship>( + id: number | string, + rel: Rel, + input: PostRelationshipData + ): Promise { + return deleteRelationship.call< + TypeOrmService, + Parameters>, + ReturnType> + >(this, id, rel, input); + } + + getOne( + id: number | string, + query: QueryOne + ): Promise> { + return getOne.call< + TypeOrmService, + Parameters>, + ReturnType> + >(this, id, query); + } + + getRelationship>( + id: number | string, + rel: Rel + ): Promise> { + return getRelationship.call< + TypeOrmService, + Parameters>, + ReturnType> + >(this, id, rel); + } + + patchOne( + id: number | string, + inputData: PatchData + ): Promise> { + return patchOne.call< + TypeOrmService, + Parameters>, + ReturnType> + >(this, id, inputData); + } + + patchRelationship>( + id: number | string, + rel: Rel, + input: PatchRelationshipData + ): Promise> { + return patchRelationship.call< + TypeOrmService, + Parameters>, + ReturnType> + >(this, id, rel, input); + } + + postOne( + inputData: PostData + ): Promise> { + return postOne.call< + TypeOrmService, + Parameters>, + ReturnType> + >(this, inputData); + } + + postRelationship>( + id: number | string, + rel: Rel, + input: PostRelationshipData + ): Promise> { + return postRelationship.call< + TypeOrmService, + Parameters>, + ReturnType> + >(this, id, rel, input); + } +} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/service/typeorm-utils.service.spec.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/service/typeorm-utils.service.spec.ts similarity index 90% rename from libs/json-api/json-api-nestjs/src/lib/modules/type-orm/service/typeorm-utils.service.spec.ts rename to libs/json-api/json-api-nestjs-typeorm/src/lib/service/typeorm-utils.service.spec.ts index c53036c5..09a08cdd 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/service/typeorm-utils.service.spec.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/service/typeorm-utils.service.spec.ts @@ -1,47 +1,37 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { getDataSourceToken } from '@nestjs/typeorm'; -import { QueryField, FilterOperand } from '../../../utils/nestjs-shared'; +import { TestingModule } from '@nestjs/testing'; +import { PostRelationshipData, Query } from '@klerick/json-api-nestjs'; +import { QueryField, FilterOperand } from '@klerick/json-api-nestjs-shared'; import { BadRequestException, NotFoundException, UnprocessableEntityException, } from '@nestjs/common'; -import { IMemoryDb } from 'pg-mem'; + import { Repository } from 'typeorm'; import { - mockDBTestModule, - providerEntities, UserGroups, Users, Comments, Roles, Addresses, Notes, + dbRandomName, + getModuleForPgLite, getRepository, pullAllData, -} from '../../../mock-utils/typeorm'; -import { - CurrentDataSourceProvider, - CurrentEntityManager, - CurrentEntityRepository, -} from '../factory'; -import { - CURRENT_ENTITY_REPOSITORY, - DEFAULT_CONNECTION_NAME, -} from '../../../constants'; +} from '../mock-utils'; + +import { CURRENT_ENTITY_REPOSITORY } from '../constants'; import { TypeormUtilsService } from './typeorm-utils.service'; -import { PostData, PostRelationshipData, Query } from '../../mixin/zod'; import { EXPRESSION, OperandsMapExpression } from '../type'; -import { ObjectLiteral as Entity } from '../../../types'; -import { createAndPullSchemaBase } from '../../../mock-utils'; -function getDefaultQuery() { +function getDefaultQuery() { const filter = { relation: null, target: null, }; - const defaultQuery: Query = { + const defaultQuery = { [QueryField.filter]: filter, [QueryField.fields]: null, [QueryField.include]: null, @@ -50,13 +40,13 @@ function getDefaultQuery() { size: 1, number: 1, }, - }; + } as Query; return defaultQuery; } describe('TypeormUtilsService', () => { - let db: IMemoryDb; + const dbName = dbRandomName(); let typeormUtilsServiceUserGroups: TypeormUtilsService; let repositoryUserGroups: Repository; @@ -84,17 +74,12 @@ describe('TypeormUtilsService', () => { } beforeAll(async () => { - db = createAndPullSchemaBase(); - const module: TestingModule = await Test.createTestingModule({ - imports: [mockDBTestModule(db)], - providers: [ - ...providerEntities(getDataSourceToken()), - CurrentDataSourceProvider(DEFAULT_CONNECTION_NAME), - CurrentEntityManager(), - CurrentEntityRepository(UserGroups), - TypeormUtilsService, - ], - }).compile(); + dbRandomName(); + const module: TestingModule = await getModuleForPgLite( + UserGroups, + dbName, + TypeormUtilsService + ); typeormUtilsServiceUserGroups = module.get>(TypeormUtilsService); @@ -102,16 +87,11 @@ describe('TypeormUtilsService', () => { CURRENT_ENTITY_REPOSITORY ); - const moduleUsers: TestingModule = await Test.createTestingModule({ - imports: [mockDBTestModule(db)], - providers: [ - ...providerEntities(getDataSourceToken()), - CurrentDataSourceProvider(DEFAULT_CONNECTION_NAME), - CurrentEntityManager(), - CurrentEntityRepository(Users), - TypeormUtilsService, - ], - }).compile(); + const moduleUsers: TestingModule = await getModuleForPgLite( + Users, + dbName, + TypeormUtilsService + ); ({ userRepository, @@ -172,7 +152,7 @@ describe('TypeormUtilsService', () => { const notes = await notesRepository.find(); const userGroup = await userGroupRepository.find(); - const data: PostData['relationships'] = { + const data = { notes: { data: [ { @@ -193,7 +173,7 @@ describe('TypeormUtilsService', () => { id: `${userGroup[0].id}`, }, }, - }; + } as any; const result = []; for await (const item of typeormUtilsServiceUser.asyncIterateFindRelationships( @@ -230,14 +210,14 @@ describe('TypeormUtilsService', () => { }); it('should be error resource not found', async () => { - const data: PostData['relationships'] = { + const data = { manager: { data: { id: '1000', type: 'users', }, }, - }; + } as any; expect.assertions(1); try { await typeormUtilsServiceUser @@ -383,9 +363,15 @@ describe('TypeormUtilsService', () => { throw new Error(`name is not pattern: params_${alias}_\\d{1,}`); } const expressionMap = expression.replace(name, EXPRESSION); - const checkFilterOperand = Object.entries(FilterOperand).find( + + const checkFilterOperand = Object.entries({ + ...FilterOperand, + like: 'ilike', + } as any).find( + // @ts-ignore ([key, val]) => OperandsMapExpression[val] === expressionMap ); + if (!checkFilterOperand) { expect(checkFilterOperand).not.toBe(undefined); throw new Error(`expression incorrect`); @@ -517,9 +503,7 @@ describe('TypeormUtilsService', () => { if (Array.isArray(first.params)) { expect(first?.params?.length).toBe(3); const [firstParams, secondParams, thirdParams] = first.params; - expect(firstParams?.val).toBe( - query.filter?.relation?.roles?.createdAt?.eq - ); + expect(firstParams?.val).toBe(conditional.createdAt.eq); const regResult1 = firstParams?.name.match( new RegExp(`params_Roles.createdAt_\\d{1,}`) @@ -529,9 +513,7 @@ describe('TypeormUtilsService', () => { } expect(regResult1).not.toBe(null); - expect(secondParams?.val).toBe( - query.filter?.relation?.roles?.createdAt?.ne - ); + expect(secondParams?.val).toBe(conditional.createdAt.ne); const regResult2 = secondParams?.name.match( new RegExp(`params_Roles.createdAt_\\d{1,}`) @@ -541,9 +523,7 @@ describe('TypeormUtilsService', () => { } expect(regResult2).not.toBe(null); - expect(thirdParams?.val).toBe( - query.filter?.relation?.roles?.createdAt?.nin - ); + expect(thirdParams?.val).toBe(conditional.createdAt.nin); const regResult3 = thirdParams?.name.match( new RegExp(`params_Roles.createdAt_\\d{1,}`) ); @@ -606,7 +586,7 @@ describe('TypeormUtilsService', () => { throw Error('Should be like pattern'); } - expect(second.expression).toBe(`ILIKE :${secondResult[0]}`); + expect(second.expression).toBe(`LIKE :${secondResult[0]}`); expect(second.alias).toBe('Users__Comments_comments.createdAt'); expect(second.selectInclude).toBe('comments'); if (!Array.isArray(second.params)) { @@ -646,7 +626,7 @@ describe('TypeormUtilsService', () => { const userGroupData = { type: 'user-groups', - id: usersData.userGroup.id.toString(), + id: usersData.userGroup?.id.toString(), }; const managerData = { type: 'users', @@ -660,7 +640,7 @@ describe('TypeormUtilsService', () => { ); const result1 = await typeormUtilsServiceUser.validateRelationInputData( 'userGroup', - userGroupData + userGroupData as any ); const result2 = await typeormUtilsServiceUser.validateRelationInputData( 'manager', @@ -675,7 +655,7 @@ describe('TypeormUtilsService', () => { emptyRoles ); expect(result).toEqual(usersData.roles.map((i) => i.id.toString())); - expect(result1).toEqual(usersData.userGroup.id.toString()); + expect(result1).toEqual(usersData.userGroup?.id.toString()); expect(result2).toEqual(usersData.manager.id.toString()); expect(result3).toEqual(emptyManager); expect(result4).toEqual(emptyRoles); @@ -689,7 +669,7 @@ describe('TypeormUtilsService', () => { const userGroupData = { type: 'userGroups', - id: usersData.userGroup.id.toString(), + id: usersData.userGroup?.id.toString(), }; const managerData = { type: 'user', @@ -707,7 +687,7 @@ describe('TypeormUtilsService', () => { try { await typeormUtilsServiceUser.validateRelationInputData( 'userGroup', - userGroupData + userGroupData as any ); } catch (e) { expect(e).toBeInstanceOf(UnprocessableEntityException); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/service/typeorm-utils.service.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/service/typeorm-utils.service.ts similarity index 78% rename from libs/json-api/json-api-nestjs/src/lib/modules/type-orm/service/typeorm-utils.service.ts rename to libs/json-api/json-api-nestjs-typeorm/src/lib/service/typeorm-utils.service.ts index ecdd35c9..1d1597ff 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/service/typeorm-utils.service.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/service/typeorm-utils.service.ts @@ -5,40 +5,54 @@ import { NotFoundException, UnprocessableEntityException, } from '@nestjs/common'; -import { EntityMetadata, Equal, In, Repository } from 'typeorm'; +import { + EntityMetadata, + Equal, + In, + Repository, + ILike, + FindOperator, +} from 'typeorm'; import { RelationMetadata as TypeOrmRelationMetadata } from 'typeorm/metadata/RelationMetadata'; import { - camelToKebab, - kebabToCamel, ObjectTyped, - snakeToCamel, FilterOperand, -} from '../../../utils/nestjs-shared'; + getEntityName, + RelationKeys, +} from '@klerick/json-api-nestjs-shared'; -import { ObjectLiteral, ValidateQueryError } from '../../../types'; +import { + ValidateQueryError, + PatchData, + PostData, + Query, + UnionToTuple, +} from '@klerick/json-api-nestjs'; +import { kebabCase, camelCase, pascalCase } from 'change-case-commonjs'; +import { titleCase } from 'typeorm/util/StringUtils'; import { EXPRESSION, OperandMapExpressionForNull, OperandsMapExpression, OperandsMapExpressionForNullRelation, } from '../type'; -import { PatchData, PostData, Query } from '../../mixin/zod'; -import { TupleOfEntityRelation, EntityRelation } from '../../mixin/types'; -import { getEntityName } from '../../mixin/helper'; -import { CURRENT_ENTITY_REPOSITORY } from '../../../constants'; + +import { CURRENT_ENTITY_REPOSITORY } from '../constants'; +import { DriverUtils } from 'typeorm/driver/DriverUtils'; type RelationAlias = { - [K in TupleOfEntityRelation[number]]: string; + [K in UnionToTuple>[number] & PropertyKey]: string; }; type RelationMetadata = { - [K in TupleOfEntityRelation[number]]: TypeOrmRelationMetadata; + [K in UnionToTuple>[number] & + PropertyKey]: TypeOrmRelationMetadata; }; type ResultQueryExpressionObject = { name: string; val: string }; type ResultQueryExpressionArray = { name: string; val: string }[]; -export type RelationshipsResult = { - [K in EntityRelation]: E[K] extends E[K][] ? E[K] : E[K] | null; +export type RelationshipsResult = { + [K in RelationKeys]: E[K] extends E[K][] ? E[K] : E[K] | null; }; export type ResultQueryExpression = { @@ -59,19 +73,17 @@ export type ValidateReturn = T extends unknown[] ? null : string; -type Entity = ObjectLiteral; - -function isTargetField( - relationField: TupleOfEntityRelation, +function isTargetField( + relationField: UnionToTuple>, field: any -): field is TupleOfEntityRelation[number] { - return relationField.includes(field); +): field is UnionToTuple>[number] { + return (relationField as any[]).includes(field); } -function isRelationField( - relationField: TupleOfEntityRelation, +function isRelationField( + relationField: UnionToTuple>, field: any -): asserts field is EntityRelation { +): asserts field is RelationKeys { if (isTargetField(relationField, field)) return; const error: ValidateQueryError = { code: 'unrecognized_keys', @@ -84,40 +96,48 @@ function isRelationField( } Injectable(); -export class TypeormUtilsService { +export class TypeormUtilsService< + E extends object, + IdKey extends string = 'id' +> { private readonly _currentAlias!: string; private readonly _relationMetadata = {} as RelationMetadata; private readonly _relationAlias = {} as RelationAlias; - private readonly _relationFields!: TupleOfEntityRelation; + private readonly _relationFields!: UnionToTuple>; private readonly _entityMetadata!: EntityMetadata; private _number = 0; constructor( @Inject(CURRENT_ENTITY_REPOSITORY) private repository: Repository ) { - this._currentAlias = snakeToCamel(repository.metadata.name); + this._currentAlias = pascalCase(repository.metadata.name); const relationFields = []; for (const metadata of repository.metadata.relations) { - const propertyName = - metadata.propertyName as TupleOfEntityRelation[number]; - this._relationMetadata[propertyName] = metadata; - this._relationAlias[propertyName] = snakeToCamel( - metadata.inverseEntityMetadata.name + const propertyName = metadata.propertyName as UnionToTuple< + RelationKeys + >[number]; + + Reflect.set(this._relationMetadata, propertyName as any, metadata); + Reflect.set( + this._relationAlias, + propertyName as any, + titleCase(metadata.inverseEntityMetadata.name) ); + relationFields.push(propertyName); } - this._relationFields = relationFields as TupleOfEntityRelation; + this._relationFields = relationFields as UnionToTuple>; this._entityMetadata = repository.metadata; } get currentAlias() { return this._currentAlias; } - get relationFields() { + get relationFields(): UnionToTuple> { return this._relationFields; } - relationName(relName: TupleOfEntityRelation[number]) { + relationName(relName: keyof RelationAlias) { return this._relationAlias[relName]; } @@ -125,21 +145,26 @@ export class TypeormUtilsService { return this._entityMetadata.primaryColumns[0].propertyName as keyof E; } - getAliasForRelation(relName: TupleOfEntityRelation[number]) { - return `${this.currentAlias}__${this._relationAlias[relName]}_${relName}`; + getAliasForRelation(relName: keyof RelationAlias) { + return `${this.currentAlias}__${this._relationAlias[relName]}_${String( + relName + )}`; } - getRelMetaDataForRelation(relName: TupleOfEntityRelation[number]) { + getRelMetaDataForRelation(relName: keyof RelationAlias) { return this._relationMetadata[relName]; } - getPrimaryColumnForRel(relName: TupleOfEntityRelation[number]) { + getPrimaryColumnForRel(relName: keyof RelationAlias) { return this._relationMetadata[relName].inverseEntityMetadata .primaryColumns[0].propertyName; } - private getFilterObject(query: Query, filterType: 'target' | 'relation') { - const { filter } = query; + private getFilterObject( + query: Query, + filterType: 'target' | 'relation' + ) { + const { filter } = query as any; if (!filter) return null; return filter[filterType]; } @@ -159,23 +184,23 @@ export class TypeormUtilsService { getAliasPath(fieldName: unknown): string; getAliasPath( fieldName: unknown, - relname: TupleOfEntityRelation[number], + relname: keyof RelationAlias, separator?: string ): string; getAliasPath(fieldName: unknown, relname: string, separator?: string): string; getAliasPath( fieldName: unknown, - relname?: TupleOfEntityRelation[number] | string, + relname?: keyof RelationAlias | string, separator = '.' ): string { const alias = relname - ? this._relationAlias[relname] || relname + ? Reflect.get(this._relationAlias, relname) || relname : this.currentAlias; - return `${alias}${separator}${fieldName}`; + return `${String(alias)}${separator}${fieldName}`; } private getSubQueryForManyToMany( - fieldName: TupleOfEntityRelation[number], + fieldName: keyof RelationMetadata | keyof RelationAlias, expression?: string[] ): string { const metadataRelation: TypeOrmRelationMetadata = @@ -229,16 +254,27 @@ export class TypeormUtilsService { return query.getQuery(); } - getFilterExpressionForTarget(query: Query): ResultQueryExpression[] { + getFilterExpressionForTarget( + query: Query + ): ResultQueryExpression[] { const resultExpression: ResultQueryExpression[] = []; const filterTarget = this.getFilterObject(query, 'target'); if (!filterTarget) return resultExpression; for (const [fieldName, filter] of ObjectTyped.entries(filterTarget)) { if (!filter) continue; for (const entries of ObjectTyped.entries(filter)) { - const [operand, value] = entries as [FilterOperand, string]; + const [operandFromQuery, value] = entries as [FilterOperand, string]; const valueConditional = - operand === FilterOperand.like ? `%${value}%` : value; + operandFromQuery === FilterOperand.like ? `%${value}%` : value; + + const operand = DriverUtils.isPostgresFamily( + this.repository.manager.connection.driver + ) + ? operandFromQuery === FilterOperand.like + ? 'ilike' + : operandFromQuery + : operandFromQuery; + const fieldWithAlias = this.getAliasPath(fieldName); const paramsName = this.getParamName(fieldWithAlias); @@ -334,7 +370,9 @@ export class TypeormUtilsService { return resultExpression; } - getFilterExpressionForRelation(query: Query): ResultQueryExpression[] { + getFilterExpressionForRelation( + query: Query + ): ResultQueryExpression[] { const resultExpression: ResultQueryExpression[] = []; const filterRelation = this.getFilterObject(query, 'relation'); if (!filterRelation) return resultExpression; @@ -406,7 +444,7 @@ export class TypeormUtilsService { this.getAliasForRelation(relationField) ), expression, - selectInclude: relationField, + selectInclude: relationField.toString(), params, }); } @@ -451,39 +489,38 @@ export class TypeormUtilsService { async *asyncIterateFindRelationships( relationships: NonNullable< - PatchData['relationships'] | PostData['relationships'] + PatchData['relationships'] | PostData['relationships'] > - ): AsyncGenerator> { + ): AsyncGenerator> { for (const entries of ObjectTyped.entries(relationships)) { const [props, dataItem] = entries; isRelationField(this._relationFields, props); - if (dataItem === undefined) continue; + if (dataItem === null || dataItem === undefined) continue; - const { data } = dataItem; + const { data } = dataItem as any; if (data === undefined) continue; if (data === null) { - yield { [props]: null } as RelationshipsResult; + yield { [props]: null } as RelationshipsResult; continue; } const isArray = Array.isArray(data); if (isArray && data.length === 0) { - yield { [props]: [] } as RelationshipsResult; + yield { [props]: [] } as RelationshipsResult; continue; } const condition = isArray ? In((data as any[]).map((i) => i.id)) : Equal(data['id']); - const relationsTypeName = kebabToCamel( + const relationsTypeName = camelCase( isArray ? (data as any[])[0]['type'] : data['type'] ); const primaryField = this.getPrimaryColumnForRel( - props as TupleOfEntityRelation[number] + props as unknown as keyof RelationAlias ); - const relationsTarget = - this._relationMetadata[props as TupleOfEntityRelation[number]] - .inverseEntityMetadata.target; + const relationsTarget = Reflect.get(this._relationMetadata, props) + .inverseEntityMetadata.target; const result = await this.repository.manager .getRepository(relationsTarget) .find({ @@ -508,20 +545,25 @@ export class TypeormUtilsService { const error: ValidateQueryError = { code: 'invalid_arguments', - path: ['data', 'relationships', props.toString()], + path: ['data', 'relationships', String(props)], message, }; throw new BadRequestException([error]); } - yield { [props]: isArray ? result : result[0] } as RelationshipsResult; + yield { [props]: isArray ? result : result[0] } as RelationshipsResult< + E, + IdKey + >; } } async saveEntityData( target: E, - relationships: PatchData['relationships'] | PostData['relationships'] + relationships: + | PatchData['relationships'] + | PostData['relationships'] ): Promise { if (relationships) { for await (const item of this.asyncIterateFindRelationships( @@ -535,6 +577,7 @@ export class TypeormUtilsService { } } } + const saveData = await this.repository.save(target); let saveDataWithRelation: E | null = null; if (relationships) { @@ -547,7 +590,9 @@ export class TypeormUtilsService { }); for (const [props] of ObjectTyped.entries(relationships)) { - const currentIncludeAlias = this.getAliasForRelation(props.toString()); + const currentIncludeAlias = this.getAliasForRelation( + props as unknown as keyof RelationAlias + ); queryBuilder.leftJoinAndSelect( this.getAliasPath(props), @@ -562,23 +607,22 @@ export class TypeormUtilsService { } async validateRelationInputData< - Rel extends EntityRelation, + Rel extends RelationKeys, In extends InputValidateData | InputValidateData[] >(rel: Rel, inputData: In): Promise>; async validateRelationInputData< - Rel extends EntityRelation, + Rel extends RelationKeys, In extends InputValidateData | InputValidateData[] >(rel: Rel, inputData: In): Promise>; async validateRelationInputData< - Rel extends EntityRelation, + Rel extends RelationKeys, In extends null | InputValidateData | InputValidateData[] >(rel: Rel, inputData: In): Promise>; async validateRelationInputData< - Rel extends EntityRelation, + Rel extends RelationKeys, In extends null | InputValidateData | InputValidateData[] >(rel: Rel, inputData: In): Promise> { - const relationMetadata = - this._relationMetadata[rel as TupleOfEntityRelation[number]]; + const relationMetadata = Reflect.get(this._relationMetadata, rel); const isArray = Array.isArray(inputData); if ( @@ -619,7 +663,7 @@ export class TypeormUtilsService { const errors: ValidateQueryError[] = []; let i = 0; - const typeName = camelToKebab( + const typeName = kebabCase( getEntityName(relationMetadata.inverseEntityMetadata.target) ); @@ -644,12 +688,14 @@ export class TypeormUtilsService { .getRepository(relationMetadata.inverseEntityMetadata.target) .find({ select: { - [this.getPrimaryColumnForRel(rel.toString())]: true, + [this.getPrimaryColumnForRel( + rel as unknown as keyof RelationAlias + )]: true, }, where: { - [this.getPrimaryColumnForRel(rel.toString())]: In( - prepareData.map((i) => i.id) - ), + [this.getPrimaryColumnForRel( + rel as unknown as keyof RelationAlias + )]: In(prepareData.map((i) => i.id)), }, }); @@ -660,7 +706,11 @@ export class TypeormUtilsService { } const resulDataMap = checkResult.reduce((acum, item) => { - acum[item[this.getPrimaryColumnForRel(rel.toString())]] = true; + acum[ + item[ + this.getPrimaryColumnForRel(rel as unknown as keyof RelationAlias) + ] + ] = true; return acum; }, {} as Record); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/type-orm-json-api.module.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/type-orm-json-api.module.ts similarity index 62% rename from libs/json-api/json-api-nestjs/src/lib/modules/type-orm/type-orm-json-api.module.ts rename to libs/json-api/json-api-nestjs-typeorm/src/lib/type-orm-json-api.module.ts index 968e57a1..495829cf 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/type-orm-json-api.module.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/type-orm-json-api.module.ts @@ -1,8 +1,13 @@ -import { DynamicModule } from '@nestjs/common'; +import { DynamicModule, Provider } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { EntityClassOrSchema } from '@nestjs/typeorm/dist/interfaces/entity-class-or-schema.type'; +import { + PrepareParams, + NestProvider, + MODULE_OPTIONS_TOKEN, + ErrorFormatService, +} from '@klerick/json-api-nestjs'; -import { NestProvider, ObjectLiteral, ResultModuleOptions } from '../../types'; import { CurrentEntityManager, CurrentDataSourceProvider, @@ -13,14 +18,14 @@ import { RunInTransactionFactory, EntityPropsMap, } from './factory'; -import { TypeormUtilsService } from './service'; -import { GLOBAL_MODULE_OPTIONS_TOKEN } from '../../constants'; +import { TypeOrmFormatErrorService, TypeormUtilsService } from './service'; + +import { TypeOrmParam } from './type'; export class TypeOrmJsonApiModule { - static module = 'typeOrm' as const; - static forRoot(options: ResultModuleOptions): DynamicModule { + static forRoot(options: PrepareParams): DynamicModule { const optionProvider = { - provide: GLOBAL_MODULE_OPTIONS_TOKEN, + provide: MODULE_OPTIONS_TOKEN, useValue: options, }; @@ -29,16 +34,22 @@ export class TypeOrmJsonApiModule { options.connectionName ); - const currentProvider = [ + const currentProvider: Provider[] = [ ...(options.providers || []), optionProvider, CurrentDataSourceProvider(options.connectionName), CurrentEntityManager(), EntityPropsMap(options.entities), RunInTransactionFactory(), + { + provide: ErrorFormatService, + useClass: TypeOrmFormatErrorService, + }, + ]; + const currentImport: DynamicModule[] = [ + typeOrmModule, + ...((options.imports || []) as DynamicModule[]), ]; - - const currentImport = [typeOrmModule, ...(options.imports || [])]; return { module: TypeOrmJsonApiModule, @@ -48,7 +59,7 @@ export class TypeOrmJsonApiModule { }; } - static getUtilProviders(entity: ObjectLiteral): NestProvider { + static getUtilProviders(entity: object): NestProvider { return [ CurrentEntityRepository(entity), TypeormUtilsService, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/type.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/type.ts similarity index 87% rename from libs/json-api/json-api-nestjs/src/lib/modules/type-orm/type.ts rename to libs/json-api/json-api-nestjs-typeorm/src/lib/type.ts index 9d365343..356bb26e 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/type.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/type.ts @@ -1,5 +1,6 @@ +import { FilterOperand } from '@klerick/json-api-nestjs-shared'; import { IsolationLevel } from 'typeorm/driver/types/IsolationLevel'; -import { FilterOperand } from '../../utils/nestjs-shared'; + export type TypeOrmParam = { useSoftDelete?: boolean; runInTransaction?: any>( @@ -16,11 +17,12 @@ export const OperandsMapExpression = { [FilterOperand.gt]: `> :${EXPRESSION}`, [FilterOperand.gte]: `>= :${EXPRESSION}`, [FilterOperand.in]: `IN (:...${EXPRESSION})`, - [FilterOperand.like]: `ILIKE :${EXPRESSION}`, + [FilterOperand.like]: `LIKE :${EXPRESSION}`, [FilterOperand.lt]: `< :${EXPRESSION}`, [FilterOperand.lte]: `<= :${EXPRESSION}`, [FilterOperand.nin]: `NOT IN (:...${EXPRESSION})`, [FilterOperand.some]: `&& :${EXPRESSION}`, + ilike: `ILIKE :${EXPRESSION}`, }; export const OperandMapExpressionForNull = { diff --git a/libs/json-api/json-api-nestjs-typeorm/tsconfig.json b/libs/json-api/json-api-nestjs-typeorm/tsconfig.json new file mode 100644 index 00000000..0dc79caa --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/tsconfig.json @@ -0,0 +1,22 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "module": "commonjs", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "noPropertyAccessFromIndexSignature": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/libs/json-api/json-api-nestjs-typeorm/tsconfig.lib.json b/libs/json-api/json-api-nestjs-typeorm/tsconfig.lib.json new file mode 100644 index 00000000..08408448 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/tsconfig.lib.json @@ -0,0 +1,16 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../dist/out-tsc", + "declaration": true, + "types": ["node"], + "target": "es2023", + "strictNullChecks": true, + "noImplicitAny": true, + "strictBindCallApply": true, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src/**/*.ts"], + "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts", "src/lib/mock-utils/**/*.ts"] +} diff --git a/libs/json-api/json-api-nestjs-typeorm/tsconfig.spec.json b/libs/json-api/json-api-nestjs-typeorm/tsconfig.spec.json new file mode 100644 index 00000000..07100034 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/tsconfig.spec.json @@ -0,0 +1,24 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../dist/out-tsc", + "module": "commonjs", + "moduleResolution": "node10", + "types": ["jest", "node"], + "paths": { + "@klerick/json-api-nestjs-shared": [ + "libs/json-api/json-api-nestjs-shared/src/index.ts" + ], + "@klerick/json-api-nestjs": [ + "libs/json-api/json-api-nestjs/src/index.ts" + ] + }, + "allowJs": true + }, + "include": [ + "jest.config.ts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} diff --git a/libs/json-api/json-api-nestjs/README.md b/libs/json-api/json-api-nestjs/README.md index ffa4bf6a..1bf33659 100644 --- a/libs/json-api/json-api-nestjs/README.md +++ b/libs/json-api/json-api-nestjs/README.md @@ -18,7 +18,7 @@ need to write any code. ## Installation ```bash -$ npm install json-api-nestjs +$ npm install @klerick/json-api-nestjs ``` ## Example @@ -27,7 +27,8 @@ Once the installation process is complete, we can import the **JsonApiModule** i ### TypeOrm ```typescript import {Module} from '@nestjs/common'; -import {JsonApiModule, TypeOrmJsonApiModule} from 'json-api-nestjs'; +import {JsonApiModule} from '@klerick/json-api-nestjs'; +import {TypeOrmJsonApiModule} from '@klerick/json-api-nestjs-typeorm'; import {Users} from 'type-orm/database'; @Module({ @@ -44,7 +45,8 @@ export class AppModule { ### MicroOrm ```typescript import {Module} from '@nestjs/common'; -import {JsonApiModule, MicroOrmJsonApiModule} from 'json-api-nestjs'; +import {JsonApiModule} from '@klerick/json-api-nestjs'; +import {MicroOrmJsonApiModule} from '@klerick/json-api-nestjs-microorm'; import {Users} from 'micro-orm/database'; @Module({ @@ -86,15 +88,8 @@ export interface ModuleOptions { debug?: boolean; // Debug info in result object, like error message pipeForId?: Type // Nestjs pipe for validate id params, by default ParseIntPipe operationUrl?: string // Url for atomic operation https://jsonapi.org/ext/atomic/ - // TypeOrm - useSoftDelete?: boolean // Use soft delete - runInTransaction?: any>( - isolationLevel: IsolationLevel, - fn: Func - ) => ReturnType // You can use cutom function for wrapping transaction in atomic operation, example: runInTransaction from https://github.com/Aliheym/typeorm-transactional - // MicroOrm - arrayType?: string[]; //Custom type for indicate of array - }; + // You can add params for MicroOrm or TypeOrm adapter + } ; } ``` @@ -110,9 +105,11 @@ import { JsonBaseController, InjectService, JsonApiService, - ResourceObjectRelationships, Query, -} from 'json-api-nestjs'; +} from '@klerick/json-api-nestjs'; +import { + ResourceObjectRelationships, +} from '@klerick/json-api-nestjs-shared'; import {ExampleService} from '../../service/example/example.service'; @JsonApi(Users, { @@ -120,11 +117,11 @@ import {ExampleService} from '../../service/example/example.service'; requiredSelectField: true, overrideRoute: 'user', }) -export class ExtendUserController extends JsonBaseController { +export class ExtendUserController extends JsonBaseController { @InjectService() public service: JsonApiService; @Inject(ExampleService) protected exampleService: ExampleService; - public override getAll(query: Query): Promise> { + public override getAll(query: Query): Promise> { if (!this.exampleService.someCheck(query)) { throw new BadRequestException({}); } @@ -135,7 +132,7 @@ export class ExtendUserController extends JsonBaseController { id: string | number, relName: Rel, input: PatchRelationshipData - ): Promise> { + ): Promise> { return super.patchRelationship(id, relName, input); } @@ -168,12 +165,12 @@ import { requiredSelectField: true, overrideRoute: 'user', }) -export class ExtendUserController extends JsonBaseController { +export class ExtendUserController extends JsonBaseController { @InjectService() public service: JsonApiService; @Inject(ExampleService) protected exampleService: ExampleService; public override getAll( - @Query(ExamplePipe) query: QueryType + @Query(ExamplePipe) query: QueryType ): Promise> { return super.getAll(query); } @@ -186,8 +183,8 @@ import { ArgumentMetadata, PipeTransform } from '@nestjs/common'; import { Query } from 'json-api-nestjs'; import { Users } from 'database'; -export class ExamplePipe implements PipeTransform, Query> { - transform(value: Query, metadata: ArgumentMetadata): Query { +export class ExamplePipe implements PipeTransform, Query> { + transform(value: Query, metadata: ArgumentMetadata): Query { return value; } } @@ -200,6 +197,7 @@ For using swagger, you should only add [@nestjs/swagger](https://docs.nestjs.com const app = await NestFactory.create(AppModule); const config = new DocumentBuilder() + .setOpenAPIVersion('3.1.0') .setTitle('JSON API swagger example') .setDescription('The JSON API list example') .setVersion('1.0') @@ -429,6 +427,7 @@ but [Atomic operation](https://jsonapi.org/ext/atomic/) allow for one request. ``` **tmpId** - is params for operation **add**, should be unique for all operations. + If you have Interceptor you can check call it from **AtomicOperation** diff --git a/libs/json-api/json-api-nestjs/package.json b/libs/json-api/json-api-nestjs/package.json index cfce35c0..bb8b9499 100644 --- a/libs/json-api/json-api-nestjs/package.json +++ b/libs/json-api/json-api-nestjs/package.json @@ -1,26 +1,8 @@ { - "name": "json-api-nestjs", + "name": "@klerick/json-api-nestjs", "version": "9.0.0", - "engines": { - "node": ">= 16.0.0" - }, "type": "commonjs", "description": "JsonApi Plugin for NestJs", - "contributors": [ - { - "email": "klerick666@gmain.com", - "name": "Aleksandr Kharkovey" - } - ], - "repository": { - "type": "git", - "url": "https://github.com/klerick/nestjs-json-api.git" - }, - "private": false, - "license": "MIT", - "files": [ - "**/*" - ], "keywords": [ "nestjs", "nest", @@ -30,21 +12,9 @@ "microorm", "CRUD" ], - "peerDependencies": { - "reflect-metadata": "^0.1.13", - "tslib": "^2.3.0", - "@mikro-orm/core": "^6.0.0 || ^6.0.0-dev.0", - "@nestjs/common": "^10.0.0", - "@nestjs/core": "^10.0.0", - "@nestjs/swagger": "^7.3.0", - "@nestjs/typeorm": "^10.0.0", - "@mikro-orm/knex": "^6.0.0", - "typeorm": "^0.3.20" - }, "dependencies": { - "@anatine/zod-openapi": "^2.0.0", - "zod": "^3.24.0", - "zod-validation-error": "^3.4.0", - "uuid": "^10.0.0" + "tslib": ">2.3.0", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" } } diff --git a/libs/json-api/json-api-nestjs/project.json b/libs/json-api/json-api-nestjs/project.json index 48451232..cba7e66b 100644 --- a/libs/json-api/json-api-nestjs/project.json +++ b/libs/json-api/json-api-nestjs/project.json @@ -1,9 +1,9 @@ { "name": "json-api-nestjs", "$schema": "../../../node_modules/nx/schemas/project-schema.json", - "sourceRoot": "libs/json-api/json-api-nestjs/src", + "sourceRoot": "{projectRoot}/src", "projectType": "library", - "tags": [], + "tags": ["type:lib", "lib:json-api-nestjs", "lib:json-api-nestjs", "type:publish"], "targets": { "build": { "executor": "@nx/js:tsc", @@ -11,32 +11,16 @@ "{options.outputPath}" ], "options": { - "outputPath": "dist/libs/json-api/json-api-nestjs", - "tsConfig": "libs/json-api/json-api-nestjs/tsconfig.lib.json", - "packageJson": "libs/json-api/json-api-nestjs/package.json", - "main": "libs/json-api/json-api-nestjs/src/index.ts", + "outputPath": "dist/{projectRoot}", + "tsConfig": "{projectRoot}/tsconfig.lib.json", + "packageJson": "{projectRoot}/package.json", + "main": "{projectRoot}/src/index.ts", "assets": [ - "libs/json-api/json-api-nestjs/*.md" + "{projectRoot}/*.md" ], "buildableProjectDepsInPackageJsonType": "peerDependencies", - "generateExportsField": true - } - }, - "build-npm": { - "executor": "@nx/js:tsc", - "outputs": [ - "{options.outputPath}" - ], - "options": { - "outputPath": "node_modules/@klerick/json-api-nestjs", - "tsConfig": "libs/json-api/json-api-nestjs/tsconfig.lib.json", - "packageJson": "libs/json-api/json-api-nestjs/package.json", - "main": "libs/json-api/json-api-nestjs/src/index.ts", - "assets": [ - "libs/json-api/json-api-nestjs/*.md" - ], - "buildableProjectDepsInPackageJsonType": "peerDependencies", - "generateExportsField": true + "generateExportsField": true, + "updateBuildableProjectDepsInPackageJson": true } }, "nx-release-publish": { @@ -56,13 +40,28 @@ "{workspaceRoot}/coverage/{projectRoot}" ], "options": { - "jestConfig": "libs/json-api/json-api-nestjs/jest.config.ts", + "jestConfig": "{projectRoot}/jest.config.ts", "codeCoverage": true, "coverageReporters": [ "json-summary" ] } }, + "ts-test": { + "dependsOn":[ { + "dependencies": true, + "target": "build", + "params": "ignore" + }], + "executor": "nx:run-commands", + "options": { + "commands": [ + "tsd --files \"src/**/*.test-d.ts\" -t src/lib/types/index.ts" + ], + "cwd": "{workspaceRoot}/{projectRoot}", + "parallel": false + } + }, "upload-badge": { "executor": "nx:run-commands", "dependsOn": [ @@ -76,8 +75,9 @@ ], "cwd": "./", "parallel": false, - "outputPath": "{workspaceRoot}/libs/json-api/json-api-nestjs" + "outputPath": "{workspaceRoot}/projectRoot}" } } - } + }, + "implicitDependencies": ["json-api-nestjs-shared"] } diff --git a/libs/json-api/json-api-nestjs/src/index.ts b/libs/json-api/json-api-nestjs/src/index.ts index fc0b6e76..48b2b225 100644 --- a/libs/json-api/json-api-nestjs/src/index.ts +++ b/libs/json-api/json-api-nestjs/src/index.ts @@ -1,24 +1,53 @@ export { JsonApiModule } from './lib/json-api.module'; -export { TypeOrmJsonApiModule, MicroOrmJsonApiModule } from './lib/modules'; +export { JsonBaseController } from './lib/modules/mixin/controllers/json-base.controller'; export { JsonApi, InjectService } from './lib/modules/mixin/decorators'; -export { OrmService as JsonApiService } from './lib/modules/mixin/types'; -export { JsonBaseController } from './lib/modules/mixin/controller/json-base.controller'; export { - Query, + entityForClass, + excludeMethod, +} from './lib/modules/mixin/helpers/utils'; +export { + PrepareParams, + NestProvider, + ValidateQueryError, + UnionToTuple, + EntityParam, + TypeField, +} from './lib/types'; +export { + JsonApiTransformerService, + ErrorFormatService, +} from './lib/modules/mixin/service'; +export { + MODULE_OPTIONS_TOKEN, + CONTROLLER_OPTIONS_TOKEN, + ASC, + DESC, + FIND_ONE_ROW_ENTITY, + CHECK_RELATION_NAME, + RUN_IN_TRANSACTION_FUNCTION, + ORM_SERVICE, + ENTITY_PARAM_MAP, + DEFAULT_PAGE_SIZE, + DEFAULT_QUERY_PAGE, + CURRENT_ENTITY, +} from './lib/constants'; +export { + OrmService, + OrmService as JsonApiService, + EntityControllerParam, + CheckRelationName, + FindOneRowEntity, + RunInTransaction, + EntityParamMap, +} from './lib/modules/mixin/types'; +export { PatchData, + PatchRelationshipData, PostData, PostRelationshipData, - PatchRelationshipData, + Query, QueryOne, + SortQuery, + Relationships, } from './lib/modules/mixin/zod'; - -export { - EntityRelation, - ResourceObject, - ResourceObjectRelationships, - QueryField, -} from './lib/utils/nestjs-shared'; - -export { excludeMethod } from './lib/modules/mixin/config/bindings'; -export { entityForClass } from './lib/utils'; diff --git a/libs/json-api/json-api-nestjs/src/lib/constants/constants.ts b/libs/json-api/json-api-nestjs/src/lib/constants/constants.ts new file mode 100644 index 00000000..1c47554f --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/constants/constants.ts @@ -0,0 +1,10 @@ +export const JSON_API_CONTROLLER_POSTFIX = 'JsonApiController'; +export const JSON_API_MODULE_POSTFIX = 'JsonApiModule'; +export const DEFAULT_CONNECTION_NAME = 'default'; +export const ORM_SERVICE_PROPS = Symbol('ORM_SERVICE_PROPS'); +export const PARAMS_RESOURCE_ID = 'id'; +export const PARAMS_RELATION_NAME = 'relName'; +export const DESC = 'DESC'; +export const ASC = 'ASC'; + +export const SORT_TYPE = [DESC, ASC] as const; diff --git a/libs/json-api/json-api-nestjs/src/lib/constants/default.ts b/libs/json-api/json-api-nestjs/src/lib/constants/default.ts index de75ca27..a15de4b8 100644 --- a/libs/json-api/json-api-nestjs/src/lib/constants/default.ts +++ b/libs/json-api/json-api-nestjs/src/lib/constants/default.ts @@ -1,4 +1,2 @@ -export const DEFAULT_CONNECTION_NAME = 'default'; - export const DEFAULT_QUERY_PAGE = 1; export const DEFAULT_PAGE_SIZE = 20; diff --git a/libs/json-api/json-api-nestjs/src/lib/constants/di.ts b/libs/json-api/json-api-nestjs/src/lib/constants/di.ts index 2d70e17d..ced993f5 100644 --- a/libs/json-api/json-api-nestjs/src/lib/constants/di.ts +++ b/libs/json-api/json-api-nestjs/src/lib/constants/di.ts @@ -1,20 +1,10 @@ -export const CURRENT_ENTITY_MANAGER_TOKEN = Symbol( - 'CURRENT_ENTITY_MANAGER_TOKEN' -); -export const GLOBAL_MODULE_OPTIONS_TOKEN = Symbol('GLOBAL_MODULE_OPTIONS'); export const ORM_SERVICE = Symbol('ORM_SERVICE'); -export const ORM_SERVICE_PROPS = Symbol('ORM_SERVICE_PROPS'); -export const PARAMS_FOR_ZOD_SCHEMA = Symbol('PARAMS_FOR_ZOD_SCHEMA'); -export const FIELD_FOR_ENTITY = Symbol('FIELD_FOR_ENTITY'); -export const CONTROL_OPTIONS_TOKEN = Symbol('CONTROL_OPTIONS_TOKEN'); -export const RUN_IN_TRANSACTION_FUNCTION = Symbol( - 'RUN_IN_TRANSACTION_FUNCTION' -); +export const MODULE_OPTIONS_TOKEN = Symbol('MODULE_OPTIONS_TOKEN'); +export const CONTROLLER_OPTIONS_TOKEN = Symbol('CONTROLLER_OPTIONS_TOKEN'); export const CURRENT_ENTITY = Symbol('CURRENT_ENTITY'); -export const FIND_ONE_ROW_ENTITY = Symbol('FIND_ONE_ROW_ENTITY'); -export const CHECK_RELATION_NAME = Symbol('CHECK_RELATION_NAME'); +export const ENTITY_PARAM_MAP = Symbol('ENTITY_PARAM_MAP'); export const ZOD_INPUT_QUERY_SCHEMA = Symbol('ZOD_INPUT_QUERY_SCHEMA'); export const ZOD_QUERY_SCHEMA = Symbol('ZOD_INPUT_QUERY_SCHEMA'); @@ -26,7 +16,9 @@ export const ZOD_POST_RELATIONSHIP_SCHEMA = Symbol( export const ZOD_PATCH_RELATIONSHIP_SCHEMA = Symbol( 'ZOD_PATCH_RELATIONSHIP_SCHEMA' ); -export const CURRENT_DATA_SOURCE_TOKEN = Symbol('CURRENT_DATA_SOURCE_TOKEN'); -export const CURRENT_ENTITY_REPOSITORY = Symbol('CURRENT_ENTITY_REPOSITORY'); -export const ENTITY_MAP_PROPS = Symbol('ENTITY_MAP_PROPS'); +export const FIND_ONE_ROW_ENTITY = Symbol('FIND_ONE_ROW_ENTITY'); +export const CHECK_RELATION_NAME = Symbol('CHECK_RELATION_NAME'); +export const RUN_IN_TRANSACTION_FUNCTION = Symbol( + 'RUN_IN_TRANSACTION_FUNCTION' +); diff --git a/libs/json-api/json-api-nestjs/src/lib/constants/index.ts b/libs/json-api/json-api-nestjs/src/lib/constants/index.ts index 83b9d181..1e2902a0 100644 --- a/libs/json-api/json-api-nestjs/src/lib/constants/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/constants/index.ts @@ -1,14 +1,4 @@ export * from './default'; -export * from './di'; export * from './reflection'; - -export const JSON_API_CONTROLLER_POSTFIX = 'JsonApiController'; -export const JSON_API_MODULE_POSTFIX = 'JsonApiModule'; - -export const PARAMS_RESOURCE_ID = 'id'; -export const PARAMS_RELATION_ID = 'relId'; -export const PARAMS_RELATION_NAME = 'relName'; - -export const DESC = 'DESC'; -export const ASC = 'ASC'; -export const SORT_TYPE = [DESC, ASC] as const; +export * from './di'; +export * from './constants'; diff --git a/libs/json-api/json-api-nestjs/src/lib/json-api.module.ts b/libs/json-api/json-api-nestjs/src/lib/json-api.module.ts index 0e9fad09..8fcb8362 100644 --- a/libs/json-api/json-api-nestjs/src/lib/json-api.module.ts +++ b/libs/json-api/json-api-nestjs/src/lib/json-api.module.ts @@ -1,80 +1,60 @@ import { DynamicModule, Module } from '@nestjs/common'; -import { DiscoveryModule } from '@nestjs/core'; - +import { OrmModule, ParamsModule } from './types'; +import { prepareConfig, getController } from './utils'; +import { ENTITY_PARAM_MAP } from './constants'; +import { AtomicOperationModule, MixinModule } from './modules'; import { - AnyEntity, - EntityName, - TypeOrmDefaultOptions, - TypeOrmOptions, - MicroOrmOptions, - ResultModuleOptions, -} from './types'; -import { createMixinModule, prepareConfig, createAtomicModule } from './utils'; -import type { TypeOrmJsonApiModule, MicroOrmJsonApiModule } from './modules'; + ErrorInterceptors, + LogTimeInterceptors, +} from './modules/mixin/interceptors'; +import { ErrorFormatService } from './modules/mixin/service'; @Module({}) export class JsonApiModule { - public static forRoot( - module: typeof TypeOrmJsonApiModule, - options: TypeOrmOptions - ): DynamicModule; - public static forRoot( - module: typeof MicroOrmJsonApiModule, - options: MicroOrmOptions - ): DynamicModule; - /** - * @deprecated This type of method is deprecated and may be removed in future versions. - * Consider using newer alternatives or updated patterns for module registration. - */ - public static forRoot(options: TypeOrmDefaultOptions): DynamicModule; - public static forRoot( - first: - | typeof TypeOrmJsonApiModule - | typeof MicroOrmJsonApiModule - | TypeOrmDefaultOptions, - second?: TypeOrmOptions | MicroOrmOptions + public static forRoot( + module: M, + options: ParamsModule ): DynamicModule { - let resultOption: ResultModuleOptions = {} as any; - - if (second) { - const module = first as - | typeof TypeOrmJsonApiModule - | typeof MicroOrmJsonApiModule; - resultOption = { - ...prepareConfig(second, module.module), - type: module, - } as ResultModuleOptions; - } else { - const { - TypeOrmJsonApiModule, - } = require('./modules/type-orm/type-orm-json-api.module'); - resultOption = { - ...prepareConfig( - first as TypeOrmDefaultOptions, - TypeOrmJsonApiModule.module - ), - type: TypeOrmJsonApiModule as typeof TypeOrmJsonApiModule, - } as any; - } - - resultOption.imports.unshift(DiscoveryModule); - - const commonOrmModule = resultOption.type.forRoot(resultOption); - - const entitiesMixinModules = resultOption.entities.map( - (entity: EntityName) => - createMixinModule(entity, resultOption, commonOrmModule) + const prepareOptions = prepareConfig(options); + prepareOptions.providers.push( + ErrorInterceptors, + ErrorFormatService, + LogTimeInterceptors ); - - const operationModuleImport = createAtomicModule( - resultOption, - entitiesMixinModules, - commonOrmModule + const commonOrmModule = module.forRoot(prepareOptions); + + if ( + !commonOrmModule.providers || + !commonOrmModule.providers.find( + (i) => 'provide' in i && i.provide === ENTITY_PARAM_MAP + ) + ) + throw new Error( + `The module ${module.name} should be provide ${ENTITY_PARAM_MAP.description}` + ); + + const entitiesModules = prepareOptions.entities.map((entityItem) => + MixinModule.forRoot({ + entity: entityItem, + imports: [commonOrmModule, ...prepareOptions.imports], + ormModule: module, + controller: getController(entityItem, prepareOptions.controllers), + config: prepareOptions, + }) ); + const atomicOperation = prepareOptions.options.operationUrl + ? AtomicOperationModule.forRoot( + prepareOptions.options.operationUrl, + prepareOptions.entities, + entitiesModules, + commonOrmModule + ) + : []; + return { module: JsonApiModule, - imports: [...operationModuleImport, ...entitiesMixinModules], + imports: [...entitiesModules, ...atomicOperation], }; } } diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/db-for-test b/libs/json-api/json-api-nestjs/src/lib/mock-utils/db-for-test deleted file mode 100644 index fa08bc14..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/db-for-test +++ /dev/null @@ -1,647 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 12.5 --- Dumped by pg_dump version 12.5 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET idle_in_transaction_session_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SELECT pg_catalog.set_config('search_path', '', false); -SET check_function_bodies = false; -SET xmloption = content; -SET client_min_messages = warning; -SET row_security = off; - -create extension "uuid-ossp"; - --- --- Name: comment_kind_enum; Type: TYPE; Schema: public; Owner: - --- - -CREATE TYPE public.comment_kind_enum AS ENUM ( - 'COMMENT', - 'MESSAGE', - 'NOTE' -); - - -SET default_table_access_method = heap; - --- --- Name: addresses; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE public.addresses ( - id integer NOT NULL, - city character varying(70) DEFAULT NULL::character varying, - state character varying(70) DEFAULT NULL::character varying, - country character varying(70) DEFAULT NULL::character varying, - created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP, - array_field text[] -); - - --- --- Name: addresses_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE public.addresses_id_seq - AS integer - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: addresses_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE public.addresses_id_seq OWNED BY public.addresses.id; - - --- --- Name: comments; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE public.comments ( - id integer NOT NULL, - text text NOT NULL, - kind public.comment_kind_enum NOT NULL, - created_by integer, - created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP -); - - --- --- Name: comments_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE public.comments_id_seq - AS integer - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: comments_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE public.comments_id_seq OWNED BY public.comments.id; - - --- --- Name: notes; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE public.notes ( - id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), - text text NOT NULL, - created_by integer, - created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP -); - - - --- --- Name: migrations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE public.migrations ( - id integer NOT NULL, - "timestamp" bigint NOT NULL, - name character varying NOT NULL -); - - --- --- Name: migrations_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE public.migrations_id_seq - AS integer - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: migrations_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE public.migrations_id_seq OWNED BY public.migrations.id; - - --- --- Name: pods; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE public.pods ( - id integer NOT NULL, - name character varying, - created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP -); - - --- --- Name: pods_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE public.pods_id_seq - AS integer - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: pods_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE public.pods_id_seq OWNED BY public.pods.id; - - --- --- Name: requests; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE public.requests ( - id integer NOT NULL, - created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP -); - - --- --- Name: requests_have_pod_locks; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE public.requests_have_pod_locks ( - id integer NOT NULL, - request_id integer NOT NULL, - pod_id integer NOT NULL, - external_id integer, - created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP -); - - --- --- Name: requests_have_pod_locks_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE public.requests_have_pod_locks_id_seq - AS integer - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: requests_have_pod_locks_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE public.requests_have_pod_locks_id_seq OWNED BY public.requests_have_pod_locks.id; - - --- --- Name: requests_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE public.requests_id_seq - AS integer - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: requests_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE public.requests_id_seq OWNED BY public.requests.id; - - --- --- Name: roles; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE public.roles ( - id integer NOT NULL, - name character varying(128) DEFAULT NULL::character varying, - key character varying(128) NOT NULL, - is_default boolean DEFAULT false, - created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP -); - - --- --- Name: roles_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE public.roles_id_seq - AS integer - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: roles_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE public.roles_id_seq OWNED BY public.roles.id; - - --- --- Name: typeorm_metadata; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE public.typeorm_metadata ( - type character varying NOT NULL, - database character varying, - schema character varying, - "table" character varying, - name character varying, - value text -); - - --- --- Name: users; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE public.users ( - id integer NOT NULL, - login character varying(100) NOT NULL, - first_name character varying, - last_name character varying, - is_active boolean DEFAULT false, - test_real real[], - test_array_null real[], - manager_id integer, - addresses_id integer, - user_groups_id integer, - created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP, - test_date timestamp without time zone DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP -); - --- --- Name: user_groups; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE public.user_groups ( - id integer NOT NULL, - label character varying NOT NULL -); - - --- --- Name: users_have_roles; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE public.users_have_roles ( - id integer NOT NULL, - user_id integer NOT NULL, - role_id integer NOT NULL, - created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP -); - - --- --- Name: users_have_roles_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE public.users_have_roles_id_seq - AS integer - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: users_have_roles_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE public.users_have_roles_id_seq OWNED BY public.users_have_roles.id; - - --- --- Name: users_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE public.users_id_seq - AS integer - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: users_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE public.users_id_seq OWNED BY public.users.id; - - --- --- Name: user_groups_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE public.user_groups_id_seq - AS integer - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - --- --- Name: user_groups_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE public.user_groups_id_seq OWNED BY public.user_groups.id; - - --- --- Name: addresses id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.addresses ALTER COLUMN id SET DEFAULT nextval('public.addresses_id_seq'::regclass); - - --- --- Name: comments id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.comments ALTER COLUMN id SET DEFAULT nextval('public.comments_id_seq'::regclass); - - --- --- Name: migrations id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.migrations ALTER COLUMN id SET DEFAULT nextval('public.migrations_id_seq'::regclass); - - --- --- Name: pods id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.pods ALTER COLUMN id SET DEFAULT nextval('public.pods_id_seq'::regclass); - - --- --- Name: requests id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.requests ALTER COLUMN id SET DEFAULT nextval('public.requests_id_seq'::regclass); - - --- --- Name: requests_have_pod_locks id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.requests_have_pod_locks ALTER COLUMN id SET DEFAULT nextval('public.requests_have_pod_locks_id_seq'::regclass); - - --- --- Name: roles id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.roles ALTER COLUMN id SET DEFAULT nextval('public.roles_id_seq'::regclass); - - --- --- Name: users id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.users ALTER COLUMN id SET DEFAULT nextval('public.users_id_seq'::regclass); - - --- --- Name: users id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.user_groups ALTER COLUMN id SET DEFAULT nextval('public.user_groups_id_seq'::regclass); - - --- --- Name: users_have_roles id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.users_have_roles ALTER COLUMN id SET DEFAULT nextval('public.users_have_roles_id_seq'::regclass); - - --- --- Name: requests PK_0428f484e96f9e6a55955f29b5f; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.requests - ADD CONSTRAINT "PK_0428f484e96f9e6a55955f29b5f" PRIMARY KEY (id); - - --- --- Name: addresses PK_745d8f43d3af10ab8247465e450; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.addresses - ADD CONSTRAINT "PK_745d8f43d3af10ab8247465e450" PRIMARY KEY (id); - - --- --- Name: comments PK_8bf68bc960f2b69e818bdb90dcb; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.comments - ADD CONSTRAINT "PK_8bf68bc960f2b69e818bdb90dcb" PRIMARY KEY (id); - - --- --- Name: migrations PK_8c82d7f526340ab734260ea46be; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.migrations - ADD CONSTRAINT "PK_8c82d7f526340ab734260ea46be" PRIMARY KEY (id); - - --- --- Name: users_have_roles PK_9bb88c2f9f64bff7570e4108108; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.users_have_roles - ADD CONSTRAINT "PK_9bb88c2f9f64bff7570e4108108" PRIMARY KEY (id); - - --- --- Name: users PK_a3ffb1c0c8416b9fc6f907b7433; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.users - ADD CONSTRAINT "PK_a3ffb1c0c8416b9fc6f907b7433" PRIMARY KEY (id); - - --- --- Name: users PK_user_groups; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.user_groups - ADD CONSTRAINT "PK_user_groups" PRIMARY KEY (id); - --- --- Name: pods PK_b00bbc2c7fb41627be2b169f0dd; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.pods - ADD CONSTRAINT "PK_b00bbc2c7fb41627be2b169f0dd" PRIMARY KEY (id); - - --- --- Name: roles PK_c1433d71a4838793a49dcad46ab; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.roles - ADD CONSTRAINT "PK_c1433d71a4838793a49dcad46ab" PRIMARY KEY (id); - - --- --- Name: requests_have_pod_locks PK_f214657396a396b70a697b04a85; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.requests_have_pod_locks - ADD CONSTRAINT "PK_f214657396a396b70a697b04a85" PRIMARY KEY (id); - - --- --- Name: users UQ_2d443082eccd5198f95f2a36e2c; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.users - ADD CONSTRAINT "UQ_2d443082eccd5198f95f2a36e2c" UNIQUE (login); - - --- --- Name: roles UQ_a87cf0659c3ac379b339acf36a2; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.roles - ADD CONSTRAINT "UQ_a87cf0659c3ac379b339acf36a2" UNIQUE (key); - - --- --- Name: IDX_48d6a9a1ab3943e6c6d2a25d2e; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX "IDX_48d6a9a1ab3943e6c6d2a25d2e" ON public.requests_have_pod_locks USING btree (request_id, pod_id); - - --- --- Name: IDX_61c360686dfe8d62a9b03873bf; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX "IDX_61c360686dfe8d62a9b03873bf" ON public.users_have_roles USING btree (user_id, role_id); - - --- --- Name: users FK_2f8d527df0d3acb8aa51945a968; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.users - ADD CONSTRAINT "FK_2f8d527df0d3acb8aa51945a968" FOREIGN KEY (addresses_id) REFERENCES public.addresses(id); - - --- --- Name: users FK_user_groups; Type: FK CONSTRAINT; Schema: public; Owner: - --- -ALTER TABLE ONLY public.users - ADD CONSTRAINT "FK_user_groups" FOREIGN KEY (user_groups_id) REFERENCES public.user_groups(id); - - --- --- Name: users_have_roles FK_6e768e03083247102b401b74b46; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.users_have_roles - ADD CONSTRAINT "FK_6e768e03083247102b401b74b46" FOREIGN KEY (role_id) REFERENCES public.roles(id); - - --- --- Name: comments FK_980bfefe00ed11685f325d0bd4c; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.comments - ADD CONSTRAINT "FK_980bfefe00ed11685f325d0bd4c" FOREIGN KEY (created_by) REFERENCES public.users(id); - - --- --- Name: notes FK_980bfefe00ed11685f325d0bd4c; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.notes - ADD CONSTRAINT "FK_notes" FOREIGN KEY (created_by) REFERENCES public.users(id); - - --- --- Name: requests_have_pod_locks FK_c7531fe6bbb926bba3f69fcbb55; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.requests_have_pod_locks - ADD CONSTRAINT "FK_c7531fe6bbb926bba3f69fcbb55" FOREIGN KEY (pod_id) REFERENCES public.pods(id); - - --- --- Name: users_have_roles FK_df6a0246fcd887dd8ffeed2c292; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.users_have_roles - ADD CONSTRAINT "FK_df6a0246fcd887dd8ffeed2c292" FOREIGN KEY (user_id) REFERENCES public.users(id); - - --- --- Name: requests_have_pod_locks FK_f3729b493fcdb7309cad08837ff; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.requests_have_pod_locks - ADD CONSTRAINT "FK_f3729b493fcdb7309cad08837ff" FOREIGN KEY (request_id) REFERENCES public.requests(id); - - --- --- Name: users FK_fba2d8e029689aa8fea98e53c91; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.users - ADD CONSTRAINT "FK_fba2d8e029689aa8fea98e53c91" FOREIGN KEY (manager_id) REFERENCES public.users(id); - - --- --- PostgreSQL database dump complete --- diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/index.ts b/libs/json-api/json-api-nestjs/src/lib/mock-utils/index.ts deleted file mode 100644 index b9efca01..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/index.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { DataType, IMemoryDb, newDb } from 'pg-mem'; -import { readFileSync } from 'fs'; -import { join } from 'path'; -import { v4 } from 'uuid'; -// @ts-ignore -import type { PGlite } from '@electric-sql/pglite'; - -export async function createAndPullSchemaBasePgLite(): Promise { - const db = await Promise.all([ - import('@electric-sql/pglite'), - // @ts-ignore - import('@electric-sql/pglite/contrib/uuid_ossp'), - ]).then( - ([{ PGlite }, { uuid_ossp }]) => - new PGlite({ - extensions: { uuid_ossp }, - database: 'pgLite', - username: 'postgres', - }) - ); - - // await db.exec( - // 'CREATE SCHEMA IF NOT EXISTS public; SET search_path TO public;' - // ); - - // const dump = readFileSync(join(__dirname, 'db-for-test'), { - // encoding: 'utf8', - // }); - // await db.exec(dump); - return db; -} - -export function createAndPullSchemaBase(): IMemoryDb { - const dump = readFileSync(join(__dirname, 'db-for-test'), { - encoding: 'utf8', - }); - const db = newDb({ - autoCreateForeignKeyIndices: true, - }); - - db.public.registerFunction({ - name: 'current_database', - implementation: () => 'test', - }); - - db.public.registerFunction({ - name: 'version', - implementation: () => - 'PostgreSQL 12.5 on x86_64-pc-linux-musl, compiled by gcc (Alpine 10.2.1_pre1) 10.2.1 20201203, 64-bit', - }); - - db.registerExtension('uuid-ossp', (schema) => { - schema.registerFunction({ - name: 'uuid_generate_v4', - returns: DataType.uuid, - implementation: v4, - impure: true, - }); - }); - db.public.none(dump); - return db; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/requests-have-pod-locks.ts b/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/requests-have-pod-locks.ts deleted file mode 100644 index 7f1f8125..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/requests-have-pod-locks.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { - AfterLoad, - BeforeInsert, - BeforeRemove, - BeforeUpdate, - Column, - CreateDateColumn, - Entity, - PrimaryGeneratedColumn, - UpdateDateColumn, -} from 'typeorm'; - -export type IRequestsHavePodLocks = RequestsHavePodLocks; - -@Entity('requests_have_pod_locks') -export class RequestsHavePodLocks { - @PrimaryGeneratedColumn() - public id!: number; - - @AfterLoad() - protected getRequestId() { - this.requestId = this.request_id; - } - - @BeforeInsert() - @BeforeUpdate() - @BeforeRemove() - protected setRequestId() { - if (this.requestId) { - this.request_id = this.requestId; - } - } - - public requestId!: number; - - @AfterLoad() - protected getPodId() { - this.podId = this.pod_id; - } - - @BeforeInsert() - @BeforeUpdate() - @BeforeRemove() - protected setPodId() { - if (this.podId) { - this.pod_id = this.podId; - } - } - - public podId!: number; - - @Column({ - name: 'request_id', - type: 'int', - nullable: false, - }) - protected request_id!: number; - - @Column({ - name: 'pod_id', - type: 'int', - nullable: false, - }) - protected pod_id!: number; - - @CreateDateColumn({ - name: 'created_at', - type: 'timestamp', - nullable: true, - default: 'CURRENT_TIMESTAMP', - }) - public createdAt!: Date; - - @UpdateDateColumn({ - name: 'updated_at', - type: 'timestamp', - nullable: true, - default: 'CURRENT_TIMESTAMP', - }) - public updatedAt!: Date; - - @Column({ - name: 'external_id', - type: 'int', - nullable: true, - unsigned: true, - default: 'NULL', - unique: true, - }) - public externalId!: number; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/requests.ts b/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/requests.ts deleted file mode 100644 index 9bd64266..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/requests.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { - PrimaryGeneratedColumn, - Entity, - CreateDateColumn, - UpdateDateColumn, - ManyToMany, - JoinTable, -} from 'typeorm'; - -import { Pods, IPods } from './index'; - -export type IRequests = Requests; - -@Entity('requests') -export class Requests { - @PrimaryGeneratedColumn() - public id!: number; - - @CreateDateColumn({ - name: 'created_at', - type: 'timestamp', - nullable: true, - default: 'CURRENT_TIMESTAMP', - }) - public createdAt!: Date; - - @UpdateDateColumn({ - name: 'updated_at', - type: 'timestamp', - nullable: true, - default: 'CURRENT_TIMESTAMP', - }) - public updatedAt!: Date; - - @ManyToMany(() => Pods, (item) => item.lockedRequests) - @JoinTable({ - name: 'requests_have_pod_locks', - inverseJoinColumn: { - referencedColumnName: 'id', - name: 'pod_id', - }, - joinColumn: { - referencedColumnName: 'id', - name: 'request_id', - }, - }) - public podLocks!: IPods[]; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/index.ts b/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/index.ts deleted file mode 100644 index f7eba83d..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/index.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { TypeOrmModule } from '@nestjs/typeorm'; -import { DynamicModule } from '@nestjs/common'; -import { IMemoryDb } from 'pg-mem'; - -import { - Addresses, - Comments, - Notes, - Pods, - Requests, - RequestsHavePodLocks, - Roles, - UserGroups, - Users, -} from './entities'; -import { DataSource } from 'typeorm'; - -export * from './entities'; -export * from './utils'; - -export const entities = [ - Users, - UserGroups, - Roles, - RequestsHavePodLocks, - Requests, - Pods, - Comments, - Addresses, - Notes, -]; - -export function mockDBTestModule(db: IMemoryDb): DynamicModule { - return TypeOrmModule.forRootAsync({ - useFactory() { - return { - type: 'postgres', - // logging: true, - entities: [ - Users, - UserGroups, - Roles, - RequestsHavePodLocks, - Requests, - Pods, - Comments, - Addresses, - Notes, - ], - }; - }, - async dataSourceFactory(options) { - const dataSource: DataSource = await db.adapters.createTypeormDataSource( - options - ); - - return dataSource; - }, - }); -} diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/utils/index.ts b/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/utils/index.ts deleted file mode 100644 index 7cb5aa8b..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/utils/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './pull-data'; -export * from './provider-entities'; diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/utils/provider-entities.ts b/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/utils/provider-entities.ts deleted file mode 100644 index f0bca9e1..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/utils/provider-entities.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { DataSource, Repository } from 'typeorm'; -import { Provider } from '@nestjs/common'; -import { getDataSourceToken, getRepositoryToken } from '@nestjs/typeorm'; - -import { - Addresses, - Comments, - Entities, - Notes, - Pods, - Roles, - UserGroups, -} from '../entities'; -import { Users } from '../entities'; -import { DEFAULT_CONNECTION_NAME } from '../../../constants'; -import { TestingModule } from '@nestjs/testing'; - -export function providerEntities( - dataSourceToken: ReturnType -): Provider[] { - return Entities.map((entitiy) => { - return { - provide: getRepositoryToken(entitiy, DEFAULT_CONNECTION_NAME), - useFactory(dataSource: DataSource) { - return dataSource.getRepository(entitiy); - }, - inject: [getDataSourceToken()], - }; - }); -} - -export function getRepository(module: TestingModule) { - const userRepository = module.get>( - getRepositoryToken(Users, DEFAULT_CONNECTION_NAME) - ); - - const addressesRepository = module.get>( - getRepositoryToken(Addresses, DEFAULT_CONNECTION_NAME) - ); - - const notesRepository = module.get>( - getRepositoryToken(Notes, DEFAULT_CONNECTION_NAME) - ); - - const commentsRepository = module.get>( - getRepositoryToken(Comments, DEFAULT_CONNECTION_NAME) - ); - const rolesRepository = module.get>( - getRepositoryToken(Roles, DEFAULT_CONNECTION_NAME) - ); - - const userGroupRepository = module.get>( - getRepositoryToken(UserGroups, DEFAULT_CONNECTION_NAME) - ); - - const podsRepository = module.get>( - getRepositoryToken(Pods, DEFAULT_CONNECTION_NAME) - ); - - return { - userRepository, - addressesRepository, - notesRepository, - commentsRepository, - rolesRepository, - userGroupRepository, - podsRepository, - }; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/atomic-operation.module.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/atomic-operation.module.ts index 46bf6797..f8c75fcc 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/atomic-operation.module.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/atomic-operation.module.ts @@ -6,7 +6,8 @@ import { Module, NestModule, } from '@nestjs/common'; -import { DiscoveryModule } from '@nestjs/core'; +import { DiscoveryModule, RouterModule } from '@nestjs/core'; +import { AnyEntity, EntityClass } from '@klerick/json-api-nestjs-shared'; import { OperationController } from './controllers'; import { ExplorerService, ExecuteService, SwaggerService } from './service'; @@ -17,13 +18,33 @@ import { ZodInputOperation, AsyncIterate, } from './factory'; -import { ResultModuleOptions } from '../../types'; -import { MAP_CONTROLLER_INTERCEPTORS, OPTIONS } from './constants'; +import { MAP_CONTROLLER_INTERCEPTORS } from './constants'; @Module({}) export class AtomicOperationModule implements NestModule { static forRoot( - options: ResultModuleOptions, + operationUrl: string, + entities: EntityClass[], + entityModules: DynamicModule[], + commonModule: DynamicModule + ): DynamicModule[] { + return [ + AtomicOperationModule.factoryModule( + entities, + entityModules, + commonModule + ), + RouterModule.register([ + { + module: AtomicOperationModule, + path: operationUrl, + }, + ]), + ]; + } + + private static factoryModule( + entities: EntityClass[], entityModules: DynamicModule[], commonModule: DynamicModule ): DynamicModule { @@ -35,17 +56,13 @@ export class AtomicOperationModule implements NestModule { ExecuteService, SwaggerService, AsyncIterate, - MapControllerEntity(options.entities, entityModules), - MapEntityNameToEntity(options.entities), + MapControllerEntity(entities, entityModules), + MapEntityNameToEntity(entities), ZodInputOperation(), { provide: MAP_CONTROLLER_INTERCEPTORS, useValue: new Map(), }, - { - provide: OPTIONS, - useValue: options.options, - }, { provide: AsyncLocalStorage, useValue: new AsyncLocalStorage(), @@ -54,6 +71,7 @@ export class AtomicOperationModule implements NestModule { imports: [DiscoveryModule, commonModule], }; } + @Inject(AsyncLocalStorage) private readonly als!: AsyncLocalStorage; configure(consumer: MiddlewareConsumer) { @@ -66,6 +84,6 @@ export class AtomicOperationModule implements NestModule { }; this.als.run(store, () => next()); }) - .forRoutes('*'); + .forRoutes('{*splat}'); } } diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/constants/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/constants/index.ts index ccace714..3dbb5aa0 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/constants/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/constants/index.ts @@ -5,6 +5,3 @@ export const MAP_CONTROLLER_INTERCEPTORS = Symbol( export const MAP_ENTITY = Symbol('MAP_ENTITY'); export const ZOD_INPUT_OPERATION = Symbol('ZOD_INPUT_OPERATION'); export const ASYNC_ITERATOR_FACTORY = Symbol('ASYNC_ITERATOR_FACTORY'); -export const KEY_MAIN_INPUT_SCHEMA = 'atomic:operations'; -export const KEY_MAIN_OUTPUT_SCHEMA = 'atomic:results'; -export const OPTIONS = Symbol('OPTIONS'); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/controllers/operation.controller.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/controllers/operation.controller.spec.ts index 1206658c..164ea78d 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/controllers/operation.controller.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/controllers/operation.controller.spec.ts @@ -2,55 +2,40 @@ import { Test, TestingModule } from '@nestjs/testing'; import { DiscoveryModule } from '@nestjs/core'; import { HttpException } from '@nestjs/common'; import { Module } from '@nestjs/core/injector/module'; -import { getDataSourceToken } from '@nestjs/typeorm'; -import { IMemoryDb } from 'pg-mem'; +import { + KEY_MAIN_OUTPUT_SCHEMA, + Operation, +} from '@klerick/json-api-nestjs-shared'; import { OperationController } from './operation.controller'; import { ExecuteService, ExplorerService } from '../service'; -import { InputArray, Operation } from '../utils'; -import { JsonBaseController } from '../../mixin/controller/json-base.controller'; -import { - mockDBTestModule, - providerEntities, - Users, -} from '../../../mock-utils/typeorm'; +import { InputArray } from '../utils'; +import { JsonBaseController } from '../../mixin/controllers'; + +import { Users } from '../../../utils/___test___/test-classes.helper'; import { ASYNC_ITERATOR_FACTORY, - KEY_MAIN_OUTPUT_SCHEMA, MAP_CONTROLLER_ENTITY, MAP_ENTITY, ZOD_INPUT_OPERATION, MAP_CONTROLLER_INTERCEPTORS, - OPTIONS, } from '../constants'; import { OperationMethode } from '../types'; import { AsyncLocalStorage } from 'async_hooks'; -import { ObjectLiteral } from '../../../types'; -import { - CURRENT_DATA_SOURCE_TOKEN, - RUN_IN_TRANSACTION_FUNCTION, -} from '../../../constants'; -import { createAndPullSchemaBase } from '../../../mock-utils'; +import { RUN_IN_TRANSACTION_FUNCTION } from '../../../constants'; describe('OperationController', () => { - let db: IMemoryDb; let operationController: OperationController; let explorerService: ExplorerService; let executeService: ExecuteService; beforeEach(async () => { - db = createAndPullSchemaBase(); const app: TestingModule = await Test.createTestingModule({ - imports: [DiscoveryModule, mockDBTestModule(db)], + imports: [DiscoveryModule], controllers: [OperationController], providers: [ - ...providerEntities(getDataSourceToken()), - { - provide: CURRENT_DATA_SOURCE_TOKEN, - useValue: {}, - }, ExplorerService, ExecuteService, { @@ -73,10 +58,6 @@ describe('OperationController', () => { provide: ZOD_INPUT_OPERATION, useValue: {}, }, - { - provide: OPTIONS, - useValue: {}, - }, { provide: MAP_CONTROLLER_INTERCEPTORS, useValue: {}, @@ -127,7 +108,7 @@ describe('OperationController', () => { const getMethodNameByParamSpy = jest .spyOn(explorerService, 'getMethodNameByParam') .mockReturnValue( - paramsForExecuteMock[0].methodName as OperationMethode + paramsForExecuteMock[0].methodName as OperationMethode ); const getModulesByControllerSpy = jest .spyOn(explorerService, 'getParamsForMethod') diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/controllers/operation.controller.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/controllers/operation.controller.ts index 7042e289..f5377b78 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/controllers/operation.controller.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/controllers/operation.controller.ts @@ -8,14 +8,16 @@ import { Type, } from '@nestjs/common'; import { Module } from '@nestjs/core/injector/module'; - +import { + KEY_MAIN_INPUT_SCHEMA, + KEY_MAIN_OUTPUT_SCHEMA, +} from '@klerick/json-api-nestjs-shared'; import { InputArray } from '../utils'; import { InputOperationPipe } from '../pipes/input-operation.pipe'; import { ExecuteService, ExplorerService } from '../service'; -import { KEY_MAIN_INPUT_SCHEMA, KEY_MAIN_OUTPUT_SCHEMA } from '../constants'; import { OperationMethode, ParamsForExecute } from '../types'; -import { JsonBaseController } from '../../mixin/controller/json-base.controller'; -import { ObjectLiteral as Entity, ValidateQueryError } from '../../../types'; +import { JsonBaseController } from '../../mixin/controllers/json-base.controller'; +import { ValidateQueryError } from '../../../types'; @Controller('/') export class OperationController { @@ -32,8 +34,8 @@ export class OperationController { op, } = dataInput; - let controller: Type>; - let methodName: OperationMethode; + let controller: Type>; + let methodName: OperationMethode; let module: Module; try { controller = this.explorerService.getControllerByEntityName(type); @@ -63,7 +65,7 @@ export class OperationController { const params = this.explorerService.getParamsForMethod( methodName, dataInput - ); + ) as any; try { module = this.explorerService.getModulesByController(controller); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/index.ts index 0dded8b9..cd4165b3 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/index.ts @@ -1,4 +1,4 @@ -export * from './zod-input-operation'; +export * from './async-iterator'; export * from './map-controller-entity'; export * from './map-entity-name-to-entity'; -export * from './async-iterator'; +export * from './zod-input-operation'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/map-controller-entity.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/map-controller-entity.ts index 64d23a17..7e149c4a 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/map-controller-entity.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/map-controller-entity.ts @@ -1,11 +1,11 @@ import { DynamicModule, ValueProvider } from '@nestjs/common'; import { Type } from '@nestjs/common/interfaces/type.interface'; -import { EntityClassOrSchema } from '@nestjs/typeorm/dist/interfaces/entity-class-or-schema.type'; +import { AnyEntity, EntityClass } from '@klerick/json-api-nestjs-shared'; import { MapController } from '../types'; import { MAP_CONTROLLER_ENTITY } from '../constants'; export function MapControllerEntity( - entities: EntityClassOrSchema[], + entities: EntityClass[], entityModules: DynamicModule[] ): ValueProvider { const mapController = entities.reduce((acum, entity, index) => { @@ -16,7 +16,7 @@ export function MapControllerEntity( } return acum; - }, new Map>()); + }, new Map, Type>()); return { provide: MAP_CONTROLLER_ENTITY, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/map-entity-name-to-entity.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/map-entity-name-to-entity.ts index 848eea94..302fcf9f 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/map-entity-name-to-entity.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/map-entity-name-to-entity.ts @@ -1,19 +1,21 @@ -import { EntityClassOrSchema } from '@nestjs/typeorm/dist/interfaces/entity-class-or-schema.type'; import { ValueProvider } from '@nestjs/common'; -import { camelToKebab } from '../../../utils/nestjs-shared'; +import { + getEntityName, + AnyEntity, + EntityClass, +} from '@klerick/json-api-nestjs-shared'; +import { kebabCase } from 'change-case-commonjs'; import { MapEntity } from '../types'; import { MAP_ENTITY } from '../constants'; -import { getEntityName } from '../../mixin/helper'; -import { AnyEntity, EntityTarget } from '../../../types'; export function MapEntityNameToEntity( - entities: EntityClassOrSchema[] + entities: EntityClass[] ): ValueProvider { return { provide: MAP_ENTITY, useValue: entities.reduce( - (acum, item) => acum.set(camelToKebab(getEntityName(item)), item), - new Map>() + (acum, item) => acum.set(kebabCase(getEntityName(item)), item), + new Map>() ), }; } diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/zod-input-operation.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/zod-input-operation.ts index 75ddeb40..77687d94 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/zod-input-operation.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/zod-input-operation.ts @@ -1,22 +1,22 @@ import { FactoryProvider } from '@nestjs/common'; +import { AnyEntity, EntityClass } from '@klerick/json-api-nestjs-shared'; import { MAP_CONTROLLER_ENTITY, ZOD_INPUT_OPERATION } from '../constants'; import { MapController } from '../types'; import { zodInputOperation, ZodInputOperation } from '../utils'; -import { ENTITY_MAP_PROPS } from '../../../constants'; -import { ZodEntityProps } from '../../mixin/types'; -import { EntityClass, ObjectLiteral } from '../../../types'; +import { ENTITY_PARAM_MAP } from '../../../constants'; +import { EntityParamMap } from '../../mixin/types'; -export function ZodInputOperation(): FactoryProvider< +export function ZodInputOperation(): FactoryProvider< ZodInputOperation > { return { provide: ZOD_INPUT_OPERATION, useFactory( mapController: MapController, - entityMapProps: Map, ZodEntityProps> + entityMapProps: EntityParamMap> ) { return zodInputOperation(mapController, entityMapProps); }, - inject: [MAP_CONTROLLER_ENTITY, ENTITY_MAP_PROPS], + inject: [MAP_CONTROLLER_ENTITY, ENTITY_PARAM_MAP], }; } diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/index.ts deleted file mode 100644 index 81ce0c2a..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './atomic-operation.module'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/pipes/input-operation.pipe.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/pipes/input-operation.pipe.spec.ts index 643405e1..d2b55af2 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/pipes/input-operation.pipe.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/pipes/input-operation.pipe.spec.ts @@ -1,4 +1,5 @@ import { Test, TestingModule } from '@nestjs/testing'; +import { KEY_MAIN_INPUT_SCHEMA } from '@klerick/json-api-nestjs-shared'; import { ZodError } from 'zod'; import { InternalServerErrorException, @@ -7,12 +8,12 @@ import { import { InputOperationPipe } from './input-operation.pipe'; -import { KEY_MAIN_INPUT_SCHEMA, ZOD_INPUT_OPERATION } from '../constants'; +import { ZOD_INPUT_OPERATION } from '../constants'; import { ZodInputOperation } from '../utils'; describe('PatchInputPipe', () => { let patchInputPipe: InputOperationPipe; - let zodInputOperation: ZodInputOperation; + let zodInputOperation: ZodInputOperation; beforeAll(async () => { const module: TestingModule = await Test.createTestingModule({ providers: [ @@ -27,7 +28,8 @@ describe('PatchInputPipe', () => { }).compile(); patchInputPipe = module.get(InputOperationPipe); - zodInputOperation = module.get(ZOD_INPUT_OPERATION); + zodInputOperation = + module.get>(ZOD_INPUT_OPERATION); }); afterEach(() => { diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/pipes/input-operation.pipe.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/pipes/input-operation.pipe.ts index a920101f..a63c294e 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/pipes/input-operation.pipe.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/pipes/input-operation.pipe.ts @@ -4,11 +4,12 @@ import { Inject, PipeTransform, } from '@nestjs/common'; +import { KEY_MAIN_INPUT_SCHEMA } from '@klerick/json-api-nestjs-shared'; import { errorMap } from 'zod-validation-error'; import { ZodError } from 'zod'; import { JSONValue } from '../../mixin/types'; import { InputArray, ZodInputOperation } from '../utils'; -import { KEY_MAIN_INPUT_SCHEMA, ZOD_INPUT_OPERATION } from '../constants'; +import { ZOD_INPUT_OPERATION } from '../constants'; export class InputOperationPipe implements PipeTransform diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/execute.service.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/execute.service.spec.ts index 45723122..361bd497 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/execute.service.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/execute.service.spec.ts @@ -1,13 +1,12 @@ import { Test, TestingModule } from '@nestjs/testing'; import { ModuleRef } from '@nestjs/core'; import { ROUTE_ARGS_METADATA } from '@nestjs/common/constants'; +import { KEY_MAIN_INPUT_SCHEMA } from '@klerick/json-api-nestjs-shared'; import { ExecuteService, isZodError } from './execute.service'; import { IterateFactory } from '../factory'; import { ASYNC_ITERATOR_FACTORY, - KEY_MAIN_INPUT_SCHEMA, MAP_CONTROLLER_INTERCEPTORS, - OPTIONS, } from '../constants'; import { @@ -40,10 +39,6 @@ describe('ExecuteService', () => { get() {}, }, }, - { - provide: OPTIONS, - useValue: {}, - }, { provide: ASYNC_ITERATOR_FACTORY, useValue: { diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/execute.service.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/execute.service.ts index a59606ed..b477b5ee 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/execute.service.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/execute.service.ts @@ -17,7 +17,8 @@ import { ObjectTyped, ResourceObject, ResourceObjectRelationships, -} from '../../../utils/nestjs-shared'; + KEY_MAIN_INPUT_SCHEMA, +} from '@klerick/json-api-nestjs-shared'; import { InterceptorsConsumer, InterceptorsContextCreator, @@ -29,12 +30,11 @@ import { AsyncLocalStorage } from 'async_hooks'; import { MapControllerInterceptor, ParamsForExecute } from '../types'; import { ASYNC_ITERATOR_FACTORY, - KEY_MAIN_INPUT_SCHEMA, MAP_CONTROLLER_INTERCEPTORS, } from '../constants'; import { IterateFactory } from '../factory'; -import { TypeFromType } from '../../mixin/types'; -import { RunInTransaction, ValidateQueryError } from '../../../types'; +import { TypeFromType, ValidateQueryError } from '../../../types'; +import { RunInTransaction } from '../../mixin/types'; import { RUN_IN_TRANSACTION_FUNCTION } from '../../../constants'; export function isZodError( @@ -48,9 +48,12 @@ export function isZodError( ); } +function assertIsArray(data: unknown): data is Array { + return Array.isArray(data); +} + @Injectable() export class ExecuteService { - // @Inject(CURRENT_DATA_SOURCE_TOKEN) private readonly dataSource!: DataSource; @Inject(ModuleRef) private readonly moduleRef!: ModuleRef & { container: NestContainer; applicationConfig: ApplicationConfig; @@ -97,7 +100,8 @@ export class ExecuteService { ); const resultArray: Array< - ResourceObject | ResourceObjectRelationships + | ResourceObject + | ResourceObjectRelationships > = []; let i = 0; const tmpIdsMap: Record = {}; @@ -134,9 +138,9 @@ export class ExecuteService { itemReplace, ], controller, - // @ts-ignore + // @ts-expect-error inccorect parse controller[methodName], - // @ts-ignore + // @ts-expect-error inccorect parse async () => controller[methodName](...itemReplace) ); @@ -226,9 +230,9 @@ export class ExecuteService { bodyInput.relationships = ObjectTyped.entries(relationships).reduce( (acum, [name, val]) => { - if (!val) throw new Error('Va; undefined'); - const { data } = val; - if (Array.isArray(data)) { + if (!val) throw new Error('Val undefined'); + const { data } = val as any; + if (assertIsArray(data)) { acum[name] = { data: data.map((i) => { if (i === null) return i; @@ -252,7 +256,7 @@ export class ExecuteService { } return acum; }, - { ...relationships } + { ...relationships } as any ); inputParams[inputParams.length - 1] = bodyInput; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/explorer.service.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/explorer.service.spec.ts index ec654d2d..51fe575d 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/explorer.service.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/explorer.service.spec.ts @@ -1,12 +1,12 @@ import { Test } from '@nestjs/testing'; import { ModulesContainer } from '@nestjs/core'; +import { Operation } from '@klerick/json-api-nestjs-shared'; import { MAP_ENTITY, MAP_CONTROLLER_ENTITY, - OPTIONS, MAP_CONTROLLER_INTERCEPTORS, } from '../constants'; -import { Operation } from '../utils'; + import { ExplorerService } from './explorer.service'; describe('ExplorerService', () => { @@ -40,10 +40,6 @@ describe('ExplorerService', () => { provide: MAP_CONTROLLER_INTERCEPTORS, useValue: new Map(), }, - { - provide: OPTIONS, - useValue: {}, - }, ], }).compile(); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/explorer.service.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/explorer.service.ts index 57bc72b4..be3e680a 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/explorer.service.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/explorer.service.ts @@ -1,12 +1,12 @@ import { Inject, Injectable, Type } from '@nestjs/common'; import { Module } from '@nestjs/core/injector/module'; import { ModulesContainer } from '@nestjs/core'; -import { EntityRelation } from '../../../utils/nestjs-shared'; +import { RelationKeys, Operation } from '@klerick/json-api-nestjs-shared'; import { MAP_CONTROLLER_ENTITY, MAP_ENTITY } from '../constants'; import { MapController, MapEntity, OperationMethode } from '../types'; -import { ObjectLiteral as Entity } from '../../../types'; -import { InputArray, Operation } from '../utils'; -import { JsonBaseController } from '../../mixin/controller/json-base.controller'; + +import { InputArray } from '../utils'; +import { JsonBaseController } from '../../mixin/controllers/json-base.controller'; import { PatchData, PatchRelationshipData, @@ -15,7 +15,7 @@ import { } from '../../mixin/zod'; @Injectable() -export class ExplorerService { +export class ExplorerService { @Inject(ModulesContainer) private readonly modulesContainer!: ModulesContainer; @@ -65,27 +65,27 @@ export class ExplorerService { const { op, ref, ...other } = data; switch (methodName) { case 'postOne': - return [other as PostData]; + return [other as PostData]; case 'patchOne': - return [ref.id as string, other as PatchData]; + return [ref.id as string, other as PatchData]; case 'deleteOne': return [ref.id as string]; case 'deleteRelationship': return [ ref.id as string, - ref.relationship as EntityRelation, + ref.relationship as RelationKeys, other as PostRelationshipData, ]; case 'patchRelationship': return [ ref.id as string, - ref.relationship as EntityRelation, + ref.relationship as RelationKeys, other as PatchRelationshipData, ]; case 'postRelationship': return [ ref.id as string, - ref.relationship as EntityRelation, + ref.relationship as RelationKeys, other as PostRelationshipData, ]; } diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/index.ts index aaf75a95..b80e6897 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/index.ts @@ -1,3 +1,3 @@ -export * from './explorer.service'; export * from './execute.service'; export * from './swagger.service'; +export * from './explorer.service'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/swagger.service.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/swagger.service.ts index cf263440..d69e3690 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/swagger.service.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/swagger.service.ts @@ -15,7 +15,7 @@ import { ZOD_INPUT_OPERATION } from '../constants'; export class SwaggerService implements OnModuleInit { @Inject(ModuleRef) private readonly moduleRef!: ModuleRef; @Inject(ZOD_INPUT_OPERATION) - private typeZodInputOperation!: ZodInputOperation; + private typeZodInputOperation!: ZodInputOperation; private initSwagger() { const operationControllerInst = this.moduleRef.get(OperationController); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/types/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/types/index.ts index 57fe5ae5..26ec14f3 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/types/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/types/index.ts @@ -1,29 +1,26 @@ import { NestInterceptor, Type } from '@nestjs/common'; import { Module } from '@nestjs/core/injector/module'; import { Controller } from '@nestjs/common/interfaces'; -import { EntityTarget, ObjectLiteral } from '../../../types'; -import { JsonBaseController } from '../../mixin/controller/json-base.controller'; +import { EntityClass } from '@klerick/json-api-nestjs-shared'; +import { JsonBaseController } from '../../mixin/controllers'; export type MapControllerInterceptor = Map< Controller, Map<(...arg: any) => any, NestInterceptor[]> >; -export type MapController = Map< - EntityTarget, +export type MapController = Map< + EntityClass, Type >; -export type MapEntity = Map< - string, - EntityTarget ->; +export type MapEntity = Map>; -export type OperationMethode = keyof Omit< +export type OperationMethode = keyof Omit< { [k in keyof JsonBaseController]: string }, 'getAll' | 'getOne' | 'getRelationship' >; export type ParamsForExecute< - E extends ObjectLiteral = ObjectLiteral, + E extends object = object, O extends OperationMethode = OperationMethode > = { methodName: O; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/utils/zod/zod-helper.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/utils/zod/zod-helper.spec.ts index 68a9977c..32660915 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/utils/zod/zod-helper.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/utils/zod/zod-helper.spec.ts @@ -1,7 +1,13 @@ import { Test, TestingModule } from '@nestjs/testing'; -import { z, ZodError } from 'zod'; import { + RelationKeys, + KEY_MAIN_INPUT_SCHEMA, Operation, + AnyEntity, + EntityClass, +} from '@klerick/json-api-nestjs-shared'; +import { z, ZodError } from 'zod'; +import { ZodAdd, zodAdd, zodInputOperation, @@ -13,17 +19,14 @@ import { zodUpdate, ZodUpdate, } from './zod-helper'; -import { Users } from '../../../../mock-utils/typeorm'; -import { ENTITY_MAP_PROPS, FIELD_FOR_ENTITY } from '../../../../constants'; -import { JsonBaseController } from '../../../mixin/controller/json-base.controller'; + import { MapController } from '../../types'; -import { KEY_MAIN_INPUT_SCHEMA } from '../../constants'; -import { - GetFieldForEntity, - TupleOfEntityRelation, - ZodEntityProps, -} from '../../../mixin/types'; -import { EntityClass } from '../../../../types'; +import { JsonBaseController } from '../../../mixin/controllers'; +import { mapMock } from '../../../../utils/___test___/test.helper'; +import { Users } from '../../../../utils/___test___/test-classes.helper'; +import { ENTITY_PARAM_MAP } from '../../../../constants'; +import { EntityParamMap } from '../../../mixin/types'; +import { UnionToTuple } from '../../../../types'; describe('ZodHelperSpec', () => { afterEach(() => { @@ -321,10 +324,9 @@ describe('ZodHelperSpec', () => { describe('zodOperationRel', () => { it('should be correct', () => { const user = 'user'; - const rel = [ - 'address', - 'notes', - ] as unknown as TupleOfEntityRelation; + const rel = ['address', 'notes'] as unknown as UnionToTuple< + RelationKeys + >; const schema = zodOperationRel( user, rel, @@ -353,10 +355,9 @@ describe('ZodHelperSpec', () => { }); it('should be not correct', () => { const user = 'user'; - const rel = [ - 'address', - 'notes', - ] as unknown as TupleOfEntityRelation; + const rel = ['address', 'notes'] as unknown as UnionToTuple< + RelationKeys + >; const schema = zodOperationRel( user, rel, @@ -449,41 +450,25 @@ describe('ZodHelperSpec', () => { }); }); describe('zodInputOperation', () => { - let getField: Map, ZodEntityProps>; + let entityParamMap: EntityParamMap>; beforeAll(async () => { const module: TestingModule = await Test.createTestingModule({ providers: [ { - provide: ENTITY_MAP_PROPS, - useValue: new Map([ - [ - Users, - { - relations: [ - 'userGroup', - 'notes', - 'comments', - 'roles', - 'manager', - 'addresses', - ], - }, - ], - ]), + provide: ENTITY_PARAM_MAP, + useValue: mapMock, }, ], }).compile(); - getField = - module.get, ZodEntityProps>>( - ENTITY_MAP_PROPS - ); + entityParamMap = + module.get>>(ENTITY_PARAM_MAP); }); it('should be correct', () => { const mapController: MapController = new Map([ [Users as any, JsonBaseController], ]); - const schema = zodInputOperation(mapController, getField); + const schema = zodInputOperation(mapController, entityParamMap); const check: z.infer> = { [KEY_MAIN_INPUT_SCHEMA]: [ { @@ -526,7 +511,7 @@ describe('ZodHelperSpec', () => { const mapController: MapController = new Map([ [Users as any, JsonBaseController], ]); - const schema = zodInputOperation(mapController, getField); + const schema = zodInputOperation(mapController, entityParamMap); const check = {}; const check1 = { ssdf: 'sdfsdf', @@ -563,7 +548,7 @@ describe('ZodHelperSpec', () => { const mapController: MapController = new Map([ [Users as any, Test], ]); - const schema = zodInputOperation(mapController, getField); + const schema = zodInputOperation(mapController, entityParamMap); const check: z.infer> = { [KEY_MAIN_INPUT_SCHEMA]: [ { diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/utils/zod/zod-helper.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/utils/zod/zod-helper.ts index a1b83422..a44e05ed 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/utils/zod/zod-helper.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/utils/zod/zod-helper.ts @@ -1,3 +1,11 @@ +import { + getEntityName, + RelationKeys, + KEY_MAIN_INPUT_SCHEMA, + Operation, + AnyEntity, + EntityClass, +} from '@klerick/json-api-nestjs-shared'; import { z, ZodArray, @@ -9,23 +17,12 @@ import { ZodType, ZodUnion, } from 'zod'; -import { camelToKebab } from '../../../../utils/nestjs-shared'; +import { kebabCase } from 'change-case-commonjs'; -import { KEY_MAIN_INPUT_SCHEMA } from '../../constants'; import { MapController } from '../../types'; -import { - GetFieldForEntity, - TupleOfEntityRelation, - ZodEntityProps, -} from '../../../mixin/types'; -import { getEntityName } from '../../../mixin/helper'; -import { EntityClass, ObjectLiteral } from '../../../../types'; - -export enum Operation { - add = 'add', - update = 'update', - remove = 'remove', -} + +import { UnionToTuple } from '../../../../types'; +import { EntityParamMap } from '../../../mixin/types'; const literalSchema = z.union([z.string(), z.number(), z.boolean(), z.null()]); type Literal = z.infer; @@ -81,17 +78,16 @@ export const zodRemove = (type: T) => }) .strict(); -export type ZodOperationRel< - E extends ObjectLiteral, - O extends Operation -> = ReturnType>; +export type ZodOperationRel = ReturnType< + typeof zodOperationRel +>; -export const zodOperationRel = ( +export const zodOperationRel = ( type: string, - rel: TupleOfEntityRelation, + rel: UnionToTuple>, typeOperation: O ) => { - const literalArray = rel.map((i) => z.literal(i)) as [ + const literalArray = rel.map((i) => z.literal(i as string)) as [ ZodLiteral, ZodLiteral, ...ZodLiteral[] @@ -125,17 +121,16 @@ export type ZodInputArray = ZodArray< 'atleastone' >; -export type ZodInputOperation = - ReturnType>; -export type InputOperation = z.infer< - ZodInputOperation +export type ZodInputOperation = ReturnType< + typeof zodInputOperation >; +export type InputOperation = z.infer>; export type InputArray = z.infer; -export function zodInputOperation( +export function zodInputOperation( mapController: MapController, - entityMapProps: Map, ZodEntityProps> + entityMapProps: EntityParamMap> ) { const array = [] as unknown as [ ZodAdd, @@ -146,7 +141,7 @@ export function zodInputOperation( ZodOperationRel ]; for (const [entity, controller] of mapController.entries()) { - const typeName = camelToKebab(getEntityName(entity)); + const typeName = kebabCase(getEntityName(entity)); const entityMap = entityMapProps.get(entity as any); if (!entityMap) throw new Error('Entity not found in map'); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/index.ts index 06b783b6..8bd85b09 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/index.ts @@ -1,3 +1,2 @@ -export * from './type-orm'; -export * from './micro-orm'; -export * from './atomic-operation'; +export * from './mixin/mixin.module'; +export * from './atomic-operation/atomic-operation.module'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/constants/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/constants/index.ts deleted file mode 100644 index 116b14aa..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/constants/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const ENTITY_METADATA_TOKEN = Symbol('ENTITY_METADATA_TOKEN'); -export const DEFAULT_ARRAY_TYPE = ['ArrayType', 'EnumArrayType']; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-helper/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-helper/index.ts deleted file mode 100644 index 1ad4cffc..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-helper/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { EntityKey, EntityMetadata } from '@mikro-orm/core'; -import { ObjectLiteral, ResultMicroOrmModuleOptions } from '../../../types'; -import { - FieldWithType, - FilterNullableProps, - RelationProperty, - TupleOfEntityProps, - TupleOfEntityRelation, - TypeField, - TypeForId, -} from '../../mixin/types'; - -export const getRelation = ( - entityMetadata: EntityMetadata -) => entityMetadata.relations.map((i) => i.name) as TupleOfEntityRelation; - -export const getProps = ( - entityMetadata: EntityMetadata -): TupleOfEntityProps => { - const relations = getRelation(entityMetadata); - - return entityMetadata.props - .map((i) => i.name) - .filter((i) => !relations.includes(i)) as TupleOfEntityProps; -}; - -export const getPropsType = ( - entityMetadata: EntityMetadata, - config: ResultMicroOrmModuleOptions['options']['arrayType'] -): FieldWithType => { - const field = getProps(entityMetadata); - - const result = {} as any; - for (const item of field) { - const props = - entityMetadata.properties[item as unknown as EntityKey]; - - let typeProps: TypeField = TypeField.string; - if (config.includes(props['type'])) { - result[item] = TypeField.array; - continue; - } - - switch (props.runtimeType) { - case 'Date': - typeProps = TypeField.date; - break; - case 'number': - typeProps = TypeField.number; - break; - case 'boolean': - typeProps = TypeField.boolean; - break; - case 'object': - typeProps = TypeField.object; - break; - default: - typeProps = TypeField.string; - } - result[item] = typeProps; - } - - return result; -}; - -export const getPropsNullable = ( - entityMetadata: EntityMetadata -): FilterNullableProps> => { - return getProps(entityMetadata) - .map((i) => { - // @ts-ignore - const props = entityMetadata.properties[i]; - return props.nullable || props.default !== undefined ? i : false; - }) - .filter((i) => !!i) as FilterNullableProps>; -}; - -export const getPrimaryColumnName = ( - entityMetadata: EntityMetadata -) => entityMetadata.getPrimaryProp().name.toString(); - -export const getPrimaryColumnType = ( - entityMetadata: EntityMetadata -): TypeForId => { - return entityMetadata.getPrimaryProp().runtimeType === 'number' - ? TypeField.number - : TypeField.string; -}; - -export const getRelationProperty = ( - entityMetadata: EntityMetadata -): RelationProperty => { - return entityMetadata.relations.reduce((acum, item) => { - // @ts-expect-error its dynamic creater - acum[item.name] = { - entityClass: item.entity() as any, - nullable: - item.kind === 'm:n' || item.kind === '1:m' - ? false - : (!!item.nullable as any), - isArray: item.kind === 'm:n' || item.kind === ('1:m' as any), - }; - - return acum; - }, {} as RelationProperty); -}; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/config/bindings.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/config/bindings.spec.ts deleted file mode 100644 index 4c256991..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/config/bindings.spec.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Bindings, excludeMethod } from './bindings'; - -describe('bindings', () => { - it('excludeMethod', () => { - expect(excludeMethod(['patchRelationship'])).toEqual( - Object.keys(Bindings).filter((i) => i !== 'patchRelationship') - ); - }); -}); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/config/bindings.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/config/bindings.ts index 346a17df..bfe6c55d 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/config/bindings.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/config/bindings.ts @@ -1,8 +1,7 @@ import { Body, Param, Query, RequestMethod } from '@nestjs/common'; -import { ObjectTyped } from '../../../utils/nestjs-shared'; -import { BindingsConfig, MethodName } from '../types'; -import { JsonBaseController } from '../controller/json-base.controller'; +import { BindingsConfig } from '../types'; +import { JsonBaseController } from '../controllers/json-base.controller'; import { PARAMS_RELATION_NAME, PARAMS_RESOURCE_ID } from '../../../constants'; import { @@ -188,15 +187,3 @@ const Bindings: BindingsConfig = { }; export { Bindings }; - -export function excludeMethod( - names: Array> -): Array { - const tmpObject = names.reduce( - (acum, key) => ((acum[key] = true), acum), - {} as Record, boolean> - ); - return ObjectTyped.keys(Bindings).filter( - (method) => !tmpObject[method] - ) as Array; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/controllers/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/controllers/index.ts new file mode 100644 index 00000000..fa836432 --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/controllers/index.ts @@ -0,0 +1 @@ +export * from './json-base.controller'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/controller/json-base.controller.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/controllers/json-base.controller.ts similarity index 50% rename from libs/json-api/json-api-nestjs/src/lib/modules/mixin/controller/json-base.controller.ts rename to libs/json-api/json-api-nestjs/src/lib/modules/mixin/controllers/json-base.controller.ts index 146d54eb..f4b33ad5 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/controller/json-base.controller.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/controllers/json-base.controller.ts @@ -1,12 +1,9 @@ import { - EntityRelation, ResourceObject, ResourceObjectRelationships, -} from '../../../utils/nestjs-shared'; + RelationKeys, +} from '@klerick/json-api-nestjs-shared'; -import { ORM_SERVICE_PROPS } from '../../../constants'; -import { MethodName } from '../types'; -import { ObjectLiteral } from '../../../types'; import { PatchData, PatchRelationshipData, @@ -15,21 +12,29 @@ import { Query, QueryOne, } from '../zod'; -import { OrmService } from '../types'; -type RequestMethodeObject = { - [K in MethodName]: OrmService[K]; +import { OrmService, MethodName } from '../types'; + +import { ORM_SERVICE_PROPS } from '../../../constants'; + +type RequestMethodeObject = { + [K in MethodName]: OrmService[K]; }; -export class JsonBaseController - implements RequestMethodeObject +export class JsonBaseController + implements RequestMethodeObject { - private [ORM_SERVICE_PROPS]!: OrmService; + private [ORM_SERVICE_PROPS]!: OrmService; - getOne(id: string | number, query: QueryOne): Promise> { + getOne( + id: string | number, + query: QueryOne + ): Promise> { return this[ORM_SERVICE_PROPS].getOne(id, query); } - getAll(query: Query): Promise> { + getAll( + query: Query + ): Promise> { return this[ORM_SERVICE_PROPS].getAll(query); } deleteOne(id: string | number): Promise { @@ -38,30 +43,32 @@ export class JsonBaseController patchOne( id: string | number, - inputData: PatchData - ): Promise> { + inputData: PatchData + ): Promise> { return this[ORM_SERVICE_PROPS].patchOne(id, inputData); } - postOne(inputData: PostData): Promise> { + postOne( + inputData: PostData + ): Promise> { return this[ORM_SERVICE_PROPS].postOne(inputData); } - getRelationship>( + getRelationship>( id: string | number, relName: Rel - ): Promise> { + ): Promise> { return this[ORM_SERVICE_PROPS].getRelationship(id, relName); } - postRelationship>( + postRelationship>( id: string | number, relName: Rel, input: PostRelationshipData - ): Promise> { + ): Promise> { return this[ORM_SERVICE_PROPS].postRelationship(id, relName, input); } - deleteRelationship>( + deleteRelationship>( id: string | number, relName: Rel, input: PostRelationshipData @@ -69,11 +76,11 @@ export class JsonBaseController return this[ORM_SERVICE_PROPS].deleteRelationship(id, relName, input); } - patchRelationship>( + patchRelationship>( id: string | number, relName: Rel, input: PatchRelationshipData - ): Promise> { + ): Promise> { return this[ORM_SERVICE_PROPS].patchRelationship(id, relName, input); } } diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/decorators/json-api/json-api.decorator.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/decorators/json-api/json-api.decorator.spec.ts index fd246eb9..fd4f39a4 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/decorators/json-api/json-api.decorator.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/decorators/json-api/json-api.decorator.spec.ts @@ -6,27 +6,28 @@ import { } from '../../../../constants'; import { JsonApi } from './json-api.decorator'; -import { excludeMethod, Bindings } from '../../config/bindings'; +import { Bindings } from '../../config/bindings'; import { DecoratorOptions } from '../../types'; +import { excludeMethod } from '../../helpers'; describe('InjectServiceDecorator', () => { it('should save entity in class', () => { - const testedEntity = class SomeEntity {}; + class SomeEntity {} - @JsonApi(testedEntity) + @JsonApi(SomeEntity) class SomeClass {} const data = Reflect.getMetadata(JSON_API_DECORATOR_ENTITY, SomeClass); - expect(data).toBe(testedEntity); + expect(data).toBe(SomeEntity); }); it('should save options in class', () => { - const testedEntity = class SomeEntity {}; + class SomeEntity {} const apiOptions: DecoratorOptions = { allowMethod: ['getAll', 'deleteRelationship'], }; - @JsonApi(testedEntity, apiOptions) + @JsonApi(SomeEntity, apiOptions) class SomeClass {} const data = Reflect.getMetadata(JSON_API_DECORATOR_OPTIONS, SomeClass); @@ -34,13 +35,13 @@ describe('InjectServiceDecorator', () => { }); it('should save options in class using helpFunction', () => { - const testedEntity = class SomeEntity {}; + class SomeEntity {} const example = ['getAll', 'deleteRelationship']; const apiOptions: DecoratorOptions = { allowMethod: excludeMethod(example as any), }; - @JsonApi(testedEntity, apiOptions) + @JsonApi(SomeEntity, apiOptions) class SomeClass {} const data: DecoratorOptions = Reflect.getMetadata( @@ -54,13 +55,13 @@ describe('InjectServiceDecorator', () => { }); it('should save options in class and correctly set overrideRoute', () => { - const testedEntity = class SomeEntity {}; + class SomeEntity {} const apiOptions: DecoratorOptions = { allowMethod: ['getAll', 'deleteRelationship'], overrideRoute: '123', }; - @JsonApi(testedEntity, apiOptions) + @JsonApi(SomeEntity, apiOptions) class SomeClass {} const data = Reflect.getMetadata(JSON_API_DECORATOR_OPTIONS, SomeClass); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/decorators/json-api/json-api.decorator.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/decorators/json-api/json-api.decorator.ts index c73f8594..fdd77b93 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/decorators/json-api/json-api.decorator.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/decorators/json-api/json-api.decorator.ts @@ -1,12 +1,12 @@ +import { AnyEntity, EntityClass } from '@klerick/json-api-nestjs-shared'; import { JSON_API_DECORATOR_ENTITY, JSON_API_DECORATOR_OPTIONS, } from '../../../../constants'; -import { EntityClass, ObjectLiteral } from '../../../../types'; import { DecoratorOptions } from '../../types'; -export function JsonApi( - entity: EntityClass, +export function JsonApi( + entity: EntityClass, options?: DecoratorOptions ): ClassDecorator { return (target): typeof target => { diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/factory/zod-validate.factory.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/factory/zod-validate.factory.ts index 942c24c6..53f5dc46 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/factory/zod-validate.factory.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/factory/zod-validate.factory.ts @@ -1,15 +1,3 @@ -import { FactoryProvider, ValueProvider } from '@nestjs/common'; - -import { - ZOD_INPUT_QUERY_SCHEMA, - ZOD_QUERY_SCHEMA, - ZOD_POST_SCHEMA, - ZOD_PATCH_SCHEMA, - ZOD_POST_RELATIONSHIP_SCHEMA, - ZOD_PATCH_RELATIONSHIP_SCHEMA, - ENTITY_MAP_PROPS, -} from '../../../constants'; - import { zodInputQuery, ZodInputQuery, @@ -24,253 +12,68 @@ import { zodPatchRelationship, ZodPatchRelationship, } from '../zod'; -import { EntityClass, ObjectLiteral } from '../../../types'; -import { - AllFieldWithType, - ArrayPropsForEntity, - EntityProps, - FieldWithType, - PropsForField, - RelationPrimaryColumnType, - RelationPropsArray, - RelationPropsTypeName, - RelationTree, - ResultGetField, - ZodEntityProps, -} from '../types'; -import { ObjectTyped } from '../../../utils/nestjs-shared'; -function getEntityMap( - entityMapProps: Map, ZodEntityProps>, - entity: Function & { prototype: E } -) { - const entityMap = entityMapProps.get(entity); - if (!entityMap) throw new Error('Entity not found in map'); - return entityMap; -} - -export function getParamsForOatchANdPostZod( - entityMapProps: Map, ZodEntityProps>, - entity: Function & { prototype: E } -) { - const entityMap = getEntityMap(entityMapProps, entity); - - const { - primaryColumnType, - typeName, - propsType, - primaryColumnName, - propsNullable, - relationProperty, - } = entityMap; - const fieldWithType = {} as FieldWithType; - const propsDb = {} as PropsForField; - const relationArrayProps = {} as RelationPropsArray; - const relationPopsName = {} as RelationPropsTypeName; - const primaryColumnTypeForRel = {} as RelationPrimaryColumnType; - - for (const [name, type] of ObjectTyped.entries(propsType)) { - Reflect.set(propsDb, name, { - type: type, - isArray: type === 'array', - isNullable: (propsNullable as any[]).includes(name), - }); - if (name === primaryColumnName) continue; - Reflect.set(fieldWithType, name, type); - } - - for (const [name, value] of ObjectTyped.entries(relationProperty)) { - const relEntityMap = getEntityMap(entityMapProps, value.entityClass); - - Reflect.set(relationArrayProps, name, value.isArray); - Reflect.set(relationPopsName, name, relEntityMap.className); - Reflect.set(primaryColumnTypeForRel, name, relEntityMap.primaryColumnType); - } +import { + ZOD_INPUT_QUERY_SCHEMA, + ZOD_QUERY_SCHEMA, + ZOD_POST_SCHEMA, + ZOD_PATCH_SCHEMA, + ZOD_POST_RELATIONSHIP_SCHEMA, + ZOD_PATCH_RELATIONSHIP_SCHEMA, +} from '../../../constants'; - return { - primaryColumnType, - typeName: typeName as any, - fieldWithType, - propsDb: propsDb as PropsForField, - primaryColumnName: primaryColumnName as EntityProps, - relationArrayProps, - relationPopsName, - primaryColumnTypeForRel, - }; -} +import { EntityParamMapService } from '../service'; +import { FactoryProvider, ValueProvider } from '@nestjs/common'; -export function ZodInputQuerySchema( - entity: EntityClass -): FactoryProvider> { +export function ZodInputQuerySchema< + E extends object, + IdKey extends string = 'id' +>(): FactoryProvider> { return { provide: ZOD_INPUT_QUERY_SCHEMA, - inject: [ - { - token: ENTITY_MAP_PROPS, - optional: false, - }, - ], - useFactory: (entityMapProps: Map, ZodEntityProps>) => { - const entityMap = getEntityMap(entityMapProps, entity); - - const { props, relations, relationProperty } = entityMap; - - const entityRelationStructure = ObjectTyped.entries( - relationProperty - ).reduce((acum, [name, value]) => { - const relMap = getEntityMap(entityMapProps, value.entityClass); - Reflect.set(acum, name, relMap.props); - return acum; - }, {} as RelationTree); - - return zodInputQuery( - { - field: props, - relations: relations, - } as ResultGetField, - entityRelationStructure - ); + inject: [EntityParamMapService], + useFactory: (entityParamMapService: EntityParamMapService) => { + return zodInputQuery(entityParamMapService); }, }; } - -export function ZodQuerySchema( - entity: EntityClass -): FactoryProvider> { +export function ZodQuerySchema< + E extends object, + IdKey extends string = 'id' +>(): FactoryProvider> { return { provide: ZOD_QUERY_SCHEMA, - inject: [ - { - token: ENTITY_MAP_PROPS, - optional: false, - }, - ], - useFactory: (entityMapProps: Map, ZodEntityProps>) => { - const entityMap = getEntityMap(entityMapProps, entity); - - const { - props, - relations, - relationProperty, - propsType: propsTypeEntity, - } = entityMap; - - const propsType = { ...propsTypeEntity } as AllFieldWithType; - - const propsArray = { target: {} } as ArrayPropsForEntity; - - for (const [name, type] of ObjectTyped.entries(propsTypeEntity)) { - if (type !== 'array') continue; - Reflect.set(propsArray.target, name, true); - } - - const entityRelationStructure = {} as RelationTree; - for (const [name, value] of ObjectTyped.entries(relationProperty)) { - const relMap = getEntityMap(entityMapProps, value.entityClass); - - if (!(name in propsArray)) { - Reflect.set(propsArray, name, {}); - } - for (const [relNameField, type] of ObjectTyped.entries( - relMap.propsType - )) { - if (type !== 'array') continue; - const propsArrayObject = Reflect.get(propsArray, name); - Reflect.set(propsArrayObject, relNameField, true); - } - - Reflect.set(propsType, name, relMap.propsType); - Reflect.set(entityRelationStructure, name, relMap.props); - } - const entityFieldsStructure = { - field: props, - relations: relations, - } as ResultGetField; - - return zodQuery( - entityFieldsStructure, - entityRelationStructure, - propsArray, - propsType - ); + inject: [EntityParamMapService], + useFactory: (entityParamMapService: EntityParamMapService) => { + return zodQuery(entityParamMapService); }, }; } - -export function ZodPostSchema( - entity: EntityClass -): FactoryProvider> { +export function ZodPostSchema< + E extends object, + IdKey extends string = 'id' +>(): FactoryProvider> { return { provide: ZOD_POST_SCHEMA, - inject: [ - { - token: ENTITY_MAP_PROPS, - optional: false, - }, - ], - useFactory: (entityMapProps: Map, ZodEntityProps>) => { - const { - primaryColumnType, - typeName, - fieldWithType, - propsDb, - primaryColumnName, - relationArrayProps, - relationPopsName, - primaryColumnTypeForRel, - } = getParamsForOatchANdPostZod(entityMapProps, entity); - - return zodPost( - primaryColumnType, - typeName, - fieldWithType, - propsDb, - primaryColumnName, - relationArrayProps, - relationPopsName, - primaryColumnTypeForRel - ); + inject: [EntityParamMapService], + useFactory: (entityParamMapService: EntityParamMapService) => { + return zodPost(entityParamMapService); }, }; } -export function ZodPatchSchema( - entity: EntityClass -): FactoryProvider> { +export function ZodPatchSchema< + E extends object, + IdKey extends string = 'id' +>(): FactoryProvider> { return { provide: ZOD_PATCH_SCHEMA, - inject: [ - { - token: ENTITY_MAP_PROPS, - optional: false, - }, - ], - useFactory: (entityMapProps: Map, ZodEntityProps>) => { - const { - primaryColumnType, - typeName, - fieldWithType, - propsDb, - primaryColumnName, - relationArrayProps, - relationPopsName, - primaryColumnTypeForRel, - } = getParamsForOatchANdPostZod(entityMapProps, entity); - - return zodPatch( - primaryColumnType, - typeName as I, - fieldWithType, - propsDb, - primaryColumnName as EntityProps, - relationArrayProps, - relationPopsName, - primaryColumnTypeForRel - ); + inject: [EntityParamMapService], + useFactory: (entityParamMapService: EntityParamMapService) => { + return zodPatch(entityParamMapService); }, }; } - export const ZodInputPostRelationshipSchema: ValueProvider = { provide: ZOD_POST_RELATIONSHIP_SCHEMA, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/utils.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/utils.ts deleted file mode 100644 index 88ebd7cc..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/utils.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { EntityTarget, ObjectLiteral } from '../../../types'; - -import { upperFirstLetter } from '../../../utils/nestjs-shared'; - -export const nameIt = ( - name: string, - cls: new (...rest: unknown[]) => Record -) => - ({ - [name]: class extends cls { - constructor(...arg: unknown[]) { - super(...arg); - } - }, - }[name]); - -export const getEntityName = ( - entity: EntityTarget -): string => { - if (typeof entity === 'string') { - return entity; - } - - if ('name' in entity) { - return entity['name']; - } - - if ('constructor' in entity && 'name' in entity.constructor) { - return entity['constructor']['name']; - } - - return `${entity}`; -}; - -export function getProviderName( - entity: EntityTarget, - name: string -) { - const entityName = getEntityName(entity); - return `${upperFirstLetter(entityName)}${name}`; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/bind-controller.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/bind-controller.spec.ts similarity index 91% rename from libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/bind-controller.spec.ts rename to libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/bind-controller.spec.ts index bf60890e..94ed83c4 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/bind-controller.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/bind-controller.spec.ts @@ -3,12 +3,11 @@ import { PATH_METADATA, ROUTE_ARGS_METADATA, } from '@nestjs/common/constants'; -import { ObjectTyped } from '../../../utils/nestjs-shared'; +import { ObjectTyped } from '@klerick/json-api-nestjs-shared'; import { RouteParamtypes } from '@nestjs/common/enums/route-paramtypes.enum'; import { bindController } from './bind-controller'; -import { Users } from '../../../mock-utils/typeorm'; -import { DEFAULT_CONNECTION_NAME } from '../../../constants'; + import { ParseIntPipe, Query, @@ -20,8 +19,8 @@ import { import { OrmService } from '../types'; import { PatchData } from '../zod'; import { JsonApi } from '../decorators'; -import { JsonBaseController } from '../controller/json-base.controller'; -import { excludeMethod } from '../config/bindings'; +import { JsonBaseController } from '../controllers/json-base.controller'; +import { excludeMethod } from './utils'; import { Bindings } from '../config/bindings'; @@ -30,6 +29,8 @@ mapParams.set(Query, RouteParamtypes.QUERY); mapParams.set(Body, RouteParamtypes.BODY); mapParams.set(Param, RouteParamtypes.PARAM); +class Users {} + describe('bindController', () => { it('Should be all methode', () => { class Controller {} @@ -123,10 +124,10 @@ describe('bindController', () => { return undefined; } } - class Controller extends JsonBaseController { + class Controller extends JsonBaseController { override patchOne( @Param('id', SomePipes) id: string | number, - @Body(SomePipes) inputData: PatchData + @Body(SomePipes) inputData: PatchData ): ReturnType['patchOne']> { return super.patchOne(id, inputData); } diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/bind-controller.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/bind-controller.ts similarity index 93% rename from libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/bind-controller.ts rename to libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/bind-controller.ts index de5c6d66..282dabf9 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/bind-controller.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/bind-controller.ts @@ -13,14 +13,18 @@ import { ROUTE_ARGS_METADATA } from '@nestjs/common/constants'; import { RouteParamtypes } from '@nestjs/common/enums/route-paramtypes.enum'; import { Bindings } from '../config/bindings'; -import { DecoratorOptions, MixinOptions, MethodName } from '../types'; -import { NestController, ExtractNestType } from '../../../types'; +import { DecoratorOptions, EntityControllerParam, MethodName } from '../types'; +import { + ModuleMixinOptions, + NestController, + ExtractNestType, +} from '../../../types'; import { JSON_API_DECORATOR_OPTIONS } from '../../../constants'; export function bindController( controller: ExtractNestType, - entity: MixinOptions['entity'], - config: MixinOptions['config'] + entity: ModuleMixinOptions['entity'], + config: EntityControllerParam ): void { for (const methodName in Bindings) { const { name, path, parameters, method, implementation } = diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/create-controller.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/create-controller.spec.ts similarity index 96% rename from libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/create-controller.spec.ts rename to libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/create-controller.spec.ts index 9060696b..1940b9ac 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/create-controller.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/create-controller.spec.ts @@ -5,8 +5,7 @@ import { PROPERTY_DEPS_METADATA, } from '@nestjs/common/constants'; import { createController } from './create-controller'; -import { Users } from '../../../mock-utils/typeorm'; -import { JsonBaseController } from '../controller/json-base.controller'; +import { JsonBaseController } from '../controllers/json-base.controller'; import { JSON_API_CONTROLLER_POSTFIX, ORM_SERVICE, @@ -15,6 +14,8 @@ import { import { InjectService, JsonApi } from '../decorators'; import { ErrorInterceptors, LogTimeInterceptors } from '../interceptors'; +class Users {} + describe('createController', () => { it('Should be error', () => { class TestController {} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/create-controller.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/create-controller.ts similarity index 68% rename from libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/create-controller.ts rename to libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/create-controller.ts index 7a10058a..ed7558f2 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/create-controller.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/create-controller.ts @@ -1,23 +1,22 @@ -import { Controller, Inject, Type, UseInterceptors } from '@nestjs/common'; - -import { camelToKebab } from '../../../utils/nestjs-shared'; - +import { Controller, Inject, UseInterceptors } from '@nestjs/common'; +import { kebabCase } from 'change-case-commonjs'; +import { ModuleMixinOptions, NestController } from '../../../types'; +import { DecoratorOptions } from '../types'; import { getProviderName, nameIt } from './utils'; +import { JsonBaseController } from '../controllers'; import { - JSON_API_CONTROLLER_POSTFIX, JSON_API_DECORATOR_OPTIONS, - ORM_SERVICE, ORM_SERVICE_PROPS, + ORM_SERVICE, + JSON_API_CONTROLLER_POSTFIX, } from '../../../constants'; -import { JsonBaseController } from '../controller/json-base.controller'; import { ErrorInterceptors, LogTimeInterceptors } from '../interceptors'; - -import { DecoratorOptions, MixinOptions } from '../types'; +import { getEntityName } from '@klerick/json-api-nestjs-shared'; export function createController( - entity: MixinOptions['entity'], - controller?: MixinOptions['controller'] -): Type { + entity: ModuleMixinOptions['entity'], + controller?: ModuleMixinOptions['controller'] +): NestController[number] { const controllerClass = controller || nameIt( @@ -25,7 +24,7 @@ export function createController( JsonBaseController ); - const entityName = entity.name; + const entityName = getEntityName(entity); if ( !Object.prototype.isPrototypeOf.call(JsonBaseController, controllerClass) @@ -43,7 +42,8 @@ export function createController( const controllerPath = decoratorOptions && decoratorOptions['overrideRoute'] ? decoratorOptions['overrideRoute'].toString() - : `${camelToKebab(entityName)}`; + : `${kebabCase(entityName)}`; + Controller(controllerPath)(controllerClass); Inject(ORM_SERVICE)(controllerClass.prototype, ORM_SERVICE_PROPS); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/index.ts similarity index 63% rename from libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/index.ts rename to libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/index.ts index 7f0e8bc2..08395854 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/index.ts @@ -1,3 +1,2 @@ export * from './utils'; export * from './create-controller'; -export * from './bind-controller'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/utils.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/utils.spec.ts new file mode 100644 index 00000000..d7a5e1eb --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/utils.spec.ts @@ -0,0 +1,26 @@ +import { getEntityName } from '@klerick/json-api-nestjs-shared'; + +import { nameIt, excludeMethod, getProviderName } from './utils'; +import { Bindings } from '../config/bindings'; +import { JSON_API_CONTROLLER_POSTFIX } from '../../../constants'; + +describe('Test utils', () => { + it('nameIt', () => { + const newNameClass = 'newNameClass'; + const newClass = nameIt(newNameClass, class {}); + expect(getEntityName(newClass)).toBe(newNameClass); + }); + + it('excludeMethod', () => { + expect(excludeMethod(['patchRelationship'])).toEqual( + Object.keys(Bindings).filter((i) => i !== 'patchRelationship') + ); + }); + + it('getProviderName', () => { + class BookList {} + expect(getProviderName(BookList, JSON_API_CONTROLLER_POSTFIX)).toEqual( + 'BookList' + JSON_API_CONTROLLER_POSTFIX + ); + }); +}); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/utils.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/utils.ts new file mode 100644 index 00000000..ef93a2b8 --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/utils.ts @@ -0,0 +1,49 @@ +import { + getEntityName, + ObjectTyped, + EntityClass, + AnyEntity, +} from '@klerick/json-api-nestjs-shared'; +import { pascalCase } from 'change-case-commonjs'; + +import { MethodName } from '../types'; + +import { Bindings } from '../config/bindings'; +import { Type } from '@nestjs/common/interfaces'; +import { JSON_API_DECORATOR_ENTITY } from '../../../constants'; + +export const nameIt = ( + name: string, + cls: new (...rest: unknown[]) => Record +) => + ({ + [name]: class extends cls { + constructor(...arg: unknown[]) { + super(...arg); + } + }, + }[name]); + +export function getProviderName( + entity: EntityClass, + name: string +) { + const entityName = getEntityName(entity); + return `${pascalCase(entityName)}${name}`; +} + +export function excludeMethod( + names: Array> +): Array { + const tmpObject = names.reduce( + (acum, key) => ((acum[key] = true), acum), + {} as Record, boolean> + ); + return ObjectTyped.keys(Bindings).filter( + (method) => !tmpObject[method] + ) as Array; +} + +export function entityForClass(type: Type): EntityClass { + return Reflect.getMetadata(JSON_API_DECORATOR_ENTITY, type); +} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/interceptors/error.interceptors.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/interceptors/error.interceptors.ts index 9d5d086e..e7803276 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/interceptors/error.interceptors.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/interceptors/error.interceptors.ts @@ -1,120 +1,36 @@ import { - InternalServerErrorException, CallHandler, ExecutionContext, Inject, Injectable, NestInterceptor, } from '@nestjs/common'; +import { ResourceObject } from '@klerick/json-api-nestjs-shared'; +import { ErrorFormatService } from '../service'; import { catchError, Observable, throwError } from 'rxjs'; -import { ObjectLiteral } from '../../../types'; -// import { QueryFailedError, Repository } from 'typeorm'; -// import { DriverUtils } from 'typeorm/driver/DriverUtils'; -// -// import { -// CONTROL_OPTIONS_TOKEN, -// CURRENT_ENTITY_REPOSITORY, -// } from '../../constants'; -// import { ConfigParam, Entity, ValidateQueryError } from '../../types'; -// import { -// MysqlError, -// MysqlErrorCode, -// PostgresError, -// PostgresErrorCode, -// } from '../../helper'; -// import { HttpException } from '@nestjs/common'; -// #TODO need implement + @Injectable() -export class ErrorInterceptors - implements NestInterceptor -{ - // @Inject(CURRENT_ENTITY_REPOSITORY) private repository!: Repository; - // @Inject(CONTROL_OPTIONS_TOKEN) private config!: ConfigParam; +export class ErrorInterceptors implements NestInterceptor { + @Inject(ErrorFormatService) private errorFormatService!: ErrorFormatService; + + private static _instance: ErrorInterceptors; + constructor() { + if (ErrorInterceptors._instance) { + return ErrorInterceptors._instance; + } + ErrorInterceptors._instance = this; + } intercept( context: ExecutionContext, - next: CallHandler - ): Observable | Promise> { - return next.handle(); - // return next.handle().pipe( - // catchError((error) => { - // if (error instanceof QueryFailedError) { - // return throwError(() => this.prepareDataBaseError(error)); - // } - // - // if (error instanceof HttpException) { - // return throwError(() => error); - // } - // - // const errorObject: ValidateQueryError = { - // code: 'internal_error', - // message: this.config.debug ? error.message : 'Internal Server Error', - // path: [], - // }; - // const descriptionOrOptions = this.config.debug ? error : undefined; - // return throwError( - // () => - // new InternalServerErrorException( - // [errorObject], - // descriptionOrOptions - // ) - // ); - // }) - // ); + next: CallHandler> + ): Observable> { + return next + .handle() + .pipe( + catchError((error) => + throwError(() => this.errorFormatService.formatError(error)) + ) + ); } - - // private prepareDataBaseError(error: QueryFailedError): HttpException { - // const errorObject: ValidateQueryError = { - // code: 'internal_error', - // message: this.config.debug ? error.message : 'Internal Server Error', - // path: [], - // }; - // - // if (DriverUtils.isMySQLFamily(this.repository.manager.connection.driver)) { - // const { errorCode, errorMsg } = this.prepareMysqlError(error.driverError); - // if (MysqlError[errorCode]) { - // return MysqlError[errorCode](this.repository.metadata, errorMsg); - // } - // } - // - // if ( - // DriverUtils.isPostgresFamily(this.repository.manager.connection.driver) - // ) { - // const { errorCode, errorMsg, detail } = this.preparePostgresError( - // error.driverError - // ); - // - // if (PostgresError[errorCode]) { - // return PostgresError[errorCode]( - // this.repository.metadata, - // errorMsg, - // detail - // ); - // } - // } - // - // return new InternalServerErrorException([errorObject]); - // } - // - // private prepareMysqlError(error: any): { - // errorCode: MysqlErrorCode; - // errorMsg: string; - // } { - // return { - // errorCode: error.errno, - // errorMsg: error.message, - // }; - // } - // - // private preparePostgresError(error: any): { - // errorCode: PostgresErrorCode; - // errorMsg: string; - // detail: string; - // } { - // return { - // errorCode: error.code, - // errorMsg: error.message, - // detail: error.detail, - // }; - // } } diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/interceptors/log-time.interceptors.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/interceptors/log-time.interceptors.ts index 2b6b2797..48ace2bc 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/interceptors/log-time.interceptors.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/interceptors/log-time.interceptors.ts @@ -1,30 +1,39 @@ -import { CallHandler, ExecutionContext, NestInterceptor } from '@nestjs/common'; +import { + CallHandler, + ExecutionContext, + Injectable, + NestInterceptor, +} from '@nestjs/common'; +import { ResourceObject } from '@klerick/json-api-nestjs-shared'; + import { map, Observable } from 'rxjs'; -import { ObjectLiteral } from '../../../types'; -// import { Entity, ResourceObject } from '../../types'; +@Injectable() +export class LogTimeInterceptors implements NestInterceptor { + private static _instance: LogTimeInterceptors; + constructor() { + if (LogTimeInterceptors._instance) { + return LogTimeInterceptors._instance; + } + LogTimeInterceptors._instance = this; + } -export class LogTimeInterceptors - implements NestInterceptor -{ intercept( context: ExecutionContext, - // next: CallHandler> - next: CallHandler - ): Observable | Promise> { - const now = Date.now(); - return next.handle(); - // .pipe( - // map((r) => { - // const response = context.switchToHttp().getResponse(); - // const time = Date.now() - now; - // response.setHeader('x-response-time', time); - // if (r && r.meta) { - // r.meta['time'] = time; - // } - // - // return r; - // }) - // ); + next: CallHandler> + ): Observable> { + const now = performance.now(); + return next.handle().pipe( + map((r) => { + const response = context.switchToHttp().getResponse(); + const time = performance.now() - now; + response.setHeader('x-response-time', time); + if (r && r.meta) { + r.meta['time'] = time; + } + + return r; + }) + ); } } diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/mixin.module.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/mixin.module.ts index 0326a314..13aadcb9 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/mixin.module.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/mixin.module.ts @@ -1,19 +1,17 @@ import { DynamicModule } from '@nestjs/common'; - -import { MixinOptions, DecoratorOptions } from './types'; -import { createController } from './helper'; +import { DiscoveryModule } from '@nestjs/core'; +import { ModuleMixinOptions } from '../../types'; +import { createController, getProviderName, nameIt } from './helpers'; import { + CONTROLLER_OPTIONS_TOKEN, + CURRENT_ENTITY, JSON_API_DECORATOR_OPTIONS, - CONTROL_OPTIONS_TOKEN, JSON_API_MODULE_POSTFIX, - CURRENT_ENTITY, - FIND_ONE_ROW_ENTITY, - CHECK_RELATION_NAME, } from '../../constants'; -import { ConfigParam, RequiredFromPartial } from '../../types'; -import { MicroOrmParam } from '../micro-orm'; -import { TypeOrmParam } from '../type-orm'; -import { bindController, getProviderName, nameIt } from './helper'; +import { DecoratorOptions, EntityControllerParam } from './types'; +import { bindController } from './helpers/bind-controller'; +import { EntityParamMapService, JsonApiTransformerService } from './service'; +import { SwaggerBindService } from './swagger'; import { ZodInputQuerySchema, ZodPostSchema, @@ -22,27 +20,24 @@ import { ZodInputPatchRelationshipSchema, ZodInputPostRelationshipSchema, } from './factory'; -import { SwaggerBindService } from './swagger'; -import { JsonApiTransformerService } from './service/json-api-transformer.service'; export class MixinModule { - static forRoot(options: MixinOptions): DynamicModule { - const { entity, controller, imports, ormModule } = options; + static forRoot(mixinOptions: ModuleMixinOptions): DynamicModule { + const { entity, controller, imports, ormModule, config } = mixinOptions; const controllerClass = createController(entity, controller); const decoratorOptions: DecoratorOptions = Reflect.getMetadata(JSON_API_DECORATOR_OPTIONS, controllerClass) || {}; - const moduleConfig: RequiredFromPartial< - ConfigParam & (MicroOrmParam | TypeOrmParam) - > = { - ...options.config, + const moduleConfig: EntityControllerParam = { + ...config.options, ...decoratorOptions, }; bindController(controllerClass, entity, moduleConfig); + const optionProvider = { - provide: CONTROL_OPTIONS_TOKEN, + provide: CONTROLLER_OPTIONS_TOKEN, useValue: moduleConfig, }; @@ -51,16 +46,6 @@ export class MixinModule { useValue: entity, }; - const findOneRowEntityProvider = { - provide: FIND_ONE_ROW_ENTITY, - useValue: undefined, - }; - - const checkRelationNameProvider = { - provide: CHECK_RELATION_NAME, - useValue: undefined, - }; - return { module: nameIt( getProviderName(entity, JSON_API_MODULE_POSTFIX), @@ -70,19 +55,18 @@ export class MixinModule { providers: [ optionProvider, currentEntityProvider, - findOneRowEntityProvider, - checkRelationNameProvider, + EntityParamMapService, JsonApiTransformerService, - ...ormModule.getUtilProviders(entity), - ZodInputQuerySchema(entity), - ZodQuerySchema(entity), - ZodPatchSchema(entity), - ZodPostSchema(entity), SwaggerBindService, + ZodInputQuerySchema(), + ZodPostSchema(), + ZodQuerySchema(), + ZodPatchSchema(), ZodInputPatchRelationshipSchema, ZodInputPostRelationshipSchema, + ...ormModule.getUtilProviders(entity), ], - imports: imports, + imports: [...imports, DiscoveryModule], }; } } diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/check-item-entity/check-item-entity.pipe.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/check-item-entity/check-item-entity.pipe.spec.ts index a8e52f7d..64de13f0 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/check-item-entity/check-item-entity.pipe.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/check-item-entity/check-item-entity.pipe.spec.ts @@ -1,13 +1,13 @@ import { Test, TestingModule } from '@nestjs/testing'; import { NotFoundException } from '@nestjs/common'; +import { EntityClass } from '@klerick/json-api-nestjs-shared'; import { CheckItemEntityPipe } from './check-item-entity.pipe'; import { CURRENT_ENTITY, FIND_ONE_ROW_ENTITY } from '../../../../constants'; -import { EntityTarget } from 'typeorm/common/EntityTarget'; describe('CheckItemEntityPipe', () => { let pipe: CheckItemEntityPipe; let mockFindOneRowEntity: jest.Mock; - let mockEntityTarget: EntityTarget; + let mockEntityTarget: EntityClass; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ @@ -19,7 +19,7 @@ describe('CheckItemEntityPipe', () => { }).compile(); pipe = module.get>(CheckItemEntityPipe); - mockEntityTarget = module.get>(CURRENT_ENTITY); + mockEntityTarget = module.get>(CURRENT_ENTITY); mockFindOneRowEntity = module.get(FIND_ONE_ROW_ENTITY); }); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/check-item-entity/check-item-entity.pipe.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/check-item-entity/check-item-entity.pipe.ts index 8244d3aa..63287909 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/check-item-entity/check-item-entity.pipe.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/check-item-entity/check-item-entity.pipe.ts @@ -1,16 +1,14 @@ import { Inject, NotFoundException, PipeTransform } from '@nestjs/common'; +import { EntityClass, getEntityName } from '@klerick/json-api-nestjs-shared'; + import { ValidateQueryError } from '../../../../types'; import { CURRENT_ENTITY, FIND_ONE_ROW_ENTITY } from '../../../../constants'; -import { EntityTarget, ObjectLiteral } from '../../../../types'; import { FindOneRowEntity } from '../../types'; -import { getEntityName } from '../../helper'; -export class CheckItemEntityPipe< - E extends ObjectLiteral, - I extends string | number -> implements PipeTransform> +export class CheckItemEntityPipe + implements PipeTransform> { - @Inject(CURRENT_ENTITY) private currentEntity!: EntityTarget; + @Inject(CURRENT_ENTITY) private currentEntity!: EntityClass; @Inject(FIND_ONE_ROW_ENTITY) private findOneRowEntity!: | FindOneRowEntity | undefined; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/index.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/index.spec.ts index 6970b810..f6728a09 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/index.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/index.spec.ts @@ -1,8 +1,8 @@ import { INJECTABLE_WATERMARK } from '@nestjs/common/constants'; import { PipeTransform } from '@nestjs/common/interfaces'; -import { MixinOptions } from '../types'; import { factoryMixin } from './index'; +import { ModuleMixinOptions } from '../../../types'; describe('factoryMixin', () => { class TestEntity {} @@ -21,7 +21,7 @@ describe('factoryMixin', () => { it('should return a pipe class with a new name', () => { const pipeClass = factoryMixin( - TestEntity as MixinOptions['entity'], + TestEntity as ModuleMixinOptions['entity'], TestPipe ); expect(pipeClass.name).toBe('TestEntityTestPipe'); @@ -29,7 +29,7 @@ describe('factoryMixin', () => { it('should return a pipe class that is Injectable', () => { const pipeClass = factoryMixin( - TestEntity as MixinOptions['entity'], + TestEntity as ModuleMixinOptions['entity'], TestPipe ); expect(isInjectable(pipeClass)).toBe(true); @@ -37,7 +37,7 @@ describe('factoryMixin', () => { it('should preserve the behavior of the original pipe', () => { const pipeClass = factoryMixin( - TestEntity as MixinOptions['entity'], + TestEntity as ModuleMixinOptions['entity'], TestPipe ); const instance = new pipeClass(); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/index.ts index b7c0cc13..87448f10 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/index.ts @@ -1,9 +1,7 @@ import { Injectable, ParseIntPipe } from '@nestjs/common'; -import { upperFirstLetter } from '../../../utils/nestjs-shared'; +import { pascalCase } from 'change-case-commonjs'; -import { PipeMixin } from '../../../types'; -import { MixinOptions } from '../types'; -import { nameIt } from '../helper'; +import { ModuleMixinOptions, PipeMixin } from '../../../types'; import { QueryInputPipe } from './query-input'; import { QueryPipe } from './query'; @@ -15,12 +13,17 @@ import { PatchInputPipe } from './patch-input'; import { ParseRelationshipNamePipe } from './parse-relationship-name'; import { PostRelationshipPipe } from './post-relationship'; import { PatchRelationshipPipe } from './patch-relationship'; +import { nameIt } from '../helpers'; +import { EntityControllerParam } from '../types'; -export function factoryMixin(entity: MixinOptions['entity'], pipe: PipeMixin) { +export function factoryMixin( + entity: ModuleMixinOptions['entity'], + pipe: PipeMixin +) { const entityName = entity.name; const pipeClass = nameIt( - `${upperFirstLetter(entityName)}${pipe.name}`, + `${pascalCase(entityName)}${pipe.name}`, pipe ) as PipeMixin; @@ -29,61 +32,67 @@ export function factoryMixin(entity: MixinOptions['entity'], pipe: PipeMixin) { return pipeClass; } -export function queryInputMixin(entity: MixinOptions['entity']): PipeMixin { +export function queryInputMixin( + entity: ModuleMixinOptions['entity'] +): PipeMixin { return factoryMixin(entity, QueryInputPipe); } -export function queryMixin(entity: MixinOptions['entity']): PipeMixin { +export function queryMixin(entity: ModuleMixinOptions['entity']): PipeMixin { return factoryMixin(entity, QueryPipe); } export function queryFiledInIncludeMixin( - entity: MixinOptions['entity'] + entity: ModuleMixinOptions['entity'] ): PipeMixin { return factoryMixin(entity, QueryFiledInIncludePipe); } export function queryCheckSelectFieldMixin( - entity: MixinOptions['entity'] + entity: ModuleMixinOptions['entity'] ): PipeMixin { return factoryMixin(entity, QueryCheckSelectField); } export function idPipeMixin( - entity: MixinOptions['entity'], - config?: MixinOptions['config'] + entity: ModuleMixinOptions['entity'], + config?: EntityControllerParam ): PipeMixin { return config && config.pipeForId ? config.pipeForId : (ParseIntPipe as any); } export function checkItemEntityPipeMixin( - entity: MixinOptions['entity'] + entity: ModuleMixinOptions['entity'] ): PipeMixin { return factoryMixin(entity, CheckItemEntityPipe); } -export function postInputPipeMixin(entity: MixinOptions['entity']): PipeMixin { +export function postInputPipeMixin( + entity: ModuleMixinOptions['entity'] +): PipeMixin { return factoryMixin(entity, PostInputPipe); } -export function patchInputPipeMixin(entity: MixinOptions['entity']): PipeMixin { +export function patchInputPipeMixin( + entity: ModuleMixinOptions['entity'] +): PipeMixin { return factoryMixin(entity, PatchInputPipe); } export function postRelationshipPipeMixin( - entity: MixinOptions['entity'] + entity: ModuleMixinOptions['entity'] ): PipeMixin { return factoryMixin(entity, PostRelationshipPipe); } export function patchRelationshipPipeMixin( - entity: MixinOptions['entity'] + entity: ModuleMixinOptions['entity'] ): PipeMixin { return factoryMixin(entity, PatchRelationshipPipe); } export function parseRelationshipNamePipeMixin( - entity: MixinOptions['entity'] + entity: ModuleMixinOptions['entity'] ): PipeMixin { return factoryMixin(entity, ParseRelationshipNamePipe); } diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/parse-relationship-name/parse-relationship-name.pipe.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/parse-relationship-name/parse-relationship-name.pipe.spec.ts index 2709180b..247fb82c 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/parse-relationship-name/parse-relationship-name.pipe.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/parse-relationship-name/parse-relationship-name.pipe.spec.ts @@ -1,13 +1,17 @@ import { Test, TestingModule } from '@nestjs/testing'; import { UnprocessableEntityException } from '@nestjs/common'; +import { EntityClass } from '@klerick/json-api-nestjs-shared'; import { ParseRelationshipNamePipe } from './parse-relationship-name.pipe'; import { CURRENT_ENTITY, CHECK_RELATION_NAME } from '../../../../constants'; -import { EntityTarget } from 'typeorm/common/EntityTarget'; +import { EntityParam } from '../../../../types'; describe('CheckItemEntityPipe', () => { - let pipe: ParseRelationshipNamePipe; + let pipe: ParseRelationshipNamePipe< + object, + keyof EntityParam['relationProperty'] + >; let checkRelationNameMock: jest.Mock; - let mockEntityTarget: EntityTarget; + let mockEntityTarget: EntityClass; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ @@ -18,10 +22,13 @@ describe('CheckItemEntityPipe', () => { ], }).compile(); - pipe = module.get>( - ParseRelationshipNamePipe - ); - mockEntityTarget = module.get>(CURRENT_ENTITY); + pipe = module.get< + ParseRelationshipNamePipe< + object, + keyof EntityParam['relationProperty'] + > + >(ParseRelationshipNamePipe); + mockEntityTarget = module.get>(CURRENT_ENTITY); checkRelationNameMock = module.get(CHECK_RELATION_NAME); }); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/parse-relationship-name/parse-relationship-name.pipe.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/parse-relationship-name/parse-relationship-name.pipe.ts index de555df3..d0d85ba9 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/parse-relationship-name/parse-relationship-name.pipe.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/parse-relationship-name/parse-relationship-name.pipe.ts @@ -3,20 +3,19 @@ import { UnprocessableEntityException, Inject, } from '@nestjs/common'; -import { EntityRelation } from '../../../../utils/nestjs-shared'; -import { ValidateQueryError } from '../../../../types'; +import { EntityClass, getEntityName } from '@klerick/json-api-nestjs-shared'; + +import { EntityParam, ValidateQueryError } from '../../../../types'; import { CHECK_RELATION_NAME, CURRENT_ENTITY } from '../../../../constants'; -import { EntityTarget, ObjectLiteral } from '../../../../types'; -import { CheckRelationNme } from '../../types'; -import { getEntityName } from '../../helper'; +import { CheckRelationName } from '../../types'; export class ParseRelationshipNamePipe< - E extends ObjectLiteral, - I extends EntityRelation + E extends object, + I extends keyof EntityParam['relationProperty'] > implements PipeTransform { - @Inject(CURRENT_ENTITY) private currentEntity!: EntityTarget; - @Inject(CHECK_RELATION_NAME) private checkRelationName!: CheckRelationNme; + @Inject(CURRENT_ENTITY) private currentEntity!: EntityClass; + @Inject(CHECK_RELATION_NAME) private checkRelationName!: CheckRelationName; transform(value: string): I { if (!this.checkRelationName || typeof this.checkRelationName !== 'function') diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/patch-input/patch-input.pipe.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/patch-input/patch-input.pipe.spec.ts index 7e54641f..3e52b35d 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/patch-input/patch-input.pipe.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/patch-input/patch-input.pipe.spec.ts @@ -10,11 +10,11 @@ import { PostData, ZodPost } from '../../zod'; import { JSONValue } from '../../types'; import { ZOD_PATCH_SCHEMA } from '../../../../constants'; -type MockEntity = { id: number; name: string }; +import { Users } from '../../../../utils/___test___/test-classes.helper'; describe('PostInputPipe', () => { - let pipe: PatchInputPipe; - let mockSchema: ZodPost; + let pipe: PatchInputPipe; + let mockSchema: ZodPost; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ @@ -29,13 +29,13 @@ describe('PostInputPipe', () => { ], }).compile(); - pipe = module.get>(PatchInputPipe); - mockSchema = module.get>(ZOD_PATCH_SCHEMA); + pipe = module.get>(PatchInputPipe); + mockSchema = module.get>(ZOD_PATCH_SCHEMA); }); it('should transform JSONValue to PostData on success', () => { const input: JSONValue = { key: 'value' } as any; - const expectedData: PostData = { id: 1, key: 'value' } as any; + const expectedData: PostData = { id: 1, key: 'value' } as any; jest .spyOn(mockSchema, 'parse') diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/patch-input/patch-input.pipe.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/patch-input/patch-input.pipe.ts index 3fd108af..3f6dc334 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/patch-input/patch-input.pipe.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/patch-input/patch-input.pipe.ts @@ -10,18 +10,17 @@ import { errorMap } from 'zod-validation-error'; import { JSONValue } from '../../types'; import { PatchData, ZodPatch } from '../../zod'; import { ZOD_PATCH_SCHEMA } from '../../../../constants'; -import { ObjectLiteral } from '../../../../types'; -export class PatchInputPipe - implements PipeTransform> +export class PatchInputPipe + implements PipeTransform> { @Inject(ZOD_PATCH_SCHEMA) private zodInputPatchSchema!: ZodPatch; - transform(value: JSONValue): PatchData { + transform(value: JSONValue): PatchData { try { return this.zodInputPatchSchema.parse(value, { errorMap: errorMap, - })['data'] as PatchData; + })['data'] as PatchData; } catch (e) { if (e instanceof ZodError) { throw new BadRequestException(e.issues); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/patch-relationship/patch-relationship.pipe.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/patch-relationship/patch-relationship.pipe.spec.ts index 8c591419..0454ce2b 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/patch-relationship/patch-relationship.pipe.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/patch-relationship/patch-relationship.pipe.spec.ts @@ -1,4 +1,3 @@ -import { IMemoryDb } from 'pg-mem'; import { Test, TestingModule } from '@nestjs/testing'; import { InternalServerErrorException, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/post-input/post-input.pipe.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/post-input/post-input.pipe.spec.ts index 01481275..a61eae00 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/post-input/post-input.pipe.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/post-input/post-input.pipe.spec.ts @@ -9,12 +9,11 @@ import { PostInputPipe } from './post-input.pipe'; import { PostData, ZodPost } from '../../zod'; import { JSONValue } from '../../types'; import { ZOD_POST_SCHEMA } from '../../../../constants'; - -type MockEntity = { id: number; name: string }; +import { Users } from '../../../../utils/___test___/test-classes.helper'; describe('PostInputPipe', () => { - let pipe: PostInputPipe; - let mockSchema: ZodPost; + let pipe: PostInputPipe; + let mockSchema: ZodPost; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ @@ -29,13 +28,13 @@ describe('PostInputPipe', () => { ], }).compile(); - pipe = module.get>(PostInputPipe); - mockSchema = module.get>(ZOD_POST_SCHEMA); + pipe = module.get>(PostInputPipe); + mockSchema = module.get>(ZOD_POST_SCHEMA); }); it('should transform JSONValue to PostData on success', () => { const input: JSONValue = { key: 'value' } as any; - const expectedData: PostData = { id: 1, key: 'value' } as any; + const expectedData: PostData = { id: 1, key: 'value' } as any; jest .spyOn(mockSchema, 'parse') diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/post-input/post-input.pipe.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/post-input/post-input.pipe.ts index 5059b8ce..3956098d 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/post-input/post-input.pipe.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/post-input/post-input.pipe.ts @@ -9,18 +9,17 @@ import { errorMap } from 'zod-validation-error'; import { PostData, ZodPost } from '../../zod'; import { ZOD_POST_SCHEMA } from '../../../../constants'; -import { ObjectLiteral } from '../../../../types'; import { JSONValue } from '../../types'; -export class PostInputPipe - implements PipeTransform> +export class PostInputPipe + implements PipeTransform> { @Inject(ZOD_POST_SCHEMA) private zodInputPostSchema!: ZodPost; - transform(value: JSONValue): PostData { + transform(value: JSONValue): PostData { try { return this.zodInputPostSchema.parse(value, { errorMap: errorMap, - })['data'] as PostData; + })['data'] as PostData; } catch (e) { if (e instanceof ZodError) { throw new BadRequestException(e.issues); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/post-relationship/post-relationship.pipe.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/post-relationship/post-relationship.pipe.spec.ts index 8833734d..038529c1 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/post-relationship/post-relationship.pipe.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/post-relationship/post-relationship.pipe.spec.ts @@ -1,6 +1,5 @@ -import { IMemoryDb } from 'pg-mem'; import { Test, TestingModule } from '@nestjs/testing'; -import { getDataSourceToken } from '@nestjs/typeorm'; + import { InternalServerErrorException, BadRequestException, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-check-select-field/query-check-select-field.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-check-select-field/query-check-select-field.spec.ts index 161204f6..f877b959 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-check-select-field/query-check-select-field.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-check-select-field/query-check-select-field.spec.ts @@ -1,19 +1,19 @@ import { Test, TestingModule } from '@nestjs/testing'; import { BadRequestException } from '@nestjs/common'; -import { QueryField } from '../../../../utils/nestjs-shared'; +import { QueryField } from '@klerick/json-api-nestjs-shared'; import { QueryCheckSelectField } from './query-check-select-field'; -import { Users } from '../../../../mock-utils/typeorm'; -import { CONTROL_OPTIONS_TOKEN } from '../../../../constants'; +import { Users } from '../../../../utils/___test___/test-classes.helper'; +import { CONTROLLER_OPTIONS_TOKEN } from '../../../../constants'; import { Query } from '../../zod'; -import { ConfigParam, ObjectLiteral } from '../../../../types'; +import { EntityControllerParam } from '../../types'; -function getDefaultQuery() { +function getDefaultQuery() { const filter = { relation: null, target: null, }; - const defaultQuery: Query = { + const defaultQuery: Query = { [QueryField.filter]: filter, [QueryField.fields]: null, [QueryField.include]: null, @@ -29,12 +29,12 @@ function getDefaultQuery() { describe('QueryCheckSelectField', () => { let queryCheckSelectField: QueryCheckSelectField; - let configParam: ConfigParam; + let configParam: EntityControllerParam; beforeAll(async () => { const module: TestingModule = await Test.createTestingModule({ providers: [ { - provide: CONTROL_OPTIONS_TOKEN, + provide: CONTROLLER_OPTIONS_TOKEN, useValue: { requiredSelectField: false, debug: false, @@ -47,7 +47,7 @@ describe('QueryCheckSelectField', () => { queryCheckSelectField = module.get>( QueryCheckSelectField ); - configParam = module.get(CONTROL_OPTIONS_TOKEN); + configParam = module.get(CONTROLLER_OPTIONS_TOKEN); }); it('Is valid', () => { diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-check-select-field/query-check-select-field.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-check-select-field/query-check-select-field.ts index 7b98707f..bb973785 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-check-select-field/query-check-select-field.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-check-select-field/query-check-select-field.ts @@ -1,17 +1,14 @@ import { BadRequestException, Inject, PipeTransform } from '@nestjs/common'; -import { CONTROL_OPTIONS_TOKEN } from '../../../../constants'; -import { - ConfigParam, - ObjectLiteral, - ValidateQueryError, -} from '../../../../types'; +import { CONTROLLER_OPTIONS_TOKEN } from '../../../../constants'; +import { ValidateQueryError } from '../../../../types'; import { Query } from '../../zod'; +import { EntityControllerParam } from '../../types'; -export class QueryCheckSelectField - implements PipeTransform, Query> +export class QueryCheckSelectField + implements PipeTransform, Query> { - @Inject(CONTROL_OPTIONS_TOKEN) private configParam!: ConfigParam; - transform(value: Query): Query { + @Inject(CONTROLLER_OPTIONS_TOKEN) private configParam!: EntityControllerParam; + transform(value: Query): Query { if (this.configParam.requiredSelectField && value.fields === null) { const error: ValidateQueryError = { code: 'invalid_arguments', diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-filed-on-include/query-filed-in-include.pipe.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-filed-on-include/query-filed-in-include.pipe.spec.ts index 71dc33e4..0a226d8d 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-filed-on-include/query-filed-in-include.pipe.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-filed-on-include/query-filed-in-include.pipe.spec.ts @@ -1,7 +1,7 @@ import { BadRequestException } from '@nestjs/common'; -import { QueryField } from '../../../../utils/nestjs-shared'; +import { QueryField } from '@klerick/json-api-nestjs-shared'; import { QueryFiledInIncludePipe } from './query-filed-in-include.pipe'; -import { Users } from '../../../../mock-utils/typeorm'; +import { Users } from '../../../../utils/___test___/test-classes.helper'; import { Query } from '../../zod'; describe('QueryFiledInIncludePipe', () => { @@ -12,7 +12,7 @@ describe('QueryFiledInIncludePipe', () => { }); it('Should be ok', () => { - const check: Query = { + const check: Query = { [QueryField.fields]: { roles: ['id'], }, @@ -28,7 +28,7 @@ describe('QueryFiledInIncludePipe', () => { }, }; - const check2: Query = { + const check2: Query = { [QueryField.fields]: null, [QueryField.include]: ['roles'], [QueryField.filter]: { @@ -51,7 +51,7 @@ describe('QueryFiledInIncludePipe', () => { }); it('Should be not ok', () => { - const check: Query = { + const check: Query = { [QueryField.fields]: { roles: ['id'], }, @@ -66,7 +66,7 @@ describe('QueryFiledInIncludePipe', () => { size: 1, }, }; - const check2: Query = { + const check2: Query = { [QueryField.fields]: { roles: ['id'], }, @@ -86,7 +86,7 @@ describe('QueryFiledInIncludePipe', () => { }, }; - const check3: Query = { + const check3: Query = { [QueryField.fields]: null, [QueryField.include]: null, [QueryField.filter]: { diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-filed-on-include/query-filed-in-include.pipe.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-filed-on-include/query-filed-in-include.pipe.ts index 8ce987eb..ba621c0c 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-filed-on-include/query-filed-in-include.pipe.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-filed-on-include/query-filed-in-include.pipe.ts @@ -1,13 +1,13 @@ import { BadRequestException, PipeTransform } from '@nestjs/common'; -import { ObjectTyped } from '../../../../utils/nestjs-shared'; +import { ObjectTyped } from '@klerick/json-api-nestjs-shared'; -import { ObjectLiteral, ValidateQueryError } from '../../../../types'; +import { ValidateQueryError } from '../../../../types'; import { Query } from '../../zod'; -export class QueryFiledInIncludePipe - implements PipeTransform, Query> +export class QueryFiledInIncludePipe + implements PipeTransform, Query> { - transform(value: Query): Query { + transform(value: Query): Query { const errors: ValidateQueryError[] = []; const { fields, include, sort, filter } = value; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-input/query-input.pipe.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-input/query-input.pipe.ts index c1129549..f4ba6cb8 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-input/query-input.pipe.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-input/query-input.pipe.ts @@ -9,15 +9,14 @@ import { errorMap } from 'zod-validation-error'; import { ZOD_INPUT_QUERY_SCHEMA } from '../../../../constants'; import { ZodInputQuery, InputQuery } from '../../zod'; import { JSONValue } from '../../types'; -import { ObjectLiteral } from '../../../../types'; -export class QueryInputPipe - implements PipeTransform> +export class QueryInputPipe + implements PipeTransform> { @Inject(ZOD_INPUT_QUERY_SCHEMA) - private zodInputQuerySchema!: ZodInputQuery; + private zodInputQuerySchema!: ZodInputQuery; - transform(value: JSONValue): InputQuery { + transform(value: JSONValue): InputQuery { try { return this.zodInputQuerySchema.parse(value, { errorMap: errorMap, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query/query.pipe.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query/query.pipe.spec.ts index 6f62baa4..f2d69856 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query/query.pipe.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query/query.pipe.spec.ts @@ -3,18 +3,17 @@ import { InternalServerErrorException, } from '@nestjs/common'; import { Test, TestingModule } from '@nestjs/testing'; +import { FilterOperand, QueryField } from '@klerick/json-api-nestjs-shared'; import { ZodError } from 'zod'; import { QueryPipe } from './query.pipe'; import { ASC, ZOD_QUERY_SCHEMA } from '../../../../constants'; import { ZodQuery, InputQuery, Query } from '../../zod'; -import { FilterOperand, QueryField } from '../../../../utils/nestjs-shared'; - -type MockEntity = { id: number; name: string }; +import { Users } from '../../../../utils/___test___/test-classes.helper'; describe('QueryPipe', () => { - let queryPipe: QueryPipe; - let zodQuerySchemaMock: ZodQuery; + let queryPipe: QueryPipe; + let zodQuerySchemaMock: ZodQuery; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ @@ -29,12 +28,12 @@ describe('QueryPipe', () => { ], }).compile(); - queryPipe = module.get>(QueryPipe); - zodQuerySchemaMock = module.get>(ZOD_QUERY_SCHEMA); + queryPipe = module.get>(QueryPipe); + zodQuerySchemaMock = module.get>(ZOD_QUERY_SCHEMA); }); it('should parse the query successfully using the zod schema', () => { - const inputQuery: InputQuery = { + const inputQuery: InputQuery = { [QueryField.fields]: { target: ['id', 'name'], }, @@ -50,9 +49,9 @@ describe('QueryPipe', () => { [QueryField.sort]: { target: { id: ASC } }, [QueryField.page]: { number: 1, size: 10 }, }; - const parsedQuery: Query = { + const parsedQuery: Query = { [QueryField.fields]: { - target: ['id', 'name'], + target: ['id', 'lastName'], }, [QueryField.filter]: { relation: null, @@ -79,7 +78,7 @@ describe('QueryPipe', () => { const inputQuery = { id: 1, name: 'Invalid', - } as unknown as InputQuery; + } as unknown as InputQuery; const zodError = new ZodError([]); jest.spyOn(zodQuerySchemaMock, 'parse').mockImplementation(() => { @@ -93,7 +92,7 @@ describe('QueryPipe', () => { const inputQuery = { id: 1, name: 'Invalid', - } as unknown as InputQuery; + } as unknown as InputQuery; const unexpectedError = new Error('Unexpected error'); jest.spyOn(zodQuerySchemaMock, 'parse').mockImplementation(() => { diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query/query.pipe.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query/query.pipe.ts index d4c5d359..488e8136 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query/query.pipe.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query/query.pipe.ts @@ -8,15 +8,14 @@ import { ZodError } from 'zod'; import { ZOD_QUERY_SCHEMA } from '../../../../constants'; import { ZodQuery, Query, InputQuery } from '../../zod'; -import { ObjectLiteral } from '../../../../types'; -export class QueryPipe - implements PipeTransform, Query> +export class QueryPipe + implements PipeTransform, Query> { @Inject(ZOD_QUERY_SCHEMA) - private zodQuerySchema!: ZodQuery; + private zodQuerySchema!: ZodQuery; - transform(value: InputQuery): Query { + transform(value: InputQuery): Query { try { return this.zodQuerySchema.parse(value); } catch (e) { diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/entity-param-map.service.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/entity-param-map.service.ts new file mode 100644 index 00000000..0bd484b8 --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/entity-param-map.service.ts @@ -0,0 +1,36 @@ +import { Inject, Injectable } from '@nestjs/common'; +import { AnyEntity, EntityClass } from '@klerick/json-api-nestjs-shared'; + +import { ENTITY_PARAM_MAP, CURRENT_ENTITY } from '../../../constants'; +import { EntityParamMap } from '../types'; +import { EntityParam } from '../../../types'; + +@Injectable() +export class EntityParamMapService< + E extends object, + IdKey extends string = 'id' +> { + @Inject(ENTITY_PARAM_MAP) private readonly entityParamMap!: EntityParamMap< + EntityClass + >; + + @Inject(CURRENT_ENTITY) private readonly currentEntity!: EntityClass; + + private _entityParaMap!: EntityParam; + + getParamMap( + entity: EntityClass + ): EntityParam { + const paramMap = this.entityParamMap.get(entity); + if (!paramMap) throw new Error(`Param map for: ${entity.name} not found`); + + return paramMap as unknown as EntityParam; + } + + get entityParaMap(): EntityParam { + if (!this._entityParaMap) { + this._entityParaMap = this.getParamMap(this.currentEntity); + } + return this._entityParaMap; + } +} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/error-format.service.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/error-format.service.ts new file mode 100644 index 00000000..b5c96ca8 --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/error-format.service.ts @@ -0,0 +1,46 @@ +import { + HttpException, + Inject, + Injectable, + InternalServerErrorException, +} from '@nestjs/common'; +import { MODULE_OPTIONS_TOKEN } from '../../../constants'; +import { PrepareParams, ValidateQueryError } from '../../../types'; +import { HttpExceptionOptions } from '@nestjs/common/exceptions/http.exception'; + +@Injectable() +export class ErrorFormatService { + @Inject(MODULE_OPTIONS_TOKEN) private config!: PrepareParams; + private defaultErrorMsg = 'Internal Server Error'; + formatError(error: unknown): HttpException { + if (error instanceof HttpException) { + return error; + } + + const errMessage = + error instanceof Error + ? this.config.options.debug + ? error.message + : this.defaultErrorMsg + : this.defaultErrorMsg; + + const errorObject: ValidateQueryError = { + code: 'internal_error', + message: errMessage, + path: [], + }; + + const descriptionOrOptions: HttpExceptionOptions = this.config.options.debug + ? { + description: this.defaultErrorMsg, + cause: error instanceof Error ? error : undefined, + } + : { + description: this.defaultErrorMsg, + }; + return new InternalServerErrorException( + [errorObject], + descriptionOrOptions + ); + } +} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/index.ts new file mode 100644 index 00000000..438f47b4 --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/index.ts @@ -0,0 +1,3 @@ +export * from './entity-param-map.service'; +export * from './json-api-transformer.service'; +export * from './error-format.service'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/json-api-transformer.service.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/json-api-transformer.service.spec.ts index 3b9444f7..74b11cf4 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/json-api-transformer.service.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/json-api-transformer.service.spec.ts @@ -1,53 +1,28 @@ import { Test, TestingModule } from '@nestjs/testing'; import { ApplicationConfig } from '@nestjs/core'; - +import { faker } from '@faker-js/faker'; +import { PropertyKeys } from '@klerick/json-api-nestjs-shared'; import { JsonApiTransformerService } from './json-api-transformer.service'; +import { EntityParamMapService } from './entity-param-map.service'; +import { usersEntityParamMapMockData } from '../../../utils/___test___/test.helper'; import { - Addresses, - Roles, Users, - Notes, + Roles, + Addresses, Comments, - UserGroups, - dbRandomName, - mockDbPgLiteTestModule, -} from '../../../mock-utils/microrom'; - -import { faker } from '@faker-js/faker'; -import { Collection, MikroORM } from '@mikro-orm/core'; -import { - CurrentEntityManager, - CurrentEntityMetadata, - CurrentMicroOrmProvider, - EntityPropsMap, -} from '../../micro-orm/factory'; -import { - CURRENT_ENTITY, - ENTITY_MAP_PROPS, - GLOBAL_MODULE_OPTIONS_TOKEN, -} from '../../../constants'; -import { DEFAULT_ARRAY_TYPE } from '../../micro-orm/constants'; -import { EntityClass } from '../../../types'; -import { ZodEntityProps } from '../types'; +} from '../../../utils/___test___/test-classes.helper'; +import { EntityParam } from '../../../types'; describe('JsonApiTransformerService - extractAttributes', () => { - let service: JsonApiTransformerService; + let service: JsonApiTransformerService; const userObject: Users = {} as Users; const urlPrefix = 'api'; const version = '1'; - let mikroORM: MikroORM; - let dbName: string; - let mapProps: Map, ZodEntityProps>; - let mapPropsUser: ZodEntityProps; + let mapPropsService: EntityParamMapService; + let mapPropsUser: EntityParam; beforeAll(async () => { - dbName = dbRandomName(true); const module: TestingModule = await Test.createTestingModule({ - imports: [mockDbPgLiteTestModule(dbName)], providers: [ - CurrentMicroOrmProvider(), - CurrentEntityManager(), - CurrentEntityMetadata(), - JsonApiTransformerService, { provide: ApplicationConfig, useValue: { @@ -59,43 +34,27 @@ describe('JsonApiTransformerService - extractAttributes', () => { }, }, { - provide: CURRENT_ENTITY, - useValue: Users, - }, - EntityPropsMap([ - Addresses, - Roles, - Users, - Notes, - Comments, - UserGroups, - ] as any), - { - provide: GLOBAL_MODULE_OPTIONS_TOKEN, - useValue: { options: { arrayType: DEFAULT_ARRAY_TYPE } }, + provide: EntityParamMapService, + useValue: usersEntityParamMapMockData, }, + JsonApiTransformerService, ], }).compile(); service = module.get>( JsonApiTransformerService ); - mapProps = module.get(ENTITY_MAP_PROPS); - const mapPropsUserCheck = mapProps.get(Users); - if (!mapPropsUserCheck) throw new Error('Not found map property for Users'); - mapPropsUser = mapPropsUserCheck; - mikroORM = module.get(MikroORM); - }); - - afterAll(() => { - mikroORM.close(true); + mapPropsService = module.get>( + EntityParamMapService + ); + mapPropsUser = mapPropsService.getParamMap(Users); }); beforeEach(async () => { userObject.id = faker.number.int(); userObject.firstName = faker.person.firstName(); userObject.lastName = faker.person.lastName(); - userObject.isActive = faker.datatype.boolean(); + userObject.isActive = null; userObject.login = faker.internet.userName({ lastName: userObject.lastName, firstName: userObject.firstName, @@ -108,7 +67,11 @@ describe('JsonApiTransformerService - extractAttributes', () => { describe('extractAttributes', () => { it('should extract specified fields from an object', () => { - const fields: (keyof Users)[] = ['firstName', 'lastName', 'login']; + const fields: PropertyKeys[] = [ + 'firstName', + 'lastName', + 'login', + ]; const result = service.extractAttributes(userObject, fields); expect(result).toEqual({ @@ -169,10 +132,9 @@ describe('JsonApiTransformerService - extractAttributes', () => { key: faker.string.alphanumeric(5), name: faker.word.words(), }, - ] as unknown as Collection; + ] as any; userObject.manager = null as any; - userObject.notes = [] as any; }); it('should transform relationships without "include" option enabled', () => { @@ -197,7 +159,7 @@ describe('JsonApiTransformerService - extractAttributes', () => { it('should transform relationships with "include" option enabled', () => { const query = { include: ['roles'] } as any; - const result = service.transformRelationships( + const result = service.transformRelationships( userObject, mapPropsUser, query @@ -212,7 +174,7 @@ describe('JsonApiTransformerService - extractAttributes', () => { if (i === 'roles') { acum[i]['data'] = userObject.roles.map((relName) => ({ id: relName.id.toString(), - type: mapProps.get(Roles)?.typeName, + type: mapPropsService.getParamMap(Roles)?.typeName, })); } return acum; @@ -234,7 +196,7 @@ describe('JsonApiTransformerService - extractAttributes', () => { if (i === 'addresses') { acum[i]['data'] = { id: userObject.addresses.id.toString(), - type: mapProps.get(Addresses)?.typeName, + type: mapPropsService.getParamMap(Addresses)?.typeName, }; } return acum; @@ -256,9 +218,6 @@ describe('JsonApiTransformerService - extractAttributes', () => { if (i === 'manager') { acum[i]['data'] = null; } - if (i === 'notes') { - acum[i]['data'] = []; - } return acum; }, {} as Record); @@ -270,7 +229,7 @@ describe('JsonApiTransformerService - extractAttributes', () => { const result = service.transformRelationships( userObject, - { ...mapPropsUser, relations: [] as any }, + { ...mapPropsUser, relationProperty: {} as any }, query ); @@ -294,10 +253,9 @@ describe('JsonApiTransformerService - extractAttributes', () => { roleFake.key = faker.string.alphanumeric(5); roleFake.name = faker.word.words(); - userObject.roles = [roleFake] as unknown as Collection; + userObject.roles = [roleFake] as any; userObject.manager = null as any; - userObject.notes = [] as any; }); it('should by include', () => { @@ -307,65 +265,49 @@ describe('JsonApiTransformerService - extractAttributes', () => { const result = service.extractIncluded([userObject], query); const rolesInclude = result.find( - (i) => i.type === mapProps.get(Roles)?.typeName + (i) => i.type === mapPropsService.getParamMap(Roles)?.typeName ); const addressesInclude = result.find( - (i) => i.type === mapProps.get(Addresses)?.typeName + (i) => i.type === mapPropsService.getParamMap(Addresses)?.typeName ); const managerInclude = result.find( - (i) => i.type === mapProps.get(Users)?.typeName - ); - const notesInclude = result.find( - (i) => i.type === mapProps.get(Notes)?.typeName + (i) => i.type === mapPropsService.getParamMap(Users)?.typeName ); - expect(notesInclude).toBe(undefined); expect(managerInclude).toBe(undefined); const { id: roleId, ...checkRolesAttr } = roleFake; expect(rolesInclude).toEqual({ id: roleId.toString(), - type: mapProps.get(Roles)?.typeName, + type: mapPropsService.getParamMap(Roles)?.typeName, attributes: checkRolesAttr, links: { - self: `/api/v1/${mapProps.get(Roles)?.typeName}/${roleId}`, - }, - relationships: { - users: { - links: { - self: `/api/v${version}/${ - mapProps.get(Roles)?.typeName - }/${roleId}/relationships/users`, - }, - }, + self: `/api/v1/${ + mapPropsService.getParamMap(Roles)?.typeName + }/${roleId}`, }, + relationships: {}, }); const { id: addressesId, ...addressesAttr } = userObject.addresses; expect(addressesInclude).toEqual({ id: addressesId.toString(), - type: mapProps.get(Addresses)?.typeName, + type: mapPropsService.getParamMap(Addresses)?.typeName, attributes: addressesAttr, links: { - self: `/api/v1/${mapProps.get(Addresses)?.typeName}/${addressesId}`, - }, - relationships: { - user: { - links: { - self: `/api/v${version}/${ - mapProps.get(Addresses)?.typeName - }/${addressesId}/relationships/user`, - }, - }, + self: `/api/v1/${ + mapPropsService.getParamMap(Addresses)?.typeName + }/${addressesId}`, }, + relationships: {}, }); }); - it('should ne include by custom select', () => { + it('should be include by custom select', () => { const userObject = { id: faker.number.int(), firstName: faker.person.firstName(), isActive: faker.datatype.boolean(), - } as any; + } as unknown as Users; userObject.addresses = { id: faker.number.int(), city: faker.location.city(), @@ -380,7 +322,7 @@ describe('JsonApiTransformerService - extractAttributes', () => { { id: faker.number.int(), text: faker.lorem.text(), - kind: undefined, + kind: 'COMMENT', createdAt: undefined, updatedAt: undefined, createdBy: undefined, @@ -404,13 +346,13 @@ describe('JsonApiTransformerService - extractAttributes', () => { addresses: undefined, manager: undefined, userGroup: undefined, - }; + } as any; const query = { include: ['addresses', 'comments', 'manager'], fields: { target: ['firstName', 'isActive'], - comments: ['text'], + comments: ['kind'], manager: ['login'], }, } as any; @@ -418,60 +360,54 @@ describe('JsonApiTransformerService - extractAttributes', () => { const result = service.extractIncluded([userObject], query); const rolesInclude = result.find( - (i) => i.type === mapProps.get(Roles)?.typeName + (i) => i.type === mapPropsService.getParamMap(Roles)?.typeName ); const addressesInclude = result.find( - (i) => i.type === mapProps.get(Addresses)?.typeName + (i) => i.type === mapPropsService.getParamMap(Addresses)?.typeName ); const managerInclude = result.find( - (i) => i.type === mapProps.get(Users)?.typeName + (i) => i.type === mapPropsService.getParamMap(Users)?.typeName ); const commentsInclude = result.find( - (i) => i.type === mapProps.get(Comments)?.typeName - ); - const notesInclude = result.find( - (i) => i.type === mapProps.get(Notes)?.typeName + (i) => i.type === mapPropsService.getParamMap(Comments)?.typeName ); - expect(notesInclude).toBe(undefined); expect(rolesInclude).toBe(undefined); const { id: addressesId, ...addressesAttr } = userObject.addresses; expect(addressesInclude).toEqual({ id: addressesId.toString(), - type: mapProps.get(Addresses)?.typeName, + type: mapPropsService.getParamMap(Addresses)?.typeName, attributes: addressesAttr, links: { - self: `/api/v1/${mapProps.get(Addresses)?.typeName}/${addressesId}`, - }, - relationships: { - user: { - links: { - self: `/api/v${version}/${ - mapProps.get(Addresses)?.typeName - }/${addressesId}/relationships/user`, - }, - }, + self: `/api/v1/${ + mapPropsService.getParamMap(Addresses)?.typeName + }/${addressesId}`, }, + relationships: {}, }); const { id: commentsId } = userObject.comments[0]; + expect(commentsInclude).toEqual({ id: commentsId.toString(), - type: mapProps.get(Comments)?.typeName, + type: mapPropsService.getParamMap(Comments)?.typeName, attributes: query.fields.comments.reduce((acum: any, field: any) => { + // @ts-ignore acum[field] = userObject.comments[0][field]; return acum; }, {}), links: { - self: `/api/v1/${mapProps.get(Comments)?.typeName}/${commentsId}`, + self: `/api/v1/${ + mapPropsService.getParamMap(Comments)?.typeName + }/${commentsId}`, }, relationships: { - createdBy: { + user: { links: { self: `/api/v1/${ - mapProps.get(Comments)?.typeName - }/${commentsId}/relationships/createdBy`, + mapPropsService.getParamMap(Comments)?.typeName + }/${commentsId}/relationships/user`, }, }, }, @@ -481,57 +417,53 @@ describe('JsonApiTransformerService - extractAttributes', () => { expect(managerInclude).toEqual({ id: managerId.toString(), - type: mapProps.get(Users)?.typeName, + type: mapPropsService.getParamMap(Users)?.typeName, attributes: query.fields.manager.reduce((acum: any, field: any) => { + // @ts-ignore acum[field] = userObject.manager[field]; return acum; }, {}), links: { - self: `/api/v1/${mapProps.get(Users)?.typeName}/${managerId}`, + self: `/api/v1/${ + mapPropsService.getParamMap(Users)?.typeName + }/${managerId}`, }, relationships: { addresses: { links: { self: `/api/v1/${ - mapProps.get(Users)?.typeName + mapPropsService.getParamMap(Users)?.typeName }/${managerId}/relationships/addresses`, }, }, manager: { links: { self: `/api/v1/${ - mapProps.get(Users)?.typeName + mapPropsService.getParamMap(Users)?.typeName }/${managerId}/relationships/manager`, }, }, roles: { links: { self: `/api/v1/${ - mapProps.get(Users)?.typeName + mapPropsService.getParamMap(Users)?.typeName }/${managerId}/relationships/roles`, }, }, userGroup: { links: { self: `/api/v1/${ - mapProps.get(Users)?.typeName + mapPropsService.getParamMap(Users)?.typeName }/${managerId}/relationships/userGroup`, }, }, comments: { links: { self: `/api/v1/${ - mapProps.get(Users)?.typeName + mapPropsService.getParamMap(Users)?.typeName }/${managerId}/relationships/comments`, }, }, - notes: { - links: { - self: `/api/v1/${ - mapProps.get(Users)?.typeName - }/${managerId}/relationships/notes`, - }, - }, }, }); }); @@ -541,7 +473,7 @@ describe('JsonApiTransformerService - extractAttributes', () => { const query = { include: [] } as any; const result = service.transformItem(userObject, mapPropsUser, query); - const { id, manager, notes, roles, addresses, ...checkAttr } = userObject; + const { id, manager, roles, addresses, ...checkAttr } = userObject; expect(result).toEqual({ id: userObject.id.toString(), @@ -576,11 +508,6 @@ describe('JsonApiTransformerService - extractAttributes', () => { self: `/api/v1/${mapPropsUser.typeName}/${userObject.id}/relationships/comments`, }, }, - notes: { - links: { - self: `/api/v1/${mapPropsUser.typeName}/${userObject.id}/relationships/notes`, - }, - }, }, }); }); @@ -634,7 +561,7 @@ describe('JsonApiTransformerService - extractAttributes', () => { addresses: { data: { id: userObject.addresses.id.toString(), - type: mapProps.get(Addresses)?.typeName, + type: mapPropsService.getParamMap(Addresses)?.typeName, }, links: { self: `/api/v1/${mapPropsUser.typeName}/${userObject.id}/relationships/addresses`, @@ -662,11 +589,6 @@ describe('JsonApiTransformerService - extractAttributes', () => { self: `/api/v1/${mapPropsUser.typeName}/${userObject.id}/relationships/userGroup`, }, }, - notes: { - links: { - self: `/api/v1/${mapPropsUser.typeName}/${userObject.id}/relationships/notes`, - }, - }, }, }); }); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/json-api-transformer.service.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/json-api-transformer.service.ts index 6cd7bc6b..82a20627 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/json-api-transformer.service.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/json-api-transformer.service.ts @@ -2,51 +2,46 @@ import { Inject, Injectable, VersioningType } from '@nestjs/common'; import { ApplicationConfig } from '@nestjs/core'; import { Attributes, - camelToKebab, - Data, - DataResult, - EntityRelation, Include, - MainData, ObjectTyped, + PropertyKeys, Relationships, ResourceData, ResourceObject, -} from '../../../utils/nestjs-shared'; + BaseMainData, + RelationKeys, + EntityClass, +} from '@klerick/json-api-nestjs-shared'; +import { RoutePathFactory } from '@nestjs/core/router/route-path-factory'; -import { EntityClass, ObjectLiteral } from '../../../types'; -import { ENTITY_MAP_PROPS, CURRENT_ENTITY } from '../../../constants'; -import { - EntityProps, - RelationProperty, - ZodEntityProps, - ZodParams, -} from '../types'; +import { EntityParam } from '../../../types'; import { Query, QueryOne } from '../zod'; -import { RoutePathFactory } from '@nestjs/core/router/route-path-factory'; +import { EntityParamMapService } from './entity-param-map.service'; + +function assertColumnName( + entity: E, + columnName: string +): asserts columnName is keyof EntityClass { + const entityType = entity as EntityClass; + if (!(columnName in entityType)) { + throw new Error(`${columnName} not exist in ${entityType.name}`); + } +} Injectable(); -export class JsonApiTransformerService { +export class JsonApiTransformerService< + E extends object, + IdKey extends string = 'id' +> { @Inject(ApplicationConfig) private applicationConfig!: ApplicationConfig; - @Inject(ENTITY_MAP_PROPS) private entityMapProps!: Map< - EntityClass, - ZodEntityProps - >; - @Inject(CURRENT_ENTITY) private currentEntity!: EntityClass; - - private _urlPath!: string[]; - private _currentMapProps!: ZodEntityProps; - get currentMapProps(): ZodEntityProps { - if (!this._currentMapProps) { - const result = this.entityMapProps.get(this.currentEntity); - if (!result) - throw new Error('Not found map for ' + this.currentEntity.name); + @Inject(EntityParamMapService) + private entityParamMapService!: EntityParamMapService; - this._currentMapProps = result; - } + private _urlPath!: string[]; - return this._currentMapProps; + get currentMapProps(): EntityParam { + return this.entityParamMapService.entityParaMap; } get urlPath() { @@ -77,21 +72,21 @@ export class JsonApiTransformerService { public transformData( data: E, - query: QueryOne - ): Pick, 'data' | 'included'>; + query: QueryOne + ): Pick, 'data' | 'included'>; public transformData( data: E[], - query: Query - ): Pick, 'data' | 'included'>; + query: Query + ): Pick, 'data' | 'included'>; public transformData( data: E | E[], - query: Query + query: Query ): - | Pick, 'data' | 'included'> - | Pick, 'data' | 'included'> { + | Pick, 'data' | 'included'> + | Pick, 'data' | 'included'> { if (Array.isArray(data)) { const resultData: Pick< - ResourceObject, + ResourceObject, 'data' | 'included' > = { data: data.map((item) => @@ -106,7 +101,10 @@ export class JsonApiTransformerService { return resultData; } - const resultData: Pick, 'data' | 'included'> = { + const resultData: Pick< + ResourceObject, + 'data' | 'included' + > = { data: this.transformItem(data, this.currentMapProps, query), }; @@ -117,42 +115,48 @@ export class JsonApiTransformerService { return resultData; } - public transformItem( + public transformItem( item: T, - mapProps: ZodEntityProps, - query: Query - ): ResourceData { + mapProps: EntityParam, + query: Query + ): ResourceData { const { fields } = query; - const target = Reflect.get(fields || {}, 'target'); + const targetField = fields && fields.target ? fields.target : null; + assertColumnName(item, mapProps.primaryColumnName); + const props = ObjectTyped.keys(mapProps.propsType).filter((i) => { + if (i.toString() === mapProps.primaryColumnName.toString()) { + return false; + } + if (!targetField) { + return true; + } + + return (targetField as any[]).includes(i); + }); + return { - id: item[mapProps.primaryColumnName].toString(), + id: `${item[mapProps.primaryColumnName]}`, type: mapProps.typeName, - attributes: this.extractAttributes( - item, - mapProps.props.filter((i) => { - if (i === mapProps.primaryColumnName) { - return false; - } - if (!target) { - return true; - } - - return (target as string[]).includes(i); - }) - ), + attributes: this.extractAttributes(item, props), links: { self: this.getLink(mapProps.typeName, item[mapProps.primaryColumnName]), }, - relationships: this.transformRelationships(item, mapProps, query), + relationships: this.transformRelationships( + item, + mapProps, + query + ), }; } - public transformRel>( + public transformRel>( item: E, rel: Rel - ): DataResult { + ): BaseMainData['data'] { const relProps = Reflect.get(this.currentMapProps.relationProperty, rel); - const relationMapPops = this.entityMapProps.get(relProps.entityClass); + const relationMapPops = this.entityParamMapService.getParamMap( + relProps.entityClass as EntityClass + ); if (!relationMapPops) throw new Error('Not found props map for ' + relProps.entityClass); const props = item[rel]; @@ -161,49 +165,55 @@ export class JsonApiTransformerService { return props.map((i: any) => ({ type: relationMapPops.typeName, id: i[relationMapPops.primaryColumnName].toString(), - })); + })) as BaseMainData['data']; } else { + assertColumnName(item[rel] as any, relationMapPops.primaryColumnName); return props ? ({ type: relationMapPops.typeName, - id: props[relationMapPops.primaryColumnName].toString(), + id: (props[relationMapPops.primaryColumnName] as any).toString(), } as any) : null; } } - public transformRelationships( + public transformRelationships< + T extends object = E, + TIdKey extends string = IdKey + >( item: T, - mapProps: ZodEntityProps, - query: Query - ): Relationships { + mapProps: EntityParam, + query: Query + ): Relationships { const { include } = query; - const includeMap = new Map((include || []).map((i) => [i, true])); + const primaryColumnName = mapProps.primaryColumnName; + assertColumnName(item, primaryColumnName); - return mapProps.relations.reduce((acum, i: keyof RelationProperty) => { - acum[i as keyof Relationships] = { + return ObjectTyped.keys(mapProps.relationProperty).reduce((acum, i) => { + acum[i as keyof Relationships] = { links: { self: this.getLink( mapProps.typeName, - item[mapProps.primaryColumnName], + item[primaryColumnName], 'relationships', - i + i.toString() ), }, }; - if (includeMap.has(i)) { - const relationMapPops = this.entityMapProps.get( - mapProps.relationProperty[i].entityClass + if (includeMap.has(i as any)) { + const relationMapPops = this.entityParamMapService.getParamMap( + mapProps.relationProperty[i].entityClass as EntityClass ); if (!relationMapPops) throw new Error( 'Not found props map for ' + mapProps.relationProperty[i].entityClass.name ); + if (mapProps.relationProperty[i].isArray) { - if (item[i] && Array.isArray(item[i]) && item[i].length > 0) { + if (item[i] && Array.isArray(item[i]) && (item[i] as []).length > 0) { // @ts-expect-error incorrect parse acum[i as keyof Relationships]['data'] = item[i].map( (rel: any) => ({ @@ -216,24 +226,30 @@ export class JsonApiTransformerService { acum[i as keyof Relationships]['data'] = []; } } else { - // @ts-expect-error incorrect parse - acum[i as keyof Relationships]['data'] = item[i] - ? { - id: item[i][relationMapPops.primaryColumnName].toString(), - type: relationMapPops.typeName, - } - : null; + const relPrimaryColumnName = relationMapPops.primaryColumnName; + const relType = item[i] as object; + if (item[i]) { + assertColumnName(relType, relPrimaryColumnName); + // @ts-expect-error incorrect parse + acum[i as keyof Relationships]['data'] = { + id: `${relType[relPrimaryColumnName]}`, + type: relationMapPops.typeName, + }; + } else { + // @ts-expect-error incorrect parse + acum[i as keyof Relationships]['data'] = null; + } } } return acum; - }, {} as Relationships); + }, {} as Relationships); } - public extractAttributes( + public extractAttributes( item: T, - fields: (keyof T)[] - ): Attributes { + fields: PropertyKeys[] + ): Attributes { const mapFields = fields.reduce((acum, field) => { acum[field.toString()] = true; return acum; @@ -244,13 +260,13 @@ export class JsonApiTransformerService { acum[name] = value; } return acum; - }, {} as Attributes); + }, {} as Attributes); } - public extractIncluded( + public extractIncluded( data: T[], - query: Query - ): Include[] { + query: Query + ): Include[] { const includeArray: any[] = []; const { include } = query; if (!include) return []; @@ -258,15 +274,15 @@ export class JsonApiTransformerService { const relationProps = this.currentMapProps.relationProperty[relationPropsFromInclude]; if (!relationProps) continue; - const relationMapProp = this.entityMapProps.get( - relationProps.entityClass + const relationMapProp = this.entityParamMapService.getParamMap( + relationProps.entityClass as EntityClass ); if (!relationMapProp) throw new Error( 'Not found props for relation ' + relationPropsFromInclude + 'in' + - this.currentEntity.name + this.currentMapProps.className ); const { fields } = query; @@ -281,7 +297,7 @@ export class JsonApiTransformerService { target: selectFieldForInclude && Array.isArray(selectFieldForInclude) && - selectFieldForInclude.length > 0 + (selectFieldForInclude as []).length > 0 ? selectFieldForInclude : null, }, @@ -294,19 +310,19 @@ export class JsonApiTransformerService { if (Array.isArray(propRel)) { for (const i of propRel as any) { includeArray.push( - this.transformItem( + this.transformItem( i, - relationMapProp as unknown as ZodEntityProps, - queryForInclude as Query + relationMapProp as unknown as EntityParam, + queryForInclude as Query ) ); } } else { includeArray.push( - this.transformItem( + this.transformItem( propRel, - relationMapProp as unknown as ZodEntityProps, - queryForInclude as Query + relationMapProp as unknown as EntityParam, + queryForInclude as Query ) ); } diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/filter-operand-model.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/filter-operand-model.ts index c5ae1563..a71b36ee 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/filter-operand-model.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/filter-operand-model.ts @@ -1,5 +1,5 @@ import { ApiProperty } from '@nestjs/swagger'; -import { FilterOperand as FilterOperandType } from '../../../utils/nestjs-shared'; +import { FilterOperand as FilterOperandType } from '@klerick/json-api-nestjs-shared'; const title = 'is equal to the conditional of query'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/delete-one.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/delete-one.ts index 0a1d527f..0674f646 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/delete-one.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/delete-one.ts @@ -1,20 +1,21 @@ import { Type } from '@nestjs/common'; import { ApiOperation, ApiParam, ApiResponse } from '@nestjs/swagger'; +import { EntityClass } from '@klerick/json-api-nestjs-shared'; -import { TypeField, ZodEntityProps } from '../../types'; -import { EntityClass, ObjectLiteral } from '../../../../types'; -import { errorSchema, getEntityMapProps } from '../utils'; +import { TypeField } from '../../../../types'; +import { errorSchema } from '../utils'; +import { EntityParamMapService } from '../../service'; -export function deleteOne( +export function deleteOne( controller: Type, descriptor: PropertyDescriptor, entity: EntityClass, - mapEntity: Map, ZodEntityProps>, + mapEntity: EntityParamMapService, methodName: string ) { const entityName = entity.name; - const { primaryColumnType } = getEntityMapProps(mapEntity, entity); + const { primaryColumnType } = mapEntity.getParamMap(entity); ApiParam({ name: 'id', diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/delete-relationship.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/delete-relationship.ts index 2b1c2b8b..7b236c2e 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/delete-relationship.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/delete-relationship.ts @@ -1,31 +1,35 @@ import { ApiBody, ApiOperation, ApiParam, ApiResponse } from '@nestjs/swagger'; import { generateSchema } from '@anatine/zod-openapi'; import { Type } from '@nestjs/common'; +import { EntityClass } from '@klerick/json-api-nestjs-shared'; -import { EntityClass, ObjectLiteral } from '../../../../types'; -import { TypeField, ZodEntityProps } from '../../types'; +import { TypeField } from '../../../../types'; import { zodPatchRelationship } from '../../zod'; -import { errorSchema, getEntityMapProps } from '../utils'; +import { errorSchema } from '../utils'; import { ReferenceObject, SchemaObject, } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; +import { EntityParamMapService } from '../../service'; -export function deleteRelationship( +export function deleteRelationship< + E extends object, + IdKey extends string = 'id' +>( controller: Type, descriptor: PropertyDescriptor, entity: EntityClass, - mapEntity: Map, ZodEntityProps>, + mapEntity: EntityParamMapService, methodName: string ) { const entityName = entity.name; - const { relations, primaryColumnType } = getEntityMapProps(mapEntity, entity); + const { relations, primaryColumnType } = mapEntity.getParamMap(entity); ApiOperation({ summary: `Delete list of relation for resource "${entityName}"`, - operationId: `${controller.name}_${methodName}`, + operationId: `${controller.constructor.name}_${methodName}`, })(controller, methodName, descriptor); ApiParam({ @@ -39,7 +43,7 @@ export function deleteRelationship( name: 'relName', required: true, type: 'string', - enum: relations, + enum: relations as any, description: `Relation name of resource "${entityName}"`, })(controller, methodName, descriptor); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-all.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-all.ts index 772290dd..555d0dc4 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-all.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-all.ts @@ -1,25 +1,36 @@ import { ApiOperation, ApiQuery, ApiResponse } from '@nestjs/swagger'; import { Type } from '@nestjs/common'; -import { ObjectTyped } from '../../../../utils/nestjs-shared'; +import { + ObjectTyped, + EntityClass, + FilterOperand, +} from '@klerick/json-api-nestjs-shared'; -import { EntityClass, ObjectLiteral } from '../../../../types'; -import { ZodEntityProps } from '../../types'; -import { errorSchema, getEntityMapProps, jsonSchemaResponse } from '../utils'; +import { + assertIsKeysOfObject, + errorSchema, + jsonSchemaResponse, +} from '../utils'; import { DEFAULT_PAGE_SIZE, DEFAULT_QUERY_PAGE } from '../../../../constants'; +import { EntityParamMapService } from '../../service'; -export function getAll( +export function getAll( controller: Type, descriptor: PropertyDescriptor, entity: EntityClass, - mapEntity: Map, ZodEntityProps>, + mapEntity: EntityParamMapService, methodName: string ): void { const { props, relations, relationProperty, primaryColumnName } = - getEntityMapProps(mapEntity, entity); + mapEntity.getParamMap(entity); + + assertIsKeysOfObject(entity, props); + assertIsKeysOfObject(entity, relations); + const entityRelationStructure = {} as any; const relationTree = ObjectTyped.entries(relationProperty).reduce( (acum, [name, props]) => { - const relMap = getEntityMapProps(mapEntity, props.entityClass); + const relMap = mapEntity.getParamMap(props.entityClass as any); acum.push(...relMap.props.map((i) => `${name.toLocaleString()}.${i}`)); entityRelationStructure[name] = relMap.props; return acum; @@ -65,13 +76,44 @@ export function getAll( }, description: `Object of field for select field from "${entity.name}" resource`, })(controller, methodName, descriptor); - + // https://github.com/OAI/OpenAPI-Specification/issues/1706#issuecomment-2704374644 need wait fix deepObject ApiQuery({ name: 'filter', required: false, style: 'deepObject', schema: { type: 'object', + properties: { + ...props.reduce((acum, i) => { + Reflect.set(acum, String(i), { + type: 'object', + properties: Object.keys(FilterOperand).reduce((acum, name) => { + Reflect.set(acum, String(name), { + type: 'string', + }); + return acum; + }, {}), + minProperties: 1, + additionalProperties: false, + }); + return acum; + }, {}), + ...relationTree.reduce((acum, i) => { + Reflect.set(acum, String(i), { + type: 'object', + properties: Object.keys(FilterOperand).reduce((acum, name) => { + Reflect.set(acum, String(name), { + type: 'string', + }); + return acum; + }, {}), + minProperties: 1, + additionalProperties: false, + }); + return acum; + }, {}), + }, + additionalProperties: false, }, examples: { simpleExample: { @@ -125,14 +167,14 @@ export function getAll( let sortSeveral = { summary: 'Sort several field', description: 'Sort several field', - value: `${props[1]},-${props[0]}`, + value: `${String(props[1])},-${String(props[0])}`, }; if (relations.length > 0) { ApiQuery({ name: 'include', required: false, - enum: relations, + enum: relations as any, style: 'simple', isArray: true, description: `"${entity.name}" resource item has been extended with existing relations`, @@ -163,7 +205,9 @@ export function getAll( sortSeveral = { summary: 'Sort several field with relation', description: 'Sort several field relation', - value: `${props[1]},-${relationTree[2]},${relationTree[1]},-${props[0]}`, + value: `${String(props[1])},-${relationTree[2]},${ + relationTree[1] + },-${String(props[0])}`, }; } @@ -181,7 +225,7 @@ export function getAll( sortDesc: { summary: 'Sort field by DESC', description: 'Sort field by DESC', - value: `-${props[1]}`, + value: `-${String(props[1])}`, }, sortAscRelation, sortDescRelation, @@ -195,16 +239,20 @@ export function getAll( required: false, schema: { type: 'object', + examples: [ + { + number: DEFAULT_QUERY_PAGE, + size: DEFAULT_PAGE_SIZE, + }, + ], properties: { number: { type: 'integer', minimum: 1, - example: DEFAULT_QUERY_PAGE, }, size: { type: 'integer', minimum: 1, - example: DEFAULT_PAGE_SIZE, maximum: 500, }, }, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-one.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-one.ts index 05fdb3d7..b3b1b303 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-one.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-one.ts @@ -1,16 +1,16 @@ import { ApiOperation, ApiParam, ApiQuery, ApiResponse } from '@nestjs/swagger'; -import { ObjectTyped } from '../../../../utils/nestjs-shared'; +import { ObjectTyped, EntityClass } from '@klerick/json-api-nestjs-shared'; import { Type } from '@nestjs/common'; -import { TypeField, ZodEntityProps } from '../../types'; -import { errorSchema, getEntityMapProps, jsonSchemaResponse } from '../utils'; -import { EntityClass, ObjectLiteral } from '../../../../types'; +import { errorSchema, jsonSchemaResponse } from '../utils'; +import { TypeField } from '../../../../types'; +import { EntityParamMapService } from '../../service'; -export function getOne( +export function getOne( controller: Type, descriptor: PropertyDescriptor, entity: EntityClass, - mapEntity: Map, ZodEntityProps>, + mapEntity: EntityParamMapService, methodName: string ) { const entityName = entity.name; @@ -21,11 +21,11 @@ export function getOne( relationProperty, primaryColumnName, primaryColumnType, - } = getEntityMapProps(mapEntity, entity); + } = mapEntity.getParamMap(entity); const entityRelationStructure = ObjectTyped.entries(relationProperty).reduce( (acum, [name, props]) => { - const relMap = getEntityMapProps(mapEntity, props.entityClass); + const relMap = mapEntity.getParamMap(props.entityClass as any); acum[name] = relMap.props; return acum; }, @@ -81,7 +81,7 @@ export function getOne( ApiQuery({ name: 'include', required: false, - enum: relations, + enum: relations as any, style: 'simple', isArray: true, description: `"${entity.name}" resource item has been extended with existing relations`, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-relationship.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-relationship.ts index ce881025..2ed9b4ff 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-relationship.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-relationship.ts @@ -1,24 +1,21 @@ import { Type } from '@nestjs/common'; import { ApiOperation, ApiParam, ApiResponse } from '@nestjs/swagger'; +import { EntityClass } from '@klerick/json-api-nestjs-shared'; -import { EntityClass, ObjectLiteral } from '../../../../types'; -import { TypeField, ZodEntityProps } from '../../types'; -import { - errorSchema, - getEntityMapProps, - schemaTypeForRelation, -} from '../utils'; +import { TypeField } from '../../../../types'; +import { errorSchema, schemaTypeForRelation } from '../utils'; +import { EntityParamMapService } from '../../service'; -export function getRelationship( +export function getRelationship( controller: Type, descriptor: PropertyDescriptor, entity: EntityClass, - mapEntity: Map, ZodEntityProps>, + mapEntity: EntityParamMapService, methodName: string ) { const entityName = entity.name; - const { relations, primaryColumnType } = getEntityMapProps(mapEntity, entity); + const { relations, primaryColumnType } = mapEntity.getParamMap(entity); ApiOperation({ summary: `Get list of relation for resource "${entityName}"`, @@ -36,7 +33,7 @@ export function getRelationship( name: 'relName', required: true, type: 'string', - enum: relations, + enum: relations as any, description: `Relation name of resource "${entityName}"`, })(controller, methodName, descriptor); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/index.ts index 61a4005f..404cbe19 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/index.ts @@ -9,7 +9,6 @@ import { postRelationship } from './post-relationship'; import { patchRelationship } from './patch-relationship'; import { OrmService } from '../../types'; -import { ObjectLiteral } from '../../../../types'; export const swaggerMethod = { getAll, @@ -23,6 +22,6 @@ export const swaggerMethod = { patchRelationship, } as const; -export type SwaggerMethod = { +export type SwaggerMethod = { [Key in keyof OrmService]?: (typeof swaggerMethod)[Key]; }; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/patch-one.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/patch-one.ts index 24113795..49bde0b6 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/patch-one.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/patch-one.ts @@ -5,32 +5,24 @@ import { } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; import { ApiBody, ApiOperation, ApiParam, ApiResponse } from '@nestjs/swagger'; import { generateSchema } from '@anatine/zod-openapi'; +import { EntityClass } from '@klerick/json-api-nestjs-shared'; + +import { TypeField } from '../../../../types'; -import { EntityClass, ObjectLiteral } from '../../../../types'; -import { TypeField, ZodEntityProps } from '../../types'; import { errorSchema, jsonSchemaResponse } from '../utils'; import { zodPatch } from '../../zod'; -import { getParamsForOatchANdPostZod } from '../../factory'; +import { EntityParamMapService } from '../../service'; -export function patchOne( +export function patchOne( controller: Type, descriptor: PropertyDescriptor, entity: EntityClass, - mapEntity: Map, ZodEntityProps>, + mapEntity: EntityParamMapService, methodName: string ) { const entityName = entity.name; - const { - primaryColumnType, - typeName, - fieldWithType, - propsDb, - primaryColumnName, - relationArrayProps, - relationPopsName, - primaryColumnTypeForRel, - } = getParamsForOatchANdPostZod(mapEntity, entity); + const primaryColumnType = mapEntity.entityParaMap.primaryColumnType; ApiOperation({ summary: `Update item of resource "${entityName}"`, @@ -46,18 +38,9 @@ export function patchOne( ApiBody({ description: `Json api schema for update "${entityName}" item`, - schema: generateSchema( - zodPatch( - primaryColumnType, - typeName, - fieldWithType, - propsDb, - primaryColumnName, - relationArrayProps, - relationPopsName, - primaryColumnTypeForRel - ) - ) as SchemaObject | ReferenceObject, + schema: generateSchema(zodPatch(mapEntity)) as + | SchemaObject + | ReferenceObject, required: true, })(controller, methodName, descriptor); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/patch-relationship.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/patch-relationship.ts index 9301fd62..ef3d1a0a 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/patch-relationship.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/patch-relationship.ts @@ -5,26 +5,26 @@ import { } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; import { generateSchema } from '@anatine/zod-openapi'; import { Type } from '@nestjs/common'; +import { EntityClass } from '@klerick/json-api-nestjs-shared'; -import { EntityClass, ObjectLiteral } from '../../../../types'; -import { TypeField, ZodEntityProps } from '../../types'; -import { - errorSchema, - getEntityMapProps, - schemaTypeForRelation, -} from '../utils'; +import { TypeField } from '../../../../types'; +import { errorSchema, schemaTypeForRelation } from '../utils'; import { zodPatchRelationship } from '../../zod'; +import { EntityParamMapService } from '../../service'; -export function patchRelationship( +export function patchRelationship< + E extends object, + IdKey extends string = 'id' +>( controller: Type, descriptor: PropertyDescriptor, entity: EntityClass, - mapEntity: Map, ZodEntityProps>, + mapEntity: EntityParamMapService, methodName: string ) { const entityName = entity.name; - const { relations, primaryColumnType } = getEntityMapProps(mapEntity, entity); + const { relations, primaryColumnType } = mapEntity.getParamMap(entity); ApiOperation({ summary: `Update list of relation for resource "${entityName}"`, @@ -42,7 +42,7 @@ export function patchRelationship( name: 'relName', required: true, type: 'string', - enum: relations, + enum: relations as any, description: `Relation name of resource "${entityName}"`, })(controller.prototype, methodName, descriptor); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/post-one.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/post-one.ts index 10c35021..8c30a776 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/post-one.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/post-one.ts @@ -5,31 +5,20 @@ import { SchemaObject, } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; import { Type } from '@nestjs/common'; +import { EntityClass } from '@klerick/json-api-nestjs-shared'; -import { EntityClass, ObjectLiteral } from '../../../../types'; -import { ZodEntityProps } from '../../types'; import { errorSchema, jsonSchemaResponse } from '../utils'; import { zodPost } from '../../zod'; -import { getParamsForOatchANdPostZod } from '../../factory'; +import { EntityParamMapService } from '../../service'; -export function postOne( +export function postOne( controller: Type, descriptor: PropertyDescriptor, entity: EntityClass, - mapEntity: Map, ZodEntityProps>, + mapEntity: EntityParamMapService, methodName: string ) { const entityName = entity.name; - const { - primaryColumnType, - typeName, - fieldWithType, - propsDb, - primaryColumnName, - relationArrayProps, - relationPopsName, - primaryColumnTypeForRel, - } = getParamsForOatchANdPostZod(mapEntity, entity); ApiOperation({ summary: `Create item of resource "${entityName}"`, @@ -38,18 +27,9 @@ export function postOne( ApiBody({ description: `Json api schema for new "${entityName}" item`, - schema: generateSchema( - zodPost( - primaryColumnType, - typeName, - fieldWithType, - propsDb, - primaryColumnName, - relationArrayProps, - relationPopsName, - primaryColumnTypeForRel - ) - ) as SchemaObject | ReferenceObject, + schema: generateSchema(zodPost(mapEntity)) as + | SchemaObject + | ReferenceObject, required: true, })(controller, methodName, descriptor); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/post-relationship.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/post-relationship.ts index 3e9fe208..58e6967b 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/post-relationship.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/post-relationship.ts @@ -5,26 +5,23 @@ import { SchemaObject, } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; import { ApiBody, ApiOperation, ApiParam, ApiResponse } from '@nestjs/swagger'; +import { EntityClass } from '@klerick/json-api-nestjs-shared'; -import { - errorSchema, - getEntityMapProps, - schemaTypeForRelation, -} from '../utils'; +import { errorSchema, schemaTypeForRelation } from '../utils'; import { zodPatchRelationship } from '../../zod'; -import { TypeField, ZodEntityProps } from '../../types'; -import { EntityClass, ObjectLiteral } from '../../../../types'; +import { TypeField } from '../../../../types'; +import { EntityParamMapService } from '../../service'; -export function postRelationship( +export function postRelationship( controller: Type, descriptor: PropertyDescriptor, entity: EntityClass, - mapEntity: Map, ZodEntityProps>, + mapEntity: EntityParamMapService, methodName: string ) { const entityName = entity.name; - const { relations, primaryColumnType } = getEntityMapProps(mapEntity, entity); + const { relations, primaryColumnType } = mapEntity.getParamMap(entity); ApiParam({ name: 'id', @@ -37,7 +34,7 @@ export function postRelationship( name: 'relName', required: true, type: 'string', - enum: relations, + enum: relations as any, description: `Relation name of resource "${entityName}"`, })(controller, methodName, descriptor); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/swagger-bind.service.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/swagger-bind.service.ts index 383607b3..78691e5e 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/swagger-bind.service.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/swagger-bind.service.ts @@ -2,52 +2,45 @@ import { Injectable, OnModuleInit, Inject } from '@nestjs/common'; import { DECORATORS } from '@nestjs/swagger/dist/constants'; import { ApiExtraModels, ApiTags } from '@nestjs/swagger'; import { DiscoveryService } from '@nestjs/core'; -import { ObjectTyped } from '../../../utils/nestjs-shared'; +import { ObjectTyped, EntityClass } from '@klerick/json-api-nestjs-shared'; import { PARAMTYPES_METADATA } from '@nestjs/common/constants'; import { - CONTROL_OPTIONS_TOKEN, + CONTROLLER_OPTIONS_TOKEN, CURRENT_ENTITY, JSON_API_CONTROLLER_POSTFIX, JSON_API_DECORATOR_ENTITY, - PARAMS_FOR_ZOD_SCHEMA, - ENTITY_MAP_PROPS, } from '../../../constants'; -import { getProviderName, nameIt } from '../helper'; -import { JsonBaseController } from '../controller/json-base.controller'; -import { EntityClass, ObjectLiteral } from '../../../types'; -import { - DecoratorOptions, - EntityProps, - ZodEntityProps, - ZodParams, -} from '../types'; +import { getProviderName, nameIt } from '../helpers'; +import { JsonBaseController } from '../controllers'; +import { DecoratorOptions } from '../types'; import { FilterOperand } from './filter-operand-model'; import { createApiModels } from './utils'; import { Bindings } from '../config/bindings'; import { swaggerMethod } from './method'; +import { EntityParamMapService } from '../service'; @Injectable() -export class SwaggerBindService +export class SwaggerBindService implements OnModuleInit { @Inject(CURRENT_ENTITY) private entity!: EntityClass; @Inject(DiscoveryService) private discoveryService!: DiscoveryService; - @Inject(CONTROL_OPTIONS_TOKEN) private config!: DecoratorOptions; + @Inject(CONTROLLER_OPTIONS_TOKEN) private config!: DecoratorOptions; - @Inject(ENTITY_MAP_PROPS) private mapEntity!: Map< - EntityClass, - ZodEntityProps + @Inject(EntityParamMapService) private mapEntity!: EntityParamMapService< + E, + IdKey >; - onModuleInit(): any { + onModuleInit() { this.initSwagger(); } public initSwagger() { const controllerName = nameIt( - getProviderName(this.entity.name, JSON_API_CONTROLLER_POSTFIX), + getProviderName(this.entity, JSON_API_CONTROLLER_POSTFIX), JsonBaseController ).name; @@ -65,7 +58,7 @@ export class SwaggerBindService if (!controllerInst) throw new Error(`Controller for ${this.entity.name} is empty`); - const mapProps = this.mapEntity.get(this.entity); + const mapProps = this.mapEntity.getParamMap(this.entity); if (!mapProps) throw new Error(`ZodEntityProps for ${this.entity.name} is empty`); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/utils.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/utils.ts index 85607ea1..2e5e0c06 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/utils.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/utils.ts @@ -2,12 +2,33 @@ import { ApiProperty } from '@nestjs/swagger'; import { SchemaObject } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; import { ObjectTyped, - EntityRelation, - camelToKebab, -} from '../../../utils/nestjs-shared'; + AnyEntity, + EntityClass, + PropertyKeys, +} from '@klerick/json-api-nestjs-shared'; +import { kebabCase } from 'change-case-commonjs'; -import { EntityProps, TypeField, ZodEntityProps, ZodParams } from '../types'; -import { EntityClass, ObjectLiteral } from '../../../types'; +import { EntityParam, RelationProperty, TypeField } from '../../../types'; + +import { EntityParamMap } from '../types'; +import { EntityParamMapService } from '../service'; + +export function assertIsKeysOfObject( + object: EntityClass, + element: any +): asserts element is readonly [keyof E] { + if (!Array.isArray(element)) { + throw new Error(element + ' is not keys of ' + object.name); + } + if (false) throw new Error(element + ' not exist in ' + object.name); +} + +export function assertIsKeyOfObject( + object: EntityClass, + element: unknown +): asserts element is PropertyKeys { + if (false) throw new Error(element + 'not exist in ' + object.name); +} export const errorSchema = { type: 'object', @@ -48,20 +69,24 @@ export const errorSchema = { }, }; -export function jsonSchemaResponse( +export function jsonSchemaResponse< + E extends object, + IdKey extends string = 'id' +>( entity: EntityClass, - mapEntity: Map, ZodEntityProps>, + mapEntity: EntityParamMapService, array = false ) { const { propsType, relations, relationProperty, primaryColumnName } = - getEntityMapProps(mapEntity, entity); + mapEntity.getParamMap(entity); + assertIsKeysOfObject(entity, relations); const dataType = { type: 'object', properties: { type: { type: 'string', - const: camelToKebab(entity.name), + const: kebabCase(entity.name), }, id: { type: 'string', @@ -71,6 +96,7 @@ export function jsonSchemaResponse( properties: ObjectTyped.entries(propsType) .filter(([name]) => name !== primaryColumnName) .reduce((acum, [name, type]) => { + assertIsKeyOfObject(entity, name); switch (type) { case TypeField.array: acum[name.toString()] = { @@ -106,15 +132,16 @@ export function jsonSchemaResponse( }, relationships: { type: 'object', - properties: relations.reduce((acum, name) => { + properties: ObjectTyped.keys( + relationProperty as RelationProperty> + ).reduce((acum, name) => { const dataItem = { type: 'object', properties: { type: { type: 'string', - const: getEntityMapProps( - mapEntity, - Reflect.get(relationProperty, name).entityClass + const: mapEntity.getParamMap( + Reflect.get(relationProperty, name).entityClass as any ).typeName, }, id: { @@ -127,7 +154,7 @@ export function jsonSchemaResponse( type: 'array', items: dataItem, }; - acum[name.toString()] = { + acum[name] = { type: 'object', properties: { links: { @@ -221,19 +248,25 @@ export function jsonSchemaResponse( }; } -export function createApiModels( +export function createApiModels( entity: EntityClass, - mapEntity: ZodEntityProps + mapEntity: EntityParam ): EntityClass { const { propsType, props, relations, propsNullable, relationProperty } = mapEntity; + assertIsKeysOfObject(entity, propsNullable); + assertIsKeysOfObject(entity, relations); for (const name of props) { let currentType: any; let required = false; let isArray = false; - required = !(propsNullable as any).includes(name); - const type = Reflect.get(propsType, name); + + assertIsKeyOfObject(entity, name); + + required = !propsNullable.includes(name); + + const type = propsType[name]; isArray = type === 'array'; switch (type) { case TypeField.date: @@ -248,7 +281,7 @@ export function createApiModels( default: currentType = String; } - if (relations.includes(name as string)) { + if (relations.includes(name)) { const propsRel = Reflect.get(relationProperty, name); currentType = propsRel.entityClass; isArray = propsRel.isArray; @@ -300,8 +333,8 @@ export const schemaTypeForRelation = { }, }; -export function getEntityMapProps( - mapEntity: Map, ZodEntityProps>, +export function getEntityMapProps( + mapEntity: EntityParamMap>, entity: EntityClass ) { const entityMap = mapEntity.get(entity); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/binding.types.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/binding.type.ts similarity index 71% rename from libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/binding.types.ts rename to libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/binding.type.ts index eebff2fc..d3deadfa 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/binding.types.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/binding.type.ts @@ -1,8 +1,9 @@ -import { PipeTransform, RequestMethod } from '@nestjs/common'; import { Type } from '@nestjs/common/interfaces'; -import { PipeFabric } from './module.types'; -import { JsonBaseController } from '../controller/json-base.controller'; -import { ObjectLiteral } from '../../../types'; +import { PipeTransform, RequestMethod } from '@nestjs/common'; +import { AnyEntity, EntityClass } from '@klerick/json-api-nestjs-shared'; +import { JsonBaseController } from '../controllers'; +import { PipeMixin } from '../../../types'; +import { EntityControllerParam } from './decorator-options.type'; export type MethodName = | 'getAll' @@ -27,11 +28,16 @@ type MapNameToTypeMethod = { getRelationship: RequestMethod.GET; }; +export type PipeFabric = >( + entity: Entity, + config?: EntityControllerParam +) => PipeMixin; + export interface Binding { path: string; method: MapNameToTypeMethod[T]; name: T; - implementation: JsonBaseController[T]; + implementation: JsonBaseController[T]; parameters: { decorator: ( property?: string, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/decorator-options.type.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/decorator-options.type.ts new file mode 100644 index 00000000..ea545b87 --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/decorator-options.type.ts @@ -0,0 +1,15 @@ +import { MethodName } from './binding.type'; + +import { PrepareParams } from '../../../types'; + +type ControllerOptions = { + allowMethod: Array; + overrideRoute: string; +}; + +export type DecoratorOptions> = Partial< + ControllerOptions & Omit['options'], 'operationUrl'> +>; + +export type EntityControllerParam> = + PrepareParams['options'] & DecoratorOptions; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/decorator-options.types.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/decorator-options.types.ts deleted file mode 100644 index 4911b5dd..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/decorator-options.types.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { MethodName } from './binding.types'; - -import { RequiredFromPartial, ConfigParam } from '../../../types'; -import { MicroOrmParam } from '../../micro-orm'; -import { TypeOrmParam } from '../../type-orm'; - -export type DecoratorOptions = Partial< - { - allowMethod: Array; - } & RequiredFromPartial ->; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/index.ts index d3876db6..25e600cf 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/index.ts @@ -1,6 +1,11 @@ -export * from './module.types'; -export * from './decorator-options.types'; -export * from './binding.types'; -export * from './utils'; -export * from './zod-types'; +export * from './binding.type'; +export * from './decorator-options.type'; export * from './orm-service.type'; +export * from './module.type'; +export type JSONValue = + | string + | number + | boolean + | null + | { [x: string]: JSONValue } + | Array; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/module.type.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/module.type.ts new file mode 100644 index 00000000..e4f60eda --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/module.type.ts @@ -0,0 +1,18 @@ +import { EntityClass } from '@klerick/json-api-nestjs-shared'; +import { EntityParam } from '../../../types'; + +export type EntityParamMap = Map>; + +export type CheckRelationName = ( + entity: EntityClass, + params: string +) => boolean; + +export type FindOneRowEntity = ( + entity: EntityClass, + params: number | string +) => Promise; + +export type RunInTransaction< + F extends (...arg: any[]) => Promise = (...arg: any[]) => Promise +> = (arg: F) => ReturnType; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/module.types.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/module.types.ts deleted file mode 100644 index 768387c6..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/module.types.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { - AnyEntity, - EntityName, - NestImport, - NestController, - RequiredFromPartial, - ConfigParam, - PipeMixin, - ExtractNestType, - ResultModuleOptions, -} from '../../../types'; -import { MicroOrmParam } from '../../micro-orm'; -import { TypeOrmParam } from '../../type-orm'; - -type Controller = ExtractNestType; - -export interface MixinOptions { - entity: EntityName; - controller: Controller | undefined; - config: RequiredFromPartial; - imports: NestImport; - ormModule: ResultModuleOptions['type']; -} - -export type PipeFabric = >( - entity: Entity, - config?: MixinOptions['config'] -) => PipeMixin; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/orm-service.type.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/orm-service.type.ts index 546a8303..21ee0f36 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/orm-service.type.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/orm-service.type.ts @@ -1,10 +1,9 @@ -import { EntityTarget, ObjectLiteral } from '../../../types'; - import { - EntityRelation, ResourceObject, ResourceObjectRelationships, -} from '../../../utils/nestjs-shared'; + RelationKeys, +} from '@klerick/json-api-nestjs-shared'; + import { PatchData, PatchRelationshipData, @@ -14,42 +13,42 @@ import { QueryOne, } from '../zod'; -export interface OrmService { - getAll(query: Query): Promise>; - getOne(id: number | string, query: QueryOne): Promise>; +export interface OrmService { + getAll( + query: Query + ): Promise>; + getOne( + id: number | string, + query: QueryOne + ): Promise>; deleteOne(id: number | string): Promise; - postOne(inputData: PostData): Promise>; patchOne( id: number | string, - inputData: PatchData - ): Promise>; - getRelationship>( + inputData: PatchData + ): Promise>; + postOne( + inputData: PostData + ): Promise>; + + getRelationship>( id: number | string, rel: Rel - ): Promise>; - postRelationship>( + ): Promise>; + postRelationship>( id: number | string, rel: Rel, input: PostRelationshipData - ): Promise>; - deleteRelationship>( + ): Promise>; + + deleteRelationship>( id: number | string, rel: Rel, input: PostRelationshipData ): Promise; - patchRelationship>( + + patchRelationship>( id: number | string, rel: Rel, input: PatchRelationshipData - ): Promise>; + ): Promise>; } - -export type FindOneRowEntity = ( - entity: EntityTarget, - params: number | string -) => Promise; - -export type CheckRelationNme = ( - entity: EntityTarget, - params: string -) => boolean; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/utils.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/utils.ts deleted file mode 100644 index c254ca95..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/utils.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { Type } from '@nestjs/common/interfaces'; - -import { - EntityField, - EntityRelation, - TypeOfArray, - EntityProps, -} from '../../../utils/nestjs-shared'; - -import { ObjectLiteral as Entity } from '../../../types'; - -export { EntityField, EntityProps, EntityRelation, TypeOfArray }; - -export type EntityPropsArray = { - [P in keyof T]: T[P] extends EntityField - ? IsArray extends true - ? P - : never - : never; -}[keyof T]; - -type UnionToIntersection = ( - U extends never ? never : (arg: U) => never -) extends (arg: infer I) => void - ? I - : never; - -export type UnionToTupleMain = UnionToIntersection< - T extends never ? never : (t: T) => T -> extends (_: never) => infer W - ? UnionToTupleMain, [...A, W]> - : A; - -export type UnionToTuple = UnionToTupleMain extends readonly [ - string, - ...string[] -] - ? UnionToTupleMain - : never; - -export type TypeCast = A extends T ? A : never; - -export type CastProps = K extends keyof E ? E[K] : never; - -export type TypeFromType = T extends Type ? A : never; - -export type ConcatStringArray = T extends [ - infer F extends string, - ...infer R extends string[] -] - ? `${F}${ConcatStringArray}` - : ''; - -export type Concat = ConcatStringArray< - [E, '.', F] ->; - -export type ValueOf = T[keyof T]; - -export type JSONValue = - | string - | number - | boolean - | null - | { [x: string]: JSONValue } - | Array; - -export type IsArray = [Extract] extends [never] ? false : true; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/zod-types.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/zod-types.ts deleted file mode 100644 index c6298320..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/zod-types.ts +++ /dev/null @@ -1,179 +0,0 @@ -import { Type } from '@nestjs/common'; -import { z } from 'zod'; - -import { - EntityProps, - EntityRelation, - UnionToTuple, - CastProps, - TypeOfArray, - EntityPropsArray, - IsArray, -} from './utils'; -import { - EntityTarget, - ObjectLiteral as Entity, - ObjectLiteral, -} from '../../../types'; -import { Collection } from '@mikro-orm/core'; - -export enum PropsNameResultField { - field = 'field', - relations = 'relations', -} - -export type ResultGetField = { - [PropsNameResultField.field]: TupleOfEntityProps; - [PropsNameResultField.relations]: TupleOfEntityRelation; -}; - -export type TupleOfEntityProps< - E, - Props = UnionToTuple> -> = Props extends readonly [string, ...string[]] ? Props : never; -export type TupleOfEntityRelation< - E, - Props = UnionToTuple> -> = Props extends readonly [string, ...string[]] ? Props : never; - -export type RelationTree = { - [K in keyof RelationType]: TypeOfArray extends Entity - ? ResultGetField>['field'] - : never; -}; - -export type RelationType = { - [K in EntityRelation]: Type>>; -}; - -export type ZodInfer any> = z.infer>; - -export type GetFieldForEntity = ( - entity: EntityTarget -) => ResultGetField; - -export type ZodParams< - E extends Entity, - P extends EntityProps, - I = string -> = { - entityFieldsStructure: ResultGetField; - entityRelationStructure: RelationTree; - propsArray: ArrayPropsForEntity; - propsType: AllFieldWithType; - typeId: TypeForId; - typeName: I; - fieldWithType: FieldWithType; - propsDb: PropsForField; - primaryColumn: P; - relationArrayProps: RelationPropsArray; - relationPopsName: RelationPropsTypeName; - primaryColumnType: RelationPrimaryColumnType; -}; - -export type PropsArray = { [K in EntityPropsArray]: true }; - -export type ArrayPropsForEntity = { - target: PropsArray; -} & { - [K in ResultGetField['relations'][number]]: PropsArray< - TypeOfArray> - >; -}; - -export enum TypeField { - array = 'array', - date = 'date', - number = 'number', - boolean = 'boolean', - string = 'string', - object = 'object', -} -export type TypeForId = Extract; - -export type FieldWithType = { - [K in EntityProps]: IsArray extends true - ? TypeField.array - : E[K] extends Date - ? TypeField.date - : E[K] extends number - ? TypeField.number - : E[K] extends boolean - ? TypeField.boolean - : E[K] extends object - ? TypeField.object - : TypeField.string; -}; - -export type AllFieldWithType = FieldWithType & { - [K in EntityRelation]: E[K] extends (infer U extends Entity)[] - ? FieldWithType - : E[K] extends Entity - ? FieldWithType - : never; -}; - -export type PropsForField = { - [K in EntityProps]: PropsFieldItem; -} & { - [K in EntityRelation]: PropsFieldItem; -}; - -export type ColumnType = - | T - | typeof Number - | typeof Date - | typeof Boolean; - -export type PropsFieldItem = { - type: ColumnType; - isArray: boolean; - isNullable: boolean; -}; - -export type RelationPropsArray = { - [K in EntityRelation]: E[K] extends unknown[] - ? true - : E[K] extends Collection> - ? true - : false; -}; - -export type RelationPropsTypeName = { - [K in EntityRelation]: string; -}; - -export type RelationPrimaryColumnType = { - [K in EntityRelation]: TypeForId; -}; - -export type FilterNullableProps< - T, - Props extends readonly (keyof T)[] -> = Props extends [infer Head, ...infer Tail] - ? Head extends keyof T - ? null extends T[Head] - ? [Head, ...FilterNullableProps] - : FilterNullableProps - : FilterNullableProps - : []; - -export type RelationProperty = { - [K in TupleOfEntityRelation[number]]: { - entityClass: TypeOfArray>; - nullable: [Extract] extends [never] ? false : true; - isArray: E[K] extends unknown[] ? true : false; - }; -}; - -export type ZodEntityProps = { - props: TupleOfEntityProps; - propsType: FieldWithType; - propsNullable: FilterNullableProps>; - primaryColumnName: I; - primaryColumnType: TypeForId; - typeName: string; - className: string; - relations: TupleOfEntityRelation; - relationProperty: RelationProperty; -}; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-patch-schema/index.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-patch-schema/index.spec.ts index a8b89a19..6408d93f 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-patch-schema/index.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-patch-schema/index.spec.ts @@ -1,39 +1,9 @@ -import { - EntityProps, - FieldWithType, - PropsForField, - RelationPrimaryColumnType, - RelationPropsArray, - RelationPropsTypeName, - TypeField, - TypeForId, -} from '../../types'; -import { Users } from '../../../../mock-utils/typeorm'; import { zodPatch, PatchData } from './'; import { ZodError } from 'zod'; -import { - fieldTypeUsers as fieldWithType, - propsDb, - relationArrayProps, - relationPopsName, - primaryColumnType, -} from '../../../../utils/___test___/test.helper'; +import { usersEntityParamMapMockData } from '../../../../utils/___test___/test.helper'; -const typeId: TypeForId = TypeField.number; - -const primaryColumn: EntityProps = 'id'; - -const schema = zodPatch( - typeId, - 'users', - fieldWithType, - propsDb, - primaryColumn, - relationArrayProps, - relationPopsName, - primaryColumnType -); +const schema = zodPatch(usersEntityParamMapMockData); describe('zodPatch', () => { it('should be ok', () => { @@ -46,11 +16,11 @@ describe('zodPatch', () => { testArrayNull: null, }; const relationships = { - notes: { + roles: { data: [ { - type: 'notes', - id: 'dsfsdf', + type: 'roles', + id: '1', }, ], }, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-patch-schema/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-patch-schema/index.ts index b1444e11..b1514d3a 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-patch-schema/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-patch-schema/index.ts @@ -9,67 +9,46 @@ import { zodType, ZodType, } from '../zod-share'; -import { ObjectLiteral } from '../../../../types'; -import { - EntityProps, - FieldWithType, - PropsForField, - RelationPrimaryColumnType, - RelationPropsArray, - RelationPropsTypeName, - TypeForId, -} from '../../types'; -import { ZodPost } from '../zod-input-post-schema'; -type ZodPatchPatchShape = { +import { EntityParamMapService } from '../../service'; +import { TypeForId } from '../../../../types'; + +type ZodPatchPatchShape = { id: ZodId; - type: ZodType; - attributes: ZodOptional>; - relationships: ZodOptional>; + type: ZodType; + attributes: ZodOptional>; + relationships: ZodOptional>; }; -type ZodInputPatchSchema = ZodObject< - ZodPatchPatchShape, +type ZodInputPatchSchema = ZodObject< + ZodPatchPatchShape, 'strict' >; -type ZodInputPatchDataShape = { - data: ZodInputPatchSchema; +type ZodInputPatchDataShape = { + data: ZodInputPatchSchema; }; -function getShape( - typeId: TypeForId, - typeName: N, - fieldWithType: FieldWithType, - propsDb: PropsForField, - primaryColumn: EntityProps, - relationArrayProps: RelationPropsArray, - relationPopsName: RelationPropsTypeName, - primaryColumnType: RelationPrimaryColumnType -): ZodInputPatchSchema { +function getShape( + entityParamMapService: EntityParamMapService +): ZodInputPatchSchema { const shape = { - id: zodId(typeId), - type: zodType(typeName), - attributes: zodAttributes( - fieldWithType, - propsDb, - primaryColumn, - true - ).optional(), - relationships: zodRelationships( - relationArrayProps, - relationPopsName, - primaryColumnType, - true - ).optional(), + id: zodId( + entityParamMapService.entityParaMap.primaryColumnType as TypeForId + ), + type: zodType(entityParamMapService.entityParaMap.typeName), + attributes: zodAttributes(entityParamMapService, true).optional(), + relationships: zodRelationships(entityParamMapService, true).optional(), }; return z.object(shape).strict(); } -function zodDataShape( - shape: ZodInputPatchSchema -): ZodPatch { +export function zodPatch( + entityParamMapService: EntityParamMapService +): ZodPatch { + const shape = getShape(entityParamMapService); + return z .object({ data: shape, @@ -77,35 +56,10 @@ function zodDataShape( .strict(); } -export function zodPatch( - typeId: TypeForId, - typeName: N, - fieldWithType: FieldWithType, - propsDb: PropsForField, - primaryColumn: EntityProps, - relationArrayProps: RelationPropsArray, - relationPopsName: RelationPropsTypeName, - primaryColumnType: RelationPrimaryColumnType -): ZodPatch { - const shape = getShape( - typeId, - typeName, - fieldWithType, - propsDb, - primaryColumn, - relationArrayProps, - relationPopsName, - primaryColumnType - ); - - return zodDataShape(shape); -} - -export type ZodPatch = ZodObject< - ZodInputPatchDataShape, +export type ZodPatch = ZodObject< + ZodInputPatchDataShape, 'strict' >; -export type PatchData< - E extends ObjectLiteral, - N extends string = string -> = z.infer>['data']; +export type PatchData = z.infer< + ZodPatch +>['data']; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-post-schema/index.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-post-schema/index.spec.ts index 70e41e5d..8a5e6ac8 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-post-schema/index.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-post-schema/index.spec.ts @@ -1,30 +1,8 @@ -import { EntityProps, TypeField, TypeForId } from '../../types'; -import { Users } from '../../../../mock-utils/typeorm'; -import { zodPost } from './'; import { ZodError } from 'zod'; +import { zodPost } from './'; +import { usersEntityParamMapMockData } from '../../../../utils/___test___/test.helper'; -import { - fieldTypeUsers as fieldWithType, - propsDb, - relationArrayProps, - relationPopsName, - primaryColumnType, -} from '../../../../utils/___test___/test.helper'; - -const typeId: TypeForId = TypeField.number; - -const primaryColumn: EntityProps = 'id'; - -const schema = zodPost( - typeId, - 'users', - fieldWithType, - propsDb, - primaryColumn, - relationArrayProps, - relationPopsName, - primaryColumnType -); +const schema = zodPost(usersEntityParamMapMockData); describe('zodPost', () => { it('should be ok', () => { @@ -33,20 +11,35 @@ describe('zodPost', () => { const attributes = { login: 'login', lastName: 'sdfsdf', - isActive: true, + firstName: 'sdds', + isActive: 'null', testDate: date.toISOString(), + createdAt: date.toISOString() as any, + updatedAt: date.toISOString() as any, testReal: [`${real}`], testArrayNull: null, }; const relationships = { - notes: { + roles: { data: [ { - type: 'notes', - id: 'dsfsdf', + type: 'roles', + id: '1', }, ], }, + addresses: { + data: { + type: 'addresses', + id: '1', + }, + }, + manager: { + data: { + type: 'users', + id: '1', + }, + }, }; const check = { data: { @@ -75,6 +68,8 @@ describe('zodPost', () => { attributes: { ...attributes, ['testDate']: date, + createdAt: date, + updatedAt: date, testReal: [real], }, relationships, @@ -86,6 +81,8 @@ describe('zodPost', () => { attributes: { ...attributes, ['testDate']: date, + createdAt: date, + updatedAt: date, testReal: [real], }, }, @@ -97,6 +94,8 @@ describe('zodPost', () => { attributes: { ...attributes, ['testDate']: date, + createdAt: date, + updatedAt: date, testReal: [real], }, }, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-post-schema/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-post-schema/index.ts index 74302679..e79363b3 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-post-schema/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-post-schema/index.ts @@ -1,6 +1,6 @@ import { z, ZodObject, ZodOptional } from 'zod'; -import { ObjectLiteral } from '../../../../types'; +import { TypeForId } from '../../../../types'; import { ZodId, zodId, @@ -11,60 +11,42 @@ import { ZodRelationships, zodRelationships, } from '../zod-share'; -import { - EntityProps, - FieldWithType, - PropsForField, - RelationPrimaryColumnType, - RelationPropsArray, - RelationPropsTypeName, - TypeForId, -} from '../../types'; +import { EntityParamMapService } from '../../service'; -type ZodInputPostShape = { +type ZodInputPostShape = { id: ZodOptional; - type: ZodType; - attributes: ZodAttributes; - relationships: ZodOptional>; + type: ZodType; + attributes: ZodAttributes; + relationships: ZodOptional>; }; -type ZodInputPostSchema = ZodObject< - ZodInputPostShape, +type ZodInputPostSchema = ZodObject< + ZodInputPostShape, 'strict' >; -type ZodInputPostDataShape = { - data: ZodInputPostSchema; +type ZodInputPostDataShape = { + data: ZodInputPostSchema; }; -function getShape( - typeId: TypeForId, - typeName: N, - fieldWithType: FieldWithType, - propsDb: PropsForField, - primaryColumn: EntityProps, - relationArrayProps: RelationPropsArray, - relationPopsName: RelationPropsTypeName, - primaryColumnType: RelationPrimaryColumnType -): ZodInputPostSchema { +function getShape( + entityParamMapService: EntityParamMapService +): ZodInputPostSchema { const shape = { - id: zodId(typeId).optional(), - type: zodType(typeName), - attributes: zodAttributes(fieldWithType, propsDb, primaryColumn, false), - relationships: zodRelationships( - relationArrayProps, - relationPopsName, - primaryColumnType, - false + id: zodId( + entityParamMapService.entityParaMap.primaryColumnType as TypeForId ).optional(), + type: zodType(entityParamMapService.entityParaMap.typeName), + attributes: zodAttributes(entityParamMapService, false), + relationships: zodRelationships(entityParamMapService, false).optional(), }; return z.object(shape).strict(); } -function zodDataShape( - shape: ZodInputPostSchema -): ZodPost { +function zodDataShape( + shape: ZodInputPostSchema +): ZodPost { return z .object({ data: shape, @@ -72,38 +54,22 @@ function zodDataShape( .strict(); } -export function zodPost( - typeId: TypeForId, - typeName: N, - fieldWithType: FieldWithType, - propsDb: PropsForField, - primaryColumn: EntityProps, - relationArrayProps: RelationPropsArray, - relationPopsName: RelationPropsTypeName, - primaryColumnType: RelationPrimaryColumnType -): ZodPost { - const shape = getShape( - typeId, - typeName, - fieldWithType, - propsDb, - primaryColumn, - relationArrayProps, - relationPopsName, - primaryColumnType - ); +export function zodPost( + entityParamMapService: EntityParamMapService +): ZodPost { + const shape = getShape(entityParamMapService); return zodDataShape(shape); } -export type ZodPost = ZodObject< - ZodInputPostDataShape, +export type ZodPost = ZodObject< + ZodInputPostDataShape, 'strict' >; -export type Post = z.infer< - ZodPost +export type Post = z.infer< + ZodPost >; -export type PostData = Post< +export type PostData = Post< E, - N + IdKey >['data']; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/fields.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/fields.spec.ts index eb999c51..8978de09 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/fields.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/fields.spec.ts @@ -1,14 +1,8 @@ import { zodFieldsInputQuery } from './fields'; -import { ResultGetField } from '../../types'; -import { Users } from '../../../../mock-utils/typeorm'; - -import { userFieldsStructure } from '../../../../utils/___test___/test.helper'; - -const validRelationList: ResultGetField['relations'] = - userFieldsStructure['relations']; +import { usersEntityParamMapMockData } from '../../../../utils/___test___/test.helper'; describe('zodFieldsInputQuerySchema', () => { - const schema = zodFieldsInputQuery(validRelationList); + const schema = zodFieldsInputQuery(usersEntityParamMapMockData); it('should validate successfully with a valid target and relation', () => { const targetInput = 'field1,field2'; @@ -88,6 +82,7 @@ describe('zodFieldsInputQuerySchema', () => { }; const result = schema.safeParse(input); + expect.assertions(5); expect(result.success).toBe(false); if (!result.success) { @@ -95,13 +90,13 @@ describe('zodFieldsInputQuerySchema', () => { 'Expected string, received null' ); expect(result.error.issues[1].message).toContain( - 'Expected string, received boolean' + 'Expected string, received array' ); expect(result.error.issues[2].message).toContain( 'Expected string, received number' ); expect(result.error.issues[3].message).toContain( - 'Expected string, received array' + ' Fields should be have only props: ["target","addresses","manager","roles","comments","userGroup"]' ); } }); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/fields.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/fields.ts index 93d94c81..25b672c6 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/fields.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/fields.ts @@ -1,9 +1,9 @@ -import { ObjectTyped } from '../../../../utils/nestjs-shared'; +import { ObjectTyped } from '@klerick/json-api-nestjs-shared'; import { z } from 'zod'; -import { ObjectLiteral } from '../../../../types'; -import { ResultGetField, ZodInfer } from '../../types'; +import { EntityParam } from '../../../../types'; import { nonEmptyObject, getValidationErrorForStrict } from '../zod-utils'; +import { EntityParamMapService } from '../../service'; function getZodRules() { return z @@ -14,26 +14,34 @@ function getZodRules() { type ZodRule = ReturnType; -export function zodFieldsInputQuery( - relationList: ResultGetField['relations'] +export function zodFieldsInputQuery( + entityParamMapService: EntityParamMapService ) { const target = z.object({ target: getZodRules(), }); - const relation = relationList.reduce( + const relation = entityParamMapService.entityParaMap.relations.reduce( (acum, item) => ({ ...acum, - [item]: getZodRules(), + [item as PropertyKey]: getZodRules(), }), {} as { - [K in ResultGetField['relations'][number]]: ZodRule; + [K in EntityParam['relations'][number] & PropertyKey]: ZodRule; } ); return target .merge(z.object(relation)) - .strict(getValidationErrorForStrict(['target', ...relationList], 'Fields')) + .strict( + getValidationErrorForStrict( + [ + 'target', + ...(entityParamMapService.entityParaMap.relations as string[]), + ], + 'Fields' + ) + ) .refine(nonEmptyObject(), { message: 'Validation error: Need select field for target or relation', }) @@ -54,6 +62,7 @@ export function zodFieldsInputQuery( }); } -export type ZodFieldsInputQuery = ZodInfer< - typeof zodFieldsInputQuery ->; +export type ZodFieldsInputQuery< + E extends object, + IdKey extends string +> = z.infer>>; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/filter.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/filter.spec.ts index 1455300a..95a32fd3 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/filter.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/filter.spec.ts @@ -1,17 +1,9 @@ import { zodFilterInputQuery } from './filter'; -import { Users } from '../../../../mock-utils/typeorm'; -import { ResultGetField } from '../../types'; - -import { - userFieldsStructure, - userRelations, -} from '../../../../utils/___test___/test.helper'; - -const userFields: ResultGetField['field'] = userFieldsStructure['field']; +import { usersEntityParamMapMockData } from '../../../../utils/___test___/test.helper'; describe('zodFilterInputQuery', () => { it('should return transformed result with relation and target when valid data is provided', () => { - const schema = zodFilterInputQuery(userFields, userRelations); + const schema = zodFilterInputQuery(usersEntityParamMapMockData); const input = { login: { eq: 'johndoe' }, addresses: { eq: 'null' }, @@ -36,14 +28,14 @@ describe('zodFilterInputQuery', () => { }); it('should return null relation and target when no data is provided', () => { - const schema = zodFilterInputQuery(userFields, userRelations); + const schema = zodFilterInputQuery(usersEntityParamMapMockData); const result = schema.parse({}); expect(result).toEqual({ relation: null, target: null }); }); it('should ignore invalid fields and not include them in the result', () => { - const schema = zodFilterInputQuery(userFields, userRelations); + const schema = zodFilterInputQuery(usersEntityParamMapMockData); const input = { invalidField: { eq: 'should be ignored' }, login: { eq: 'johndoe', gte: '123' }, @@ -58,7 +50,7 @@ describe('zodFilterInputQuery', () => { }); it('should handle nested relations correctly', () => { - const schema = zodFilterInputQuery(userFields, userRelations); + const schema = zodFilterInputQuery(usersEntityParamMapMockData); const input = { 'manager.firstName': { like: 'Jane' }, 'manager.lastName': { nin: 'Doe,Jim' }, @@ -78,7 +70,7 @@ describe('zodFilterInputQuery', () => { }); it('should throw a validation error for invalid structures', () => { - const schema = zodFilterInputQuery(userFields, userRelations); + const schema = zodFilterInputQuery(usersEntityParamMapMockData); const invalidInput = { login: { unknownOperator: 'invalid' }, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/filter.test-d.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/filter.test-d.ts new file mode 100644 index 00000000..0bdcd177 --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/filter.test-d.ts @@ -0,0 +1,37 @@ +import { ZodFilterInputQuery } from './filter'; +import { Users } from '../../../../utils/___test___/test-classes.helper'; +import { expectAssignable, expectNotAssignable } from 'tsd'; + +type FilterType = ZodFilterInputQuery; +const checkShape = { + target: { + id: { + some: '', + eq: '', + }, + testArrayNull: { + some: '', + }, + addresses: { + eq: 'null', + }, + }, + relation: { + addresses: { + arrayField: { + in: '', + }, + }, + }, +} satisfies FilterType; +expectAssignable(checkShape); +expectNotAssignable({ + ...checkShape, + notAllow: {}, +}); +expectNotAssignable({ + ...checkShape, + addresses: { + in: null, + }, +}); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/filter.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/filter.ts index 53f69f68..8e651cfb 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/filter.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/filter.ts @@ -1,25 +1,33 @@ import { FilterOperand, - ObjectTyped, isString, -} from '../../../../utils/nestjs-shared'; -import { z } from 'zod'; + ObjectTyped, +} from '@klerick/json-api-nestjs-shared'; +import { z, ZodType } from 'zod'; +import { EntityParamMapService } from '../../service'; +import { getRelationProps, oneOf, stringLongerThan } from '../zod-utils'; import { - RelationTree, - ResultGetField, + EntityParam, + EntityRelationProps, UnionToTuple, - ZodInfer, -} from '../../types'; -import { ObjectLiteral } from '../../../../types'; +} from '../../../../types'; + +type FilterType = Partial<{ + [key in FilterOperand]: string | string[]; +}>; -import { oneOf, stringLongerThan } from '../zod-utils'; +type OutPutFilter = { + relation: null | Record>; + target: null | Record; +}; const arrayOp = { [FilterOperand.in]: true, [FilterOperand.nin]: true, [FilterOperand.some]: true, }; + function convertToFilterObject( value: Record | string ): Partial<{ @@ -41,36 +49,6 @@ function convertToFilterObject( } } -type FilterType = Partial<{ - [key in FilterOperand]: string | string[]; -}>; - -type OutPutFilter = { - relation: null | Record>; - target: null | Record; -}; - -function getZodRulesForRelation() { - return z - .union([ - z - .object({ - [FilterOperand.eq]: z - .union([z.literal('null'), z.null()]) - .transform(() => null), - }) - .strict(), - z - .object({ - [FilterOperand.ne]: z - .union([z.literal('null'), z.null()]) - .transform(() => null), - }) - .strict(), - ]) - .optional(); -} - function getZodRulesForFilterOperator() { const filterConditional = z .union([z.string().refine(stringLongerThan()), z.null(), z.number()]) @@ -94,28 +72,46 @@ function getZodRulesForFilterOperator() { return z.union([filterConditional, conditional]).optional(); } -function shapeForArray< - R extends readonly [string, ...string[]], - Z extends ZodRulesForRelation | ZodRulesForFilterOperator ->(fields: R, zodSchema: Z) { - return fields.reduce( - (acum, item) => ({ - ...acum, - [item]: zodSchema, - }), - {} as { - [K in R[number]]: Z; - } - ); +export type ZodRulesForFilterOperator = ReturnType< + typeof getZodRulesForFilterOperator +>; + +function getZodRulesForRelation() { + return z + .union([ + z + .object({ + [FilterOperand.eq]: z + .union([z.literal('null'), z.null()]) + .transform(() => null), + }) + .strict(), + z + .object({ + [FilterOperand.ne]: z + .union([z.literal('null'), z.null()]) + .transform(() => null), + }) + .strict(), + ]) + .optional(); } -function getTupleConcatRelationFields( - relationList: RelationTree -): UnionToTuple< +type ZodRulesForRelation = ReturnType; + +export type ConcatRelationField< + E extends object, + IdKey extends string +> = UnionToTuple< { - [K in keyof RelationTree]: `${K & string}.${RelationTree[K][number]}`; - }[keyof RelationTree] -> { + [K in keyof EntityRelationProps]: `${K & + string}.${EntityRelationProps[K][number] & string}`; + }[keyof EntityRelationProps] +>; + +function getTupleConcatRelationFields( + relationList: EntityRelationProps +): ConcatRelationField { const result: string[] = []; for (const [key, val] of ObjectTyped.entries(relationList)) { @@ -125,37 +121,65 @@ function getTupleConcatRelationFields( } } - return result as any; + return result as ConcatRelationField; } -type ZodRulesForRelation = ReturnType; -type ZodRulesForFilterOperator = ReturnType< - typeof getZodRulesForFilterOperator ->; +export type ShapeArrayInput = + | EntityParam['props'] + | EntityParam['relations'] + | ConcatRelationField; + +export function shapeForArray< + E extends object, + Z extends ZodType, + IdKey extends string, + PropsList extends ShapeArrayInput +>(fields: PropsList, zodSchema: Z) { + return fields.reduce( + (acum, item) => ({ + ...acum, + [item as PropertyKey]: zodSchema, + }), + {} as { + [K in PropsList[number] & PropertyKey]: Z; + } + ); +} -export function zodFilterInputQuery( - fields: ResultGetField['field'], - relationList: RelationTree +export function zodFilterInputQuery( + entityParamMapService: EntityParamMapService ) { const target = z.object( - shapeForArray(fields, getZodRulesForFilterOperator()) + shapeForArray< + E, + ZodRulesForFilterOperator, + IdKey, + EntityParam['props'] + >(entityParamMapService.entityParaMap.props, getZodRulesForFilterOperator()) ); - const relationTuple = ObjectTyped.keys(relationList) as UnionToTuple< - keyof RelationTree - >; - const relations = z.object( - shapeForArray(relationTuple, getZodRulesForRelation()) + shapeForArray< + E, + ZodRulesForRelation, + IdKey, + EntityParam['relations'] + >(entityParamMapService.entityParaMap.relations, getZodRulesForRelation()) ); + const relationList = getRelationProps(entityParamMapService); + const relationFields = z.object( - shapeForArray( + shapeForArray< + E, + ZodRulesForFilterOperator, + IdKey, + ConcatRelationField + >( getTupleConcatRelationFields(relationList), getZodRulesForFilterOperator() ) ); - return target .merge(relations) .merge(relationFields) @@ -191,6 +215,7 @@ export function zodFilterInputQuery( }); } -export type ZodFilterInputQuery = ZodInfer< - typeof zodFilterInputQuery ->; +export type ZodFilterInputQuery< + E extends object, + IdKey extends string +> = z.infer>>; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/include.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/include.ts index b5a72ad8..dd5e8448 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/include.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/include.ts @@ -1,6 +1,5 @@ +import { isString } from '@klerick/json-api-nestjs-shared'; import { z } from 'zod'; -import { isString } from '../../../../utils/nestjs-shared'; -import { ZodInfer } from '../../types'; export function zodIncludeInputQuery() { return z @@ -15,4 +14,6 @@ export function zodIncludeInputQuery() { }); } -export type ZodIncludeInputQuery = ZodInfer; +export type ZodIncludeInputQuery = z.infer< + ReturnType +>; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/index.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/index.spec.ts index dc0691c7..9a89e07d 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/index.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/index.spec.ts @@ -1,24 +1,11 @@ -import { QueryField, ObjectTyped } from '../../../../utils/nestjs-shared'; -import { zodInputQuery } from './index'; - -import { ResultGetField, TupleOfEntityRelation } from '../../types'; -import { Users } from '../../../../mock-utils/typeorm'; - -import { - userFieldsStructure, - userRelations, -} from '../../../../utils/___test___/test.helper'; +import { QueryField } from '@klerick/json-api-nestjs-shared'; +import { usersEntityParamMapMockData } from '../../../../utils/___test___/test.helper'; -const userFields: ResultGetField['field'] = userFieldsStructure['field']; - -const entityFieldsStructure = { - field: userFields, - relations: ObjectTyped.keys(userRelations) as TupleOfEntityRelation, -}; +import { zodInputQuery } from './index'; describe('zodInputQuery', () => { it('should validate a correct input query object', () => { - const schema = zodInputQuery(entityFieldsStructure, userRelations); + const schema = zodInputQuery(usersEntityParamMapMockData); const input = { [QueryField.fields]: { target: 'login', @@ -40,7 +27,7 @@ describe('zodInputQuery', () => { }); it('should throw an error for an invalid field in the input query', () => { - const schema = zodInputQuery(entityFieldsStructure, userRelations); + const schema = zodInputQuery(usersEntityParamMapMockData); const input = { [QueryField.fields]: ['invalidRelation.invalidField'], [QueryField.filter]: { id: 1 }, @@ -53,7 +40,7 @@ describe('zodInputQuery', () => { }); it('should throw an error if an unexpected key is present in the input query', () => { - const schema = zodInputQuery(entityFieldsStructure, userRelations); + const schema = zodInputQuery(usersEntityParamMapMockData); const input = { [QueryField.fields]: ['roles.name'], [QueryField.filter]: { id: 1 }, @@ -67,7 +54,7 @@ describe('zodInputQuery', () => { }); it('should throw an error when a required field is missing', () => { - const schema = zodInputQuery(entityFieldsStructure, userRelations); + const schema = zodInputQuery(usersEntityParamMapMockData); const input = { [QueryField.fields]: ['roles.name'], [QueryField.include]: ['roles'], @@ -79,7 +66,7 @@ describe('zodInputQuery', () => { }); it('should validate input with empty but valid fields', () => { - const schema = zodInputQuery(entityFieldsStructure, userRelations); + const schema = zodInputQuery(usersEntityParamMapMockData); const input = { [QueryField.page]: { number: 1, size: 10 }, }; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/index.ts index ac58dd4d..00e4f0e6 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/index.ts @@ -1,27 +1,20 @@ -import { QueryField } from '../../../../utils/nestjs-shared'; +import { QueryField } from '@klerick/json-api-nestjs-shared'; import { z } from 'zod'; -import { RelationTree, ResultGetField } from '../../types'; -import { ObjectLiteral } from '../../../../types'; +import { EntityParamMapService } from '../../service'; import { zodFieldsInputQuery } from './fields'; import { zodFilterInputQuery } from './filter'; import { zodIncludeInputQuery } from './include'; import { zodSortInputQuery } from './sort'; import { zodPageInputQuery } from '../zod-share'; -export function zodInputQuery( - entityFieldsStructure: ResultGetField, - entityRelationStructure: RelationTree +export function zodInputQuery( + entityParamMapService: EntityParamMapService ) { return z .object({ - [QueryField.fields]: zodFieldsInputQuery( - entityFieldsStructure.relations - ), - [QueryField.filter]: zodFilterInputQuery( - entityFieldsStructure.field, - entityRelationStructure - ), + [QueryField.fields]: zodFieldsInputQuery(entityParamMapService), + [QueryField.filter]: zodFilterInputQuery(entityParamMapService), [QueryField.include]: zodIncludeInputQuery(), [QueryField.sort]: zodSortInputQuery(), [QueryField.page]: zodPageInputQuery(), @@ -33,7 +26,9 @@ export function zodInputQuery( ); } -export type ZodInputQuery = ReturnType< - typeof zodInputQuery +export type ZodInputQuery = ReturnType< + typeof zodInputQuery +>; +export type InputQuery = z.infer< + ZodInputQuery >; -export type InputQuery = z.infer>; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/sort.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/sort.ts index 105fab4e..1142a6f2 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/sort.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/sort.ts @@ -1,6 +1,5 @@ import { z } from 'zod'; import { ASC, DESC } from '../../../../constants'; -import { ZodInfer } from '../../types'; export function zodSortInputQuery() { return z @@ -34,4 +33,4 @@ export function zodSortInputQuery() { }); } -export type ZodSortInputQuery = ZodInfer; +export type ZodSortInputQuery = z.infer>; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/fields.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/fields.spec.ts index 704960e0..07da2780 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/fields.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/fields.spec.ts @@ -1,17 +1,11 @@ import { zodFieldsQuery } from './fields'; -import { Users } from '../../../../mock-utils/typeorm'; +import { usersEntityParamMapMockData } from '../../../../utils/___test___/test.helper'; -import { - userFields, - userRelations, -} from '../../../../utils/___test___/test.helper'; - -const schema = zodFieldsQuery(userFields, userRelations); +const schema = zodFieldsQuery(usersEntityParamMapMockData); describe('zodFieldsQuerySchema', () => { it('should validate a target field correctly', () => { const input = { target: ['id'] }; const result = schema.safeParse(input); - expect(result.success).toBe(true); }); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/fields.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/fields.ts index 5b8f65c8..ea8eb6d4 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/fields.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/fields.ts @@ -1,13 +1,23 @@ -import { ObjectTyped } from '../../../../utils/nestjs-shared'; -import { z } from 'zod'; +import { ObjectTyped } from '@klerick/json-api-nestjs-shared'; +import { z, ZodObject } from 'zod'; -import { nonEmptyObject, uniqueArray } from '../zod-utils'; -import { ObjectLiteral } from '../../../../types'; -import { ResultGetField, RelationTree } from '../../types'; +import { getRelationProps, nonEmptyObject, uniqueArray } from '../zod-utils'; +import { + EntityParam, + EntityRelationProps, + NonEmptyStringTuple, +} from '../../../../types'; +import { EntityParamMapService } from '../../service'; + +function getZodFieldRule< + E extends object, + IdKey extends string, + PropsList extends ShapeArrayInput +>(fields: PropsList) { + const fieldsProps: NonEmptyStringTuple = fields as any; -function getZodRules(fields: K) { return z - .enum(fields) + .enum(fieldsProps) .array() .nonempty() .refine(uniqueArray(), { @@ -16,40 +26,58 @@ function getZodRules(fields: K) { .optional(); } -type ZodRule = ReturnType< - typeof getZodRules ->; +type ShapeArrayInput = + | EntityParam['props'] + | EntityRelationProps[keyof EntityRelationProps]; + +type ZodFieldRule< + E extends object, + IdKey extends string, + PropsList extends ShapeArrayInput +> = ReturnType>; -type TargetRelationShape = { - [K in keyof RelationTree]: ZodRule[K]>; +type ZodFieldsShape = { + target: ZodFieldRule['props']>; +} & { + [K in keyof EntityRelationProps]: ZodFieldRule< + E, + IdKey, + EntityRelationProps[K] + >; }; -export function zodFieldsQuery( - fields: ResultGetField['field'], - relationList: RelationTree -) { - const target = { - target: getZodRules(fields), - }; +function getShapeFields( + entityParamMapService: EntityParamMapService +): ZodObject, 'strict'> { + const relationList = getRelationProps(entityParamMapService); - const relation = {} as TargetRelationShape; + const fieldShape = ObjectTyped.entries(relationList).reduce( + (acum, [key, val]) => ({ + ...acum, + [key as PropertyKey]: getZodFieldRule(val), + }), + { + target: getZodFieldRule['props']>( + entityParamMapService.entityParaMap.props + ), + } as ZodFieldsShape + ); - for (const [key, value] of ObjectTyped.entries(relationList)) { - relation[key] = getZodRules(value); - } + return z.object(fieldShape).strict('Should be only target of relation'); +} - return z - .object({ - ...target, - ...relation, - }) - .strict('Should be only target of relation') +export function zodFieldsQuery( + entityParamMapService: EntityParamMapService +) { + return getShapeFields(entityParamMapService) .refine(nonEmptyObject(), { message: 'Validation error: Select target or relation fields', }) .nullable(); } -export type ZodFieldsQuery = ReturnType< - typeof zodFieldsQuery +export type ZodFieldsQuery = ReturnType< + typeof zodFieldsQuery +>; +export type FieldsQuery = z.infer< + ZodFieldsQuery >; -export type FieldsQuery = z.infer>; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/filter.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/filter.spec.ts index dbc637f8..b6df96b6 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/filter.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/filter.spec.ts @@ -1,44 +1,16 @@ -import { zodFilterQuery } from './filter'; -import { Users } from '../../../../mock-utils/typeorm'; -import { ArrayPropsForEntity } from '../../types'; import { ZodError } from 'zod'; -import { ZodFilterInputQuery } from '../zod-input-query-schema/filter'; - -import { - userFields, - userRelations, - propsType, -} from '../../../../utils/___test___/test.helper'; -const propsArray: ArrayPropsForEntity = { - target: { - testArrayNull: true, - testReal: true, - }, - addresses: { - arrayField: true, - }, - userGroup: {}, - manager: { - testArrayNull: true, - testReal: true, - }, - comments: {}, - notes: {}, - roles: {}, -}; +import { zodFilterQuery } from './filter'; +import { usersEntityParamMapMockData } from '../../../../utils/___test___/test.helper'; +import { Users } from '../../../../utils/___test___/test-classes.helper'; +import { ZodFilterInputQuery } from '../zod-input-query-schema/filter'; -const schema = zodFilterQuery( - userFields, - userRelations, - propsArray, - propsType -); +const schema = zodFilterQuery(usersEntityParamMapMockData); describe('Check "filter" zod schema', () => { describe('Valid schema', () => { it('Valid schema - check1', () => { - const check1: ZodFilterInputQuery = { + const check1: ZodFilterInputQuery = { target: { id: { gte: '1213', @@ -52,7 +24,7 @@ describe('Check "filter" zod schema', () => { }); it('Valid schema - check2', () => { - const check2: ZodFilterInputQuery = { + const check2: ZodFilterInputQuery = { target: { id: { gte: '1213', @@ -74,7 +46,7 @@ describe('Check "filter" zod schema', () => { }); it('Valid schema - check3', () => { - const check3: ZodFilterInputQuery = { + const check3: ZodFilterInputQuery = { target: null, relation: null, }; @@ -83,7 +55,7 @@ describe('Check "filter" zod schema', () => { }); it('Valid schema - check4', () => { - const check4: ZodFilterInputQuery = { + const check4: ZodFilterInputQuery = { target: null, relation: { comments: { @@ -103,7 +75,7 @@ describe('Check "filter" zod schema', () => { }); it('Valid schema - check5', () => { - const check5: ZodFilterInputQuery = { + const check5: ZodFilterInputQuery = { target: null, relation: { comments: { @@ -123,7 +95,7 @@ describe('Check "filter" zod schema', () => { }); it('Valid schema - check6', () => { - const check6: ZodFilterInputQuery = { + const check6: ZodFilterInputQuery = { target: { id: { gte: '1213', @@ -140,7 +112,7 @@ describe('Check "filter" zod schema', () => { }); it('Valid schema - check7', () => { - const check7: ZodFilterInputQuery = { + const check7: ZodFilterInputQuery = { target: { isActive: { eq: 'true', @@ -153,7 +125,7 @@ describe('Check "filter" zod schema', () => { }); it('Valid schema - check8', () => { - const check8: ZodFilterInputQuery = { + const check8: ZodFilterInputQuery = { target: { createdAt: { eq: '2023-12-08T09:40:58.020Z', @@ -166,7 +138,7 @@ describe('Check "filter" zod schema', () => { }); it('Valid schema - check9', () => { - const check9: ZodFilterInputQuery = { + const check9: ZodFilterInputQuery = { target: { createdAt: { eq: 'null', @@ -181,7 +153,7 @@ describe('Check "filter" zod schema', () => { }); it('Valid schema - check10', () => { - const check: ZodFilterInputQuery = { + const check: ZodFilterInputQuery = { target: { id: { gte: '1213', diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/filter.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/filter.ts index 8253787c..26648edd 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/filter.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/filter.ts @@ -1,33 +1,20 @@ -import { z, ZodOptional } from 'zod'; import { FilterOperand, - ObjectTyped, FilterOperandOnlyInNin, FilterOperandOnlySimple, -} from '../../../../utils/nestjs-shared'; + ObjectTyped, +} from '@klerick/json-api-nestjs-shared'; +import { z, ZodOptional } from 'zod'; +import { EntityParamMapService } from '../../service'; +import { EntityParam, TypeField, TypeOfConstructor } from '../../../../types'; import { - AllFieldWithType, - ArrayPropsForEntity, - RelationTree, - ResultGetField, - IsArray, - TypeField, - EntityProps, - TypeOfArray, - CastProps, - TypeCast, - PropsArray, -} from '../../types'; -import { ObjectLiteral } from '../../../../types'; -import { - stringLongerThan, arrayItemStringLongerThan, - stringMustBe, elementOfArrayMustBe, - oneOf, - guardIsKeyOfObject, nonEmptyObject, + oneOf, + stringLongerThan, + stringMustBe, } from '../zod-utils'; const zodRuleForString = z.union([ @@ -49,6 +36,10 @@ const zodNullRule = z.union([ z.literal(null).transform((r) => 'null' as const), ]); +const zodRuleForArrayField = z + .object({ [FilterOperand.some]: zodRuleStringArray }) + .strict(); + const zodRuleFilterRelationSchema = z.union([ z .object({ @@ -61,9 +52,6 @@ const zodRuleFilterRelationSchema = z.union([ }) .strict(), ]); -const zodRuleForArrayField = z - .object({ [FilterOperand.some]: zodRuleStringArray }) - .strict(); function getZodRulesForField(type: TypeField = TypeField.string) { const simpleShape = ObjectTyped.entries(FilterOperandOnlySimple).reduce( @@ -111,119 +99,120 @@ function getZodRulesForField(type: TypeField = TypeField.string) { ); } -function getFilterPropsShapeForEntity( - fields: ResultGetField['field'], - propsArrayTarget: PropsArray, - propsType: AllFieldWithType -) { - return fields.reduce( - (acum, field) => ({ - ...acum, - [field]: (Reflect.get(propsArrayTarget, field) - ? zodRuleForArrayField - : getZodRulesForField(propsType[field as EntityProps]) - ).optional(), - }), - {} as FilterProps['field']> - ); -} - -function getZodRulesForRelationShape( - shape: FilterProps['field']> +function getZodRulesForRelationShape( + shape: FilterProps ) { return z.object(shape).strict().optional().refine(nonEmptyObject()); } type ZodRuleForString = typeof zodRuleForString; type ZodRuleStringArray = typeof zodRuleStringArray; -type ZodRuleFilterRelationSchema = typeof zodRuleFilterRelationSchema; type ZodRuleForArrayField = typeof zodRuleForArrayField; +type ZodRuleFilterRelationSchema = typeof zodRuleFilterRelationSchema; type ZodRulesForField = ReturnType; -type ZodRulesForRelationShape = ReturnType< - typeof getZodRulesForRelationShape +type ZodRulesForRelationShape< + E extends object, + IdKey extends string +> = ReturnType>; + +type RelTypeBase< + E extends object, + IdKey extends string, + Rel extends keyof EntityParam['relationProperty'] +> = TypeOfConstructor< + EntityParam['relationProperty'][Rel]['entityClass'] >; -type FilterProps< - E extends ObjectLiteral, - P extends readonly [string, ...string[]] -> = { - [Props in P[number]]: Props extends keyof E - ? IsArray extends true +type RelType< + E extends object, + IdKey extends string, + Rel extends keyof EntityParam['relationProperty'] +> = RelTypeBase extends object + ? RelTypeBase + : never; + +type RelationFilterProps = { + [R in keyof EntityParam< + E, + IdKey + >['relationProperty']]: ZodRulesForRelationShape, IdKey>; +}; + +export type FilterProps = { + [Props in EntityParam['props'][number] & + PropertyKey]: Props extends keyof E + ? E[Props] extends TypeField.array ? ZodOptional : ZodOptional : never; }; -type RelationType = TypeCast< - TypeOfArray>, - ObjectLiteral ->; - -type RelationFilterProps = { - [R in keyof RelationTree]: ZodRulesForRelationShape>; +type TargetRelationShape = { + [Props in EntityParam['relations'][number] & + PropertyKey]: ZodOptional; }; -type TargetRelationShape = { - [K in ResultGetField['relations'][number]]: ZodOptional; -}; +type ResultTargetType = FilterProps< + E, + IdKey +> & + TargetRelationShape; + +function getFilterPropsShapeForEntity( + entityParam: EntityParam +): FilterProps { + return entityParam.props.reduce((acum, field) => { + const propertyType = Reflect.get( + entityParam.propsType, + field as PropertyKey + ); + const value = + propertyType === TypeField.array + ? zodRuleForArrayField + : getZodRulesForField(propertyType); -export function zodFilterQuery( - fields: ResultGetField['field'], - relationTree: RelationTree, - propsArray: ArrayPropsForEntity, - propsType: AllFieldWithType -) { - const { target: propsArrayTarget, ...otherRelationPropsArray } = propsArray; + Reflect.set(acum, field as PropertyKey, value.optional()); - const fieldsFilterProps = getFilterPropsShapeForEntity( - fields, - propsArrayTarget, - propsType - ); + return acum; + }, {} as FilterProps); +} - const targetRelation = ObjectTyped.keys(relationTree).reduce( +export function zodFilterQuery( + entityParamMapService: EntityParamMapService +) { + const targetResult = entityParamMapService.entityParaMap.relations.reduce( (acum, item) => ({ ...acum, - [item]: zodRuleFilterRelationSchema.optional(), + [item as PropertyKey]: zodRuleFilterRelationSchema.optional(), }), - {} as TargetRelationShape + getFilterPropsShapeForEntity( + entityParamMapService.entityParaMap + ) as ResultTargetType ); - const relationFilterProps = ObjectTyped.keys(relationTree).reduce( - (acum, name) => { - type F = typeof name; - type RT = RelationType; - type RTF = ResultGetField['field']; - - guardIsKeyOfObject(otherRelationPropsArray, name); - const relationField = relationTree[name] as RTF; - const relationPropsArray = otherRelationPropsArray[ - name - ] as PropsArray; - const relationPropsType = propsType[name] as AllFieldWithType; - - const filterProps = getFilterPropsShapeForEntity( - relationField, - relationPropsArray, - relationPropsType - ); - - const zodFilter = getZodRulesForRelationShape(filterProps); - - return { - ...acum, - [name]: zodFilter.optional(), - }; - }, - {} as RelationFilterProps - ); + const relationFilterProps = ObjectTyped.entries( + entityParamMapService.entityParaMap.relationProperty + ).reduce((acum, [relName, relProps]) => { + type RT = TypeOfConstructor extends object + ? TypeOfConstructor + : never; + const relParams = entityParamMapService.getParamMap( + relProps.entityClass as any + ) as EntityParam; + + const zodFilter = getZodRulesForRelationShape( + getFilterPropsShapeForEntity(relParams) + ); + + return { + ...acum, + [relName]: zodFilter.optional(), + }; + }, {} as RelationFilterProps); const targetShapeFilter = { target: z - .object({ - ...fieldsFilterProps, - ...targetRelation, - }) + .object(targetResult) .strict() .optional() .refine(nonEmptyObject()) @@ -239,7 +228,9 @@ export function zodFilterQuery( return z.object(targetShapeFilter).strict().refine(nonEmptyObject()); } -export type ZodFilterQuery = ReturnType< - typeof zodFilterQuery +export type ZodFilterQuery = ReturnType< + typeof zodFilterQuery +>; +export type FilterQuery = z.infer< + ZodFilterQuery >; -export type FilterQuery = z.infer>; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/include.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/include.spec.ts index 97d00ecd..438b4f82 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/include.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/include.spec.ts @@ -1,10 +1,7 @@ import { zodIncludeQuery } from './include'; +import { usersEntityParamMapMockData } from '../../../../utils/___test___/test.helper'; -import { Users } from '../../../../mock-utils/typeorm'; - -import { relationList } from '../../../../utils/___test___/test.helper'; - -const schema = zodIncludeQuery(relationList); +const schema = zodIncludeQuery(usersEntityParamMapMockData); describe('zodIncludeQuery', () => { it('should validate an array of relations successfully', () => { diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/include.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/include.ts index cf8e87a0..bc3e5bd7 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/include.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/include.ts @@ -1,13 +1,17 @@ import { z } from 'zod'; -import { ObjectLiteral } from '../../../../types'; -import { ResultGetField } from '../../types'; import { uniqueArray } from '../zod-utils'; +import { EntityParamMapService } from '../../service'; +import { NonEmptyStringTuple } from '../../../../types'; -export function zodIncludeQuery( - relationList: ResultGetField['relations'] +export function zodIncludeQuery( + entityParamMapService: EntityParamMapService ) { + const relationProps: NonEmptyStringTuple< + typeof entityParamMapService.entityParaMap.relations + > = entityParamMapService.entityParaMap.relations as any; + return z - .enum(relationList) + .enum(relationProps) .array() .nonempty() .refine(uniqueArray(), { @@ -16,7 +20,10 @@ export function zodIncludeQuery( .nullable(); } -export type ZodIncludeQuery = ReturnType< - typeof zodIncludeQuery +export type ZodIncludeQuery< + E extends object, + IdKey extends string +> = ReturnType>; +export type IncludeQuery = z.infer< + ZodIncludeQuery >; -export type IncludeQuery = z.infer>; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/index.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/index.spec.ts index 93ca9fc3..2ff1b314 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/index.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/index.spec.ts @@ -1,44 +1,17 @@ -import { FilterOperand, QueryField } from '../../../../utils/nestjs-shared'; -import { zodQuery } from './index'; -import { ArrayPropsForEntity } from '../../types'; -import { Users } from '../../../../mock-utils/typeorm'; -import { InputQuery } from '../zod-input-query-schema'; -import { ASC } from '../../../../constants'; +import { FilterOperand, QueryField } from '@klerick/json-api-nestjs-shared'; -import { - userFieldsStructure as userFields, - userRelations, - propsType, -} from '../../../../utils/___test___/test.helper'; +import { ASC } from '../../../../constants'; +import { usersEntityParamMapMockData } from '../../../../utils/___test___/test.helper'; +import { Users } from '../../../../utils/___test___/test-classes.helper'; -const propsArray: ArrayPropsForEntity = { - target: { - testArrayNull: true, - testReal: true, - }, - addresses: { - arrayField: true, - }, - userGroup: {}, - manager: { - testArrayNull: true, - testReal: true, - }, - comments: {}, - notes: {}, - roles: {}, -}; +import { InputQuery } from '../zod-input-query-schema'; +import { zodQuery } from './index'; -const schemaQuery = zodQuery( - userFields, - userRelations, - propsArray, - propsType -); +const schemaQuery = zodQuery(usersEntityParamMapMockData); describe('schemaQuery.parse', () => { it('should successfully parse valid input', () => { - const validInput: InputQuery = { + const validInput: InputQuery = { [QueryField.fields]: { target: [ 'id', @@ -81,7 +54,7 @@ describe('schemaQuery.parse', () => { }); it('should handle nested relations', () => { - const validInput: InputQuery = { + const validInput: InputQuery = { [QueryField.fields]: { target: [ 'id', diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/index.ts index 9483f211..a881d7ad 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/index.ts @@ -1,99 +1,72 @@ -import { QueryField } from '../../../../utils/nestjs-shared'; import { z, ZodObject } from 'zod'; - -import { ObjectLiteral } from '../../../../types'; -import { - AllFieldWithType, - ArrayPropsForEntity, - RelationTree, - ResultGetField, -} from '../../types'; +import { QueryField } from '@klerick/json-api-nestjs-shared'; import { zodFieldsQuery, ZodFieldsQuery } from './fields'; import { zodFilterQuery, ZodFilterQuery } from './filter'; -import { zodSortQuery, ZodSortQuery } from './sort'; import { zodIncludeQuery, ZodIncludeQuery } from './include'; +import { zodSortQuery, ZodSortQuery, SortQuery } from './sort'; import { zodPageInputQuery, ZodPageInputQuery } from '../zod-share'; -type Shape = { - [QueryField.fields]: ZodFieldsQuery; - [QueryField.filter]: ZodFilterQuery; - [QueryField.include]: ZodIncludeQuery; - [QueryField.sort]: ZodSortQuery; +import { EntityParamMapService } from '../../service'; + +export { SortQuery }; + +type Shape = { + [QueryField.fields]: ZodFieldsQuery; + [QueryField.filter]: ZodFilterQuery; + [QueryField.include]: ZodIncludeQuery; + [QueryField.sort]: ZodSortQuery; [QueryField.page]: ZodPageInputQuery; }; -function getShape( - entityFieldsStructure: ResultGetField, - entityRelationStructure: RelationTree, - propsArray: ArrayPropsForEntity, - propsType: AllFieldWithType -): Shape { +function getShape( + entityParamMapService: EntityParamMapService +): Shape { return { - [QueryField.fields]: zodFieldsQuery( - entityFieldsStructure.field, - entityRelationStructure - ), - [QueryField.filter]: zodFilterQuery( - entityFieldsStructure.field, - entityRelationStructure, - propsArray, - propsType - ), - [QueryField.include]: zodIncludeQuery(entityFieldsStructure.relations), - [QueryField.sort]: zodSortQuery( - entityFieldsStructure.field, - entityRelationStructure - ), + [QueryField.fields]: zodFieldsQuery(entityParamMapService), + [QueryField.filter]: zodFilterQuery(entityParamMapService), + [QueryField.include]: zodIncludeQuery(entityParamMapService), + [QueryField.sort]: zodSortQuery(entityParamMapService), [QueryField.page]: zodPageInputQuery(), }; } -function getZodResultSchema( - shape: Shape -): ZodObject, 'strict'> { +function getZodResultSchema( + shape: Shape +): ZodObject, 'strict'> { return z.object(shape).strict(); } - -export function zodQuery( - entityFieldsStructure: ResultGetField, - entityRelationStructure: RelationTree, - propsArray: ArrayPropsForEntity, - propsType: AllFieldWithType -): ZodResultSchema { - const shape = getShape( - entityFieldsStructure, - entityRelationStructure, - propsArray, - propsType - ); - return getZodResultSchema(shape); +export function zodQuery( + entityParamMapService: EntityParamMapService +) { + return getZodResultSchema(getShape(entityParamMapService)); } -export type ZodResultSchema = ReturnType< - typeof getZodResultSchema +export type ZodQuery = ZodObject< + Shape, + 'strict' +>; +export type Query = z.infer< + ZodObject, 'strict'> >; -export type ZodQuery = ReturnType>; -export type Query = z.infer>; -function zodQueryOne( - entityFieldsStructure: ResultGetField, - entityRelationStructure: RelationTree, - propsArray: ArrayPropsForEntity, - propsType: AllFieldWithType -): ZodObject, QueryField.fields | QueryField.include>, 'strict'> { +function zodQueryOne( + entityParamMapService: EntityParamMapService +): ZodObject< + Pick, QueryField.fields | QueryField.include>, + 'strict' +> { return z .object({ - [QueryField.fields]: zodFieldsQuery( - entityFieldsStructure.field, - entityRelationStructure - ), - [QueryField.include]: zodIncludeQuery(entityFieldsStructure.relations), + [QueryField.fields]: zodFieldsQuery(entityParamMapService), + [QueryField.include]: zodIncludeQuery(entityParamMapService), }) .strict(); } -export type ZodQueryOne = ReturnType< - typeof zodQueryOne +export type ZodQueryOne = ReturnType< + typeof zodQueryOne +>; +export type QueryOne = z.infer< + ZodQueryOne >; -export type QueryOne = z.infer>; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/sort.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/sort.spec.ts index 53ede399..9f151492 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/sort.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/sort.spec.ts @@ -2,12 +2,9 @@ import { zodSortQuery } from './sort'; import { ASC, DESC } from '../../../../constants'; -import { - userFields, - userRelations, -} from '../../../../utils/___test___/test.helper'; +import { usersEntityParamMapMockData } from '../../../../utils/___test___/test.helper'; -const schema = zodSortQuery(userFields, userRelations); +const schema = zodSortQuery(usersEntityParamMapMockData); describe('zodSortQuery', () => { it('should create a Zod schema with target and relations', () => { const parsedData = schema.parse({ @@ -16,7 +13,6 @@ describe('zodSortQuery', () => { manager: { lastName: ASC }, roles: { name: DESC }, comments: { kind: DESC }, - notes: { text: ASC }, userGroup: { label: ASC }, }); @@ -26,13 +22,12 @@ describe('zodSortQuery', () => { manager: { lastName: ASC }, roles: { name: DESC }, comments: { kind: DESC }, - notes: { text: ASC }, userGroup: { label: ASC }, }); }); it('should throw an error for an invalid field in target', () => { - const schema = zodSortQuery(userFields, userRelations); + const schema = zodSortQuery(usersEntityParamMapMockData); expect(() => { schema.parse({ @@ -42,7 +37,7 @@ describe('zodSortQuery', () => { }); it('should throw an error for invalid fields in relations', () => { - const schema = zodSortQuery(userFields, userRelations); + const schema = zodSortQuery(usersEntityParamMapMockData); expect(() => { schema.parse({ @@ -52,7 +47,7 @@ describe('zodSortQuery', () => { }); it('should allow partial relations and target', () => { - const schema = zodSortQuery(userFields, userRelations); + const schema = zodSortQuery(usersEntityParamMapMockData); const parsedData = schema.parse({ target: { id: ASC }, @@ -66,7 +61,7 @@ describe('zodSortQuery', () => { }); it('should fail if an empty object is not allowed', () => { - const schema = zodSortQuery(userFields, userRelations); + const schema = zodSortQuery(usersEntityParamMapMockData); expect(() => { schema.parse({}); @@ -77,7 +72,7 @@ describe('zodSortQuery', () => { }); it('should fail if the input is not a valid object', () => { - const schema = zodSortQuery(userFields, userRelations); + const schema = zodSortQuery(usersEntityParamMapMockData); expect(() => { schema.parse([]); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/sort.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/sort.ts index 7951749e..7dab6a80 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/sort.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/sort.ts @@ -1,60 +1,96 @@ -import { ObjectTyped } from '../../../../utils/nestjs-shared'; -import { z } from 'zod'; +import { ObjectTyped } from '@klerick/json-api-nestjs-shared'; +import { z, ZodObject } from 'zod'; -import { RelationTree, ResultGetField } from '../../types'; -import { ObjectLiteral } from '../../../../types'; +import { EntityParam, EntityRelationProps } from '../../../../types'; import { SORT_TYPE } from '../../../../constants'; -import { nonEmptyObject } from '../zod-utils'; +import { getRelationProps, nonEmptyObject } from '../zod-utils'; +import { EntityParamMapService } from '../../service'; function getZodSortRule() { return z.enum(SORT_TYPE).optional(); } -function getZodFieldRule(fields: F) { +function getZodFieldRule< + E extends object, + IdKey extends string, + PropsList extends ShapeArrayInput +>(fields: PropsList, zodSchema: ZodSortRule) { const targetShape = fields.reduce( (acum, item) => ({ ...acum, - [item]: getZodSortRule(), + [item as PropertyKey]: zodSchema, }), - {} as { [K in F[number]]: ZodSortRule } + {} as { [K in PropsList[number] & PropertyKey]: ZodSortRule } ); return z.object(targetShape).strict().refine(nonEmptyObject()).optional(); } +type ShapeArrayInput = + | EntityParam['props'] + | EntityRelationProps[keyof EntityRelationProps]; + type ZodSortRule = ReturnType; -type ZodFieldRule = ReturnType< - typeof getZodFieldRule ->; +type ZodFieldRule< + E extends object, + IdKey extends string, + PropsList extends ShapeArrayInput +> = ReturnType>; + +type ZodSortTarget = { + target: ZodFieldRule['props']>; +}; + +type ZodSortRelation = { + [K in keyof EntityRelationProps]: ZodFieldRule< + E, + IdKey, + EntityRelationProps[K] + >; +}; +type ZodSortShape = ZodSortTarget< + E, + IdKey +> & + ZodSortRelation; + +function zodSortObject( + entityParamMapService: EntityParamMapService +): ZodObject, 'strict'> { + const zodSortRule = getZodSortRule(); + const relationList = getRelationProps(entityParamMapService); + + const sortShape = ObjectTyped.entries(relationList).reduce( + (acum, [key, val]) => ({ + ...acum, + [key as PropertyKey]: getZodFieldRule( + val, + zodSortRule + ), + }), + { + target: getZodFieldRule['props']>( + entityParamMapService.entityParaMap.props, + zodSortRule + ), + } as ZodSortShape + ); -export function zodSortQuery( - fields: ResultGetField['field'], - relationList: RelationTree + return z.object(sortShape).strict(); +} + +export function zodSortQuery( + entityParamMapService: EntityParamMapService ) { - const zodRelationShape = {} as { - [K in keyof RelationTree]: ZodFieldRule[K]>; - }; - const zodTargetShape: { target: ZodFieldRule['field']> } = { - target: getZodFieldRule(fields), - }; - - for (const [key, val] of ObjectTyped.entries(relationList)) { - if (key === 'target') continue; - zodRelationShape[key] = getZodFieldRule(val); - } - - return z - .object({ - ...zodTargetShape, - ...zodRelationShape, - }) - .strict() + return zodSortObject(entityParamMapService) .partial() .refine(nonEmptyObject()) .nullable(); } -export type ZodSortQuery = ReturnType< - typeof zodSortQuery +export type ZodSortQuery = ReturnType< + typeof zodSortQuery +>; +export type SortQuery = z.infer< + ZodSortQuery >; -export type SortQuery = z.infer>; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/attributes.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/attributes.spec.ts index 7011ef35..3a260e5b 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/attributes.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/attributes.spec.ts @@ -1,40 +1,37 @@ import { ZodError } from 'zod'; import { zodAttributes, ZodAttributes, Attributes } from './attributes'; -import { Addresses, Users } from '../../../../mock-utils/typeorm'; -import { PropsForField } from '../../types'; - import { - fieldTypeUsers, - propsDb, - fieldTypeAddresses, + addressesEntityParamMapMockData, + usersEntityParamMapMockData, } from '../../../../utils/___test___/test.helper'; +import { + Users, + Addresses, +} from '../../../../utils/___test___/test-classes.helper'; describe('attributes', () => { - type SchemaTypeUsers = Attributes; - type SchemaTypeAddresses = Attributes; - describe('Attributes for post', () => { - let schemaUsers: ZodAttributes; - let schemaAddresses: ZodAttributes; + type SchemaTypeUsers = Attributes; + type SchemaTypeAddresses = Attributes; + let schemaUsers: ZodAttributes; + let schemaAddresses: ZodAttributes; beforeEach(() => { - schemaUsers = zodAttributes(fieldTypeUsers, propsDb, 'id', false); - schemaAddresses = zodAttributes( - fieldTypeAddresses, - {} as PropsForField, - 'id', - false - ); + schemaUsers = zodAttributes(usersEntityParamMapMockData, false); + schemaAddresses = zodAttributes(addressesEntityParamMapMockData, false); }); it('should be ok', () => { const date = new Date(); const check: SchemaTypeUsers = { login: 'login', - isActive: true, + isActive: 'null', lastName: 'sdsdf', testReal: [123.123, 123.123], testArrayNull: [], testDate: date.toISOString() as any, + createdAt: date.toISOString() as any, + updatedAt: date.toISOString() as any, + firstName: '', }; const check2: SchemaTypeAddresses = { @@ -48,16 +45,20 @@ describe('attributes', () => { const check3: SchemaTypeUsers = { login: 'login', - isActive: true, lastName: 'sdsdf', testReal: [123.123, 123.123], testArrayNull: null as any, testDate: date.toISOString() as any, + firstName: '', + createdAt: date.toISOString() as any, + updatedAt: date.toISOString() as any, }; expect(schemaUsers.parse(check)).toEqual({ ...check, testDate: date, + createdAt: date, + updatedAt: date, }); expect(schemaAddresses.parse(check2)).toEqual({ ...check2, @@ -68,6 +69,8 @@ describe('attributes', () => { expect(schemaUsers.parse(check3)).toEqual({ ...check3, testDate: date, + createdAt: date, + updatedAt: date, }); }); @@ -95,29 +98,22 @@ describe('attributes', () => { }); describe('Attributes for patch', () => { - let schemaUsers: ZodAttributes; - let schemaAddresses: ZodAttributes; + type SchemaTypeUsers = Attributes; + type SchemaTypeAddresses = Attributes; + let schemaUsers: ZodAttributes; + let schemaAddresses: ZodAttributes; beforeEach(() => { - schemaUsers = zodAttributes( - fieldTypeUsers, - propsDb, - 'id', - true - ); - schemaAddresses = zodAttributes( - fieldTypeAddresses, - {} as PropsForField, - 'id', - true - ); + schemaUsers = zodAttributes(usersEntityParamMapMockData, true); + schemaAddresses = zodAttributes(addressesEntityParamMapMockData, true); }); it('should be ok', () => { const date = new Date(); const check: SchemaTypeUsers = { login: 'login', - isActive: true, testDate: date.toISOString() as any, + firstName: '', + testReal: [], }; const check2: SchemaTypeAddresses = { @@ -125,12 +121,16 @@ describe('attributes', () => { state: 'state', createdAt: date.toISOString() as any, updatedAt: date.toISOString() as any, + city: '', + country: '', }; const check3: SchemaTypeUsers = { testReal: [123.123, 123.123], testArrayNull: null as any, testDate: date.toISOString() as any, + login: '', + firstName: '', }; expect(schemaUsers.parse(check)).toEqual({ diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/attributes.test-d.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/attributes.test-d.ts new file mode 100644 index 00000000..cbe90b95 --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/attributes.test-d.ts @@ -0,0 +1,48 @@ +import { expectType } from 'tsd'; +import { Any } from 'ts-toolbelt'; + +import { Users } from '../../../../utils/___test___/test-classes.helper'; +import { Attributes, IsNullableProps } from './attributes'; + +type CheckNotNullableArray = IsNullableProps; +type CheckNullableArray = IsNullableProps; +type CheckNullable = IsNullableProps; +type CheckNotNullable = IsNullableProps; + +expectType(false); +expectType(true); +expectType(true); +expectType(false); + +type CheckAttrPost = { + testReal: number[]; + login: string; + firstName: string; + testArrayNull?: number[] | null | undefined; + testDate: Date; + createdAt: Date; + updatedAt: Date; + lastName?: string | null | undefined; + isActive?: string | null | undefined; +}; + +type IsEqualsAttrPost = Any.Equals, CheckAttrPost>; +expectType(1); + +type CheckAttrPatch = { + testReal?: number[] | undefined; + login?: string | undefined; + firstName?: string | undefined; + testArrayNull?: number[] | null | undefined; + testDate?: Date | undefined; + createdAt?: Date | undefined; + updatedAt?: Date | undefined; + lastName?: string | null | undefined; + isActive?: string | null | undefined; +}; + +type IsEqualsAttrPatch = Any.Equals< + Attributes, + CheckAttrPatch +>; +expectType(1); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/attributes.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/attributes.ts index 1f29bcdd..32db14ba 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/attributes.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/attributes.ts @@ -1,202 +1,287 @@ -import { - EntityProps, - ObjectTyped, - TypeOfArray, -} from '../../../../utils/nestjs-shared'; -import { z, ZodArray, ZodNullable } from 'zod'; - -import { ObjectLiteral } from '../../../../types'; -import { - FieldWithType, - PropsFieldItem, - PropsForField, - TypeField, -} from '../../types'; -import { nonEmptyObject } from '../zod-utils'; +import { ObjectTyped } from '@klerick/json-api-nestjs-shared'; +import { z, ZodArray, ZodType } from 'zod'; + +import { EntityParam, TypeField } from '../../../../types'; +import { nonEmptyObject, setOptionalOrNot } from '../zod-utils'; +import { ResultSchema } from './type'; +import { EntityParamMapService } from '../../service'; const literalSchema = z.union([z.string(), z.number(), z.boolean(), z.null()]); type Literal = z.infer; type Json = Literal | { [key: string]: Json } | Json[]; -function getZodRulesForNumber(isNullable: boolean) { +export function getZodRulesForNumber< + Null extends true | false, + isPatch extends true | false +>(isNullable: Null, isPatch: isPatch) { const schema = z.preprocess((x) => Number(x), z.number()); - if (isNullable) schema.nullable().optional(); - return isNullable ? schema.optional() : schema; + return setOptionalOrNot(schema, isNullable, isPatch); } -function getZodRulesForString(isNullable: boolean) { +function getZodRulesForString< + Null extends true | false, + isPatch extends true | false +>(isNullable: Null, isPatch: isPatch) { const schema = z.string(); - if (isNullable) schema.nullable().optional(); - return isNullable ? schema.optional() : schema; + return setOptionalOrNot(schema, isNullable, isPatch); } -function getZodRulesForDate(isNullable: boolean) { +function getZodRulesForDate< + Null extends true | false, + isPatch extends true | false +>(isNullable: Null, isPatch: isPatch) { const schema = z.coerce.date(); - if (isNullable) schema.nullable().optional(); - return isNullable ? schema.optional() : schema; + return setOptionalOrNot(schema, isNullable, isPatch); } -function getZodRulesForBoolean(isNullable: boolean) { +function getZodRulesForBoolean< + Null extends true | false, + isPatch extends true | false +>(isNullable: Null, isPatch: isPatch) { const schema = z.boolean(); - if (isNullable) schema.nullable(); - return isNullable ? schema.optional() : schema; + return setOptionalOrNot(schema, isNullable, isPatch); } -function getZodSchemaForJson(isNullable: boolean) { +function getZodSchemaForJson< + Null extends true | false, + isPatch extends true | false +>(isNullable: Null, isPatch: isPatch) { const tmpSchema = isNullable ? literalSchema.nullable() : literalSchema; const schema: z.ZodType = z.lazy(() => z.union([tmpSchema, z.array(tmpSchema), z.record(tmpSchema)]) ); - return isNullable ? schema.optional() : schema; + return setOptionalOrNot(schema, isNullable, isPatch); } -function getZodRulesForArray( - propsField: PropsFieldItem -): - | ZodArray, 'many'> - | ZodNullable, 'many'>> { - const type = propsField.type as T; - let schema: ZodRulesForArray; - - if (!propsField) { - schema = getZodRulesForString(false) as ZodRulesForArray; - } else { - switch (type) { - case 'number': - case 'real': - case 'integer': - case 'bigint': - case 'double': - case 'numeric': - case Number: - schema = getZodRulesForNumber(false) as ZodRulesForArray; - break; - case 'date': - case Date: - schema = getZodRulesForDate(false) as ZodRulesForArray; - break; - case 'boolean': - case Boolean: - schema = getZodRulesForBoolean(false) as ZodRulesForArray; - break; - default: - schema = getZodRulesForString(false) as ZodRulesForArray; - } - } +type ZodRulesResultArray< + T extends TypeField, + Null extends true | false, + isPatch extends true | false +> = ResultSchema< + ZodArray, 'many'>, + Null, + isPatch +>; - if (propsField.isNullable) { - return schema.array().nullable() as ZodNullable< - ZodArray, 'many'> - >; +function getZodRulesForArray< + T extends TypeField, + Null extends true | false, + isPatch extends true | false +>( + propsField: T, + isNullable: Null, + isPatch: isPatch +): ZodRulesResultArray { + let schema: ZodType; + switch (propsField) { + case TypeField.number: + schema = getZodRulesForNumber(false, false); + break; + case TypeField.date: + schema = getZodRulesForDate(false, false); + break; + case TypeField.boolean: + schema = getZodRulesForBoolean(false, false); + break; + default: + schema = getZodRulesForString(false, false); } - return schema.array() as ZodArray, 'many'>; + + return setOptionalOrNot(schema.array(), isNullable, isPatch) as ResultSchema< + ZodArray, 'many'>, + Null, + isPatch + >; } -type ZodRulesForArray = T extends number - ? ReturnType - : T extends Date - ? ReturnType - : T extends boolean - ? ReturnType - : ReturnType; - -type ZodRulesForType = ReturnType< - T extends TypeField.array - ? typeof getZodRulesForArray - : T extends TypeField.date - ? typeof getZodRulesForDate +type ZodRulesForArray< + T extends TypeField, + Null extends true | false, + isPatch extends true | false +> = ReturnType>; + +export type ZodRulesForType< + T extends TypeField, + Null extends true | false, + isPatch extends true | false +> = ReturnType< + T extends TypeField.date + ? typeof getZodRulesForDate : T extends TypeField.boolean - ? typeof getZodRulesForBoolean + ? typeof getZodRulesForBoolean : T extends TypeField.number - ? typeof getZodRulesForNumber + ? typeof getZodRulesForNumber : T extends TypeField.object - ? typeof getZodSchemaForJson - : typeof getZodRulesForString + ? typeof getZodSchemaForJson + : typeof getZodRulesForString >; -function buildSchema( - fieldType: T, - propsField: P -): ZodRulesForType { - let schema: ZodRulesForType; - switch (fieldType) { - case TypeField.array: - schema = getZodRulesForArray(propsField) as ZodRulesForType; - break; +export type IsNullableProps< + E extends object, + IdKey extends string, + K extends keyof E +> = K extends EntityParam['propsNullable'][number] ? true : false; +type IsTypeArray = T extends TypeField.array ? 1 : 0; +type Props = EntityParam< + E, + IdKey +>['propsType']; + +type PropsArray = EntityParam< + E, + IdKey +>['propsArrayType']; + +type OmitPrimary = Omit< + Props, + IdKey +>; + +type ZodRules< + E extends object, + IdKey extends string, + P extends keyof E, + IsArray extends 1 | 0, + isPatch extends boolean +> = IsArray extends 1 + ? P extends keyof PropsArray + ? ZodRulesForArray< + PropsArray[P], + IsNullableProps, + isPatch + > + : never + : P extends keyof Props + ? ZodRulesForType[P], IsNullableProps, isPatch> + : never; + +export type ShapeAttributesType< + E extends object, + IdKey extends string, + isPatch extends boolean +> = { + [K in keyof OmitPrimary]: ZodRules< + E, + IdKey, + K, + IsTypeArray[K]>, + isPatch + >; +}; + +function assertPropsIsarrayProps( + paramMap: EntityParam, + propsName: unknown +): propsName is keyof PropsArray { + return Reflect.get(paramMap.propsType, `${propsName}`) === TypeField.array; +} + +function buildSchema< + E extends object, + IdKey extends string, + isPatch extends boolean, + K extends keyof Props +>( + paramMap: EntityParam, + propsName: K, + isPatch: isPatch +): ZodRules[K]>, isPatch> { + // @ts-expect-error need check in tuple + const isNullable = paramMap.propsNullable.includes(propsName); + if (assertPropsIsarrayProps(paramMap, propsName)) { + const arrayPropsType = paramMap.propsArrayType[propsName]; + + return getZodRulesForArray(arrayPropsType, isNullable, isPatch) as ZodRules< + E, + IdKey, + K, + IsTypeArray[K]>, + isPatch + >; + } + + const propsType = paramMap.propsType[propsName]; + switch (propsType) { case TypeField.date: - schema = getZodRulesForDate(propsField.isNullable) as ZodRulesForType< - T, - I + return getZodRulesForDate(isNullable, isPatch) as ZodRules< + E, + IdKey, + K, + IsTypeArray[K]>, + isPatch >; - break; case TypeField.boolean: - schema = getZodRulesForBoolean(propsField.isNullable) as ZodRulesForType< - T, - I + return getZodRulesForBoolean(isNullable, isPatch) as ZodRules< + E, + IdKey, + K, + IsTypeArray[K]>, + isPatch >; - break; case TypeField.number: - schema = getZodRulesForNumber(propsField.isNullable) as ZodRulesForType< - T, - I + return getZodRulesForNumber(isNullable, isPatch) as ZodRules< + E, + IdKey, + K, + IsTypeArray[K]>, + isPatch >; - break; case TypeField.object: - schema = getZodSchemaForJson(propsField.isNullable) as ZodRulesForType< - T, - I + return getZodSchemaForJson(isNullable, isPatch) as ZodRules< + E, + IdKey, + K, + IsTypeArray[K]>, + isPatch >; - break; default: - schema = getZodRulesForString(propsField.isNullable) as ZodRulesForType< - T, - I + return getZodRulesForString(isNullable, isPatch) as ZodRules< + E, + IdKey, + K, + IsTypeArray[K]>, + isPatch >; } +} - return schema; +function assertOmitKeysProps( + primaryColumnName: EntityParam['primaryColumnName'], + key: keyof Props +): key is keyof OmitPrimary { + return !(key.toString() === primaryColumnName); } export function zodAttributes< - E extends ObjectLiteral, + E extends object, + IdKey extends string, S extends true | false = false ->( - fieldWithType: FieldWithType, - propsDb: PropsForField, - primaryColumn: EntityProps, - isPatch: S -) { - const objectShape = {} as { - [K in keyof Omit, keyof EntityProps>]: ZodRulesForType< - FieldWithType[K], - TypeOfArray - >; - }; - - for (const [nameList, type] of ObjectTyped.entries(fieldWithType)) { - if (nameList === primaryColumn) continue; - const name = nameList as keyof Omit, keyof EntityProps>; - const propsField = propsDb[name]; - objectShape[name] = buildSchema< - typeof type, - typeof propsField, - TypeOfArray - >(type, propsField || {}); - } - const zodSchema = z.object(objectShape).strict(); - if (isPatch) { - return zodSchema.partial().refine(nonEmptyObject()); - } - return zodSchema.refine(nonEmptyObject()); +>(entityParamMapService: EntityParamMapService, isPatch: S) { + const paramsMap = entityParamMapService.entityParaMap; + + const objectShape = ObjectTyped.keys(paramsMap.propsType).reduce( + (acum, key) => { + if (assertOmitKeysProps(paramsMap.primaryColumnName, key)) { + acum[key] = buildSchema(paramsMap, key, isPatch); + } + + return acum; + }, + {} as ShapeAttributesType + ); + + return z.object(objectShape).strict().refine(nonEmptyObject()); } export type ZodAttributes< - E extends ObjectLiteral, + E extends object, + IdKey extends string, K extends true | false = false -> = ReturnType>; +> = ReturnType>; export type Attributes< - E extends ObjectLiteral, + E extends object, + IdKey extends string, K extends true | false = false -> = z.infer>; +> = z.infer>; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/id.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/id.spec.ts index d5ba401b..d3b401eb 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/id.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/id.spec.ts @@ -1,7 +1,7 @@ import { ZodError } from 'zod'; import { ZodId, zodId } from './id'; -import { TypeField } from '../../types'; +import { TypeField } from '../../../../types'; describe('zodIdSchema', () => { let numberStringSchema: ZodId; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/id.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/id.ts index 030ed201..74fea57e 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/id.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/id.ts @@ -1,5 +1,5 @@ import { z } from 'zod'; -import { TypeField, TypeForId } from '../../types'; +import { TypeField, TypeForId } from '../../../../types'; const reg = new RegExp('^-?\\d+$'); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/page.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/page.ts index 2682313b..352c49da 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/page.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/page.ts @@ -1,6 +1,5 @@ import { z } from 'zod'; import { DEFAULT_PAGE_SIZE, DEFAULT_QUERY_PAGE } from '../../../../constants'; -import { ObjectLiteral } from '../../../../types'; export function zodPageInputQuery() { return z @@ -20,4 +19,3 @@ export function zodPageInputQuery() { } export type ZodPageInputQuery = ReturnType; -export type PageInputQuery = z.infer; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/rel-data.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/rel-data.spec.ts index fe3e3122..169bfa7f 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/rel-data.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/rel-data.spec.ts @@ -1,6 +1,7 @@ import { zodRelData, ZodRelData } from './rel-data'; -import { TypeField } from '../../types'; + import { ZodError } from 'zod'; +import { TypeField } from '../../../../types'; describe('zodDataSchema', () => { let zodData: ZodRelData; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/rel-data.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/rel-data.ts index 619b9fc1..04dd9f13 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/rel-data.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/rel-data.ts @@ -1,6 +1,6 @@ import { z } from 'zod'; -import { TypeForId } from '../../types'; +import { TypeForId } from '../../../../types'; import { nonEmptyObject } from '../zod-utils'; import { zodType, zodId } from './'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/relationships.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/relationships.spec.ts index 3f101754..94d19697 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/relationships.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/relationships.spec.ts @@ -1,23 +1,16 @@ import { z, ZodError } from 'zod'; import { zodRelationships, ZodRelationships } from './relationships'; -import { Users } from '../../../../mock-utils/typeorm'; -import { - relationArrayProps, - relationPopsName, - primaryColumnType, -} from '../../../../utils/___test___/test.helper'; +import { Users } from '../../../../utils/___test___/test-classes.helper'; +import { usersEntityParamMapMockData } from '../../../../utils/___test___/test.helper'; describe('zodRelationships', () => { - let relationshipsSchema: ZodRelationships; - describe('POST', () => { + let relationshipsSchema: ZodRelationships; beforeAll(() => { relationshipsSchema = zodRelationships( - relationArrayProps, - relationPopsName, - primaryColumnType, + usersEntityParamMapMockData, false ); }); @@ -38,20 +31,18 @@ describe('zodRelationships', () => { id: '1', }, }, + addresses: { + data: { + type: 'addresses', + id: '1', + }, + }, manager: { data: { type: 'users', id: '1', }, }, - notes: { - data: [ - { - type: 'notes', - id: 'id', - }, - ], - }, }; expect(relationshipsSchema.parse(check)).toEqual(check); }); @@ -106,6 +97,14 @@ describe('zodRelationships', () => { const check16 = { manager: [], }; + const check17 = { + userGroup: { + data: { + type: 'user-groups', + id: '1', + }, + }, + }; const arrayCheck = [ check1, check2, @@ -123,6 +122,7 @@ describe('zodRelationships', () => { check14, check15, check16, + check17, ]; expect.assertions(arrayCheck.length); for (const item of arrayCheck) { @@ -136,13 +136,9 @@ describe('zodRelationships', () => { }); describe('PATCH', () => { + let relationshipsSchema: ZodRelationships; beforeAll(() => { - relationshipsSchema = zodRelationships( - relationArrayProps, - relationPopsName, - primaryColumnType, - true - ); + relationshipsSchema = zodRelationships(usersEntityParamMapMockData, true); }); it('Should be ok', () => { @@ -159,14 +155,6 @@ describe('zodRelationships', () => { id: '1', }, }, - notes: { - data: [ - { - type: 'notes', - id: 'id', - }, - ], - }, }; expect(relationshipsSchema.parse(check)).toEqual(check); }); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/relationships.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/relationships.ts index 3a6dd520..3204bfeb 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/relationships.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/relationships.ts @@ -1,157 +1,147 @@ import { z } from 'zod'; -import { - camelToKebab, - KebabCase, - ObjectTyped, -} from '../../../../utils/nestjs-shared'; - -import { ObjectLiteral } from '../../../../types'; +import { ObjectTyped } from '@klerick/json-api-nestjs-shared'; import { - RelationPropsArray, - RelationPropsTypeName, - RelationPrimaryColumnType, + EntityParam, TypeForId, -} from '../../types'; -import { zodRelData } from './rel-data'; -import { nonEmptyObject } from '../zod-utils'; - -function getZodRuleForData< - K extends string, - P extends TypeForId, - T extends true | false = false ->(typeName: K, primaryType: P, isPatch: T) { - if (isPatch) { - return zodRelData(typeName, primaryType).nullable(); - } - return zodRelData(typeName, primaryType); -} + RelationProperty, + TypeField, +} from '../../../../types'; -function getZodRuleForArrayData< - K extends string, - P extends TypeForId, - T extends true | false = false ->(typeName: K, primaryType: P, isPatch: T) { - const dataArraySchema = getZodRuleForData( - typeName, - primaryType, - false - ).array(); - if (isPatch) { - return dataArraySchema; - } - return dataArraySchema.nonempty(); -} - -function getZodDataShape< - K extends string, - P extends TypeForId, - I extends true, - T extends true | false = false ->( - typeName: K, - primaryType: P, - isArray: I, - isPatch: T -): ReturnType>; -function getZodDataShape< - K extends string, - P extends TypeForId, - I extends false, - T extends true | false = false ->( - typeName: K, - primaryType: P, - isArray: I, - isPatch: T -): ReturnType>; -function getZodDataShape< - K extends string, - P extends TypeForId, - I extends boolean, - T extends true | false = false ->( - typeName: K, - primaryType: P, - isArray: I, - isPatch: T -): ReturnType< - typeof getZodRuleForArrayData | typeof getZodRuleForData -> { - return isArray - ? getZodRuleForArrayData(typeName, primaryType, isPatch) - : getZodRuleForData(typeName, primaryType, isPatch); -} +import { zodRelData } from './rel-data'; +import { nonEmptyObject, setOptionalOrNot } from '../zod-utils'; +import { EntityParamMapService } from '../../service'; function getZodResultData< - K extends string, - P extends TypeForId, - T extends true | false = false ->(typeName: K, primaryType: P, isPatch: T) { - return z - .object({ - data: getZodDataShape(typeName, primaryType, false, isPatch), - }) - .optional(); + TypeName extends string, + Type extends TypeForId, + IsNull extends true | false = false, + IsPatch extends true | false = false +>(typeName: TypeName, primaryType: Type, isNull: IsNull, isPatch: IsPatch) { + const dataScheme = z.object({ + data: setOptionalOrNot(zodRelData(typeName, primaryType), isNull, isPatch), + }); + return setOptionalOrNot(dataScheme.refine(nonEmptyObject()), isNull, isPatch); } -function getZodResultDataArray< - K extends string, - P extends TypeForId, - T extends true | false = false ->(typeName: K, primaryType: P, isPatch: T) { +function getZodResultDataArray( + typeName: TypeName, + primaryType: Type +) { return z .object({ - data: getZodDataShape(typeName, primaryType, true, isPatch), + data: zodRelData(typeName, primaryType).array(), }) .optional(); } +type IsArrayRelation< + E extends object, + R extends keyof RelationProperty +> = RelationProperty[R]['isArray']; + +type IsNullableRelation< + E extends object, + R extends keyof RelationProperty +> = RelationProperty[R]['nullable']; + +type EntityParamForRel< + E extends object, + R extends keyof RelationProperty, + IdKey extends string +> = EntityParam[R]['entityClass'], IdKey>; + +type RelPrimaryColumnType = IdKey extends TypeForId + ? IdKey + : TypeField.string; + +type ZodResultDataArray< + E extends object, + R extends keyof RelationProperty, + IdKey extends string +> = ReturnType< + typeof getZodResultDataArray< + EntityParamForRel['typeName'], + RelPrimaryColumnType['primaryColumnType']> + > +>; + type ZodResultData< - K extends string, - P extends TypeForId, - I extends boolean, - T extends true | false = false -> = I extends true - ? ReturnType> - : ReturnType>; + E extends object, + R extends keyof RelationProperty, + IdKey extends string, + IsPatch extends boolean +> = ReturnType< + typeof getZodResultData< + EntityParamForRel['typeName'], + RelPrimaryColumnType['primaryColumnType']>, + IsNullableRelation, + IsPatch + > +>; + +type ZodData< + E extends object, + R extends keyof RelationProperty, + IdKey extends string, + IsPatch extends boolean, + IsArray extends boolean +> = IsArray extends true + ? ZodResultDataArray + : ZodResultData; + +export type ZodRelationShape< + E extends object, + IdKey extends string, + IsPatch extends true | false = false +> = { + [K in keyof RelationProperty]: ZodData< + E, + K, + IdKey, + IsPatch, + IsArrayRelation + >; +}; export function zodRelationships< - E extends ObjectLiteral, - S extends true | false = false ->( - relationArrayProps: RelationPropsArray, - relationPopsName: RelationPropsTypeName, - primaryColumnType: RelationPrimaryColumnType, - isPatch: S -) { - const shape = {} as { - [K in keyof RelationPropsArray]: ZodResultData< - KebabCase[K]>, - RelationPrimaryColumnType[K], - RelationPropsArray[K], - S - >; - }; - - for (const [props, value] of ObjectTyped.entries(relationArrayProps)) { - const typeName = camelToKebab(relationPopsName[props]); - const primaryType = primaryColumnType[props]; - shape[props] = ( - value === true - ? getZodResultDataArray(typeName, primaryType, isPatch) - : getZodResultData(typeName, primaryType, isPatch) - ) as ZodResultData; - } + E extends object, + IdKey extends string, + IsPatch extends true | false = false +>(entityParamMapService: EntityParamMapService, isPatch: IsPatch) { + const shape = ObjectTyped.entries( + entityParamMapService.entityParaMap.relationProperty + ).reduce((acum, [key, val]) => { + const relEntityParaMap = entityParamMapService.getParamMap( + val.entityClass as any + ) as EntityParamForRel; + + if (val.isArray) { + acum[key] = getZodResultDataArray( + relEntityParaMap.typeName, + relEntityParaMap.primaryColumnType as TypeForId + ) as ZodData; + } else { + acum[key] = getZodResultData( + relEntityParaMap.typeName, + relEntityParaMap.primaryColumnType as TypeForId, + val.nullable, + isPatch + ) as ZodData; + } + return acum; + }, {} as ZodRelationShape); return z.object(shape).strict().refine(nonEmptyObject()); } export type ZodRelationships< - T extends ObjectLiteral, - K extends true | false = false -> = ReturnType>; + E extends object, + IdKey extends string, + S extends true | false = false +> = ReturnType>; export type Relationships< - T extends ObjectLiteral, - K extends true | false = false -> = z.infer>; + E extends object, + IdKey extends string, + S extends true | false = false +> = z.infer>; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/type.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/type.ts index 297952d1..8c905410 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/type.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/type.ts @@ -1,4 +1,4 @@ -import { z } from 'zod'; +import { z, ZodNullable, ZodOptional, ZodType as InnerZodType } from 'zod'; export function zodType(type: T) { return z.literal(type); @@ -6,3 +6,21 @@ export function zodType(type: T) { export type ZodType = ReturnType>; export type Type = z.infer>; + +type ResultPatchSchema< + Schema extends InnerZodType, + Null extends true | false +> = Null extends true ? ZodOptional> : ZodOptional; + +type ResultPostSchema< + Schema extends InnerZodType, + Null extends true | false +> = Null extends true ? ZodOptional> : Schema; + +export type ResultSchema< + Schema extends InnerZodType, + Null extends true | false, + isPatch extends true | false +> = isPatch extends true + ? ResultPatchSchema + : ResultPostSchema; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-utils.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-utils.spec.ts index 33346a35..dd3be42a 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-utils.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-utils.spec.ts @@ -8,7 +8,7 @@ import { stringMustBe, guardIsKeyOfObject, } from './zod-utils'; -import { TypeField } from '../types'; +import { TypeField } from '../../../types'; describe('zod-utils', () => { describe('guardIsKeyOfObject', () => { diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-utils.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-utils.ts index 50dc7040..9c6e48fe 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-utils.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-utils.ts @@ -1,4 +1,10 @@ -import { TypeField } from '../types'; +import { ObjectTyped } from '@klerick/json-api-nestjs-shared'; + +import { ZodType } from 'zod'; + +import { EntityRelationProps, TypeField } from '../../../types'; +import { EntityParamMapService } from '../service'; +import { ResultSchema } from './zod-share'; export const nonEmptyObject = () => @@ -67,3 +73,39 @@ export function guardIsKeyOfObject( throw new Error('Type guard error'); } + +export function getRelationProps( + entityParamMapService: EntityParamMapService +) { + return ObjectTyped.entries( + entityParamMapService.entityParaMap.relationProperty + ).reduce((acum, [name, value]) => { + const relMap = entityParamMapService.getParamMap(value.entityClass as any); + Reflect.set(acum, name, relMap.props); + return acum; + }, {} as EntityRelationProps); +} + +export function setOptionalOrNot< + Schema extends ZodType, + Null extends true | false, + isPatch extends true | false +>( + schema: Schema, + isNullable: Null, + isPatch: isPatch +): ResultSchema { + if (isPatch) { + return (isNullable ? schema.nullable() : schema).optional() as ResultSchema< + Schema, + Null, + isPatch + >; + } else { + return (isNullable ? schema.nullable().optional() : schema) as ResultSchema< + Schema, + Null, + isPatch + >; + } +} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/constants/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/constants/index.ts deleted file mode 100644 index b5faede6..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/constants/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const SUB_QUERY_ALIAS_FOR_PAGINATION = 'subQueryWithLimitOffset'; -export const ALIAS_FOR_PAGINATION = 'aliasForPagination'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-helper/index.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-helper/index.spec.ts deleted file mode 100644 index 8a06a3df..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-helper/index.spec.ts +++ /dev/null @@ -1,422 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { getDataSourceToken } from '@nestjs/typeorm'; -import { - ObjectTyped, - EntityRelation, - TypeOfArray, - EntityProps, -} from '../../../utils/nestjs-shared'; -import { Repository } from 'typeorm'; -import { IMemoryDb } from 'pg-mem'; - -import { - mockDBTestModule, - pullUser, - pullAllData, - providerEntities, - getRepository, - Users, - Addresses, - Notes, - Comments, - Roles, - UserGroups, -} from '../../../mock-utils/typeorm'; - -import { - getField, - getPropsTreeForRepository, - fromRelationTreeToArrayName, - getArrayFields, - getArrayPropsForEntity, - getFieldWithType, - getTypeForAllProps, - getRelationTypeArray, - getTypePrimaryColumn, - getPropsFromDb, - getRelationTypeName, - getRelationTypePrimaryColumn, -} from './'; - -import { PropsArray, ArrayPropsForEntity, TypeField } from '../../mixin/types'; -import { createAndPullSchemaBase } from '../../../mock-utils'; - -describe('type-orm-helper', () => { - let userRepository: Repository; - let addressesRepository: Repository; - let notesRepository: Repository; - let commentsRepository: Repository; - let rolesRepository: Repository; - let userGroupRepository: Repository; - let db: IMemoryDb; - let user: Users; - let userWithRelation: Users; - beforeAll(async () => { - db = createAndPullSchemaBase(); - const module: TestingModule = await Test.createTestingModule({ - imports: [mockDBTestModule(db)], - providers: [...providerEntities(getDataSourceToken())], - }).compile(); - ({ - userRepository, - addressesRepository, - notesRepository, - commentsRepository, - rolesRepository, - userGroupRepository, - } = getRepository(module)); - - user = await pullUser(userRepository); - userWithRelation = await pullAllData( - userRepository, - addressesRepository, - notesRepository, - commentsRepository, - rolesRepository, - userGroupRepository - ); - }); - - it('getField', async () => { - const { relations, field } = getField(userRepository); - const userFieldProps = Object.getOwnPropertyNames( - user - ) as EntityProps[]; - const hasUserFieldInResultField = userFieldProps.some( - (field) => !field.includes(field) - ); - - const hasResultInUserField = field.some( - (field) => !userFieldProps.includes(field) - ); - - const userRelationProps: EntityRelation[] = ( - Object.getOwnPropertyNames(userWithRelation) as (EntityProps & - EntityRelation)[] - ).filter((props) => !userFieldProps.includes(props)); - - const hasUserRelationInResultField = userRelationProps.some( - (field) => !relations.includes(field) - ); - - const hasResultInUserRelation = relations.some( - (field) => !userRelationProps.includes(field) - ); - - expect(hasUserFieldInResultField).toEqual(false); - expect(hasResultInUserField).toEqual(false); - - expect(hasUserRelationInResultField).toEqual(false); - expect(hasResultInUserRelation).toEqual(false); - }); - - it('getPropsTreeForRepository', () => { - const relationField = getPropsTreeForRepository(userRepository); - const userFieldProps = Object.getOwnPropertyNames( - user - ) as EntityProps[]; - const userRelationProps: EntityRelation[] = ( - Object.getOwnPropertyNames(userWithRelation) as (EntityProps & - EntityRelation)[] - ).filter((props) => !userFieldProps.includes(props)); - - const hasUserRelationInResultField = userRelationProps.some( - (field) => !Object.keys(relationField).includes(field) - ); - const hasResultInUserRelation = ObjectTyped.keys(relationField).some( - (field) => !userRelationProps.includes(field) - ); - expect(hasUserRelationInResultField).toEqual(false); - expect(hasResultInUserRelation).toEqual(false); - - for (const [relationName, fieldsRelation] of ObjectTyped.entries( - relationField - )) { - const check = fieldsRelation.some((field) => { - const targetItem = userWithRelation[relationName]; - const target = Array.isArray(targetItem) ? targetItem[0] : targetItem; - // @ts-ignore - return !ObjectTyped.keys(target).includes(field); - }); - expect(check).toEqual(false); - } - }); - - it('fromRelationTreeToArrayName', () => { - const { relations, field } = getField(userRepository); - - const relationField = getPropsTreeForRepository(userRepository); - const checkArray = fromRelationTreeToArrayName(relationField); - - for (const key of relations) { - const resultKey = - key === 'manager' ? 'Users' : key === 'userGroup' ? 'UserGroups' : key; - - const relationsRepo = - userRepository.metadata.connection.getRepository< - TypeOfArray - >(resultKey); - const { field: relationsFields } = getField(relationsRepo); - const textField = relationsFields.map((r) => `${key}.${r}`); - const check = textField.some((i) => !checkArray.includes(i as any)); - expect(check).toEqual(false); - } - }); - - it('getArrayFields', () => { - const result = getArrayFields(addressesRepository); - expect(result).toEqual({ - arrayField: true, - } as PropsArray); - }); - - it('getArrayPropsForEntity', () => { - const result = getArrayPropsForEntity(userRepository); - const check: ArrayPropsForEntity = { - target: { - testReal: true, - testArrayNull: true, - }, - manager: { - testReal: true, - testArrayNull: true, - }, - comments: {}, - notes: {}, - userGroup: {}, - roles: {}, - addresses: { - arrayField: true, - }, - }; - expect(result).toEqual(check); - }); - - it('getFieldWithType', () => { - const result = getFieldWithType(addressesRepository); - expect(result.arrayField).toBe('array'); - expect(result.state).toBe('string'); - expect(result.id).toBe('number'); - expect(result.createdAt).toBe('date'); - const result2 = getFieldWithType(userRepository); - - expect(result2.isActive).toBe('boolean'); - }); - - it('getRelationType', () => { - const result = getRelationTypeArray(userRepository); - expect(result.roles).toBe(true); - expect(result.comments).toBe(true); - expect(result.manager).toBe(false); - expect(result.addresses).toBe(false); - expect(result.userGroup).toBe(false); - expect(result.notes).toBe(true); - }); - - it('getRelationTypeName', () => { - const result = getRelationTypeName(userRepository); - expect(result.roles).toBe('Roles'); - expect(result.comments).toBe('Comments'); - expect(result.manager).toBe('Users'); - expect(result.addresses).toBe('Addresses'); - expect(result.userGroup).toBe('UserGroups'); - expect(result.notes).toBe('Notes'); - }); - - it('getRelationTypePrimaryColumn', () => { - const result = getRelationTypePrimaryColumn(userRepository); - expect(result.roles).toBe(TypeField.number); - expect(result.comments).toBe(TypeField.number); - expect(result.manager).toBe(TypeField.number); - expect(result.addresses).toBe(TypeField.number); - expect(result.userGroup).toBe(TypeField.number); - expect(result.notes).toBe(TypeField.string); - }); - - it('getTypePrimaryColumn', () => { - expect(getTypePrimaryColumn(userRepository)).toBe(TypeField.number); - expect(getTypePrimaryColumn(notesRepository)).toBe(TypeField.string); - }); - - it('getTypeForAllProps', () => { - const result = getTypeForAllProps(userRepository); - expect(result.manager.id).toBe(TypeField.number); - expect(result.testDate).toBe(TypeField.date); - expect(result.comments.id).toBe(TypeField.number); - expect(result.notes.id).toBe(TypeField.string); - }); - - it('getPropsFromDb', () => { - const result = getPropsFromDb(userRepository); - // testReal has isNullable false but have default should be true - expect(result['testReal']).toEqual({ - type: 'real', - isArray: true, - isNullable: true, - }); - - const result2 = getPropsFromDb(rolesRepository); - expect(result2['key']).toEqual({ - type: 'varchar', - isArray: false, - isNullable: false, - }); - }); -}); - -import { - getProps, - getRelation, - getPropsType, - getPropsNullable, - getPrimaryColumnName, - getPrimaryColumnType, - getRelationProperty, -} from './'; - -describe('typeorm-orm-helper-for-map', () => { - let userRepository: Repository; - let addressesRepository: Repository; - let notesRepository: Repository; - let commentsRepository: Repository; - let rolesRepository: Repository; - let userGroupRepository: Repository; - let db: IMemoryDb; - let user: Users; - let userWithRelation: Users; - beforeAll(async () => { - db = createAndPullSchemaBase(); - const module: TestingModule = await Test.createTestingModule({ - imports: [mockDBTestModule(db)], - providers: [...providerEntities(getDataSourceToken())], - }).compile(); - - ({ - userRepository, - addressesRepository, - notesRepository, - commentsRepository, - rolesRepository, - userGroupRepository, - } = getRepository(module)); - }); - - it('getProps', () => { - const result = getProps(userRepository); - expect(result.includes('id')).toBe(true); - expect(result.includes('lastName')).toBe(true); - expect(result.includes('createdAt')).toBe(true); - expect(result.includes('updatedAt')).toBe(true); - expect(result.includes('isActive')).toBe(true); - expect(result.includes('login')).toBe(true); - expect(result.includes('firstName')).toBe(true); - expect(result.includes('testReal')).toBe(true); - expect(result.includes('testArrayNull')).toBe(true); - expect(result.includes('testDate')).toBe(true); - - expect(result.includes('userGroup' as any)).toBe(false); - expect(result.includes('notes' as any)).toBe(false); - expect(result.includes('comments' as any)).toBe(false); - expect(result.includes('roles' as any)).toBe(false); - expect(result.includes('manager' as any)).toBe(false); - expect(result.includes('addresses' as any)).toBe(false); - }); - - it('getPropsType', () => { - const result = getPropsType(userRepository); - - expect(result).toEqual({ - createdAt: 'date', - firstName: 'string', - id: 'number', - isActive: 'boolean', - lastName: 'string', - login: 'string', - testArrayNull: 'array', - testDate: 'date', - testReal: 'array', - updatedAt: 'date', - }); - }); - - it('getPropsNullable', () => { - const result = getPropsNullable(userRepository); - expect(result).toEqual([ - 'firstName', - 'testReal', - 'testArrayNull', - 'lastName', - 'isActive', - 'testDate', - 'createdAt', - 'updatedAt', - ]); - }); - - it('getPrimaryColumnName', () => { - const result = getPrimaryColumnName(userRepository); - expect(result).toBe('id'); - }); - - it('getPrimaryColumnType', () => { - const result = getPrimaryColumnType(userRepository); - expect(result).toBe(TypeField.number); - }); - - it('getRelation', () => { - const result = getRelation(userRepository); - expect(result.includes('id' as any)).toBe(false); - expect(result.includes('lastName' as any)).toBe(false); - expect(result.includes('createdAt' as any)).toBe(false); - expect(result.includes('updatedAt' as any)).toBe(false); - expect(result.includes('isActive' as any)).toBe(false); - expect(result.includes('login' as any)).toBe(false); - expect(result.includes('firstName' as any)).toBe(false); - expect(result.includes('testReal' as any)).toBe(false); - expect(result.includes('testArrayNull' as any)).toBe(false); - expect(result.includes('testDate' as any)).toBe(false); - - expect(result.includes('userGroup')).toBe(true); - expect(result.includes('notes')).toBe(true); - expect(result.includes('comments')).toBe(true); - expect(result.includes('roles')).toBe(true); - expect(result.includes('manager')).toBe(true); - expect(result.includes('addresses')).toBe(true); - }); - - it('getRelationProperty', () => { - const result = getRelationProperty(userRepository); - expect(result).toEqual({ - addresses: { - entityClass: Addresses, - isArray: false, - nullable: true, - }, - comments: { - entityClass: Comments, - isArray: true, - nullable: false, - }, - manager: { - entityClass: Users, - isArray: false, - nullable: true, - }, - notes: { - entityClass: Notes, - isArray: true, - nullable: false, - }, - roles: { - entityClass: Roles, - isArray: true, - nullable: false, - }, - userGroup: { - entityClass: UserGroups, - isArray: false, - nullable: true, - }, - }); - }); -}); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-helper/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-helper/index.ts deleted file mode 100644 index 4657b4be..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-helper/index.ts +++ /dev/null @@ -1,417 +0,0 @@ -import { - EntityProps, - EntityRelation, - ObjectTyped, -} from '../../../utils/nestjs-shared'; -import { Repository } from 'typeorm'; - -import { ObjectLiteral, ResultMicroOrmModuleOptions } from '../../../types'; -import { - RelationTree, - ValueOf, - UnionToTuple, - TypeCast, - Concat, - TypeOfArray, - CastProps, - PropsNameResultField, - PropsArray, - RelationType, - ResultGetField, - ArrayPropsForEntity, - AllFieldWithType, - TypeField, - FieldWithType, - RelationPropsArray, - TypeForId, - PropsForField, - ColumnType, - RelationPropsTypeName, - RelationPrimaryColumnType, - TupleOfEntityRelation, - TupleOfEntityProps, - FilterNullableProps, - RelationProperty, -} from '../../mixin/types'; -import { getEntityName } from '../../mixin/helper'; -import { EntityMetadata } from '@mikro-orm/core'; - -export type ConcatFieldWithRelation< - R extends string, - T extends readonly string[] -> = ValueOf<{ - [K in T[number]]: Concat; -}>; - -export type ConcatRelationUnion< - E extends ObjectLiteral, - R = RelationTree -> = ValueOf<{ - [K in keyof R]: ConcatFieldWithRelation< - TypeCast, - TypeCast - >; -}>; - -export type ConcatRelation = TypeCast< - UnionToTuple>, - [string, ...string[]] ->; - -export const getField = ( - repository: Repository -): ResultGetField => { - const relations = repository.metadata.relations.map((i) => { - return i.propertyName; - }); - - const field = repository.metadata.columns - .filter((i) => !relations.includes(i.propertyName)) - .map((r) => r.propertyName); - - return { - field, - relations, - } as unknown as ResultGetField; -}; - -export const fromRelationTreeToArrayName = ( - relationTree: RelationTree -): ConcatRelation => { - return ObjectTyped.entries(relationTree).reduce((acum, [name, filed]) => { - acum.push(...filed.map((i) => `${name.toLocaleString()}.${i}`)); - return acum; - }, [] as string[]) as unknown as ConcatRelation; -}; - -export const getPropsTreeForRepository = ( - repository: Repository -): RelationTree => { - const dataSource = repository.metadata.connection; - - const relationType = repository.metadata.relations.reduce((acum, i) => { - acum[i.propertyName] = i.inverseEntityMetadata.target; - return acum; - }, {} as Record) as unknown as RelationType; - - return ObjectTyped.entries(relationType).reduce( - (acum, [key, value]) => ({ - ...acum, - ...{ [key]: getField(dataSource.getRepository(value))['field'] }, - }), - {} as RelationTree - ); -}; - -export type PropertyTarget< - E extends ObjectLiteral, - For extends PropsNameResultField -> = { - [K in ResultGetField[For][number]]: K extends keyof E - ? TypeOfArray - : never; -}; - -export function guardKeyForPropertyTarget< - E extends ObjectLiteral, - For extends PropsNameResultField, - R extends PropertyTarget ->(relationsTargets: R, key: any): asserts key is keyof R { - if (!(key in relationsTargets)) throw new Error('Type guard error'); -} - -export const getArrayPropsForEntity = ( - repository: Repository -): ArrayPropsForEntity => { - const connection = repository.metadata.connection; - - const relationsTargets = repository.metadata.relations.reduce( - (acum, i) => ({ - ...acum, - [i.propertyName]: i.type, - }), - {} as Record - ) as PropertyTarget; - - const { relations } = getField(repository); - const relationsArrayFields = relations.reduce( - (acum, item) => { - guardKeyForPropertyTarget(relationsTargets, item); - const target = relationsTargets[item] as TypeCast< - TypeOfArray>, - ObjectLiteral - >; - - const repository = connection.getRepository( - target as Function - ) as Repository; - - acum[item] = getArrayFields(repository) as PropsArray< - TypeOfArray> - >; - - return acum; - }, - {} as { - [K in ResultGetField['relations'][number]]: PropsArray< - TypeOfArray> - >; - } - ); - - return { - target: getArrayFields(repository), - ...relationsArrayFields, - }; -}; - -export const getArrayFields = ( - repository: Repository -): PropsArray => { - const relations = repository.metadata.relations.map((i) => { - return i.propertyName; - }); - - return repository.metadata.columns - .filter((i) => !relations.includes(i.propertyName)) - .reduce((acum, metaData) => { - if (metaData.isArray) { - acum[metaData.propertyName] = true; - } - return acum; - }, {} as Record) as PropsArray; -}; - -export const getTypeForAllProps = ( - repository: Repository -): AllFieldWithType => { - const targetField = getFieldWithType(repository); - - const relationField = repository.metadata.relations.reduce((acum, item) => { - acum[item.propertyName] = getFieldWithType( - repository.manager.getRepository(item.inverseEntityMetadata.target) - ); - return acum; - }, {} as any); - - return { - ...targetField, - ...relationField, - }; -}; - -export const getFieldWithType = ( - repository: Repository -): FieldWithType => { - const { field } = getField(repository); - - const entity = repository.target as any; - const result = {} as any; - for (const item of field) { - let typeProps: TypeField = TypeField.string; - switch (Reflect.getMetadata('design:type', entity['prototype'], item)) { - case Array: - typeProps = TypeField.array; - break; - case Date: - typeProps = TypeField.date; - break; - case Number: - typeProps = TypeField.number; - break; - case Boolean: - typeProps = TypeField.boolean; - break; - case Object: - typeProps = TypeField.object; - break; - default: - typeProps = TypeField.string; - } - result[item] = typeProps; - } - - return result; -}; - -export const getRelationTypeArray = ( - repository: Repository -): RelationPropsArray => { - const { relations } = getField(repository); - - const entity = repository.target as any; - const result = {} as any; - for (const item of relations) { - result[item] = - Reflect.getMetadata('design:type', entity['prototype'], item) === Array; - } - return result; -}; - -export const getTypePrimaryColumn = ( - repository: Repository -): TypeForId => { - const target = repository.target as any; - const primaryColumn = repository.metadata.primaryColumns[0].propertyName; - - return Reflect.getMetadata( - 'design:type', - target['prototype'], - primaryColumn - ) === Number - ? TypeField.number - : TypeField.string; -}; - -export const getPropsFromDb = ( - repository: Repository -): PropsForField => { - return repository.metadata.columns.reduce((acum, i) => { - const tmp = i.propertyName as unknown as EntityProps & EntityRelation; - acum[tmp] = { - type: i.type as ColumnType, - isArray: i.isArray, - isNullable: i.isNullable || i.default !== undefined, - }; - return acum; - }, {} as PropsForField); -}; - -export const getRelationTypeName = ( - repository: Repository -): RelationPropsTypeName => { - return repository.metadata.relations.reduce((acum, i) => { - acum[i.propertyName] = getEntityName(i.inverseEntityMetadata.target); - return acum; - }, {} as Record) as RelationPropsTypeName; -}; - -export const getRelationTypePrimaryColumn = ( - repository: Repository -): RelationPrimaryColumnType => { - return repository.metadata.relations.reduce((acum, i) => { - const target = i.inverseEntityMetadata.target as any; - const primaryColumn = - i.inverseEntityMetadata.primaryColumns[0].propertyName; - acum[i.propertyName] = - Reflect.getMetadata('design:type', target['prototype'], primaryColumn) === - Number - ? TypeField.number - : TypeField.string; - return acum; - }, {} as Record) as RelationPrimaryColumnType; -}; -// ----- - -export const getRelation = ( - repository: Repository -) => - repository.metadata.relations.map((i) => { - return i.propertyName; - }) as TupleOfEntityRelation; - -export const getProps = ( - repository: Repository -): TupleOfEntityProps => { - const relations = getRelation(repository); - - return repository.metadata.columns - .filter((i) => !relations.includes(i.propertyName)) - .map((r) => r.propertyName) as TupleOfEntityProps; -}; - -export const getPropsType = ( - repository: Repository -): FieldWithType => { - const field = getProps(repository); - - const entity = repository.target as any; - const result = {} as any; - for (const item of field) { - let typeProps: TypeField = TypeField.string; - - const fieldMetadata = repository.metadata.columns.find( - (i) => i.propertyName === item - ); - - if (fieldMetadata?.isArray) { - result[item] = TypeField.array; - continue; - } - - switch (Reflect.getMetadata('design:type', entity['prototype'], item)) { - case Array: - typeProps = TypeField.array; - break; - case Date: - typeProps = TypeField.date; - break; - case Number: - typeProps = TypeField.number; - break; - case Boolean: - typeProps = TypeField.boolean; - break; - case Object: - typeProps = TypeField.object; - break; - default: - typeProps = TypeField.string; - } - - result[item] = fieldMetadata?.isArray ? TypeField.array : typeProps; - } - - return result; -}; - -export const getPropsNullable = ( - repository: Repository -): FilterNullableProps> => { - const relation = getRelation(repository); - return repository.metadata.columns - .filter((i) => !relation.includes(i.propertyName)) - .map((i) => - i.isNullable || i.default !== undefined ? i.propertyName : false - ) - .filter((i) => !!i) as FilterNullableProps>; -}; - -export const getPrimaryColumnName = ( - repository: Repository -) => { - const column = repository.metadata.primaryColumns.at(0); - if (!column) throw new Error('Primary column not found'); - - return column.propertyName; -}; - -export const getPrimaryColumnType = ( - repository: Repository -): TypeForId => { - const target = repository.target as any; - const primaryColumn = repository.metadata.primaryColumns[0].propertyName; - - return Reflect.getMetadata( - 'design:type', - target['prototype'], - primaryColumn - ) === Number - ? TypeField.number - : TypeField.string; -}; - -export const getRelationProperty = ( - repository: Repository -): RelationProperty => { - return repository.metadata.relations.reduce((acum, item) => { - // @ts-expect-error its dynamic creater - acum[item.propertyName] = { - entityClass: item.inverseEntityMetadata.target, - nullable: item.isManyToMany || item.isOneToMany ? false : item.isNullable, - isArray: item.isManyToMany || item.isOneToMany, - }; - - return acum; - }, {} as RelationProperty); -}; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/delete-one/delete-one.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/delete-one/delete-one.spec.ts deleted file mode 100644 index c47d008e..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/delete-one/delete-one.spec.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { IMemoryDb } from 'pg-mem'; -import { getDataSourceToken } from '@nestjs/typeorm'; - -import { - mockDBTestModule, - providerEntities, -} from '../../../../mock-utils/typeorm'; -import { - CurrentDataSourceProvider, - CurrentEntityManager, - CurrentEntityRepository, - OrmServiceFactory, -} from '../../factory'; -import { CURRENT_ENTITY, DEFAULT_CONNECTION_NAME } from '../../../../constants'; - -import { - getRepository, - pullUser, - Users, - entities, -} from '../../../../mock-utils/typeorm'; - -import { Repository } from 'typeorm'; -import { CONTROL_OPTIONS_TOKEN, ORM_SERVICE } from '../../../../constants'; -import { JsonApiTransformerService } from '../../../mixin/service/json-api-transformer.service'; -import { TypeOrmService, TypeormUtilsService } from '../../service'; -import { createAndPullSchemaBase } from '../../../../mock-utils'; -import { EntityPropsMap } from '../../factory'; - -describe('deleteOne', () => { - let db: IMemoryDb; - let typeormService: TypeOrmService; - - let user: Users; - let userRepository: Repository; - - beforeAll(async () => { - db = createAndPullSchemaBase(); - const module: TestingModule = await Test.createTestingModule({ - imports: [mockDBTestModule(db)], - providers: [ - ...providerEntities(getDataSourceToken()), - CurrentDataSourceProvider(DEFAULT_CONNECTION_NAME), - { - provide: CURRENT_ENTITY, - useValue: Users, - }, - { - provide: CONTROL_OPTIONS_TOKEN, - useValue: { - requiredSelectField: false, - debug: false, - }, - }, - EntityPropsMap(entities as any), - CurrentEntityManager(), - CurrentEntityRepository(Users), - TypeormUtilsService, - JsonApiTransformerService, - OrmServiceFactory(), - ], - }).compile(); - ({ userRepository } = getRepository(module)); - user = await pullUser(userRepository); - typeormService = module.get>(ORM_SERVICE); - }); - - it('Should be ok', async () => { - await typeormService.deleteOne(`${user.id}`); - expect(await userRepository.findOneBy({ id: user.id })).toBe(null); - }); -}); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/service/type-orm.service.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/service/type-orm.service.ts deleted file mode 100644 index 1e040512..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/service/type-orm.service.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { - ResourceObject, - EntityRelation, - ResourceObjectRelationships, -} from '../../../utils/nestjs-shared'; -import { Inject } from '@nestjs/common'; -import { Repository } from 'typeorm'; - -import { OrmService } from '../../mixin/types'; -import { - PatchData, - PatchRelationshipData, - PostData, - PostRelationshipData, - Query, - QueryOne, -} from '../../mixin/zod'; -import { ConfigParam, ObjectLiteral } from '../../../types'; - -import { - getAll, - getOne, - deleteOne, - postOne, - patchOne, - getRelationship, - postRelationship, - deleteRelationship, - patchRelationship, -} from '../orm-methods'; - -import { TypeormUtilsService } from './typeorm-utils.service'; -import { JsonApiTransformerService } from '../../mixin/service/json-api-transformer.service'; -import { - CONTROL_OPTIONS_TOKEN, - CURRENT_ENTITY_REPOSITORY, -} from '../../../constants'; -import { TypeOrmParam } from '../type'; - -export class TypeOrmService implements OrmService { - @Inject(TypeormUtilsService) - public typeormUtilsService!: TypeormUtilsService; - @Inject(JsonApiTransformerService) - public transformDataService!: JsonApiTransformerService; - @Inject(CONTROL_OPTIONS_TOKEN) public config!: ConfigParam & TypeOrmParam; - @Inject(CURRENT_ENTITY_REPOSITORY) public repository!: Repository; - - getAll(query: Query): Promise> { - return getAll.call< - TypeOrmService, - Parameters>, - ReturnType> - >(this, query); - } - - deleteOne(id: number | string): Promise { - return deleteOne.call< - TypeOrmService, - Parameters>, - ReturnType> - >(this, id); - } - - deleteRelationship>( - id: number | string, - rel: Rel, - input: PostRelationshipData - ): Promise { - return deleteRelationship.call< - TypeOrmService, - Parameters>, - ReturnType> - >(this, id, rel, input); - } - - getOne(id: number | string, query: QueryOne): Promise> { - return getOne.call< - TypeOrmService, - Parameters>, - ReturnType> - >(this, id, query); - } - - getRelationship>( - id: number | string, - rel: Rel - ): Promise> { - return getRelationship.call< - TypeOrmService, - Parameters>, - ReturnType> - >(this, id, rel); - } - - patchOne( - id: number | string, - inputData: PatchData - ): Promise> { - return patchOne.call< - TypeOrmService, - Parameters>, - ReturnType> - >(this, id, inputData); - } - - patchRelationship>( - id: number | string, - rel: Rel, - input: PatchRelationshipData - ): Promise> { - return patchRelationship.call< - TypeOrmService, - Parameters>, - ReturnType> - >(this, id, rel, input); - } - - postOne(inputData: PostData): Promise> { - return postOne.call< - TypeOrmService, - Parameters>, - ReturnType> - >(this, inputData); - } - - postRelationship>( - id: number | string, - rel: Rel, - input: PostRelationshipData - ): Promise> { - return postRelationship.call< - TypeOrmService, - Parameters>, - ReturnType> - >(this, id, rel, input); - } -} diff --git a/libs/json-api/json-api-nestjs/src/lib/types/common-type.ts b/libs/json-api/json-api-nestjs/src/lib/types/common-type.ts new file mode 100644 index 00000000..2f6cb5e1 --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/types/common-type.ts @@ -0,0 +1,6 @@ +import { ModuleMetadata, PipeTransform, Type } from '@nestjs/common'; + +export type NestController = NonNullable; +export type NestProvider = NonNullable; +export type NestImport = NonNullable; +export type PipeMixin = Type; diff --git a/libs/json-api/json-api-nestjs/src/lib/types/config-param.ts b/libs/json-api/json-api-nestjs/src/lib/types/config-param.ts deleted file mode 100644 index 4d3c05e5..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/types/config-param.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { - AnyEntity, - EntityName, - NestController, - NestImport, - NestProvider, - PipeMixin, -} from './util-types'; -import { NonEmptyArray } from 'zod-validation-error'; -import { EntityClassOrSchema } from '@nestjs/typeorm/dist/interfaces/entity-class-or-schema.type'; - -export type ExtractNestType = - ArrayType extends readonly (infer ElementType)[] ? ElementType : never; - -export type ConfigParam = { - requiredSelectField: boolean; - debug: boolean; - pipeForId: PipeMixin; - operationUrl: string; - overrideRoute: string; -}; - -export type GeneralParam = { - connectionName?: string; - entities: NonEmptyArray>; - controllers?: NestController; - providers?: NestProvider; - imports?: NestImport; -}; - -export type ResultGeneralParam = { - connectionName: string; - entities: NonEmptyArray>; - controllers: NestController; - providers: NestProvider; - imports: NestImport; -}; - -export interface BaseModuleOptions { - entity: EntityClassOrSchema; - connectionName: string; - controller?: ExtractNestType; - config: ConfigParam; - imports?: NestImport; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/types/entity-param.test-d.ts b/libs/json-api/json-api-nestjs/src/lib/types/entity-param.test-d.ts new file mode 100644 index 00000000..d3fce569 --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/types/entity-param.test-d.ts @@ -0,0 +1,120 @@ +import { expectType, expectAssignable, expectNotAssignable } from 'tsd'; +import { Any } from 'ts-toolbelt'; + +import { + Addresses, + Comments, + Roles, + UserGroups, + Users, +} from '../utils/___test___/test-classes.helper'; + +import { + NullableProperty, + RelationProperty, + EntityRelationProps, + ArrayProperty, + ArrayPropertyType, + TypeField, +} from './entity-param.type'; + +type NullableProps = 'testArrayNull' | 'lastName' | 'isActive'; + +type IsEqualsNullableProps = Any.Equals, NullableProps>; +type IsNoEqualsNullableProps = Any.Equals< + NullableProperty, + 'id' | 'login' +>; +expectType(1); +expectType(0); + +const checkRelationProps = { + addresses: { + entityClass: Addresses, + isArray: false, + nullable: false, + }, + comments: { + entityClass: Comments, + nullable: false, + isArray: true, + }, + manager: { + entityClass: Users, + isArray: false, + nullable: false, + }, + roles: { + entityClass: Roles, + nullable: false, + isArray: true, + }, + userGroup: { + entityClass: UserGroups, + nullable: true, + isArray: false, + }, +} satisfies RelationProperty; + +const incorrectRelationProps = { + ...checkRelationProps, + userGroup: { + ...checkRelationProps.userGroup, + nullable: false, + }, +}; + +expectAssignable>(checkRelationProps); +expectNotAssignable>(incorrectRelationProps); + +const checkEntityRelationProps = { + manager: [ + 'id', + 'testArrayNull', + 'lastName', + 'isActive', + 'login', + 'firstName', + 'testReal', + 'testDate', + 'createdAt', + 'updatedAt', + ], + roles: ['id', 'createdAt', 'updatedAt', 'name', 'key', 'isDefault'], + comments: ['id', 'createdAt', 'updatedAt', 'kind'], + addresses: [ + 'id', + 'createdAt', + 'updatedAt', + 'city', + 'state', + 'country', + 'arrayField', + ], + userGroup: ['id', 'label'], +} satisfies EntityRelationProps; + +expectAssignable>(checkEntityRelationProps); +expectNotAssignable>({ + ...incorrectRelationProps, + test: [], +}); + +type ArrayPropertyName = 'testReal' | 'testArrayNull'; + +type IsEqualsArrayProperty = Any.Equals< + ArrayProperty, + ArrayPropertyName +>; +expectType(1); + +type ArrayPropertyTypeName = { + testReal: TypeField.number; + testArrayNull: TypeField.number; +}; + +type IsEqualsArrayPropertyType = Any.Equals< + ArrayPropertyType, + ArrayPropertyTypeName +>; +expectType(1); diff --git a/libs/json-api/json-api-nestjs/src/lib/types/entity-param.type.ts b/libs/json-api/json-api-nestjs/src/lib/types/entity-param.type.ts new file mode 100644 index 00000000..6fc52b32 --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/types/entity-param.type.ts @@ -0,0 +1,115 @@ +import { Union, Object } from 'ts-toolbelt'; +import { + PropertyKeys, + RelationKeys, + IsIterator, + Constructor, +} from '@klerick/json-api-nestjs-shared'; +import { + CastIteratorType, + UnionToTuple, + IsArray, + CastArrayType, +} from './utils-type'; + +export enum TypeField { + array = 'array', + date = 'date', + number = 'number', + boolean = 'boolean', + string = 'string', + object = 'object', + null = 'null', +} +export type TypeForId = Extract; + +type TypeProps = T extends Date + ? TypeField.date + : T extends any[] + ? TypeField.array + : T extends object + ? TypeField.object + : T extends boolean + ? TypeField.boolean + : T extends number + ? TypeField.number + : T extends string + ? TypeField.string + : TypeField.object; + +export type PropertyWithType = { + [K in PropertyKeys]: Exclude extends never + ? TypeField.null + : TypeProps>; +}; + +export type ArrayProperty = { + [K in PropertyKeys]: Exclude extends never + ? never + : IsArray> extends 1 + ? K + : never; +}[PropertyKeys]; + +export type ArrayPropertyType = { + [K in ArrayProperty]: TypeProps>>; +}; + +export type NullableProperty< + E extends object, + IdKey extends string = 'id' +> = Union.Intersect, PropertyKeys>; + +export type RelationProperty = { + [K in RelationKeys]: { + entityClass: Constructor>; + nullable: IsIterator extends 1 + ? false + : [Extract] extends [never] + ? false + : true; + isArray: IsIterator extends 1 ? true : false; + }; +}; + +type PrimaryType< + E extends object, + IdKey extends string = 'id' +> = IdKey extends keyof E + ? TypeProps extends TypeField + ? TypeProps + : TypeField.string + : TypeField.string; + +export type EntityParam = { + props: UnionToTuple>; + propsType: PropertyWithType; + propsArrayType: ArrayPropertyType; + propsNullable: UnionToTuple>; + primaryColumnName: IdKey; + primaryColumnType: PrimaryType; + typeName: string; + className: string; + relations: UnionToTuple>; + relationProperty: RelationProperty; +}; + +type RelationType< + E extends object, + IdKey extends string, + K extends keyof EntityParam['relationProperty'] +> = EntityParam< + E, + IdKey +>['relationProperty'][K]['entityClass'] extends Constructor + ? Exclude + : never; + +export type EntityRelationProps< + E extends object, + IdKey extends string = 'id' +> = { + [K in keyof EntityParam['relationProperty']]: UnionToTuple< + PropertyKeys> + >; +}; diff --git a/libs/json-api/json-api-nestjs/src/lib/types/error.types.ts b/libs/json-api/json-api-nestjs/src/lib/types/error.types.ts index ca9e3564..63184a2f 100644 --- a/libs/json-api/json-api-nestjs/src/lib/types/error.types.ts +++ b/libs/json-api/json-api-nestjs/src/lib/types/error.types.ts @@ -14,5 +14,3 @@ export type InnerError = { }; export type ValidateQueryError = ZodIssue | InnerError; - -export type ErrorDescribe = ValidateQueryError; diff --git a/libs/json-api/json-api-nestjs/src/lib/types/index.ts b/libs/json-api/json-api-nestjs/src/lib/types/index.ts index 9d3aaed5..ce81cabf 100644 --- a/libs/json-api/json-api-nestjs/src/lib/types/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/types/index.ts @@ -1,4 +1,5 @@ -export * from './config-param'; -export * from './module-common.types'; -export * from './util-types'; +export * from './common-type'; +export * from './module-options.types'; +export * from './utils-type'; +export * from './entity-param.type'; export * from './error.types'; diff --git a/libs/json-api/json-api-nestjs/src/lib/types/module-common.types.ts b/libs/json-api/json-api-nestjs/src/lib/types/module-common.types.ts deleted file mode 100644 index 731f4131..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/types/module-common.types.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { - MicroOrmJsonApiModule, - TypeOrmJsonApiModule, - TypeOrmParam, - MicroOrmParam, -} from '../modules'; - -import { ConfigParam, GeneralParam, ResultGeneralParam } from './config-param'; -import { RequiredFromPartial } from './util-types'; - -export type TypeOrmConfigParam = ConfigParam & TypeOrmParam; - -export type TypeOrmDefaultOptions = GeneralParam & { - options: Partial; -}; -export type TypeOrmOptions = GeneralParam & { - options: Partial; -}; - -export type MicroOrmConfigParam = ConfigParam & MicroOrmParam; -export type MicroOrmOptions = GeneralParam & { - options: Partial; -}; - -export type ResultTypeOrmModuleOptions = ResultGeneralParam & { - type: typeof TypeOrmJsonApiModule; -} & TypeOrmOptions & { options: RequiredFromPartial }; -export type ResultMicroOrmModuleOptions = ResultGeneralParam & { - type: typeof MicroOrmJsonApiModule; -} & MicroOrmOptions & { options: RequiredFromPartial }; - -export type ResultModuleOptions = - | ResultTypeOrmModuleOptions - | ResultMicroOrmModuleOptions; diff --git a/libs/json-api/json-api-nestjs/src/lib/types/module-options.test-d.ts b/libs/json-api/json-api-nestjs/src/lib/types/module-options.test-d.ts new file mode 100644 index 00000000..459479b5 --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/types/module-options.test-d.ts @@ -0,0 +1,90 @@ +import { DynamicModule } from '@nestjs/common'; +import { expectType, expectError, expectNotType } from 'tsd'; + +import { Params, ParamsModule } from './module-options.types'; + +class Test {} + +const paramsCheck: Params = { + entities: [Test], + options: { + operationUrl: '', + debug: true, + }, + imports: [], + connectionName: 'test', + controllers: [], + providers: [], +}; + +expectType(paramsCheck); +expectNotType({ + ...paramsCheck, + options: { + ...paramsCheck.options, + extraField: true, + }, +}); + +type ExtraOptions = { + extraField: boolean; +}; + +const extraOptions: ExtraOptions = { + extraField: true, +}; + +const extendParamCheck: Params = { + ...paramsCheck, + options: { + ...paramsCheck.options, + ...extraOptions, + }, +}; + +expectType>(extendParamCheck); + +expectNotType>(paramsCheck); +expectNotType>({ + ...extendParamCheck, + options: { + ...extendParamCheck.options, + extraErrorField: true, + }, +}); + +const paramsCheckWithoutOptions: Params = { + entities: [Test], + imports: [], + connectionName: 'test', + controllers: [], + providers: [], +}; + +expectType(paramsCheckWithoutOptions); +expectNotType>(paramsCheckWithoutOptions); + +class ClassModule { + static forRoot(options: Params): DynamicModule { + return {} as any; + } +} +class ClassModuleWithoutExtra { + static forRoot(options: Params>): DynamicModule { + return {} as any; + } +} + +const paramsModule: ParamsModule = { + entities: [Test], + imports: [], + connectionName: 'test', + controllers: [], + providers: [], + options: { + extraField: true, + }, +}; + +expectType>(paramsModule); +expectNotType>(paramsModule); diff --git a/libs/json-api/json-api-nestjs/src/lib/types/module-options.types.ts b/libs/json-api/json-api-nestjs/src/lib/types/module-options.types.ts new file mode 100644 index 00000000..c9e5e448 --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/types/module-options.types.ts @@ -0,0 +1,70 @@ +import { DynamicModule } from '@nestjs/common'; +import { NonEmptyArray } from 'zod-validation-error'; +import { AnyEntity, EntityClass } from '@klerick/json-api-nestjs-shared'; +import { + NestController, + NestImport, + NestProvider, + PipeMixin, +} from './common-type'; +import { ExtractNestType, IfEquals } from './utils-type'; + +type ModuleCommonParams = { + entities: NonEmptyArray>; + connectionName?: string; + controllers?: NestController; + providers?: NestProvider; + imports?: NestImport; +}; + +type ModuleCommonOptions = { + requiredSelectField?: boolean; + debug?: boolean; + pipeForId?: PipeMixin; + operationUrl?: string; +}; + +type ModuleOptionsParams> = IfEquals< + OrmParams, + NonNullable, + { + options?: OptionOfConfig; + }, + { + options: OptionOfConfig; + } +>; + +type ExtractOrmParamsOfModule = M extends { + forRoot(options: PrepareParams): DynamicModule; +} + ? U + : never; + +export type ParamsModule = Params>; + +export type Params> = ModuleCommonParams & + ModuleOptionsParams; + +export type PrepareParams> = + Required & { + options: Required> & { + operationUrl: string | undefined; + } & OrmParams; + }; + +export type OptionOfConfig = ModuleCommonOptions & OrmParams; + +export interface OrmModule> { + new (...args: any[]): any; + forRoot(options: Params): DynamicModule; + getUtilProviders(entity: EntityClass): NestProvider; +} + +export type ModuleMixinOptions = { + entity: EntityClass; + controller: ExtractNestType | undefined; + config: PrepareParams; + imports: NestImport; + ormModule: OrmModule; +}; diff --git a/libs/json-api/json-api-nestjs/src/lib/types/util-types.ts b/libs/json-api/json-api-nestjs/src/lib/types/util-types.ts deleted file mode 100644 index 1954c168..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/types/util-types.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { ModuleMetadata, PipeTransform, Type } from '@nestjs/common'; -import { EntityTarget as EntityTargetTypeOrm } from 'typeorm/common/EntityTarget'; - -export type AnyEntity = Partial; - -export type EntityClass = Function & { prototype: T }; -export type EntityName = EntityClass; -export type EntityTarget = EntityClass | EntityTargetTypeOrm; -export interface ObjectLiteral { - [key: string]: any; -} - -export type NestController = NonNullable; -export type NestProvider = NonNullable; -export type NestImport = NonNullable; -export type PipeMixin = Type; - -export type RequiredFromPartial = { - [P in keyof T]-?: T[P] extends infer U | undefined ? U | false : T[P]; -}; - -export type RunInTransaction< - F extends (...arg: any[]) => Promise = (...arg: any[]) => Promise -> = (arg: F) => ReturnType; diff --git a/libs/json-api/json-api-nestjs/src/lib/types/utils-type.test-d.ts b/libs/json-api/json-api-nestjs/src/lib/types/utils-type.test-d.ts new file mode 100644 index 00000000..9d3767e3 --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/types/utils-type.test-d.ts @@ -0,0 +1,46 @@ +import { Collection } from '@mikro-orm/core'; +import { expectType } from 'tsd'; +import { Any, Object, Tuple, Union } from 'ts-toolbelt'; + +import { HasId, UnionToTuple, CastIteratorType } from './utils-type'; +import { Users } from '../utils/___test___/test-classes.helper'; + +type UnionForTuple = + | 'id' + | 'login' + | 'firstName' + | 'testReal' + | 'testArrayNull' + | 'lastName' + | 'isActive' + | 'testDate' + | 'createdAt' + | 'updatedAt' + | 'addresses' + | 'manager' + | 'comments' + | 'userGroup' + | 'roles'; +type TupleCheck = UnionToTuple>; +type IsEqualsFromTupleToUnion = Any.Equals< + Tuple.UnionOf, + UnionForTuple +>; + +expectType(1); +expectType>(1); +expectType>(0); + +type ArrayUsers = Users[]; +type CollectionUsers = Collection; + +type IsEqualsArrayUsers = Any.Equals, Users>; +type IsEqualsCollectionUsers = Any.Equals< + CastIteratorType, + Users +>; +type IsEqualsUsers = Any.Equals, Users>; + +expectType(1); +expectType(1); +expectType(1); diff --git a/libs/json-api/json-api-nestjs/src/lib/types/utils-type.ts b/libs/json-api/json-api-nestjs/src/lib/types/utils-type.ts new file mode 100644 index 00000000..4a853979 --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/types/utils-type.ts @@ -0,0 +1,37 @@ +import { + CastIteratorType, + HasId, + Constructor, +} from '@klerick/json-api-nestjs-shared'; +import { Any, Tuple, Union } from 'ts-toolbelt'; +import { Type } from '@nestjs/common/interfaces'; + +export { HasId, CastIteratorType }; + +export type IfEquals = Any.Equals extends 1 ? A : B; + +export type ExtractNestType = + ArrayType extends readonly (infer ElementType)[] ? ElementType : never; + +export type TypeFromType = T extends Type ? A : never; + +export type UnionToTuple< + T, + L = Union.Last, + N = [T] extends [never] ? true : false +> = true extends N ? [] : Tuple.Append>, L>; + +export type IsArray = T extends unknown[] ? 1 : 0; +export type CastArrayType = T extends (infer U)[] ? U : T; + +export type TypeOfConstructor = T extends Constructor ? E : T; + +export type NonEmptyStringTuple = T extends [] + ? never + : T extends readonly [infer First, ...infer Rest] + ? First extends string + ? Rest extends string[] + ? readonly [First, ...Rest] + : never + : never + : never; diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/___test___/test-classes.helper.ts b/libs/json-api/json-api-nestjs/src/lib/utils/___test___/test-classes.helper.ts new file mode 100644 index 00000000..46754b8e --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/utils/___test___/test-classes.helper.ts @@ -0,0 +1,56 @@ +import { Collection } from '@mikro-orm/core'; +type IUsers = Users; +export class Users { + public id!: number; + public login!: string; + public firstName!: string; + public testReal: number[] = []; + public testArrayNull!: number[] | null; + public lastName!: string | null; + public isActive!: null; + public testDate!: Date; + public createdAt: Date = new Date(); + public updatedAt: Date = new Date(); + + public addresses!: IAddresses; + public manager!: IUsers; + public roles = new Collection(this); + public comments!: Comments[]; + public userGroup!: UserGroups | null; +} +type IRoles = Roles; +export class Roles { + public id!: number; + public name!: string; + public key!: string; + public isDefault!: boolean; + createdAt: Date = new Date(); + updatedAt: Date = new Date(); +} +type IUserGroups = UserGroups; +export class UserGroups { + public id!: number; + public label!: string; +} +type IAddresses = Addresses; +export class Addresses { + public id!: number; + public city!: string; + public state!: string; + public country!: string; + public arrayField!: string[]; + createdAt: Date = new Date(); + updatedAt: Date = new Date(); +} +type IComments = Comments; +export class Comments { + public id!: number; + public kind!: CommentKind; + createdAt: Date = new Date(); + updatedAt: Date = new Date(); +} +export enum CommentKind { + Comment = 'COMMENT', + Message = 'MESSAGE', + Note = 'NOTE', +} diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/___test___/test.helper.ts b/libs/json-api/json-api-nestjs/src/lib/utils/___test___/test.helper.ts index 79477361..d83894fc 100644 --- a/libs/json-api/json-api-nestjs/src/lib/utils/___test___/test.helper.ts +++ b/libs/json-api/json-api-nestjs/src/lib/utils/___test___/test.helper.ts @@ -1,211 +1,193 @@ -// @ts-nocheck -import { - AllFieldWithType, - FieldWithType, - PropsForField, - RelationPrimaryColumnType, - RelationPropsArray, - RelationPropsTypeName, - RelationTree, - ResultGetField, - TypeField, -} from '../../modules/mixin/types'; -import { Addresses, Users } from '../../mock-utils/typeorm'; +import { EntityClass, Constructor } from '@klerick/json-api-nestjs-shared'; +import { kebabCase } from 'change-case-commonjs'; -export const fieldTypeUsers: FieldWithType = { - id: TypeField.number, - isActive: TypeField.boolean, - firstName: TypeField.string, - createdAt: TypeField.date, - lastName: TypeField.string, - login: TypeField.string, - testDate: TypeField.date, - updatedAt: TypeField.date, - testReal: TypeField.array, - testArrayNull: TypeField.array, -}; -export const propsDb: PropsForField = { - id: { type: Number, isArray: false, isNullable: false }, - login: { type: 'varchar', isArray: false, isNullable: false }, - firstName: { type: 'varchar', isArray: false, isNullable: true }, - testReal: { type: 'real', isArray: true, isNullable: false }, - testArrayNull: { type: 'real', isArray: true, isNullable: true }, - lastName: { type: 'varchar', isArray: false, isNullable: true }, - isActive: { type: 'boolean', isArray: false, isNullable: true }, - createdAt: { type: 'timestamp', isArray: false, isNullable: true }, - testDate: { type: 'timestamp', isArray: false, isNullable: true }, - updatedAt: { type: 'timestamp', isArray: false, isNullable: true }, - notes: { type: 'string', isArray: false, isNullable: true }, - roles: { type: 'number', isArray: true, isNullable: true }, - addresses: { type: 'number', isArray: true, isNullable: true }, - userGroup: { type: 'number', isArray: false, isNullable: true }, - manager: { type: 'number', isArray: false, isNullable: true }, - comments: { type: 'number', isArray: true, isNullable: true }, -}; -export const fieldTypeAddresses: FieldWithType = { - id: TypeField.number, - arrayField: TypeField.array, - state: TypeField.string, - city: TypeField.string, - createdAt: TypeField.date, - updatedAt: TypeField.date, - country: TypeField.string, -}; +import { EntityParamMapService } from '../../modules/mixin/service'; +import { + Addresses, + Comments, + Roles, + UserGroups, + Users, +} from './test-classes.helper'; +import { EntityParam, TypeField } from '../../types'; -export const relationArrayProps: RelationPropsArray = { - roles: true, - userGroup: false, - notes: true, - addresses: false, - comments: true, - manager: false, -}; -export const relationPopsName: RelationPropsTypeName = { - roles: 'Roles', - userGroup: 'UserGroups', - notes: 'Notes', - addresses: 'Addresses', - comments: 'Comments', - manager: 'Users', +const entityParamUsers: EntityParam = { + relations: ['addresses', 'manager', 'roles', 'comments', 'userGroup'], + props: [ + 'id', + 'login', + 'firstName', + 'testReal', + 'testArrayNull', + 'lastName', + 'isActive', + 'testDate', + 'createdAt', + 'updatedAt', + ], + className: 'Users', + primaryColumnName: 'id', + propsType: { + id: TypeField.number, + login: TypeField.string, + firstName: TypeField.string, + testReal: TypeField.array, + testArrayNull: TypeField.array, + lastName: TypeField.string, + isActive: TypeField.null, + testDate: TypeField.date, + createdAt: TypeField.date, + updatedAt: TypeField.date, + }, + propsArrayType: { + testReal: TypeField.number, + testArrayNull: TypeField.number, + }, + primaryColumnType: TypeField.number, + propsNullable: ['testArrayNull', 'lastName', 'isActive'], + typeName: 'users', + relationProperty: { + userGroup: { + entityClass: UserGroups, + nullable: true, + isArray: false, + }, + roles: { + entityClass: Roles, + nullable: false, + isArray: true, + }, + manager: { + entityClass: Users, + isArray: false, + nullable: false, + }, + comments: { + entityClass: Comments, + nullable: false, + isArray: true, + }, + addresses: { + entityClass: Addresses, + isArray: false, + nullable: false, + }, + }, }; -export const primaryColumnType: RelationPrimaryColumnType = { - roles: TypeField.number, - userGroup: TypeField.number, - notes: TypeField.string, - addresses: TypeField.number, - comments: TypeField.number, - manager: TypeField.number, +const entityParamRoles: EntityParam = { + relations: [], + props: ['id', 'createdAt', 'updatedAt', 'name', 'key', 'isDefault'] as any, + className: 'Roles', + propsArrayType: {}, + primaryColumnName: 'id', + propsType: { + id: TypeField.number, + name: TypeField.string, + key: TypeField.string, + isDefault: TypeField.boolean, + createdAt: TypeField.date, + updatedAt: TypeField.date, + }, + primaryColumnType: TypeField.number, + propsNullable: [], + typeName: 'roles', + relationProperty: {}, }; -export const userFields: ResultGetField['field'] = [ - 'updatedAt', - 'testDate', - 'createdAt', - 'isActive', - 'lastName', - 'testArrayNull', - 'testReal', - 'firstName', - 'login', - 'id', -]; - -export const userRelations: RelationTree = { - addresses: [ - 'arrayField', - 'country', - 'state', - 'city', - 'updatedAt', - 'createdAt', +const entityParamAddresses: EntityParam = { + relations: [], + props: [ 'id', - ], - manager: [ - 'updatedAt', - 'testDate', 'createdAt', - 'isActive', - 'lastName', - 'testArrayNull', - 'testReal', - 'firstName', - 'login', - 'id', + 'updatedAt', + 'city', + 'state', + 'country', + 'arrayField', ], - roles: ['isDefault', 'key', 'name', 'updatedAt', 'createdAt', 'id'], - comments: ['kind', 'text', 'updatedAt', 'createdAt', 'id'], - notes: ['text', 'updatedAt', 'createdAt', 'id'], - userGroup: ['label', 'id'], -}; - -export const propsType: AllFieldWithType = { - updatedAt: TypeField.date, - testDate: TypeField.date, - createdAt: TypeField.date, - isActive: TypeField.boolean, - lastName: TypeField.string, - testArrayNull: TypeField.array, - testReal: TypeField.array, - firstName: TypeField.string, - login: TypeField.string, - id: TypeField.number, - addresses: { - arrayField: TypeField.array, + propsArrayType: { + arrayField: TypeField.string, + }, + className: 'Addresses', + primaryColumnName: 'id', + propsType: { + id: TypeField.number, + city: TypeField.string, country: TypeField.string, state: TypeField.string, - city: TypeField.string, - updatedAt: TypeField.date, + arrayField: TypeField.array, createdAt: TypeField.date, - id: TypeField.number, - }, - manager: { updatedAt: TypeField.date, - testDate: TypeField.date, - createdAt: TypeField.date, - isActive: TypeField.boolean, - lastName: TypeField.string, - testArrayNull: TypeField.array, - testReal: TypeField.array, - firstName: TypeField.string, - login: TypeField.string, - id: TypeField.number, }, - roles: { - isDefault: TypeField.boolean, - key: TypeField.string, - name: TypeField.string, - updatedAt: TypeField.date, - createdAt: TypeField.date, + primaryColumnType: TypeField.number, + propsNullable: [], + typeName: 'addresses', + relationProperty: {}, +}; + +const entityParamComments: EntityParam = { + relations: [], + props: ['id', 'createdAt', 'updatedAt', 'kind'], + propsArrayType: {}, + className: 'Comments', + primaryColumnName: 'id', + propsType: { id: TypeField.number, - }, - comments: { kind: TypeField.string, - text: TypeField.string, - updatedAt: TypeField.date, createdAt: TypeField.date, - id: TypeField.number, - }, - notes: { - text: TypeField.string, updatedAt: TypeField.date, - createdAt: TypeField.date, - id: TypeField.string, }, - userGroup: { - label: TypeField.string, + primaryColumnType: TypeField.number, + propsNullable: [], + typeName: 'comments', + relationProperty: { + user: { + entityClass: Users, + nullable: false, + isArray: false, + }, + }, +}; + +const entityParamUserGroups: EntityParam = { + relations: [], + props: ['id', 'label'], + propsArrayType: {}, + className: 'UserGroups', + primaryColumnName: 'id', + propsType: { id: TypeField.number, + label: TypeField.string, }, + primaryColumnType: TypeField.number, + propsNullable: [], + typeName: kebabCase('UserGroups'), + relationProperty: {}, }; -export const relationList: ResultGetField['relations'] = [ - 'userGroup', - 'notes', - 'comments', - 'roles', - 'manager', - 'addresses', -]; +export const mapMock = new Map, EntityParam>([ + [Users, entityParamUsers], + [Roles, entityParamRoles], + [UserGroups, entityParamUserGroups], + [Addresses, entityParamAddresses], + [Comments, entityParamComments], +]); -export const userFieldsStructure: ResultGetField = { - field: [ - 'updatedAt', - 'testDate', - 'createdAt', - 'isActive', - 'lastName', - 'testArrayNull', - 'testReal', - 'firstName', - 'login', - 'id', - ], - relations: [ - 'userGroup', - 'notes', - 'comments', - 'roles', - 'manager', - 'addresses', - ], -}; +export const usersEntityParamMapMockData = { + entityParaMap: entityParamUsers, + getParamMap( + entity: EntityClass + ): EntityParam { + return mapMock.get(entity) as EntityParam; + }, +} as EntityParamMapService; + +export const addressesEntityParamMapMockData = { + entityParaMap: entityParamAddresses, + getParamMap( + entity: EntityClass + ): EntityParam { + return mapMock.get(entity) as EntityParam; + }, +} as EntityParamMapService; diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/helper.spec.ts b/libs/json-api/json-api-nestjs/src/lib/utils/helper.spec.ts deleted file mode 100644 index 767f90a8..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/utils/helper.spec.ts +++ /dev/null @@ -1,184 +0,0 @@ -import { DynamicModule, ParseIntPipe } from '@nestjs/common'; - -import { - MicroOrmJsonApiModule, - TypeOrmJsonApiModule, - TypeOrmParam, -} from '../modules'; -import { - ConfigParam, - RequiredFromPartial, - ResultModuleOptions, -} from '../types'; -import { prepareConfig, createMixinModule } from './helper'; -import { - DEFAULT_CONNECTION_NAME, - JSON_API_CONTROLLER_POSTFIX, -} from '../constants'; -import { JsonBaseController } from '../modules/mixin/controller/json-base.controller'; -import { JsonApi } from '../modules/mixin/decorators'; -import { getProviderName } from '../modules/mixin/helper'; - -class A {} -describe('Helper tests', () => { - describe('prepareConfig', () => { - it('should return default config when type is undefined', () => { - const result = prepareConfig( - { - entities: [A], - options: { debug: false, requiredSelectField: false }, - }, - 'typeOrm' - ); - - expect(Array.isArray(result.imports)).toBe(true); - expect(Array.isArray(result.controllers)).toBe(true); - expect(Array.isArray(result.providers)).toBe(true); - expect(result.options.debug).toBe(false); - expect(result.options.requiredSelectField).toBe(false); - expect(result.connectionName).toBe(DEFAULT_CONNECTION_NAME); - }); - - it('should return TypeOrm config when type is TypeOrmModule', () => { - const result = prepareConfig( - { - entities: [A], - options: { - debug: true, - requiredSelectField: true, - useSoftDelete: true, - }, - }, - 'typeOrm' - ); - - expect(result.options.debug).toBe(true); - expect( - (result.options as RequiredFromPartial) - .useSoftDelete - ).toBe(true); - }); - - it('should return MicroOrm config when type is MicroOrmModule', () => { - const result = prepareConfig( - { - entities: [A], - options: { debug: true, requiredSelectField: true }, - }, - 'microOrm' - ); - - expect(result.options.debug).toBe(true); - expect(result.options.requiredSelectField).toBe(true); - - // @ts-expect-error eed check run time - expect((result.options as ConfigParam).useSoftDelete).toBeUndefined(); - }); - - it('should use default values for pipeForId, operationUrl, and overrideRoute when not provided', () => { - const result = prepareConfig( - { - entities: [A], - options: {}, - }, - 'typeOrm' - ); - - expect(result.options.pipeForId).toBe(ParseIntPipe); - expect(result.options.operationUrl).toBe(false); - expect(result.options.overrideRoute).toBe(false); - }); - }); - - describe('createMixinModule', () => { - it('should create a MixinModule with the correct controller matching the entity', () => { - class TestEntity {} - @JsonApi(TestEntity) - class TestController extends JsonBaseController {} - const commonOrmModule = {} as DynamicModule; - const resultOptions = prepareConfig( - { - entities: [TestEntity], - controllers: [TestController], - connectionName: DEFAULT_CONNECTION_NAME, - options: { - debug: true, - requiredSelectField: true, - useSoftDelete: true, - }, - }, - 'typeOrm' - ); - - const result = createMixinModule( - TestEntity, - { - ...resultOptions, - type: TypeOrmJsonApiModule, - } as ResultModuleOptions, - commonOrmModule - ); - - expect(result).toHaveProperty('controllers', [TestController]); - expect(result).toHaveProperty('providers'); - expect(result.imports?.includes(commonOrmModule)).toBe(true); - }); - - it('should use undefined as controller if none match the entity', () => { - class TestEntity {} - const commonOrmModule = {} as DynamicModule; - const resultOptions = prepareConfig( - { - entities: [TestEntity], - controllers: [], - connectionName: 'test_connection', - options: { debug: false }, - imports: [], - }, - 'typeOrm' - ); - - const result = createMixinModule( - TestEntity, - { - ...resultOptions, - type: TypeOrmJsonApiModule, - } as ResultModuleOptions, - commonOrmModule - ); - - const controller = (result.controllers || []).at(0); - expect(controller?.name).toBe( - getProviderName(TestEntity, JSON_API_CONTROLLER_POSTFIX) - ); - }); - - it('should correctly construct the MixinModule using given ResultModuleOptions', () => { - class AnotherEntity {} - class SharedModule {} - const commonOrmModule = {} as DynamicModule; - const importTest = { module: SharedModule }; - - const resultOptions = prepareConfig( - { - entities: [AnotherEntity], - controllers: [], - connectionName: 'default_connection', - options: { debug: true, useSoftDelete: true }, - imports: [importTest], - }, - 'typeOrm' - ); - - const result = createMixinModule( - AnotherEntity, - { - ...resultOptions, - type: TypeOrmJsonApiModule, - } as ResultModuleOptions, - commonOrmModule - ); - expect(result.imports?.at(1)).toEqual(importTest); - }); - }); -}); diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/helper.ts b/libs/json-api/json-api-nestjs/src/lib/utils/helper.ts deleted file mode 100644 index 7c7f1bd6..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/utils/helper.ts +++ /dev/null @@ -1,122 +0,0 @@ -import { DynamicModule, ParseIntPipe } from '@nestjs/common'; - -import { - AnyEntity, - ConfigParam, - EntityName, - MicroOrmOptions, - RequiredFromPartial, - ResultModuleOptions, - TypeOrmConfigParam, - MicroOrmConfigParam, - TypeOrmOptions, -} from '../types'; -import { - DEFAULT_CONNECTION_NAME, - JSON_API_DECORATOR_ENTITY, -} from '../constants'; -import { TypeOrmParam, AtomicOperationModule, MicroOrmParam } from '../modules'; -import { MixinModule } from '../modules/mixin/mixin.module'; -import { Type } from '@nestjs/common/interfaces'; -import { RouterModule } from '@nestjs/core'; -import { DEFAULT_ARRAY_TYPE } from '../modules/micro-orm/constants'; - -export function prepareConfig( - moduleOptions: TypeOrmOptions | MicroOrmOptions, - type: 'typeOrm' | 'microOrm' -): Omit { - const { options: inputOptions } = moduleOptions; - - let resulOptions: - | RequiredFromPartial - | RequiredFromPartial; - - const configParam: RequiredFromPartial = { - debug: !!inputOptions.debug, - requiredSelectField: !!inputOptions.requiredSelectField, - operationUrl: inputOptions.operationUrl || false, - overrideRoute: inputOptions.overrideRoute || false, - pipeForId: inputOptions.pipeForId || ParseIntPipe, - }; - - if (type === 'typeOrm') { - const { runInTransaction, useSoftDelete } = - moduleOptions.options as Partial; - - resulOptions = { - ...configParam, - useSoftDelete: useSoftDelete ? useSoftDelete : false, - runInTransaction: runInTransaction ? runInTransaction : false, - }; - } else { - const { arrayType } = moduleOptions.options as Partial< - ConfigParam & MicroOrmParam - >; - - resulOptions = { - ...configParam, - arrayType: [...DEFAULT_ARRAY_TYPE, ...(arrayType || [])], - }; - } - - return { - connectionName: - type === 'typeOrm' - ? moduleOptions.connectionName || DEFAULT_CONNECTION_NAME - : (moduleOptions.connectionName as any), - entities: moduleOptions.entities, - imports: moduleOptions.imports || [], - providers: moduleOptions.providers || [], - controllers: moduleOptions.controllers || [], - options: resulOptions as any, - } satisfies Omit; -} - -export function createMixinModule( - entity: EntityName, - resultOption: ResultModuleOptions, - commonOrmModule: DynamicModule -): DynamicModule { - const controller = (resultOption.controllers || []).find( - (item) => - item && Reflect.getMetadata(JSON_API_DECORATOR_ENTITY, item) === entity - ); - - return MixinModule.forRoot({ - entity, - controller, - config: resultOption.options, - imports: [commonOrmModule, ...resultOption.imports], - ormModule: resultOption.type, - }); -} - -export function createAtomicModule( - options: ResultModuleOptions, - entitiesMixinModules: DynamicModule[], - commonOrmModule: DynamicModule -): DynamicModule[] { - const { operationUrl } = options.options; - if (!operationUrl) return []; - - return [ - AtomicOperationModule.forRoot( - { - ...options, - connectionName: options.connectionName, - }, - entitiesMixinModules, - commonOrmModule - ), - RouterModule.register([ - { - module: AtomicOperationModule, - path: operationUrl, - }, - ]), - ]; -} - -export function entityForClass(type: Type): EntityName { - return Reflect.getMetadata(JSON_API_DECORATOR_ENTITY, type); -} diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/index.ts b/libs/json-api/json-api-nestjs/src/lib/utils/index.ts index d6d6f056..e9860347 100644 --- a/libs/json-api/json-api-nestjs/src/lib/utils/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/utils/index.ts @@ -1 +1 @@ -export * from './helper'; +export * from './module-helper'; diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/module-helper.spec.ts b/libs/json-api/json-api-nestjs/src/lib/utils/module-helper.spec.ts new file mode 100644 index 00000000..027216f5 --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/utils/module-helper.spec.ts @@ -0,0 +1,202 @@ +import { ParseIntPipe } from '@nestjs/common'; + +import { + DEFAULT_CONNECTION_NAME, + JSON_API_DECORATOR_ENTITY, +} from '../constants'; +import { prepareConfig, getController } from './module-helper'; +import { Params } from '../types'; + +describe('module-helper', () => { + describe('getController', () => { + beforeAll(() => { + Reflect.defineMetadata = jest.fn(); + Reflect.getMetadata = jest.fn((key, target) => { + if (key === JSON_API_DECORATOR_ENTITY && (target as any).entity) { + return (target as any).entity; + } + return undefined; + }); + }); + + it('should return the controller that matches the entity metadata', () => { + const entity = class Entity1 {}; + const controllers = [ + { entity }, + { entity: 'Entity2' }, + { entity: 'Entity3' }, + ] as any; + + const result = getController(entity, controllers); + + expect(result).toEqual(controllers[0]); + }); + + it('should return undefined if no controllers match the entity metadata', () => { + const entity = class UnknownEntity {}; + const controllers = [{ entity: 'Entity1' }, { entity: 'Entity2' }] as any; + + const result = getController(entity, controllers); + + expect(result).toBeUndefined(); + }); + + it('should return undefined if controllers list is empty', () => { + const entity = class Entity1 {}; + const controllers: any[] = []; + + const result = getController(entity, controllers); + + expect(result).toBeUndefined(); + }); + + it('should handle malformed input gracefully', () => { + const entity = class Entity1 {}; + const controllers = [null, undefined, { entity: 'Entity2' }, true] as any; + + const result = getController(entity, controllers); + + expect(result).toBeUndefined(); + }); + }); + + describe('prepareConfig', () => { + it('should return default values when no options are provided', () => { + const moduleParams: Params> = { + options: undefined, + connectionName: undefined, + imports: undefined, + providers: undefined, + controllers: undefined, + entities: [] as any, + }; + + const result = prepareConfig(moduleParams); + + expect(result).toEqual({ + connectionName: DEFAULT_CONNECTION_NAME, + imports: [], + providers: [], + controllers: [], + entities: [], + options: { + operationUrl: undefined, + requiredSelectField: false, + debug: false, + pipeForId: ParseIntPipe, + }, + }); + }); + + it('should override default connectionName if provided', () => { + const moduleParams = { + connectionName: 'custom_connection', + options: {}, + imports: undefined, + providers: undefined, + controllers: undefined, + entities: [] as any, + }; + + const result = prepareConfig(moduleParams); + + expect(result.connectionName).toBe('custom_connection'); + }); + + it('should merge provided options with defaults', () => { + const moduleParams = { + options: { debug: true, operationUrl: 'http://example.com' }, + imports: undefined, + providers: undefined, + controllers: undefined, + entities: [] as any, + }; + + const result = prepareConfig(moduleParams); + + expect(result.options).toEqual({ + operationUrl: 'http://example.com', + requiredSelectField: false, + debug: true, + pipeForId: ParseIntPipe, + }); + }); + + it('should ensure requiredSelectField is cast to boolean', () => { + const moduleParams = { + options: { requiredSelectField: true }, + imports: undefined, + providers: undefined, + controllers: undefined, + entities: [] as any, + } as Params; + + const result = prepareConfig(moduleParams); + expect(result.options['requiredSelectField']).toBe(true); + }); + + it('should default pipeForId to ParseIntPipe if not provided in options', () => { + const moduleParams = { + options: {}, + imports: undefined, + providers: undefined, + controllers: undefined, + entities: [] as any, + }; + + const result = prepareConfig(moduleParams); + + expect(result.options.pipeForId).toBe(ParseIntPipe); + }); + + it('should use provided pipeForId if specified in options', () => { + class CustomPipe {} + + const moduleParams = { + options: { pipeForId: CustomPipe }, + imports: undefined, + providers: undefined, + controllers: undefined, + entities: [] as any, + }; + + const result = prepareConfig(moduleParams as any); + + expect(result.options.pipeForId).toBe(CustomPipe); + }); + + it('should return provided entities if specified', () => { + const entities = ['Entity1', 'Entity2'] as any; + const moduleParams: Params> = { + entities, + imports: undefined, + providers: undefined, + controllers: undefined, + }; + + const result = prepareConfig(moduleParams); + + expect(result.entities).toBe(entities); + expect(result).toHaveProperty('options'); + expect(result.options).toEqual({ + operationUrl: undefined, + requiredSelectField: false, + debug: false, + pipeForId: ParseIntPipe, + }); + }); + + it('should be return module option as is', () => { + const moduleParams = { + options: { customOptions: 'string' }, + imports: undefined, + providers: undefined, + controllers: undefined, + entities: [] as any, + } as Params<{ customOptions: string }>; + + const result = prepareConfig(moduleParams); + expect(result.options['customOptions']).toBe('string'); + }); + }); +}); diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/module-helper.ts b/libs/json-api/json-api-nestjs/src/lib/utils/module-helper.ts new file mode 100644 index 00000000..6649d37e --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/utils/module-helper.ts @@ -0,0 +1,44 @@ +import { ParseIntPipe } from '@nestjs/common'; +import { AnyEntity, EntityClass } from '@klerick/json-api-nestjs-shared'; + +import { + NestController, + OptionOfConfig, + Params, + PrepareParams, +} from '../types'; +import { + DEFAULT_CONNECTION_NAME, + JSON_API_DECORATOR_ENTITY, +} from '../constants'; + +export function prepareConfig( + moduleParams: Params +): PrepareParams { + const options = moduleParams['options'] || ({} as OptionOfConfig); + + return { + connectionName: moduleParams['connectionName'] || DEFAULT_CONNECTION_NAME, + imports: moduleParams['imports'] || [], + providers: moduleParams['providers'] || [], + controllers: moduleParams['controllers'] || [], + entities: moduleParams['entities'], + options: { + ...options, + operationUrl: options['operationUrl'] || undefined, + requiredSelectField: !!options['requiredSelectField'], + debug: !!options['debug'], + pipeForId: options['pipeForId'] || ParseIntPipe, + }, + }; +} + +export function getController( + entity: EntityClass, + controllers: NestController +) { + return controllers.find( + (item) => + item && Reflect.getMetadata(JSON_API_DECORATOR_ENTITY, item) === entity + ); +} diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/index.ts b/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/index.ts deleted file mode 100644 index a0fe9b9f..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './lib/utils'; -export * from './lib/types'; diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/entity-type.ts b/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/entity-type.ts deleted file mode 100644 index 5fbdd04f..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/entity-type.ts +++ /dev/null @@ -1,17 +0,0 @@ -export type EntityField = - | string - | number - | bigint - | boolean - | string[] - | number[] - | null - | Date; - -export type EntityProps = { - [P in keyof T]: T[P] extends EntityField ? P : never; -}[keyof T]; - -export type EntityRelation = { - [P in keyof T]: T[P] extends EntityField ? never : P; -}[keyof T]; diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/index.ts b/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/index.ts deleted file mode 100644 index 33b70ba6..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './utils-string.type'; -export * from './query-type'; -export * from './entity-type'; -export * from './response-body'; diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/query-type.ts b/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/query-type.ts deleted file mode 100644 index ddeead7a..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/query-type.ts +++ /dev/null @@ -1,36 +0,0 @@ -export enum QueryField { - filter = 'filter', - sort = 'sort', - include = 'include', - page = 'page', - fields = 'fields', -} - -export enum FilterOperand { - eq = 'eq', - gt = 'gt', - gte = 'gte', - like = 'like', - lt = 'lt', - lte = 'lte', - ne = 'ne', - regexp = 'regexp', - in = 'in', - nin = 'nin', - some = 'some', -} - -export enum FilterOperandOnlyInNin { - in = 'in', - nin = 'nin', -} -export enum FilterOperandOnlySimple { - eq = 'eq', - gt = 'gt', - gte = 'gte', - like = 'like', - lt = 'lt', - lte = 'lte', - ne = 'ne', - regexp = 'regexp', -} diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/response-body.ts b/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/response-body.ts deleted file mode 100644 index 85dbdb49..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/response-body.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { - EntityField, - EntityProps, - EntityRelation, - TypeOfArray, - ValueOf, -} from '.'; -import { Collection } from '@mikro-orm/core'; - -export type PageProps = { - totalItems: number; - pageNumber: number; - pageSize: number; -}; - -export type DebugMetaProps = Partial<{ - time: number; -}>; - -export type MainData = { - type: T; - id: string; -}; - -export type Links = { - self: string; - related?: string; -}; - -export type Attributes = { - [P in EntityProps]?: D[P] extends EntityField ? D[P] : TypeOfArray; -}; - -export type DataResult = E extends unknown[] - ? MainData[] - : E extends Collection - ? MainData[] - : MainData | null; - -export type Data = { - data?: DataResult; -}; - -export type Relationships = { - [P in EntityRelation]?: { - links: Links; - } & Data; -}; - -export type Include = ValueOf<{ - [P in EntityRelation]: ResourceData>; -}>; - -export type ResourceData = MainData & { - attributes?: Attributes; - relationships?: Relationships; - links: Omit; -}; - -export type MetaProps = R extends null ? T : T & R; - -export type ResourceObject< - T, - R extends 'object' | 'array' = 'object', - M = null -> = { - meta: R extends 'array' - ? MetaProps - : MetaProps; - data: R extends 'array' ? ResourceData[] : ResourceData; - included?: Include[]; -}; - -export type ResourceObjectRelationships> = { - meta: DebugMetaProps; -} & Required>; diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/utils-string.type.ts b/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/utils-string.type.ts deleted file mode 100644 index b861d238..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/utils-string.type.ts +++ /dev/null @@ -1,26 +0,0 @@ -import type { Collection } from '@mikro-orm/core'; - -export type KebabCase = S extends `${infer C}${infer T}` - ? KebabCase extends infer U - ? U extends string - ? T extends Uncapitalize - ? `${Uncapitalize}${U}` - : `${Uncapitalize}-${U}` - : never - : never - : S; - -export type KebabToCamelCase = - S extends `${infer T}-${infer U}-${infer V}` - ? `${T}${Capitalize}${Capitalize>}` - : S extends `${infer T}-${infer U}` - ? `${Capitalize}${Capitalize>}` - : S; - -export type TypeOfArray = T extends (infer U)[] - ? U - : T extends Collection - ? U - : T; - -export type ValueOf = T[keyof T]; diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/utils/index.ts b/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/utils/index.ts deleted file mode 100644 index a7799257..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/utils/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './string-utils'; -export * from './object-utils'; diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/utils/object-utils.ts b/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/utils/object-utils.ts deleted file mode 100644 index 5d4ad26d..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/utils/object-utils.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { kebabToCamel } from './string-utils'; - -export const ObjectTyped = { - keys: Object.keys as (yourObject: T) => Array, - values: Object.values as (yourObject: U) => Array, - entries: Object.entries as ( - yourObject: O - ) => Array<[keyof O, O[keyof O]]>, - fromEntries: Object.fromEntries as ( - yourObjectEntries: [K, V][] - ) => Record, -}; - -export function isObject(item: unknown): item is object { - return typeof item === 'object' && !Array.isArray(item) && item !== null; -} - -export function createEntityInstance(name: string): E { - const entityName = kebabToCamel(name); - return Function('return new class ' + entityName + '{}')(); -} diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/utils/string-utils.spec.ts b/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/utils/string-utils.spec.ts deleted file mode 100644 index 4596cd21..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/utils/string-utils.spec.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { - camelToKebab, - snakeToCamel, - isString, - kebabToCamel, -} from './string-utils'; - -describe('Test utils', () => { - it('camelToKebab', () => { - const result = camelToKebab('ApproverGroups'); - const result1 = camelToKebab('Users'); - - expect(result).toBe('approver-groups'); - expect(result1).toBe('users'); - }); - - it('snakeToCamel', () => { - const result = snakeToCamel('test_test'); - const result1 = snakeToCamel('test-test'); - const result2 = snakeToCamel('testTest'); - const result3 = snakeToCamel('event_incident_typeFK'); - expect(result).toBe('testTest'); - expect(result1).toBe('testTest'); - expect(result2).toBe('testTest'); - expect(result3).toBe('eventIncidentTypeFK'); - }); - - it('isString', () => { - expect(isString('string')).toBe(true); - expect(isString(String('string'))).toBe(true); - expect(isString(new Date())).toBe(false); - expect(isString(class {})).toBe(false); - }); - - it('kebabToCamel', () => { - const type = 'users-group'; - const type1 = 'users'; - - expect(kebabToCamel(type)).toBe('UsersGroup'); - expect(kebabToCamel(type1)).toBe('Users'); - }); -}); diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/utils/string-utils.ts b/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/utils/string-utils.ts deleted file mode 100644 index 3b678710..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/utils/string-utils.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { KebabToCamelCase, KebabCase } from '../types'; - -export function isString(value: T): value is P { - return typeof value === 'string' || value instanceof String; -} - -export function snakeToCamel(str: string): string { - if (!str.match(/[\s_-]/g)) { - return str; - } - return str.replace(/([-_][a-z])/g, (group) => - group.toUpperCase().replace('-', '').replace('_', '') - ); -} - -export function camelToKebab(string: S): KebabCase { - return string - .replace(/((?<=[a-z\d])[A-Z]|(?<=[A-Z\d])[A-Z](?=[a-z]))/g, '-$1') - .toLowerCase() as KebabCase; -} - -export function upperFirstLetter(string: S): Capitalize { - return (string.charAt(0).toUpperCase() + string.slice(1)) as Capitalize; -} - -export function kebabToCamel(str: S): KebabToCamelCase { - return str - .split('-') - .map((i) => i.charAt(0).toUpperCase() + i.substring(1)) - .join('') as KebabToCamelCase; -} - -export function capitalizeFirstChar(str: string) { - return str - .split('-') - .map((i) => i.charAt(0).toUpperCase() + i.substring(1)) - .join(''); -} diff --git a/libs/json-api/json-api-nestjs/tsconfig.lib.json b/libs/json-api/json-api-nestjs/tsconfig.lib.json index 0adc2e5a..0d157409 100644 --- a/libs/json-api/json-api-nestjs/tsconfig.lib.json +++ b/libs/json-api/json-api-nestjs/tsconfig.lib.json @@ -9,8 +9,8 @@ "noImplicitAny": true, "strictBindCallApply": true, "forceConsistentCasingInFileNames": true, - "noFallthroughCasesInSwitch": true + "noFallthroughCasesInSwitch": true, }, "include": ["src/**/*.ts"], - "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"] + "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts", "src/**/*.test-d.ts", "src/lib/utils/___test___/**/*.ts"] } diff --git a/libs/json-api/json-api-nestjs/tsconfig.spec.json b/libs/json-api/json-api-nestjs/tsconfig.spec.json index ebbb8e0d..807e943f 100644 --- a/libs/json-api/json-api-nestjs/tsconfig.spec.json +++ b/libs/json-api/json-api-nestjs/tsconfig.spec.json @@ -4,7 +4,13 @@ "outDir": "../../../dist/out-tsc", "module": "commonjs", "moduleResolution": "node16", - "types": ["jest", "node"] + "types": ["jest", "node"], + "paths": { + "@klerick/json-api-nestjs-shared": [ + "libs/json-api/json-api-nestjs-shared/src/index.ts" + ] + }, + "allowJs": true }, "include": [ "jest.config.ts", diff --git a/libs/json-rpc/nestjs-json-rpc-sdk/project.json b/libs/json-rpc/nestjs-json-rpc-sdk/project.json index 0e9067da..3f6cbc7b 100644 --- a/libs/json-rpc/nestjs-json-rpc-sdk/project.json +++ b/libs/json-rpc/nestjs-json-rpc-sdk/project.json @@ -105,5 +105,5 @@ } } }, - "tags": [] + "tags": ["type:lib", "lib:nestjs-json-rpc", "lib:nestjs-json-rpc-sdk", "type:publish"] } diff --git a/libs/json-rpc/nestjs-json-rpc/project.json b/libs/json-rpc/nestjs-json-rpc/project.json index b40d8afb..2a845db5 100644 --- a/libs/json-rpc/nestjs-json-rpc/project.json +++ b/libs/json-rpc/nestjs-json-rpc/project.json @@ -50,5 +50,5 @@ } } }, - "tags": [] + "tags": ["type:lib", "lib:nestjs-json-rpc", "lib:nestjs-json-rpc", "type:publish"] } diff --git a/libs/json-rpc/nestjs-json-rpc/src/lib/modules/ws-socket-transport/filter/rpc-ws-error-exception.filter.spec.ts b/libs/json-rpc/nestjs-json-rpc/src/lib/modules/ws-socket-transport/filter/rpc-ws-error-exception.filter.spec.ts index 69ae8c9f..9ea44a8a 100644 --- a/libs/json-rpc/nestjs-json-rpc/src/lib/modules/ws-socket-transport/filter/rpc-ws-error-exception.filter.spec.ts +++ b/libs/json-rpc/nestjs-json-rpc/src/lib/modules/ws-socket-transport/filter/rpc-ws-error-exception.filter.spec.ts @@ -10,14 +10,20 @@ import { WS_EVENT_NAME } from '../constants'; describe('rpc-ws-error-exception.filter', () => { describe('WebSocket', () => { - const WebSocketInst = new WebSocket( - 'wss://demo.piesocket.com/v3/channel_123', - {} - ); + let WebSocketInst: WebSocket; let argumentsHost: ArgumentsHost; let getClient: () => WebSocket; - beforeEach(() => { + beforeAll(async () => { + WebSocketInst = new WebSocket( + 'wss://demo.piesocket.com/v3/channel_123', + {} + ); + + await new Promise((resolve) => { + WebSocketInst.addEventListener('open', (event) => resolve(void 0)); + }); + getClient = () => WebSocketInst; argumentsHost = { switchToWs(): WsArgumentsHost { @@ -26,6 +32,11 @@ describe('rpc-ws-error-exception.filter', () => { } as any; }, } as any; + WebSocketInst.onopen = () => console.log('open'); + }); + + afterAll(() => { + WebSocketInst.close(); }); it('should catch RpcError and transform it to RpcErrorObject', () => { @@ -76,7 +87,7 @@ describe('rpc-ws-error-exception.filter', () => { let argumentsHost: ArgumentsHost; let getClient: () => Socket; - beforeEach(() => { + beforeAll(() => { getClient = () => WebSocketInst; argumentsHost = { switchToWs(): WsArgumentsHost { @@ -87,6 +98,10 @@ describe('rpc-ws-error-exception.filter', () => { } as any; }); + afterAll(() => { + WebSocketInst.disconnect(); + }); + it('should catch RpcError and transform it to RpcErrorObject', () => { const filter = new RpcWsErrorExceptionFilter(); const exception = createError( diff --git a/libs/microorm-database/src/lib/config.ts b/libs/microorm-database/src/lib/config.ts index cbdc17cb..fa30ac00 100644 --- a/libs/microorm-database/src/lib/config.ts +++ b/libs/microorm-database/src/lib/config.ts @@ -6,5 +6,8 @@ const { entitiesTs, ...configOther } = ormConfig; export const config: Options = { discovery: { requireEntitiesArray: true }, + contextName: 'default', + // @ts-ignore + registerRequestContext: false, ...configOther, }; diff --git a/libs/microorm-database/src/lib/micro-orm-database.module.ts b/libs/microorm-database/src/lib/micro-orm-database.module.ts index a742dfdd..cab84d50 100644 --- a/libs/microorm-database/src/lib/micro-orm-database.module.ts +++ b/libs/microorm-database/src/lib/micro-orm-database.module.ts @@ -1,10 +1,13 @@ import { Module } from '@nestjs/common'; import { MikroOrmModule } from '@mikro-orm/nestjs'; +import { MikroOrmCoreModule } from '@mikro-orm/nestjs/mikro-orm-core.module'; import { config } from './config'; @Module({ - imports: [MikroOrmModule.forRoot(config)], - exports: [MikroOrmModule], + imports: [MikroOrmModule.forRoot(config), MikroOrmModule.forMiddleware()], + exports: [MikroOrmCoreModule], }) export class MicroOrmDatabaseModule {} + +export { config }; diff --git a/libs/typeorm-database/src/lib/config-cli.ts b/libs/typeorm-database/src/lib/config-cli.ts index 8f782496..9ca9bd1b 100644 --- a/libs/typeorm-database/src/lib/config-cli.ts +++ b/libs/typeorm-database/src/lib/config-cli.ts @@ -2,7 +2,7 @@ import { DataSource, DataSourceOptions } from 'typeorm'; import { join } from 'path'; import * as process from 'process'; -const config: DataSourceOptions = { +const configPg: DataSourceOptions = { type: process.env['DB_TYPE'] as 'mysql' | 'postgres', host: process.env['DB_HOST'], port: parseInt(`${process.env['DB_PORT']}`, 10), @@ -15,23 +15,25 @@ const config: DataSourceOptions = { ...(process.env['DB_TYPE'] === 'mysql' ? { connectorPackage: 'mysql2' } : {}), }; -// const config: DataSourceOptions = { -// type: 'mysql', -// host: 'localhost', -// username: 'root', -// connectorPackage: 'mysql2', -// password: 'password', -// database: 'example_new', -// logging: true, -// migrations: [join(__dirname, '/migrations/**/*{.ts,.js}')], -// entities: [join(__dirname, '/entities/**/*{.ts,.js}')], -// }; +const configMysql: DataSourceOptions = { + type: process.env['DB_TYPE'] as 'mysql' | 'postgres', + host: process.env['DB_HOST'], + port: parseInt(`${process.env['DB_PORT']}`, 10), + username: process.env['DB_USERNAME'], + password: process.env['DB_PASSWORD'], + database: process.env['DB_NAME'], + logging: process.env['DB_LOGGING'] === '1', + migrations: [join(__dirname, '/migrations-mysql/**/*{.ts,.js}')], + entities: [join(__dirname, '/entities-mysql/**/*{.ts,.js}')], + connectorPackage: 'mysql2', +}; const configSeeder = { seeders: ['./libs/database/src/lib/seeders/*.ts'], defaultSeeder: 'RootSeeder', }; +const config = process.env['DB_TYPE'] === 'mysql' ? configMysql : configPg; export { config, configSeeder }; export default new DataSource({ ...config, ...configSeeder }); diff --git a/libs/typeorm-database/src/lib/entities-mysql/addresses.ts b/libs/typeorm-database/src/lib/entities-mysql/addresses.ts new file mode 100644 index 00000000..84653202 --- /dev/null +++ b/libs/typeorm-database/src/lib/entities-mysql/addresses.ts @@ -0,0 +1,58 @@ +import { + PrimaryGeneratedColumn, + OneToOne, + Column, + Entity, + UpdateDateColumn, +} from 'typeorm'; + +import { Users, IUsers } from '.'; + +export type IAddresses = Addresses; + +@Entity('addresses') +export class Addresses { + @PrimaryGeneratedColumn() + public id!: number; + + @Column({ + type: 'varchar', + length: 70, + nullable: true, + default: 'NULL', + }) + public city!: string; + + @Column({ + type: 'varchar', + length: 70, + nullable: true, + default: 'NULL', + }) + public state!: string; + + @Column({ + type: 'varchar', + length: 68, + nullable: true, + default: 'NULL', + }) + public country!: string; + + @Column({ + name: 'created_at', + type: 'timestamp', + nullable: true, + }) + public createdAt!: Date; + + @UpdateDateColumn({ + name: 'updated_at', + type: 'timestamp', + nullable: true, + }) + public updatedAt!: Date; + + @OneToOne(() => Users, (item) => item.addresses) + public user!: IUsers; +} diff --git a/libs/typeorm-database/src/lib/entities-mysql/book-list.ts b/libs/typeorm-database/src/lib/entities-mysql/book-list.ts new file mode 100644 index 00000000..135045c2 --- /dev/null +++ b/libs/typeorm-database/src/lib/entities-mysql/book-list.ts @@ -0,0 +1,40 @@ +import { + Column, + Entity, + ManyToMany, + PrimaryGeneratedColumn, + UpdateDateColumn, +} from 'typeorm'; + +import { IUsers, Users } from './users'; + +export type IBookList = BookList; + +@Entity('book_list') +export class BookList { + @PrimaryGeneratedColumn() + public id!: string; + + @Column({ + type: 'text', + nullable: false, + }) + public text!: string; + + @Column({ + name: 'created_at', + type: 'timestamp', + nullable: true, + }) + public createdAt!: Date; + + @UpdateDateColumn({ + name: 'updated_at', + type: 'timestamp', + nullable: true, + }) + public updatedAt!: Date; + + @ManyToMany(() => Users, (item) => item.books) + public users!: IUsers[]; +} diff --git a/libs/typeorm-database/src/lib/entities-mysql/comments.ts b/libs/typeorm-database/src/lib/entities-mysql/comments.ts new file mode 100644 index 00000000..a0e82a7e --- /dev/null +++ b/libs/typeorm-database/src/lib/entities-mysql/comments.ts @@ -0,0 +1,57 @@ +import { + PrimaryGeneratedColumn, + Column, + Entity, + JoinColumn, + ManyToOne, + UpdateDateColumn, +} from 'typeorm'; + +export enum CommentKind { + Comment = 'COMMENT', + Message = 'MESSAGE', + Note = 'NOTE', +} + +import { Users, IUsers } from '.'; + +export type IComments = Comments; + +@Entity('comments') +export class Comments { + @PrimaryGeneratedColumn() + public id!: number; + + @Column({ + type: 'text', + nullable: false, + }) + public text!: string; + + @Column({ + type: 'enum', + enum: CommentKind, + nullable: false, + }) + public kind!: CommentKind; + + @Column({ + name: 'created_at', + type: 'timestamp', + nullable: true, + }) + public createdAt!: Date; + + @UpdateDateColumn({ + name: 'updated_at', + type: 'timestamp', + nullable: true, + }) + public updatedAt!: Date; + + @ManyToOne(() => Users, (item: Users) => item.id) + @JoinColumn({ + name: 'created_by', + }) + public createdBy!: IUsers; +} diff --git a/libs/typeorm-database/src/lib/entities-mysql/index.ts b/libs/typeorm-database/src/lib/entities-mysql/index.ts new file mode 100644 index 00000000..c7af2ac0 --- /dev/null +++ b/libs/typeorm-database/src/lib/entities-mysql/index.ts @@ -0,0 +1,5 @@ +export * from './addresses'; +export * from './roles'; +export * from './users'; +export * from './comments'; +export * from './book-list'; diff --git a/libs/typeorm-database/src/lib/entities-mysql/roles.ts b/libs/typeorm-database/src/lib/entities-mysql/roles.ts new file mode 100644 index 00000000..1de8ea8e --- /dev/null +++ b/libs/typeorm-database/src/lib/entities-mysql/roles.ts @@ -0,0 +1,56 @@ +import { + PrimaryGeneratedColumn, + Entity, + Column, + ManyToMany, + UpdateDateColumn, +} from 'typeorm'; + +import { Users, IUsers } from '.'; + +export type IRoles = Roles; + +@Entity('roles') +export class Roles { + @PrimaryGeneratedColumn() + public id!: number; + + @Column({ + type: 'varchar', + length: 128, + nullable: true, + default: 'NULL', + }) + public name!: string; + + @Column({ + type: 'varchar', + length: 128, + nullable: false, + unique: true, + }) + public key!: string; + + @Column({ + name: 'is_default', + default: false, + }) + public isDefault!: boolean; + + @Column({ + name: 'created_at', + type: 'timestamp', + nullable: true, + }) + public createdAt!: Date; + + @UpdateDateColumn({ + name: 'updated_at', + type: 'timestamp', + nullable: true, + }) + public updatedAt!: Date; + + @ManyToMany(() => Users, (item: Users) => item.roles) + public users!: IUsers[]; +} diff --git a/libs/typeorm-database/src/lib/entities-mysql/users.ts b/libs/typeorm-database/src/lib/entities-mysql/users.ts new file mode 100644 index 00000000..33861b69 --- /dev/null +++ b/libs/typeorm-database/src/lib/entities-mysql/users.ts @@ -0,0 +1,121 @@ +import { + PrimaryGeneratedColumn, + ManyToMany, + JoinColumn, + JoinTable, + OneToOne, + OneToMany, + Entity, + Column, + UpdateDateColumn, +} from 'typeorm'; + +import { + Addresses, + IAddresses, + Roles, + IRoles, + Comments, + IComments, + IBookList, + BookList, +} from '.'; + +export type IUsers = Users; + +@Entity('users') +export class Users { + @PrimaryGeneratedColumn() + public id!: number; + + @Column({ + type: 'varchar', + length: 100, + nullable: false, + unique: true, + }) + public login!: string; + + @Column({ + name: 'first_name', + type: 'varchar', + length: 100, + nullable: true, + default: 'NULL', + }) + public firstName!: string; + + @Column({ + name: 'last_name', + type: 'varchar', + length: 100, + nullable: true, + default: 'NULL', + }) + public lastName!: string; + + @Column({ + nullable: false, + default: false, + name: 'is_active', + type: 'boolean', + }) + public isActive!: boolean; + + @Column({ + name: 'created_at', + type: 'timestamp', + nullable: true, + }) + public createdAt!: Date; + + @UpdateDateColumn({ + name: 'updated_at', + type: 'timestamp', + nullable: true, + }) + public updatedAt!: Date; + + @OneToOne(() => Addresses, (item: Addresses) => item.id) + @JoinColumn({ + name: 'addresses_id', + }) + public addresses!: IAddresses; + + @OneToOne(() => Users, (item) => item.id) + @JoinColumn({ + name: 'manager_id', + }) + public manager!: IUsers; + + @ManyToMany(() => Roles, (item: Roles) => item.users) + @JoinTable({ + name: 'users_have_roles', + inverseJoinColumn: { + referencedColumnName: 'id', + name: 'roles_id', + }, + joinColumn: { + referencedColumnName: 'id', + name: 'users_id', + }, + }) + public roles!: IRoles[]; + + @OneToMany(() => Comments, (item: Comments) => item.createdBy) + public comments!: IComments[]; + + @ManyToMany(() => BookList, (item: BookList) => item.users) + @JoinTable({ + name: 'users_have_book', + inverseJoinColumn: { + referencedColumnName: 'id', + name: 'book_list_id', + }, + joinColumn: { + referencedColumnName: 'id', + name: 'users_id', + }, + }) + public books!: IBookList[]; +} diff --git a/libs/typeorm-database/src/lib/migrations-mysql/1741669072861-test.ts b/libs/typeorm-database/src/lib/migrations-mysql/1741669072861-test.ts new file mode 100644 index 00000000..18dcf130 --- /dev/null +++ b/libs/typeorm-database/src/lib/migrations-mysql/1741669072861-test.ts @@ -0,0 +1,105 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class Test1741669072861 implements MigrationInterface { + name = 'Test1741669072861'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `CREATE TABLE \`addresses\` (\`id\` int NOT NULL AUTO_INCREMENT, \`city\` varchar(70) NULL DEFAULT 'NULL', \`state\` varchar(70) NULL DEFAULT 'NULL', \`country\` varchar(68) NULL DEFAULT 'NULL', \`created_at\` timestamp NULL, \`updated_at\` timestamp(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), PRIMARY KEY (\`id\`)) ENGINE=InnoDB` + ); + await queryRunner.query( + `CREATE TABLE \`roles\` (\`id\` int NOT NULL AUTO_INCREMENT, \`name\` varchar(128) NULL DEFAULT 'NULL', \`key\` varchar(128) NOT NULL, \`is_default\` tinyint NOT NULL DEFAULT 0, \`created_at\` timestamp NULL, \`updated_at\` timestamp(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), UNIQUE INDEX \`IDX_a87cf0659c3ac379b339acf36a\` (\`key\`), PRIMARY KEY (\`id\`)) ENGINE=InnoDB` + ); + await queryRunner.query( + `CREATE TABLE \`comments\` (\`id\` int NOT NULL AUTO_INCREMENT, \`text\` text NOT NULL, \`kind\` enum ('COMMENT', 'MESSAGE', 'NOTE') NOT NULL, \`created_at\` timestamp NULL, \`updated_at\` timestamp(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), \`created_by\` int NULL, PRIMARY KEY (\`id\`)) ENGINE=InnoDB` + ); + await queryRunner.query( + `CREATE TABLE \`book_list\` (\`id\` int NOT NULL AUTO_INCREMENT, \`text\` text NOT NULL, \`created_at\` timestamp NULL, \`updated_at\` timestamp(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), PRIMARY KEY (\`id\`)) ENGINE=InnoDB` + ); + await queryRunner.query( + `CREATE TABLE \`users\` (\`id\` int NOT NULL AUTO_INCREMENT, \`login\` varchar(100) NOT NULL, \`first_name\` varchar(100) NULL DEFAULT 'NULL', \`last_name\` varchar(100) NULL DEFAULT 'NULL', \`is_active\` tinyint NOT NULL DEFAULT 0, \`created_at\` timestamp NULL, \`updated_at\` timestamp(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), \`addresses_id\` int NULL, \`manager_id\` int NULL, UNIQUE INDEX \`IDX_2d443082eccd5198f95f2a36e2\` (\`login\`), UNIQUE INDEX \`REL_2f8d527df0d3acb8aa51945a96\` (\`addresses_id\`), UNIQUE INDEX \`REL_fba2d8e029689aa8fea98e53c9\` (\`manager_id\`), PRIMARY KEY (\`id\`)) ENGINE=InnoDB` + ); + await queryRunner.query( + `CREATE TABLE \`users_have_roles\` (\`users_id\` int NOT NULL, \`roles_id\` int NOT NULL, INDEX \`IDX_bb66594b23503c32a315a63fe1\` (\`users_id\`), INDEX \`IDX_afa6ce5ffd14d2e5580fd54624\` (\`roles_id\`), PRIMARY KEY (\`users_id\`, \`roles_id\`)) ENGINE=InnoDB` + ); + await queryRunner.query( + `CREATE TABLE \`users_have_book\` (\`users_id\` int NOT NULL, \`book_list_id\` int NOT NULL, INDEX \`IDX_7b85c8711c8d45d686a1b6ea64\` (\`users_id\`), INDEX \`IDX_88eb6d4c67dab296d402b0ae2e\` (\`book_list_id\`), PRIMARY KEY (\`users_id\`, \`book_list_id\`)) ENGINE=InnoDB` + ); + await queryRunner.query( + `ALTER TABLE \`comments\` ADD CONSTRAINT \`FK_980bfefe00ed11685f325d0bd4c\` FOREIGN KEY (\`created_by\`) REFERENCES \`users\`(\`id\`) ON DELETE NO ACTION ON UPDATE NO ACTION` + ); + await queryRunner.query( + `ALTER TABLE \`users\` ADD CONSTRAINT \`FK_2f8d527df0d3acb8aa51945a968\` FOREIGN KEY (\`addresses_id\`) REFERENCES \`addresses\`(\`id\`) ON DELETE NO ACTION ON UPDATE NO ACTION` + ); + await queryRunner.query( + `ALTER TABLE \`users\` ADD CONSTRAINT \`FK_fba2d8e029689aa8fea98e53c91\` FOREIGN KEY (\`manager_id\`) REFERENCES \`users\`(\`id\`) ON DELETE NO ACTION ON UPDATE NO ACTION` + ); + await queryRunner.query( + `ALTER TABLE \`users_have_roles\` ADD CONSTRAINT \`FK_bb66594b23503c32a315a63fe1e\` FOREIGN KEY (\`users_id\`) REFERENCES \`users\`(\`id\`) ON DELETE CASCADE ON UPDATE CASCADE` + ); + await queryRunner.query( + `ALTER TABLE \`users_have_roles\` ADD CONSTRAINT \`FK_afa6ce5ffd14d2e5580fd54624e\` FOREIGN KEY (\`roles_id\`) REFERENCES \`roles\`(\`id\`) ON DELETE NO ACTION ON UPDATE NO ACTION` + ); + await queryRunner.query( + `ALTER TABLE \`users_have_book\` ADD CONSTRAINT \`FK_7b85c8711c8d45d686a1b6ea64e\` FOREIGN KEY (\`users_id\`) REFERENCES \`users\`(\`id\`) ON DELETE CASCADE ON UPDATE CASCADE` + ); + await queryRunner.query( + `ALTER TABLE \`users_have_book\` ADD CONSTRAINT \`FK_88eb6d4c67dab296d402b0ae2e2\` FOREIGN KEY (\`book_list_id\`) REFERENCES \`book_list\`(\`id\`) ON DELETE NO ACTION ON UPDATE NO ACTION` + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE \`users_have_book\` DROP FOREIGN KEY \`FK_88eb6d4c67dab296d402b0ae2e2\`` + ); + await queryRunner.query( + `ALTER TABLE \`users_have_book\` DROP FOREIGN KEY \`FK_7b85c8711c8d45d686a1b6ea64e\`` + ); + await queryRunner.query( + `ALTER TABLE \`users_have_roles\` DROP FOREIGN KEY \`FK_afa6ce5ffd14d2e5580fd54624e\`` + ); + await queryRunner.query( + `ALTER TABLE \`users_have_roles\` DROP FOREIGN KEY \`FK_bb66594b23503c32a315a63fe1e\`` + ); + await queryRunner.query( + `ALTER TABLE \`users\` DROP FOREIGN KEY \`FK_fba2d8e029689aa8fea98e53c91\`` + ); + await queryRunner.query( + `ALTER TABLE \`users\` DROP FOREIGN KEY \`FK_2f8d527df0d3acb8aa51945a968\`` + ); + await queryRunner.query( + `ALTER TABLE \`comments\` DROP FOREIGN KEY \`FK_980bfefe00ed11685f325d0bd4c\`` + ); + await queryRunner.query( + `DROP INDEX \`IDX_88eb6d4c67dab296d402b0ae2e\` ON \`users_have_book\`` + ); + await queryRunner.query( + `DROP INDEX \`IDX_7b85c8711c8d45d686a1b6ea64\` ON \`users_have_book\`` + ); + await queryRunner.query(`DROP TABLE \`users_have_book\``); + await queryRunner.query( + `DROP INDEX \`IDX_afa6ce5ffd14d2e5580fd54624\` ON \`users_have_roles\`` + ); + await queryRunner.query( + `DROP INDEX \`IDX_bb66594b23503c32a315a63fe1\` ON \`users_have_roles\`` + ); + await queryRunner.query(`DROP TABLE \`users_have_roles\``); + await queryRunner.query( + `DROP INDEX \`REL_fba2d8e029689aa8fea98e53c9\` ON \`users\`` + ); + await queryRunner.query( + `DROP INDEX \`REL_2f8d527df0d3acb8aa51945a96\` ON \`users\`` + ); + await queryRunner.query( + `DROP INDEX \`IDX_2d443082eccd5198f95f2a36e2\` ON \`users\`` + ); + await queryRunner.query(`DROP TABLE \`users\``); + await queryRunner.query(`DROP TABLE \`book_list\``); + await queryRunner.query(`DROP TABLE \`comments\``); + await queryRunner.query( + `DROP INDEX \`IDX_a87cf0659c3ac379b339acf36a\` ON \`roles\`` + ); + await queryRunner.query(`DROP TABLE \`roles\``); + await queryRunner.query(`DROP TABLE \`addresses\``); + } +} diff --git a/migrations.json b/migrations.json deleted file mode 100644 index a153a5fe..00000000 --- a/migrations.json +++ /dev/null @@ -1,142 +0,0 @@ -{ - "migrations": [ - { - "version": "20.0.0-beta.7", - "description": "Migration for v20.0.0-beta.7", - "implementation": "./src/migrations/update-20-0-0/move-use-daemon-process", - "package": "nx", - "name": "move-use-daemon-process" - }, - { - "version": "20.0.1", - "description": "Set `useLegacyCache` to true for migrating workspaces", - "implementation": "./src/migrations/update-20-0-1/use-legacy-cache", - "x-repair-skip": true, - "package": "nx", - "name": "use-legacy-cache" - }, - { - "cli": "nx", - "version": "20.0.0-beta.5", - "description": "replace getJestProjects with getJestProjectsAsync", - "implementation": "./src/migrations/update-20-0-0/replace-getJestProjects-with-getJestProjectsAsync", - "package": "@nx/jest", - "name": "replace-getJestProjects-with-getJestProjectsAsync" - }, - { - "version": "20.2.0-beta.5", - "description": "Update TypeScript ESLint packages to v8.13.0 if they are already on v8", - "implementation": "./src/migrations/update-20-2-0/update-typescript-eslint-v8-13-0", - "package": "@nx/eslint", - "name": "update-typescript-eslint-v8.13.0" - }, - { - "cli": "nx", - "version": "19.6.1-beta.0", - "description": "Ensure Target Defaults are set correctly for Module Federation.", - "factory": "./src/migrations/update-19-6-1/ensure-depends-on-for-mf", - "package": "@nx/angular", - "name": "update-19-6-1-ensure-module-federation-target-defaults" - }, - { - "cli": "nx", - "version": "20.2.0-beta.2", - "description": "Update the ModuleFederationConfig import use @nx/module-federation.", - "factory": "./src/migrations/update-20-2-0/migrate-mf-imports-to-new-package", - "package": "@nx/angular", - "name": "update-20-2-0-update-module-federation-config-import" - }, - { - "cli": "nx", - "version": "20.2.0-beta.2", - "description": "Update the withModuleFederation import use @nx/module-federation/angular.", - "factory": "./src/migrations/update-20-2-0/migrate-with-mf-import-to-new-package", - "package": "@nx/angular", - "name": "update-20-2-0-update-with-module-federation-import" - }, - { - "cli": "nx", - "version": "20.2.0-beta.5", - "requires": { "@angular/core": ">=19.0.0" }, - "description": "Update the @angular/cli package version to ~19.0.0.", - "factory": "./src/migrations/update-20-2-0/update-angular-cli", - "package": "@nx/angular", - "name": "update-angular-cli-version-19-0-0" - }, - { - "cli": "nx", - "version": "20.2.0-beta.5", - "requires": { "@angular/core": ">=19.0.0" }, - "description": "Add the '@angular/localize/init' polyfill to the 'polyfills' option of targets using esbuild-based executors.", - "factory": "./src/migrations/update-20-2-0/add-localize-polyfill-to-targets", - "package": "@nx/angular", - "name": "add-localize-polyfill-to-targets" - }, - { - "cli": "nx", - "version": "20.2.0-beta.5", - "requires": { "@angular/core": ">=19.0.0" }, - "description": "Update '@angular/ssr' import paths to use the new '/node' entry point when 'CommonEngine' is detected.", - "factory": "./src/migrations/update-20-2-0/update-angular-ssr-imports-to-use-node-entry-point", - "package": "@nx/angular", - "name": "update-angular-ssr-imports-to-use-node-entry-point" - }, - { - "cli": "nx", - "version": "20.2.0-beta.6", - "requires": { "@angular/core": ">=19.0.0" }, - "description": "Disable the Angular ESLint prefer-standalone rule if not set.", - "factory": "./src/migrations/update-20-2-0/disable-angular-eslint-prefer-standalone", - "package": "@nx/angular", - "name": "disable-angular-eslint-prefer-standalone" - }, - { - "cli": "nx", - "version": "20.2.0-beta.8", - "requires": { "@angular/core": ">=19.0.0" }, - "description": "Remove Angular ESLint rules that were removed in v19.0.0.", - "factory": "./src/migrations/update-20-2-0/remove-angular-eslint-rules", - "package": "@nx/angular", - "name": "remove-angular-eslint-rules" - }, - { - "cli": "nx", - "version": "20.2.0-beta.8", - "requires": { "@angular/core": ">=19.0.0" }, - "description": "Remove the deprecated 'tailwindConfig' option from ng-packagr executors. Tailwind CSS configurations located at the project or workspace root will be picked up automatically.", - "factory": "./src/migrations/update-20-2-0/remove-tailwind-config-from-ng-packagr-executors", - "package": "@nx/angular", - "name": "remove-tailwind-config-from-ng-packagr-executors" - }, - { - "cli": "nx", - "version": "19.6.3-beta.0", - "description": "Migrate proxy config files to match new format from webpack-dev-server v5.", - "implementation": "./src/migrations/update-19-6-3/proxy-config", - "package": "@nx/webpack", - "name": "update-19-6-3-proxy-config" - }, - { - "version": "19.0.0", - "description": "Updates non-standalone Directives, Component and Pipes to 'standalone:false' and removes 'standalone:true' from those who are standalone", - "factory": "./bundles/explicit-standalone-flag#migrate", - "package": "@angular/core", - "name": "explicit-standalone-flag" - }, - { - "version": "19.0.0", - "description": "Updates ExperimentalPendingTasks to PendingTasks", - "factory": "./bundles/pending-tasks#migrate", - "package": "@angular/core", - "name": "pending-tasks" - }, - { - "version": "19.0.0", - "description": "Replaces `APP_INITIALIZER`, `ENVIRONMENT_INITIALIZER` & `PLATFORM_INITIALIZER` respectively with `provideAppInitializer`, `provideEnvironmentInitializer` & `providePlatformInitializer`.", - "factory": "./bundles/provide-initializer#migrate", - "optional": true, - "package": "@angular/core", - "name": "provide-initializer" - } - ] -} diff --git a/nx.json b/nx.json index 63589c20..38af183e 100644 --- a/nx.json +++ b/nx.json @@ -12,7 +12,9 @@ "!{projectRoot}/src/test-setup.[jt]s", "!{projectRoot}/test-setup.[jt]s" ], - "sharedGlobals": ["{workspaceRoot}/.github/**/*"] + "sharedGlobals": [ + "{workspaceRoot}/.github/**/*.yml" + ] }, "plugins": [ { @@ -73,30 +75,22 @@ }, "release": { "changelog": { + "automaticFromRef": true, "projectChangelogs": { "createRelease": "github" } }, "projectsRelationship": "independent", - "projects": [ - "*", - "!json-shared-type", - "!json-api-nestjs-shared", - "!json-api-server-e2e", - "!json-api-server", - "!json-api-front", - "!shared-utils", - "!typeorm-database", - "!microorm-database", - "!type-for-rpc" - ], + "projects": "tag:type:publish", "version": { - "preVersionCommand": "npx nx run-many -t build -p nestjs-json-rpc,nestjs-json-rpc-sdk,json-api-nestjs,json-api-nestjs-sdk", + "preVersionCommand": "npx nx run-many --projects=tag:type:publish --target=build --parallel", "conventionalCommits": true, "generatorOptions": { - "fallbackCurrentVersionResolver": "1.0.0" + "fallbackCurrentVersionResolver": "disk" } - } + }, + "releaseTagPattern": "{projectName}@{version}" }, - "useLegacyCache": true + "defaultBase": "master", + "nxCloudId": "67c859dd862a93f16da79c89" } diff --git a/package-lock.json b/package-lock.json index 2a46cce3..daadefb8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,38 +10,40 @@ "license": "MIT", "dependencies": { "@anatine/zod-openapi": "^2.2.3", - "@angular/animations": "19.0.3", - "@angular/common": "19.0.3", - "@angular/compiler": "19.0.3", - "@angular/core": "19.0.3", - "@angular/forms": "19.0.3", - "@angular/platform-browser": "19.0.3", - "@angular/platform-browser-dynamic": "19.0.3", - "@angular/router": "19.0.3", + "@angular/animations": "^19.2.1", + "@angular/common": "^19.2.1", + "@angular/compiler": "^19.2.1", + "@angular/core": "^19.2.1", + "@angular/forms": "^19.2.1", + "@angular/platform-browser": "^19.2.1", + "@angular/platform-browser-dynamic": "^19.2.1", + "@angular/router": "^19.2.1", "@mikro-orm/cli": "^6.4.3", "@mikro-orm/core": "^6.4.3", "@mikro-orm/migrations": "^6.4.3", "@mikro-orm/mysql": "^6.4.3", - "@mikro-orm/nestjs": "^6.0.2", + "@mikro-orm/nestjs": "^6.1.1", "@mikro-orm/postgresql": "^6.4.3", "@mikro-orm/sql-highlighter": "^1.0.1", - "@nestjs/common": "^10.3.0", - "@nestjs/core": "^10.3.0", - "@nestjs/platform-express": "10.3.3", - "@nestjs/platform-socket.io": "^10.3.7", - "@nestjs/platform-ws": "^10.3.7", - "@nestjs/swagger": "^7.3.0", - "@nestjs/typeorm": "^10.0.2", - "@nestjs/websockets": "^10.3.7", + "@nestjs/common": "^11.0.10", + "@nestjs/core": "^11.0.10", + "@nestjs/platform-express": "11.0.10", + "@nestjs/platform-socket.io": "^11.0.10", + "@nestjs/platform-ws": "^11.0.10", + "@nestjs/swagger": "^11.0.4", + "@nestjs/typeorm": "^11.0.0", + "@nestjs/websockets": "^11.0.10", "axios": "^1.6.0", + "change-case-commonjs": "^5.4.4", "class-transformer": "^0.5.1", "class-validator": "^0.14.1", - "nestjs-pino": "4.0.0", + "nestjs-pino": "4.3.0", "pg": "8.11.3", - "pino-http": "9.0.0", + "pino-http": "10.4.0", "reflect-metadata": "^0.1.13", "rxjs": "^7.8.0", "socket.io-client": "^4.7.5", + "ts-toolbelt": "^9.6.0", "tslib": "^2.3.0", "typeorm": "^0.3.20", "uuid": "^10.0.0", @@ -50,35 +52,35 @@ "zone.js": "0.15.0" }, "devDependencies": { - "@angular-devkit/build-angular": "19.0.4", - "@angular-devkit/core": "19.0.4", - "@angular-devkit/schematics": "19.0.4", - "@angular-eslint/eslint-plugin": "19.0.1", - "@angular-eslint/eslint-plugin-template": "19.0.1", - "@angular-eslint/template-parser": "19.0.1", - "@angular/cli": "~19.0.0", - "@angular/compiler-cli": "19.0.3", - "@angular/language-service": "19.0.3", + "@angular-devkit/build-angular": "19.2.1", + "@angular-devkit/core": "19.2.1", + "@angular-devkit/schematics": "19.2.1", + "@angular-eslint/eslint-plugin": "19.2.0", + "@angular-eslint/eslint-plugin-template": "19.2.0", + "@angular-eslint/template-parser": "19.2.0", + "@angular/cli": "~19.2.0", + "@angular/compiler-cli": "19.2.1", + "@angular/language-service": "19.2.1", "@electric-sql/pglite": "^0.2.16", "@faker-js/faker": "^8.4.1", "@jorgebodega/typeorm-factory": "^1.4.0", "@jorgebodega/typeorm-seeding": "^6.0.1", - "@nestjs/schematics": "^10.0.1", - "@nestjs/testing": "^10.0.2", - "@nx/angular": "20.2.1", - "@nx/eslint": "20.2.1", - "@nx/eslint-plugin": "20.2.1", - "@nx/jest": "20.2.1", - "@nx/js": "20.2.1", - "@nx/nest": "20.2.1", - "@nx/node": "20.2.1", - "@nx/web": "20.2.1", - "@nx/webpack": "20.2.1", - "@nx/workspace": "20.2.1", - "@schematics/angular": "19.0.4", - "@swc-node/register": "1.9.2", - "@swc/core": "1.5.7", - "@swc/helpers": "0.5.11", + "@nestjs/schematics": "^11.0.1", + "@nestjs/testing": "^11.0.10", + "@nx/angular": "20.5.0", + "@nx/eslint": "20.5.0", + "@nx/eslint-plugin": "20.5.0", + "@nx/jest": "20.5.0", + "@nx/js": "20.5.0", + "@nx/nest": "20.5.0", + "@nx/node": "20.5.0", + "@nx/web": "20.5.0", + "@nx/webpack": "20.5.0", + "@nx/workspace": "20.5.0", + "@schematics/angular": "19.2.1", + "@swc-node/register": "1.10.9", + "@swc/core": "1.11.7", + "@swc/helpers": "0.5.15", "@types/jest": "29.5.12", "@types/node": "~18.16.9", "@types/uuid": "^9.0.8", @@ -94,25 +96,28 @@ "jest-preset-angular": "14.4.2", "jsonc-eslint-parser": "^2.1.0", "knex-pglite": "^0.11.0", - "ng-packagr": "19.0.1", - "nx": "20.2.1", + "ng-packagr": "19.2.0", + "nx": "20.5.0", "pg-mem": "^3.0.2", "postcss": "^8.4.5", "postcss-url": "~10.1.3", "prettier": "^2.6.2", "ts-jest": "^29.1.0", "ts-node": "10.9.1", + "tsd": "^0.31.2", "typeorm-pglite": "^0.3.2", - "typescript": "5.6.3", - "verdaccio": "^5.0.4", + "typescript": "5.7.3", + "verdaccio": "6.0.5", "webpack-cli": "^5.1.4" + }, + "engines": { + "node": ">= 20.0.0" } }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -125,9 +130,8 @@ }, "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", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -138,8 +142,7 @@ }, "node_modules/@anatine/zod-openapi": { "version": "2.2.7", - "resolved": "https://registry.npmjs.org/@anatine/zod-openapi/-/zod-openapi-2.2.7.tgz", - "integrity": "sha512-kv/bGowgSGHNY2d/KIzx941ym0/elc7xoBiPri31qEUqbDPOSIppiMOZ88AedaTtLk5J1K96++h0CEsHkgFFyQ==", + "license": "MIT", "dependencies": { "ts-deepmerge": "^6.0.3" }, @@ -149,12 +152,12 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1900.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1900.4.tgz", - "integrity": "sha512-9XwZ21BPYS2vGOOwVB40fsMyuwJT0H1lWaAMo8Umwi6XbKBVfaWbEhjtR9dlarrySKtFuTz9hmTZkIXHLjXPdA==", + "version": "0.1902.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1902.1.tgz", + "integrity": "sha512-iCm6F4HYO5aIgjzhjOUPKnyFHcn6yVE8gCpjWFQL8JVqrVzFG27vMZ0wK8b8rMDIDt6/hr2FOSSwChVg/cv9GQ==", "dev": true, "dependencies": { - "@angular-devkit/core": "19.0.4", + "@angular-devkit/core": "19.2.1", "rxjs": "7.8.1" }, "engines": { @@ -164,41 +167,41 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.0.4.tgz", - "integrity": "sha512-n7fcRdNB7ed5j6aZI+qPI/1LylFv1OiRNgBIeJxX3HEmzQxsHHLcxWog2yZK2Fvw3390xFx/VjZaklITj6tBFA==", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.2.1.tgz", + "integrity": "sha512-YJdHON1005lBzXFFfTJBrcFvbgWMEhvkziQw1IuQpbl+aa2XbkPnBFbT/d5FWjQpIWVpPYRMMMCSVSqeICYUcg==", "dev": true, "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1900.4", - "@angular-devkit/build-webpack": "0.1900.4", - "@angular-devkit/core": "19.0.4", - "@angular/build": "19.0.4", - "@babel/core": "7.26.0", - "@babel/generator": "7.26.2", + "@angular-devkit/architect": "0.1902.1", + "@angular-devkit/build-webpack": "0.1902.1", + "@angular-devkit/core": "19.2.1", + "@angular/build": "19.2.1", + "@babel/core": "7.26.9", + "@babel/generator": "7.26.9", "@babel/helper-annotate-as-pure": "7.25.9", "@babel/helper-split-export-declaration": "7.24.7", - "@babel/plugin-transform-async-generator-functions": "7.25.9", + "@babel/plugin-transform-async-generator-functions": "7.26.8", "@babel/plugin-transform-async-to-generator": "7.25.9", - "@babel/plugin-transform-runtime": "7.25.9", - "@babel/preset-env": "7.26.0", - "@babel/runtime": "7.26.0", + "@babel/plugin-transform-runtime": "7.26.9", + "@babel/preset-env": "7.26.9", + "@babel/runtime": "7.26.9", "@discoveryjs/json-ext": "0.6.3", - "@ngtools/webpack": "19.0.4", - "@vitejs/plugin-basic-ssl": "1.1.0", + "@ngtools/webpack": "19.2.1", + "@vitejs/plugin-basic-ssl": "1.2.0", "ansi-colors": "4.1.3", "autoprefixer": "10.4.20", "babel-loader": "9.2.1", "browserslist": "^4.21.5", "copy-webpack-plugin": "12.0.2", "css-loader": "7.1.2", - "esbuild-wasm": "0.24.0", - "fast-glob": "3.3.2", + "esbuild-wasm": "0.25.0", + "fast-glob": "3.3.3", "http-proxy-middleware": "3.0.3", "istanbul-lib-instrument": "6.0.3", "jsonc-parser": "3.3.1", "karma-source-map-support": "1.4.0", - "less": "4.2.0", + "less": "4.2.2", "less-loader": "12.2.0", "license-webpack-plugin": "4.0.2", "loader-utils": "3.3.1", @@ -206,22 +209,22 @@ "open": "10.1.0", "ora": "5.4.1", "picomatch": "4.0.2", - "piscina": "4.7.0", - "postcss": "8.4.49", + "piscina": "4.8.0", + "postcss": "8.5.2", "postcss-loader": "8.1.1", "resolve-url-loader": "5.0.0", "rxjs": "7.8.1", - "sass": "1.80.7", - "sass-loader": "16.0.3", - "semver": "7.6.3", + "sass": "1.85.0", + "sass-loader": "16.0.5", + "semver": "7.7.1", "source-map-loader": "5.0.0", "source-map-support": "0.5.21", - "terser": "5.36.0", + "terser": "5.39.0", "tree-kill": "1.2.2", "tslib": "2.8.1", - "webpack": "5.96.1", + "webpack": "5.98.0", "webpack-dev-middleware": "7.4.2", - "webpack-dev-server": "5.1.0", + "webpack-dev-server": "5.2.0", "webpack-merge": "6.0.1", "webpack-subresource-integrity": "5.1.0" }, @@ -231,23 +234,23 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.24.0" + "esbuild": "0.25.0" }, "peerDependencies": { - "@angular/compiler-cli": "^19.0.0", - "@angular/localize": "^19.0.0", - "@angular/platform-server": "^19.0.0", - "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.0.4", - "@web/test-runner": "^0.19.0", + "@angular/compiler-cli": "^19.0.0 || ^19.2.0-next.0", + "@angular/localize": "^19.0.0 || ^19.2.0-next.0", + "@angular/platform-server": "^19.0.0 || ^19.2.0-next.0", + "@angular/service-worker": "^19.0.0 || ^19.2.0-next.0", + "@angular/ssr": "^19.2.1", + "@web/test-runner": "^0.20.0", "browser-sync": "^3.0.2", "jest": "^29.5.0", "jest-environment-jsdom": "^29.5.0", "karma": "^6.3.0", - "ng-packagr": "^19.0.0", + "ng-packagr": "^19.0.0 || ^19.2.0-next.0", "protractor": "^7.0.0", - "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.5 <5.7" + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "typescript": ">=5.5 <5.9" }, "peerDependenciesMeta": { "@angular/localize": { @@ -290,24 +293,42 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/@discoveryjs/json-ext": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", - "integrity": "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.17.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true + "node_modules/@angular-devkit/build-angular/node_modules/less": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/less/-/less-4.2.2.tgz", + "integrity": "sha512-tkuLHQlvWUTeQ3doAqnHbNn8T6WX1KA8yvbKG9x4VtKtIjHsVKQZCH11zRgAfbDAXC2UNIg/K9BYAAcEzUIrNg==", + "dev": true, + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } }, "node_modules/@angular-devkit/build-angular/node_modules/less-loader": { "version": "12.2.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-12.2.0.tgz", - "integrity": "sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 18.12.0" }, @@ -329,17 +350,66 @@ } } }, - "node_modules/@angular-devkit/build-angular/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true + "node_modules/@angular-devkit/build-angular/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } }, "node_modules/@angular-devkit/build-angular/node_modules/webpack-merge": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", - "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", "dev": true, + "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", "flat": "^5.0.2", @@ -350,12 +420,12 @@ } }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1900.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1900.4.tgz", - "integrity": "sha512-eovr5Am8EwxF7d/y0Hbfz/KYWnOXXVXVwquPUcg8JBI19lLbfctz4+71Vjz2qGroijr2FlZztRpmhd498SLt/A==", + "version": "0.1902.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1902.1.tgz", + "integrity": "sha512-KXvYkxvdun90GxAzaHIXkIKaYeJY9kQ89xaFXOaaJi6a9a+EkovnkHSPwPQ6uNqJo/zbwU5jKkT/rI/g+5D5Bg==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1900.4", + "@angular-devkit/architect": "0.1902.1", "rxjs": "7.8.1" }, "engines": { @@ -369,9 +439,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.0.4.tgz", - "integrity": "sha512-+imxIj1JLr2hbUYQePHgkTUKr0VmlxNSZvIREcCWtXUcdCypiwhJAtGXv6MfpB4hAx+FJZYEpVWeLwYOS/gW0A==", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.1.tgz", + "integrity": "sha512-DYsoU8emxmBkfIKI693BNUqocwHTVHLjgybyD5nU1qMOH+D/jqEzL5bQbjhUeqeARyrzDg7tyPM5Xno+GsS7KQ==", "dev": true, "dependencies": { "ajv": "8.17.1", @@ -397,9 +467,8 @@ }, "node_modules/@angular-devkit/core/node_modules/ajv": { "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -413,9 +482,8 @@ }, "node_modules/@angular-devkit/core/node_modules/ajv-formats": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -428,21 +496,15 @@ } } }, - "node_modules/@angular-devkit/core/node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true - }, "node_modules/@angular-devkit/schematics": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.0.4.tgz", - "integrity": "sha512-2r6Qs4N5NSPho+qzegCYS8kIgylXyH4DHaS7HJ5+4XvM1I8V8AII8payLWkUK0i29XufVoD5XfPUFnjxZrBfYQ==", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.1.tgz", + "integrity": "sha512-IVWXGROEACyV+YH/s9xvpbLVblK55GvqldZRCMvpevtXMJy1aubOPOB+8TkHOVBlmAteW/5I7ouDbQWVZjNfww==", "dev": true, "dependencies": { - "@angular-devkit/core": "19.0.4", + "@angular-devkit/core": "19.2.1", "jsonc-parser": "3.3.1", - "magic-string": "0.30.12", + "magic-string": "0.30.17", "ora": "5.4.1", "rxjs": "7.8.1" }, @@ -452,26 +514,20 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@angular-devkit/schematics/node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true - }, "node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "19.0.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-19.0.1.tgz", - "integrity": "sha512-ENnRzQdXKKisX0G2b7FmQu1IfhvPCrpZW2I4KMXNTOEp4+eouIoUzzHgM0dsRaXwB/RUfwBblTuAx8HZHW1oxw==", + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-19.2.0.tgz", + "integrity": "sha512-hmmAogTpYGbBvnJ0j7DNLi8YQ+YEEuwFdx0heU8XjTpZlRoSRIP7MJJVlaQCt+ZT5f5XwdGtqi9lOXqqcyGHLA==", "dev": true }, "node_modules/@angular-eslint/eslint-plugin": { - "version": "19.0.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-19.0.1.tgz", - "integrity": "sha512-pjS/G65ilytiQWhpz1EU7kOyNn11ZyonRZmLgH1MoES6LW2m+a9B5+zLSd+JOQxiRIkdcVeyCzRWmku0LmHBsg==", + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-19.2.0.tgz", + "integrity": "sha512-QQWWDrTdJ22tBd7RLFG/FdPwNyYEhg7YwWgn29z6XcdnV00ZFtf7FRbv/te1kqVNPvfjtht7bvtHcPQ432aUdQ==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.0.1", - "@angular-eslint/utils": "19.0.1" + "@angular-eslint/bundled-angular-compiler": "19.2.0", + "@angular-eslint/utils": "19.2.0" }, "peerDependencies": { "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", @@ -480,13 +536,13 @@ } }, "node_modules/@angular-eslint/eslint-plugin-template": { - "version": "19.0.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-19.0.1.tgz", - "integrity": "sha512-PIsv12/Rom7OUbPuSBvwtwt0hH06/cq8LMy1TQHByT2GL7/PRTn+kIrFG+eYx1IyRJXdtXjKcilLVRW8CDoFpA==", + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-19.2.0.tgz", + "integrity": "sha512-lUSzmk5/Dr0bNc2Omb5CZDu3zQZh70bJyuXnN5MKd00V1b3u90eqvMSveFzWFJ6Eot8Hh8+FxtiozPwGqOE+Og==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.0.1", - "@angular-eslint/utils": "19.0.1", + "@angular-eslint/bundled-angular-compiler": "19.2.0", + "@angular-eslint/utils": "19.2.0", "aria-query": "5.3.2", "axobject-query": "4.1.0" }, @@ -498,12 +554,12 @@ } }, "node_modules/@angular-eslint/template-parser": { - "version": "19.0.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-19.0.1.tgz", - "integrity": "sha512-h0d9sPHxjJza+KkEBuVhxGdwWS9te65ZpQbltMzC8Lug6iusIu+bGM2UigKWU5SsFoOwfQ1/4mIJJ7H2+Em+pQ==", + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-19.2.0.tgz", + "integrity": "sha512-VqgvFrILhoMe0GHZrx+Bjy8kx7/LJfJTd+x/wzE/X1cCChSU81MBZFMVeFMnoI75OOQUf4fwaaKrtUhUvAkVyw==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.0.1", + "@angular-eslint/bundled-angular-compiler": "19.2.0", "eslint-scope": "^8.0.2" }, "peerDependencies": { @@ -512,12 +568,12 @@ } }, "node_modules/@angular-eslint/utils": { - "version": "19.0.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-19.0.1.tgz", - "integrity": "sha512-t0jlld7GhaZnvKmlqwHEhzteJ1hfTNsqhYycDO1GthXXohswtmS2uePMrD2LDUS/YyHFyDdXLjdxtSmDLifK0Q==", + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-19.2.0.tgz", + "integrity": "sha512-1XQXzIqYadKUxcAgW1DPev56SVbR8Uld6TthgolU7rfIX23RYMIIRtQlrQCk7zoXLXm5fzcGqjTR4wHfoD+iWg==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.0.1" + "@angular-eslint/bundled-angular-compiler": "19.2.0" }, "peerDependencies": { "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", @@ -526,9 +582,9 @@ } }, "node_modules/@angular/animations": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.0.3.tgz", - "integrity": "sha512-YWoXM2S5p+Eq6cX1xjtFaai23oVNnbf3u34pEQCyKDjZpqI5lMu8e63lQT0tf7fZttEWlNUYRTwQ9+MpZ0sjzQ==", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.2.1.tgz", + "integrity": "sha512-I67XYXBic9bM+yfce6Dqa950TsrEWB6uwSB2l6eIg3Byp48yJxQYbyjvjDbMXPieU2Bzo8FYVSD+lc8cF4+L6A==", "dependencies": { "tslib": "^2.3.0" }, @@ -536,39 +592,40 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.3" + "@angular/core": "19.2.1" } }, "node_modules/@angular/build": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.0.4.tgz", - "integrity": "sha512-ubsNjLb54VkZwcPQ21Ke8aAHiIrRIcv7gG3R6/6XOoWeK1K2+tsv8bnO4mz5cHgzWOspLOT7FDC83NJjrKX3Nw==", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.2.1.tgz", + "integrity": "sha512-+gRcH2F+qGSN/JRT5J650FzXW2kPrhjoSwOMYW06zhSpyX+oDZenFygUxORNhb5CnXJyZf/L5UEj6ypUojx4KQ==", "dev": true, "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1900.4", - "@babel/core": "7.26.0", + "@angular-devkit/architect": "0.1902.1", + "@babel/core": "7.26.9", "@babel/helper-annotate-as-pure": "7.25.9", "@babel/helper-split-export-declaration": "7.24.7", "@babel/plugin-syntax-import-attributes": "7.26.0", - "@inquirer/confirm": "5.0.2", - "@vitejs/plugin-basic-ssl": "1.1.0", - "beasties": "0.1.0", + "@inquirer/confirm": "5.1.6", + "@vitejs/plugin-basic-ssl": "1.2.0", + "beasties": "0.2.0", "browserslist": "^4.23.0", - "esbuild": "0.24.0", - "fast-glob": "3.3.2", - "https-proxy-agent": "7.0.5", + "esbuild": "0.25.0", + "fast-glob": "3.3.3", + "https-proxy-agent": "7.0.6", "istanbul-lib-instrument": "6.0.3", "listr2": "8.2.5", - "magic-string": "0.30.12", - "mrmime": "2.0.0", + "magic-string": "0.30.17", + "mrmime": "2.0.1", "parse5-html-rewriting-stream": "7.0.0", "picomatch": "4.0.2", - "piscina": "4.7.0", - "rollup": "4.26.0", - "sass": "1.80.7", - "semver": "7.6.3", - "vite": "5.4.11", + "piscina": "4.8.0", + "rollup": "4.34.8", + "sass": "1.85.0", + "semver": "7.7.1", + "source-map-support": "0.5.21", + "vite": "6.2.0", "watchpack": "2.4.2" }, "engines": { @@ -577,19 +634,21 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "lmdb": "3.1.5" + "lmdb": "3.2.6" }, "peerDependencies": { - "@angular/compiler": "^19.0.0", - "@angular/compiler-cli": "^19.0.0", - "@angular/localize": "^19.0.0", - "@angular/platform-server": "^19.0.0", - "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.0.4", + "@angular/compiler": "^19.0.0 || ^19.2.0-next.0", + "@angular/compiler-cli": "^19.0.0 || ^19.2.0-next.0", + "@angular/localize": "^19.0.0 || ^19.2.0-next.0", + "@angular/platform-server": "^19.0.0 || ^19.2.0-next.0", + "@angular/service-worker": "^19.0.0 || ^19.2.0-next.0", + "@angular/ssr": "^19.2.1", + "karma": "^6.4.0", "less": "^4.2.0", + "ng-packagr": "^19.0.0 || ^19.2.0-next.0", "postcss": "^8.4.0", - "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.5 <5.7" + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "typescript": ">=5.5 <5.9" }, "peerDependenciesMeta": { "@angular/localize": { @@ -604,9 +663,15 @@ "@angular/ssr": { "optional": true }, + "karma": { + "optional": true + }, "less": { "optional": true }, + "ng-packagr": { + "optional": true + }, "postcss": { "optional": true }, @@ -615,27 +680,39 @@ } } }, + "node_modules/@angular/build/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@angular/cli": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.0.4.tgz", - "integrity": "sha512-jxnD9qkhelcRMCrHDCxNsWgn6HQCvMIj8uI0T2eB9Vy93q2YWUo/fWl2Sy4gFlR+VNeF+1hYhPLb/vqLLzjWuA==", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.2.1.tgz", + "integrity": "sha512-0ioZmuaapsbndXhpoUAew1uA4RFhNEa16kKgYPw5XlouaS2SLLrzC4nLW9DPJv6XrkOsOebf+OpyyHazzdFoSw==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1900.4", - "@angular-devkit/core": "19.0.4", - "@angular-devkit/schematics": "19.0.4", - "@inquirer/prompts": "7.1.0", + "@angular-devkit/architect": "0.1902.1", + "@angular-devkit/core": "19.2.1", + "@angular-devkit/schematics": "19.2.1", + "@inquirer/prompts": "7.3.2", "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.0.4", + "@schematics/angular": "19.2.1", "@yarnpkg/lockfile": "1.1.0", "ini": "5.0.0", "jsonc-parser": "3.3.1", "listr2": "8.2.5", - "npm-package-arg": "12.0.0", + "npm-package-arg": "12.0.2", "npm-pick-manifest": "10.0.0", "pacote": "20.0.0", - "resolve": "1.22.8", - "semver": "7.6.3", + "resolve": "1.22.10", + "semver": "7.7.1", "symbol-observable": "4.0.0", "yargs": "17.7.2" }, @@ -660,12 +737,6 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@angular/cli/node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true - }, "node_modules/@angular/cli/node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", @@ -673,9 +744,9 @@ "dev": true }, "node_modules/@angular/cli/node_modules/npm-package-arg": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.0.tgz", - "integrity": "sha512-ZTE0hbwSdTNL+Stx2zxSqdu2KZfNDcrtrLdIk7XGnQFYBWYDho/ORvXtn5XEePcL3tFpGjHCV3X3xrtDh7eZ+A==", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", + "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", "dev": true, "dependencies": { "hosted-git-info": "^8.0.0", @@ -696,6 +767,37 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/@angular/cli/node_modules/resolve": { + "version": "1.22.10", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@angular/cli/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@angular/cli/node_modules/validate-npm-package-name": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.0.tgz", @@ -706,9 +808,9 @@ } }, "node_modules/@angular/common": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.0.3.tgz", - "integrity": "sha512-YyBVZU+LQ38R+/U5vF/b1T3muROKpR0kkupMw7VKnGhQfgrRX5Dk3H2nr9ritt0zPc7TOUuQSlHMf3QWah2GDg==", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.2.1.tgz", + "integrity": "sha512-k+ikxn6SlWXxXEtwRmsYZeknf3a6n3Oicde6zTLBrD/Rie/u0+okuoQcuYjntQWGgH//QBQxH4UQpvRw51AR8w==", "dependencies": { "tslib": "^2.3.0" }, @@ -716,14 +818,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.3", + "@angular/core": "19.2.1", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.0.3.tgz", - "integrity": "sha512-cxtK4SlHAPstcXfjwOaoR1dAszrzo2iDF8ZiihbZPgKUG3m27qIU3Lp5XBgxfZPlO4jh6TXkWznY7f6Tyxkb0Q==", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.2.1.tgz", + "integrity": "sha512-yCN/lgXMvMsPtEmTChd621zV17RLn+flhcJ6mNZjyGA7zx16m5zity4/00G6phbGfG8WXOtH5vQ/k7nnO7wS4A==", "dependencies": { "tslib": "^2.3.0" }, @@ -731,7 +833,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.3" + "@angular/core": "19.2.1" }, "peerDependenciesMeta": { "@angular/core": { @@ -740,12 +842,12 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.0.3.tgz", - "integrity": "sha512-nayLcC3hSHoGKXCZInMdFcIZJEHYkEGNsdAutgCMuSj+lXCGuRUysuGC0rGzJc2R6nhgfaLJnO8T/O5acqaqdA==", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.2.1.tgz", + "integrity": "sha512-5uuUx0ibX7cQP7eSBaJzfZlU0Hbe0kLwc85uCnH47hfzCsd3u2VU623IZIN7ctaInoOFBjl9fUUqKnFuYibC/w==", "dev": true, "dependencies": { - "@babel/core": "7.26.0", + "@babel/core": "7.26.9", "@jridgewell/sourcemap-codec": "^1.4.14", "chokidar": "^4.0.0", "convert-source-map": "^1.5.1", @@ -763,20 +865,19 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "19.0.3", - "typescript": ">=5.5 <5.7" + "@angular/compiler": "19.2.1", + "typescript": ">=5.5 <5.9" } }, "node_modules/@angular/compiler-cli/node_modules/reflect-metadata": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/@angular/core": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.0.3.tgz", - "integrity": "sha512-WM844gDzrbHtcM2TJB9DmfCmenUYyNSI6h924CeppDW5oG8ShinQGiWNjF5oI6EZ4tG60uK3QvCm3kjr1dmbOA==", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.2.1.tgz", + "integrity": "sha512-gwdytbZSM9m5v9PhRsvh6Q13vI1Ydcx52QGs93bpWx5ACOGYGp/Y7zc2mcZb1aUM63zGBTpS9Qw9bEsPHeLZPA==", "dependencies": { "tslib": "^2.3.0" }, @@ -789,9 +890,9 @@ } }, "node_modules/@angular/forms": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.0.3.tgz", - "integrity": "sha512-8wf8yDR6cW+lOhpzhmxUOiI5Wjr1Kf7o8NuJ2P5K6b7IMNRzRyR5q/6R4NUwtF6aaJ1wNqmSof+goQmtn1HOcw==", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.2.1.tgz", + "integrity": "sha512-a+ifgpX5ie2KgTNI9m8tJWS+ym51u3LZ8Kd67dXX7+CbYe9RzdIgVtuXcTklrP1fmmhfKnQVNmsUqpAYAjrByg==", "dependencies": { "tslib": "^2.3.0" }, @@ -799,25 +900,25 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.3", - "@angular/core": "19.0.3", - "@angular/platform-browser": "19.0.3", + "@angular/common": "19.2.1", + "@angular/core": "19.2.1", + "@angular/platform-browser": "19.2.1", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/language-service": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-19.0.3.tgz", - "integrity": "sha512-SkUFggQayulgMWW4rwslLVCD7woZ1m7dCB87NCQdlZv9NIrHbNkaPfxHzaX3YrdKhw+u65XcttzD7cworcMcVQ==", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-19.2.1.tgz", + "integrity": "sha512-JJPxFQp3tbKy6xSKLHMYUA6SOBxtJoOKDNAasj8tNrgZLgxtGABWz3kPNlgzpVQ6HHyderrzPhDir9aQDooSJQ==", "dev": true, "engines": { "node": "^18.19.1 || ^20.11.1 || >=22.0.0" } }, "node_modules/@angular/platform-browser": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.0.3.tgz", - "integrity": "sha512-vggWHSzOsCpYqnGq5IIN+n7xdEvXfgUGaMdgzPhFMTsnlMTUs5+VEFl9tX9FANHkXKB5S1RttVyvEXRqJM9ncQ==", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.2.1.tgz", + "integrity": "sha512-omBNCMk0Gim+HntrofVQR8dOY2zLCFOW02+FX4y57QvuDBh/FpFfnQ14xxx1Y4qEgGculEcBe914uJlxr4ccIg==", "dependencies": { "tslib": "^2.3.0" }, @@ -825,9 +926,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "19.0.3", - "@angular/common": "19.0.3", - "@angular/core": "19.0.3" + "@angular/animations": "19.2.1", + "@angular/common": "19.2.1", + "@angular/core": "19.2.1" }, "peerDependenciesMeta": { "@angular/animations": { @@ -836,9 +937,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-19.0.3.tgz", - "integrity": "sha512-gFh+QN7JvepnD3mS0XmOtDmfY8h5sSkk2/guesE2A68Na8q+M3fGZlz7I37tCXToLth5us1X0Gi0UPCSESc4SA==", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-19.2.1.tgz", + "integrity": "sha512-jYEXI2CymdK8R27YKy/q0O36dZwSdbIyJAjX9vPTgAsORGwX8hdhm5NJwkKlOWT+ccf2ySUatJD7RCElhsEBNA==", "dependencies": { "tslib": "^2.3.0" }, @@ -846,16 +947,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.3", - "@angular/compiler": "19.0.3", - "@angular/core": "19.0.3", - "@angular/platform-browser": "19.0.3" + "@angular/common": "19.2.1", + "@angular/compiler": "19.2.1", + "@angular/core": "19.2.1", + "@angular/platform-browser": "19.2.1" } }, "node_modules/@angular/router": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.0.3.tgz", - "integrity": "sha512-L/s8crRC6nj5knmHsnPeOXMNdC7vUOSOvTQonXhmT0FdlP9bPnnRrNeVDnLnd8AzjPSBfIFE2eQw6T8jCwdxMA==", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.2.1.tgz", + "integrity": "sha512-HZTewSLnHpNbnOnTp9X7r17/eb8h3ex/b8da6z2OPpC3diV7EZsrrjrLpdkzm3wpuapaVATzRgC4I4gN8XwTxA==", "dependencies": { "tslib": "^2.3.0" }, @@ -863,17 +964,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.3", - "@angular/core": "19.0.3", - "@angular/platform-browser": "19.0.3", + "@angular/common": "19.2.1", + "@angular/core": "19.2.1", + "@angular/platform-browser": "19.2.1", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@babel/code-frame": { "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", @@ -884,30 +984,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", - "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "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==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz", + "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.0", - "@babel/generator": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.9", + "@babel/helper-compilation-targets": "^7.26.5", "@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", + "@babel/helpers": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.9", + "@babel/types": "^7.26.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -924,27 +1024,25 @@ }, "node_modules/@babel/core/node_modules/convert-source-map": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "dev": true, + "license": "MIT" }, "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", "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==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", + "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", "dev": true, "dependencies": { - "@babel/parser": "^7.26.2", - "@babel/types": "^7.26.0", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -955,9 +1053,8 @@ }, "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" }, @@ -966,12 +1063,12 @@ } }, "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==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.25.9", + "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -983,18 +1080,16 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-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": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-member-expression-to-functions": "^7.25.9", @@ -1013,18 +1108,16 @@ }, "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, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-regexp-features-plugin": { "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz", - "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "regexpu-core": "^6.2.0", @@ -1039,17 +1132,16 @@ }, "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==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", + "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -1064,9 +1156,8 @@ }, "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": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" @@ -1077,9 +1168,8 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" @@ -1090,9 +1180,8 @@ }, "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": { "@babel/helper-module-imports": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9", @@ -1107,9 +1196,8 @@ }, "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": { "@babel/types": "^7.25.9" }, @@ -1118,9 +1206,9 @@ } }, "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==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "dev": true, "engines": { "node": ">=6.9.0" @@ -1128,9 +1216,8 @@ }, "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": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-wrap-function": "^7.25.9", @@ -1145,9 +1232,8 @@ }, "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": { "@babel/helper-member-expression-to-functions": "^7.25.9", "@babel/helper-optimise-call-expression": "^7.25.9", @@ -1162,9 +1248,8 @@ }, "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, + "license": "MIT", "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" @@ -1187,36 +1272,32 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.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==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "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": { "@babel/template": "^7.25.9", "@babel/traverse": "^7.25.9", @@ -1227,25 +1308,25 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz", + "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", "dev": true, "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", + "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", "dev": true, "dependencies": { - "@babel/types": "^7.26.3" + "@babel/types": "^7.26.9" }, "bin": { "parser": "bin/babel-parser.js" @@ -1256,9 +1337,8 @@ }, "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": { "@babel/helper-plugin-utils": "^7.25.9", "@babel/traverse": "^7.25.9" @@ -1272,9 +1352,8 @@ }, "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": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -1287,9 +1366,8 @@ }, "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": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -1302,9 +1380,8 @@ }, "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": { "@babel/helper-plugin-utils": "^7.25.9", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", @@ -1319,9 +1396,8 @@ }, "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": { "@babel/helper-plugin-utils": "^7.25.9", "@babel/traverse": "^7.25.9" @@ -1335,9 +1411,8 @@ }, "node_modules/@babel/plugin-proposal-decorators": { "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.9.tgz", - "integrity": "sha512-hJhBCb0+NnTWybvWq2WpbCYDOcflSbx0t+BYP65e5R9GVnukiDTi+on5bFkk4p7QGuv190H6KfNiV9Knf/3cZA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.23.9", "@babel/helper-plugin-utils": "^7.22.5", @@ -1352,9 +1427,8 @@ }, "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": ">=6.9.0" }, @@ -1364,9 +1438,8 @@ }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1376,9 +1449,8 @@ }, "node_modules/@babel/plugin-syntax-bigint": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1388,9 +1460,8 @@ }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -1400,9 +1471,8 @@ }, "node_modules/@babel/plugin-syntax-decorators": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.23.3.tgz", - "integrity": "sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1415,9 +1485,8 @@ }, "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": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -1430,9 +1499,8 @@ }, "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" }, @@ -1445,9 +1513,8 @@ }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -1457,9 +1524,8 @@ }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1469,9 +1535,8 @@ }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1484,9 +1549,8 @@ }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -1496,9 +1560,8 @@ }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1508,9 +1571,8 @@ }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -1520,9 +1582,8 @@ }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1532,9 +1593,8 @@ }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1544,9 +1604,8 @@ }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1556,9 +1615,8 @@ }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1571,9 +1629,8 @@ }, "node_modules/@babel/plugin-syntax-typescript": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1586,9 +1643,8 @@ }, "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" @@ -1602,9 +1658,8 @@ }, "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": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -1616,14 +1671,14 @@ } }, "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==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz", + "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-remap-async-to-generator": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/traverse": "^7.26.8" }, "engines": { "node": ">=6.9.0" @@ -1634,9 +1689,8 @@ }, "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": { "@babel/helper-module-imports": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9", @@ -1650,12 +1704,12 @@ } }, "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==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz", + "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -1666,9 +1720,8 @@ }, "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": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -1681,9 +1734,8 @@ }, "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": { "@babel/helper-create-class-features-plugin": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9" @@ -1697,9 +1749,8 @@ }, "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": { "@babel/helper-create-class-features-plugin": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9" @@ -1713,9 +1764,8 @@ }, "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": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-compilation-targets": "^7.25.9", @@ -1733,9 +1783,8 @@ }, "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": { "@babel/helper-plugin-utils": "^7.25.9", "@babel/template": "^7.25.9" @@ -1749,9 +1798,8 @@ }, "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": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -1764,9 +1812,8 @@ }, "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, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9" @@ -1780,9 +1827,8 @@ }, "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" }, @@ -1795,9 +1841,8 @@ }, "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" @@ -1811,9 +1856,8 @@ }, "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": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -1826,9 +1870,8 @@ }, "node_modules/@babel/plugin-transform-exponentiation-operator": { "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", - "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -1841,9 +1884,8 @@ }, "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": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -1855,12 +1897,12 @@ } }, "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==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz", + "integrity": "sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { @@ -1872,9 +1914,8 @@ }, "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", @@ -1889,9 +1930,8 @@ }, "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" }, @@ -1904,9 +1944,8 @@ }, "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" }, @@ -1919,9 +1958,8 @@ }, "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" }, @@ -1934,9 +1972,8 @@ }, "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" }, @@ -1949,9 +1986,8 @@ }, "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" @@ -1965,9 +2001,8 @@ }, "node_modules/@babel/plugin-transform-modules-commonjs": { "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", - "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.26.0", "@babel/helper-plugin-utils": "^7.25.9" @@ -1981,9 +2016,8 @@ }, "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", @@ -1999,9 +2033,8 @@ }, "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" @@ -2015,9 +2048,8 @@ }, "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" @@ -2031,9 +2063,8 @@ }, "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" }, @@ -2045,12 +2076,12 @@ } }, "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==", + "version": "7.26.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz", + "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -2061,9 +2092,8 @@ }, "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" }, @@ -2076,9 +2106,8 @@ }, "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", @@ -2093,9 +2122,8 @@ }, "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" @@ -2109,9 +2137,8 @@ }, "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" }, @@ -2124,9 +2151,8 @@ }, "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" @@ -2140,9 +2166,8 @@ }, "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" }, @@ -2155,9 +2180,8 @@ }, "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" @@ -2171,9 +2195,8 @@ }, "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", @@ -2188,9 +2211,8 @@ }, "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" }, @@ -2203,9 +2225,8 @@ }, "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" @@ -2219,9 +2240,8 @@ }, "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" @@ -2235,9 +2255,8 @@ }, "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" }, @@ -2249,13 +2268,13 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz", - "integrity": "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.26.9.tgz", + "integrity": "sha512-Jf+8y9wXQbbxvVYTM8gO5oEF2POdNji0NMltEkG7FtmzD9PVz7/lxpqSdTvwsjTMU5HIHuDVNf2SOxLkWi+wPQ==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.6", "babel-plugin-polyfill-regenerator": "^0.6.1", @@ -2270,18 +2289,16 @@ }, "node_modules/@babel/plugin-transform-runtime/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-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" }, @@ -2294,9 +2311,8 @@ }, "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" @@ -2310,9 +2326,8 @@ }, "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" }, @@ -2324,12 +2339,12 @@ } }, "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==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz", + "integrity": "sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -2339,12 +2354,12 @@ } }, "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==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.26.7.tgz", + "integrity": "sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -2355,9 +2370,8 @@ }, "node_modules/@babel/plugin-transform-typescript": { "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz", - "integrity": "sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-create-class-features-plugin": "^7.23.6", @@ -2373,9 +2387,8 @@ }, "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" }, @@ -2388,9 +2401,8 @@ }, "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" @@ -2404,9 +2416,8 @@ }, "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" @@ -2420,9 +2431,8 @@ }, "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" @@ -2435,14 +2445,14 @@ } }, "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==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz", + "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/compat-data": "^7.26.8", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-plugin-utils": "^7.26.5", "@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", @@ -2454,9 +2464,9 @@ "@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-generator-functions": "^7.26.8", "@babel/plugin-transform-async-to-generator": "^7.25.9", - "@babel/plugin-transform-block-scoped-functions": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.26.5", "@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", @@ -2467,21 +2477,21 @@ "@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-exponentiation-operator": "^7.26.3", "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-for-of": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.26.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-commonjs": "^7.26.3", "@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-nullish-coalescing-operator": "^7.26.6", "@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", @@ -2497,17 +2507,17 @@ "@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-template-literals": "^7.26.8", + "@babel/plugin-transform-typeof-symbol": "^7.26.7", "@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-corejs3": "^0.11.0", "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.38.1", + "core-js-compat": "^3.40.0", "semver": "^6.3.1" }, "engines": { @@ -2517,20 +2527,31 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.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", @@ -2542,9 +2563,8 @@ }, "node_modules/@babel/preset-typescript": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", - "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-option": "^7.22.15", @@ -2560,9 +2580,9 @@ } }, "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==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.9.tgz", + "integrity": "sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -2572,30 +2592,30 @@ } }, "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==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", + "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", + "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", + "@babel/generator": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2603,26 +2623,10 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/types": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", + "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.25.9", @@ -2634,15 +2638,19 @@ }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@bufbuild/protobuf": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.2.3.tgz", + "integrity": "sha512-tFQoXHJdkEOSwj5tRIZSPNUuXK3RaR7T1nUrPgbYX1pUbvqqaaZAsfo+NXBPsz5rZMSKVFrgK1WL8Q/MSLvprg==", "dev": true }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "devOptional": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -2652,18 +2660,17 @@ }, "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "devOptional": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "node_modules/@cypress/request": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.1.tgz", - "integrity": "sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.7.tgz", + "integrity": "sha512-LzxlLEMbBOPYB85uXrDqvD4MgcenjRBLIns3zyhx7vTPj/0u2eQhzXvPiGcaJrV38Q9dbkExWp6cOHPJ+EtFYg==", "dev": true, "dependencies": { "aws-sign2": "~0.7.0", @@ -2672,16 +2679,16 @@ "combined-stream": "~1.0.6", "extend": "~3.0.2", "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "http-signature": "~1.3.6", + "form-data": "~4.0.0", + "http-signature": "~1.4.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "performance-now": "^2.1.0", - "qs": "6.10.4", + "qs": "6.13.1", "safe-buffer": "^5.1.2", - "tough-cookie": "^4.1.3", + "tough-cookie": "^5.0.0", "tunnel-agent": "^0.6.0", "uuid": "^8.3.2" }, @@ -2689,33 +2696,31 @@ "node": ">= 6" } }, - "node_modules/@cypress/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "node_modules/@cypress/request/node_modules/qs": { + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.1.tgz", + "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==", "dev": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "side-channel": "^1.0.6" }, "engines": { - "node": ">= 0.12" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@cypress/request/node_modules/qs": { - "version": "6.10.4", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz", - "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==", + "node_modules/@cypress/request/node_modules/tough-cookie": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "tldts": "^6.1.32" }, "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=16" } }, "node_modules/@cypress/request/node_modules/uuid": { @@ -2729,24 +2734,21 @@ }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" } }, "node_modules/@electric-sql/pglite": { "version": "0.2.16", - "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.2.16.tgz", - "integrity": "sha512-dCSHpoOKuTxecaYhWDRp2yFTN3XWcMPMrBVl5yOR8VZEUprz4+R3iuU7BipmlsqBnBDO/6l9H/C2ZwJdunkWyw==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/@emnapi/core": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.3.1.tgz", - "integrity": "sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==", "dev": true, + "license": "MIT", "dependencies": { "@emnapi/wasi-threads": "1.0.1", "tslib": "^2.4.0" @@ -2754,26 +2756,24 @@ }, "node_modules/@emnapi/runtime": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", - "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.4.0" } }, "node_modules/@emnapi/wasi-threads": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.1.tgz", - "integrity": "sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.4.0" } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", - "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", + "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", "cpu": [ "ppc64" ], @@ -2787,9 +2787,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", - "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz", + "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", "cpu": [ "arm" ], @@ -2803,9 +2803,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", - "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", + "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", "cpu": [ "arm64" ], @@ -2819,9 +2819,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", - "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz", + "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", "cpu": [ "x64" ], @@ -2835,9 +2835,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", - "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", + "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==", "cpu": [ "arm64" ], @@ -2851,9 +2851,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", - "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", + "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", "cpu": [ "x64" ], @@ -2867,9 +2867,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", - "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", + "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", "cpu": [ "arm64" ], @@ -2883,9 +2883,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", - "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", + "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", "cpu": [ "x64" ], @@ -2899,9 +2899,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", - "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", + "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", "cpu": [ "arm" ], @@ -2915,9 +2915,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", - "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", + "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", "cpu": [ "arm64" ], @@ -2931,9 +2931,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", - "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", + "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", "cpu": [ "ia32" ], @@ -2947,9 +2947,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", - "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", + "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", "cpu": [ "loong64" ], @@ -2963,9 +2963,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", - "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", + "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", "cpu": [ "mips64el" ], @@ -2979,9 +2979,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", - "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", + "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", "cpu": [ "ppc64" ], @@ -2995,9 +2995,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", - "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", + "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", "cpu": [ "riscv64" ], @@ -3011,9 +3011,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", - "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", + "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", "cpu": [ "s390x" ], @@ -3027,9 +3027,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", - "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", + "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", "cpu": [ "x64" ], @@ -3042,10 +3042,26 @@ "node": ">=18" } }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", + "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", - "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", + "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", "cpu": [ "x64" ], @@ -3059,9 +3075,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", - "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", + "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", "cpu": [ "arm64" ], @@ -3075,9 +3091,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", - "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", + "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", "cpu": [ "x64" ], @@ -3091,9 +3107,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", - "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", + "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", "cpu": [ "x64" ], @@ -3107,9 +3123,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", - "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", + "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", "cpu": [ "arm64" ], @@ -3123,9 +3139,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", - "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", + "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", "cpu": [ "ia32" ], @@ -3139,9 +3155,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", - "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", + "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", "cpu": [ "x64" ], @@ -3156,9 +3172,8 @@ }, "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, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.3.0" }, @@ -3171,18 +3186,16 @@ }, "node_modules/@eslint-community/regexpp": { "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, + "license": "MIT", "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, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -3203,9 +3216,8 @@ }, "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, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -3219,9 +3231,8 @@ }, "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, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3229,9 +3240,8 @@ }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -3244,15 +3254,13 @@ }, "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 + "dev": true, + "license": "MIT" }, "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, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3262,9 +3270,8 @@ }, "node_modules/@eslint/eslintrc/node_modules/type-fest": { "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -3274,17 +3281,14 @@ }, "node_modules/@eslint/js": { "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@faker-js/faker": { "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.4.1.tgz", - "integrity": "sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==", "dev": true, "funding": [ { @@ -3292,6 +3296,7 @@ "url": "https://opencollective.com/fakerjs" } ], + "license": "MIT", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0", "npm": ">=6.14.13" @@ -3299,9 +3304,8 @@ }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^2.0.2", "debug": "^4.3.1", @@ -3313,9 +3317,8 @@ }, "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, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3323,9 +3326,8 @@ }, "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, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3335,9 +3337,8 @@ }, "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, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -3348,19 +3349,18 @@ }, "node_modules/@humanwhocodes/object-schema": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@inquirer/checkbox": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.2.tgz", - "integrity": "sha512-+gznPl8ip8P8HYHYecDtUtdsh1t2jvb+sWCD72GAiZ9m45RqwrLmReDaqdC0umQfamtFXVRoMVJ2/qINKGm9Tg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.2.tgz", + "integrity": "sha512-PL9ixC5YsPXzXhAZFUPmkXGxfgjkdfZdPEPPmt4kFwQ4LBMDG9n/nHXYRGGZSKZJs+d1sGKWgS2GiPzVRKUdtQ==", "dev": true, "dependencies": { - "@inquirer/core": "^10.1.0", - "@inquirer/figures": "^1.0.8", - "@inquirer/type": "^3.0.1", + "@inquirer/core": "^10.1.7", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, @@ -3369,49 +3369,64 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/confirm": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.0.2.tgz", - "integrity": "sha512-KJLUHOaKnNCYzwVbryj3TNBxyZIrr56fR5N45v6K9IPrbT6B7DcudBMfylkV1A8PUdJE15mybkEQyp2/ZUpxUA==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.6.tgz", + "integrity": "sha512-6ZXYK3M1XmaVBZX6FCfChgtponnL0R6I7k8Nu+kaoNkT828FVZTcca1MqmWQipaW2oNREQl5AaPCUOOCVNdRMw==", "dev": true, "dependencies": { - "@inquirer/core": "^10.1.0", - "@inquirer/type": "^3.0.1" + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/core": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.0.tgz", - "integrity": "sha512-I+ETk2AL+yAVbvuKx5AJpQmoaWhpiTFOg/UJb7ZkMAK4blmtG8ATh5ct+T/8xNld0CZG/2UhtkdMwpgvld92XQ==", + "version": "10.1.7", "dev": true, + "license": "MIT", "dependencies": { - "@inquirer/figures": "^1.0.8", - "@inquirer/type": "^3.0.1", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "cli-width": "^4.1.0", "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", - "strip-ansi": "^6.0.1", "wrap-ansi": "^6.2.0", "yoctocolors-cjs": "^2.1.2" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/core/node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, + "license": "ISC", "engines": { "node": ">=14" }, @@ -3420,13 +3435,13 @@ } }, "node_modules/@inquirer/editor": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.1.0.tgz", - "integrity": "sha512-K1gGWsxEqO23tVdp5MT3H799OZ4ER1za7Dlc8F4um0W7lwSv0KGR/YyrUEyimj0g7dXZd8XknM/5QA2/Uy+TbA==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.7.tgz", + "integrity": "sha512-gktCSQtnSZHaBytkJKMKEuswSk2cDBuXX5rxGFv306mwHfBPjg5UAldw9zWGoEyvA9KpRDkeM4jfrx0rXn0GyA==", "dev": true, "dependencies": { - "@inquirer/core": "^10.1.0", - "@inquirer/type": "^3.0.1", + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4", "external-editor": "^3.1.0" }, "engines": { @@ -3434,16 +3449,21 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/expand": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.2.tgz", - "integrity": "sha512-WdgCX1cUtinz+syKyZdJomovULYlKUWZbVYZzhf+ZeeYf4htAQ3jLymoNs3koIAKfZZl3HUBb819ClCBfyznaw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.9.tgz", + "integrity": "sha512-Xxt6nhomWTAmuSX61kVgglLjMEFGa+7+F6UUtdEUeg7fg4r9vaFttUUKrtkViYYrQBA5Ia1tkOJj2koP9BuLig==", "dev": true, "dependencies": { - "@inquirer/core": "^10.1.0", - "@inquirer/type": "^3.0.1", + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -3451,57 +3471,71 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/figures": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.8.tgz", - "integrity": "sha512-tKd+jsmhq21AP1LhexC0pPwsCxEhGgAkg28byjJAd+xhmIs8LUX8JbUc3vBf3PhLxWiB5EvyBE5X7JSPAqMAqg==", + "version": "1.0.10", "dev": true, + "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/@inquirer/input": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.0.2.tgz", - "integrity": "sha512-yCLCraigU085EcdpIVEDgyfGv4vBiE4I+k1qRkc9C5dMjWF42ADMGy1RFU94+eZlz4YlkmFsiyHZy0W1wdhaNg==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.6.tgz", + "integrity": "sha512-1f5AIsZuVjPT4ecA8AwaxDFNHny/tSershP/cTvTDxLdiIGTeILNcKozB0LaYt6mojJLUbOYhpIxicaYf7UKIQ==", "dev": true, "dependencies": { - "@inquirer/core": "^10.1.0", - "@inquirer/type": "^3.0.1" + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/number": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.2.tgz", - "integrity": "sha512-MKQhYofdUNk7eqJtz52KvM1dH6R93OMrqHduXCvuefKrsiMjHiMwjc3NZw5Imm2nqY7gWd9xdhYrtcHMJQZUxA==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.9.tgz", + "integrity": "sha512-iN2xZvH3tyIYXLXBvlVh0npk1q/aVuKXZo5hj+K3W3D4ngAEq/DkLpofRzx6oebTUhBvOgryZ+rMV0yImKnG3w==", "dev": true, "dependencies": { - "@inquirer/core": "^10.1.0", - "@inquirer/type": "^3.0.1" + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/password": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.2.tgz", - "integrity": "sha512-tQXGSu7IO07gsYlGy3VgXRVsbOWqFBMbqAUrJSc1PDTQQ5Qdm+QVwkP0OC0jnUZ62D19iPgXOMO+tnWG+HhjNQ==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.9.tgz", + "integrity": "sha512-xBEoOw1XKb0rIN208YU7wM7oJEHhIYkfG7LpTJAEW913GZeaoQerzf5U/LSHI45EVvjAdgNXmXgH51cUXKZcJQ==", "dev": true, "dependencies": { - "@inquirer/core": "^10.1.0", - "@inquirer/type": "^3.0.1", + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2" }, "engines": { @@ -3509,40 +3543,50 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/prompts": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.1.0.tgz", - "integrity": "sha512-5U/XiVRH2pp1X6gpNAjWOglMf38/Ys522ncEHIKT1voRUvSj/DQnR22OVxHnwu5S+rCFaUiPQ57JOtMFQayqYA==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.3.2.tgz", + "integrity": "sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ==", "dev": true, "dependencies": { - "@inquirer/checkbox": "^4.0.2", - "@inquirer/confirm": "^5.0.2", - "@inquirer/editor": "^4.1.0", - "@inquirer/expand": "^4.0.2", - "@inquirer/input": "^4.0.2", - "@inquirer/number": "^3.0.2", - "@inquirer/password": "^4.0.2", - "@inquirer/rawlist": "^4.0.2", - "@inquirer/search": "^3.0.2", - "@inquirer/select": "^4.0.2" + "@inquirer/checkbox": "^4.1.2", + "@inquirer/confirm": "^5.1.6", + "@inquirer/editor": "^4.2.7", + "@inquirer/expand": "^4.0.9", + "@inquirer/input": "^4.1.6", + "@inquirer/number": "^3.0.9", + "@inquirer/password": "^4.0.9", + "@inquirer/rawlist": "^4.0.9", + "@inquirer/search": "^3.0.9", + "@inquirer/select": "^4.0.9" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/rawlist": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.2.tgz", - "integrity": "sha512-3XGcskMoVF8H0Dl1S5TSZ3rMPPBWXRcM0VeNVsS4ByWeWjSeb0lPqfnBg6N7T0608I1B2bSVnbi2cwCrmOD1Yw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.9.tgz", + "integrity": "sha512-+5t6ebehKqgoxV8fXwE49HkSF2Rc9ijNiVGEQZwvbMI61/Q5RcD+jWD6Gs1tKdz5lkI8GRBL31iO0HjGK1bv+A==", "dev": true, "dependencies": { - "@inquirer/core": "^10.1.0", - "@inquirer/type": "^3.0.1", + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -3550,17 +3594,22 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/search": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.2.tgz", - "integrity": "sha512-Zv4FC7w4dJ13BOJfKRQCICQfShinGjb1bCEIHxTSnjj2telu3+3RHwHubPG9HyD4aix5s+lyAMEK/wSFD75HLA==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.9.tgz", + "integrity": "sha512-DWmKztkYo9CvldGBaRMr0ETUHgR86zE6sPDVOHsqz4ISe9o1LuiWfgJk+2r75acFclA93J/lqzhT0dTjCzHuoA==", "dev": true, "dependencies": { - "@inquirer/core": "^10.1.0", - "@inquirer/figures": "^1.0.8", - "@inquirer/type": "^3.0.1", + "@inquirer/core": "^10.1.7", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -3568,17 +3617,22 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/select": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.2.tgz", - "integrity": "sha512-uSWUzaSYAEj0hlzxa1mUB6VqrKaYx0QxGBLZzU4xWFxaSyGaXxsSE4OSOwdU24j0xl8OajgayqFXW0l2bkl2kg==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.9.tgz", + "integrity": "sha512-BpJyJe7Dkhv2kz7yG7bPSbJLQuu/rqyNlF1CfiiFeFwouegfH+zh13KDyt6+d9DwucKo7hqM3wKLLyJxZMO+Xg==", "dev": true, "dependencies": { - "@inquirer/core": "^10.1.0", - "@inquirer/figures": "^1.0.8", - "@inquirer/type": "^3.0.1", + "@inquirer/core": "^10.1.7", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, @@ -3587,24 +3641,32 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/type": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.1.tgz", - "integrity": "sha512-+ksJMIy92sOAiAccGpcKZUc3bYO07cADnscIxHBknEm3uNts3movSmBofc1908BNy5edKscxYeAdaX1NXkHS6A==", + "version": "3.0.4", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": 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==", + "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -3619,8 +3681,7 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -3630,8 +3691,7 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -3641,13 +3701,11 @@ }, "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==" + "license": "MIT" }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -3662,8 +3720,7 @@ }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -3676,8 +3733,7 @@ }, "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==", + "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -3692,9 +3748,8 @@ }, "node_modules/@isaacs/fs-minipass": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^7.0.4" }, @@ -3704,9 +3759,8 @@ }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, + "license": "ISC", "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -3720,18 +3774,16 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -3742,23 +3794,20 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@jercle/yargonaut": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@jercle/yargonaut/-/yargonaut-1.1.5.tgz", - "integrity": "sha512-zBp2myVvBHp1UaJsNTyS6q4UDKT7eRiqTS4oNTS6VQMd6mpxYOdbeK4pY279cDCdakGy6hG0J3ejoXZVsPwHqw==", + "license": "Apache-2.0", "dependencies": { "chalk": "^4.1.2", "figlet": "^1.5.2", @@ -3767,8 +3816,7 @@ }, "node_modules/@jercle/yargonaut/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -3782,9 +3830,8 @@ }, "node_modules/@jest/console": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -3799,9 +3846,8 @@ }, "node_modules/@jest/console/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -3815,9 +3861,8 @@ }, "node_modules/@jest/core": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/reporters": "^29.7.0", @@ -3862,9 +3907,8 @@ }, "node_modules/@jest/core/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -3878,9 +3922,8 @@ }, "node_modules/@jest/environment": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", @@ -3893,9 +3936,8 @@ }, "node_modules/@jest/expect": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, + "license": "MIT", "dependencies": { "expect": "^29.7.0", "jest-snapshot": "^29.7.0" @@ -3906,9 +3948,8 @@ }, "node_modules/@jest/expect-utils": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, + "license": "MIT", "dependencies": { "jest-get-type": "^29.6.3" }, @@ -3918,9 +3959,8 @@ }, "node_modules/@jest/fake-timers": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", @@ -3935,9 +3975,8 @@ }, "node_modules/@jest/globals": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -3950,9 +3989,8 @@ }, "node_modules/@jest/reporters": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, + "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^29.7.0", @@ -3993,9 +4031,8 @@ }, "node_modules/@jest/reporters/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4009,9 +4046,8 @@ }, "node_modules/@jest/schemas": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, + "license": "MIT", "dependencies": { "@sinclair/typebox": "^0.27.8" }, @@ -4021,9 +4057,8 @@ }, "node_modules/@jest/source-map": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", @@ -4035,9 +4070,8 @@ }, "node_modules/@jest/test-result": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, + "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", @@ -4050,9 +4084,8 @@ }, "node_modules/@jest/test-sequencer": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", @@ -4065,9 +4098,8 @@ }, "node_modules/@jest/transform": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -4091,9 +4123,8 @@ }, "node_modules/@jest/transform/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4107,15 +4138,13 @@ }, "node_modules/@jest/transform/node_modules/convert-source-map": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@jest/types": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", @@ -4130,9 +4159,8 @@ }, "node_modules/@jest/types/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4146,9 +4174,8 @@ }, "node_modules/@jorgebodega/typeorm-factory": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@jorgebodega/typeorm-factory/-/typeorm-factory-1.4.0.tgz", - "integrity": "sha512-c02QHz1FcR8w4Tzv2Ibf2SvxF4LYlna0DktNT9kfMFkMajcbP94KBN4EBpP4ECU/0baY1pflzhFhphlGErUamA==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "2.4.1" }, @@ -4161,15 +4188,13 @@ }, "node_modules/@jorgebodega/typeorm-factory/node_modules/tslib": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true + "dev": true, + "license": "0BSD" }, "node_modules/@jorgebodega/typeorm-seeding": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@jorgebodega/typeorm-seeding/-/typeorm-seeding-6.0.1.tgz", - "integrity": "sha512-vmjomtkMvOlwKeJtGSVb68519TCGKfENCSKE6zxMvr9GTZ+4XiLvIcp6tM5Irl10Pji9dNHPrXdh9HfTvm18aw==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "4.1.2", "commander": "9.4.1", @@ -4189,9 +4214,8 @@ }, "node_modules/@jorgebodega/typeorm-seeding/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4205,18 +4229,16 @@ }, "node_modules/@jorgebodega/typeorm-seeding/node_modules/commander": { "version": "9.4.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", - "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || >=14" } }, "node_modules/@jorgebodega/typeorm-seeding/node_modules/glob": { "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4233,9 +4255,8 @@ }, "node_modules/@jorgebodega/typeorm-seeding/node_modules/minimatch": { "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -4245,15 +4266,13 @@ }, "node_modules/@jorgebodega/typeorm-seeding/node_modules/tslib": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true + "dev": true, + "license": "0BSD" }, "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", @@ -4265,18 +4284,16 @@ }, "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==", "devOptional": true, + "license": "MIT", "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" } @@ -4293,15 +4310,13 @@ }, "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==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "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, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -4309,9 +4324,8 @@ }, "node_modules/@jsonjoy.com/base64": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10.0" }, @@ -4325,9 +4339,8 @@ }, "node_modules/@jsonjoy.com/json-pack": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.1.0.tgz", - "integrity": "sha512-zlQONA+msXPPwHWZMKFVS78ewFczIll5lXiVPwFPCZUsrOKdxc2AvxU1HoNBmMRhqDZUR9HkC3UOm+6pME6Xsg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/base64": "^1.1.1", "@jsonjoy.com/util": "^1.1.2", @@ -4347,9 +4360,8 @@ }, "node_modules/@jsonjoy.com/util": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.5.0.tgz", - "integrity": "sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10.0" }, @@ -4363,15 +4375,13 @@ }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@listr2/prompt-adapter-inquirer": { "version": "2.0.18", - "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.18.tgz", - "integrity": "sha512-0hz44rAcrphyXcA8IS7EJ2SCoaBZD2u5goE8S/e+q/DL+dOGpqpcLidVOFeLG3VgML62SXmfRLAhWt0zL1oW4Q==", "dev": true, + "license": "MIT", "dependencies": { "@inquirer/type": "^1.5.5" }, @@ -4384,9 +4394,8 @@ }, "node_modules/@listr2/prompt-adapter-inquirer/node_modules/@inquirer/type": { "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", - "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", "dev": true, + "license": "MIT", "dependencies": { "mute-stream": "^1.0.0" }, @@ -4396,17 +4405,16 @@ }, "node_modules/@listr2/prompt-adapter-inquirer/node_modules/mute-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", "dev": true, + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.1.5.tgz", - "integrity": "sha512-ue5PSOzHMCIYrfvPP/MRS6hsKKLzqqhcdAvJCO8uFlDdj598EhgnacuOTuqA6uBK5rgiZXfDWyb7DVZSiBKxBA==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.2.6.tgz", + "integrity": "sha512-yF/ih9EJJZc72psFQbwnn8mExIWfTnzWJg+N02hnpXtDPETYLmQswIMBn7+V88lfCaFrMozJsUvcEQIkEPU0Gg==", "cpu": [ "arm64" ], @@ -4417,9 +4425,9 @@ ] }, "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.1.5.tgz", - "integrity": "sha512-CGhsb0R5vE6mMNCoSfxHFD8QTvBHM51gs4DBeigTYHWnYv2V5YpJkC4rMo5qAAFifuUcc0+a8a3SIU0c9NrfNw==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.2.6.tgz", + "integrity": "sha512-5BbCumsFLbCi586Bb1lTWQFkekdQUw8/t8cy++Uq251cl3hbDIGEwD9HAwh8H6IS2F6QA9KdKmO136LmipRNkg==", "cpu": [ "x64" ], @@ -4430,9 +4438,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.1.5.tgz", - "integrity": "sha512-3WeW328DN+xB5PZdhSWmqE+t3+44xWXEbqQ+caWJEZfOFdLp9yklBZEbVqVdqzznkoaXJYxTCp996KD6HmANeg==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.2.6.tgz", + "integrity": "sha512-+6XgLpMb7HBoWxXj+bLbiiB4s0mRRcDPElnRS3LpWRzdYSe+gFk5MT/4RrVNqd2MESUDmb53NUXw1+BP69bjiQ==", "cpu": [ "arm" ], @@ -4443,9 +4451,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.1.5.tgz", - "integrity": "sha512-LAjaoOcBHGj6fiYB8ureiqPoph4eygbXu4vcOF+hsxiY74n8ilA7rJMmGUT0K0JOB5lmRQHSmor3mytRjS4qeQ==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.2.6.tgz", + "integrity": "sha512-l5VmJamJ3nyMmeD1ANBQCQqy7do1ESaJQfKPSm2IG9/ADZryptTyCj8N6QaYgIWewqNUrcbdMkJajRQAt5Qjfg==", "cpu": [ "arm64" ], @@ -4456,9 +4464,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.1.5.tgz", - "integrity": "sha512-k/IklElP70qdCXOQixclSl2GPLFiopynGoKX1FqDd1/H0E3Fo1oPwjY2rEVu+0nS3AOw1sryStdXk8CW3cVIsw==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.2.6.tgz", + "integrity": "sha512-nDYT8qN9si5+onHYYaI4DiauDMx24OAiuZAUsEqrDy+ja/3EbpXPX/VAkMV8AEaQhy3xc4dRC+KcYIvOFefJ4Q==", "cpu": [ "x64" ], @@ -4469,9 +4477,9 @@ ] }, "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.1.5.tgz", - "integrity": "sha512-KYar6W8nraZfSJspcK7Kp7hdj238X/FNauYbZyrqPBrtsXI1hvI4/KcRcRGP50aQoV7fkKDyJERlrQGMGTZUsA==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.2.6.tgz", + "integrity": "sha512-XlqVtILonQnG+9fH2N3Aytria7P/1fwDgDhl29rde96uH2sLB8CHORIf2PfuLVzFQJ7Uqp8py9AYwr3ZUCFfWg==", "cpu": [ "x64" ], @@ -4483,21 +4491,18 @@ }, "node_modules/@lukeed/csprng": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", - "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@microsoft/tsdoc": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.0.tgz", - "integrity": "sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA==" + "version": "0.15.1", + "license": "MIT" }, "node_modules/@mikro-orm/cli": { "version": "6.4.3", - "resolved": "https://registry.npmjs.org/@mikro-orm/cli/-/cli-6.4.3.tgz", - "integrity": "sha512-DWnYNxoyMgU6L90TGBlT0eziTu6yl15ArnnFoq0kyOjp8JEMRjin+8cizSrKyQ3QiQZ5iop5fB0i9Sp+Hbgd8Q==", + "license": "MIT", "dependencies": { "@jercle/yargonaut": "1.1.5", "@mikro-orm/core": "6.4.3", @@ -4516,8 +4521,7 @@ }, "node_modules/@mikro-orm/cli/node_modules/fs-extra": { "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -4529,8 +4533,7 @@ }, "node_modules/@mikro-orm/core": { "version": "6.4.3", - "resolved": "https://registry.npmjs.org/@mikro-orm/core/-/core-6.4.3.tgz", - "integrity": "sha512-UTaqKs1bomYtGmEEZ8sNBOmW2OqT5NcMh+pBV2iJ6WLM5MuiIEuNhDMuvvPE5gNEwUzc1HyRhUV87bRDhDIGRg==", + "license": "MIT", "dependencies": { "dataloader": "2.2.3", "dotenv": "16.4.7", @@ -4549,8 +4552,7 @@ }, "node_modules/@mikro-orm/core/node_modules/fs-extra": { "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -4562,13 +4564,11 @@ }, "node_modules/@mikro-orm/core/node_modules/reflect-metadata": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==" + "license": "Apache-2.0" }, "node_modules/@mikro-orm/knex": { "version": "6.4.3", - "resolved": "https://registry.npmjs.org/@mikro-orm/knex/-/knex-6.4.3.tgz", - "integrity": "sha512-gVkRD/cIn6qxk/P9nR+IufZxJwuCCdv0AtcGvShxXXvaoIrQPJYDV7HRxBOHCEyNygr6M3Fqpph1oPoT6aezTQ==", + "license": "MIT", "dependencies": { "fs-extra": "11.2.0", "knex": "3.1.0", @@ -4597,8 +4597,7 @@ }, "node_modules/@mikro-orm/knex/node_modules/fs-extra": { "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -4610,8 +4609,7 @@ }, "node_modules/@mikro-orm/migrations": { "version": "6.4.3", - "resolved": "https://registry.npmjs.org/@mikro-orm/migrations/-/migrations-6.4.3.tgz", - "integrity": "sha512-VrsKq95esUBEMhwp9vVX+YUj2+/cNwb8UZ63HfgaqPo+pYj8r1RBSTboFOE9V0Md0n3ol9b5xByfPPa3qHmL0g==", + "license": "MIT", "dependencies": { "@mikro-orm/knex": "6.4.3", "fs-extra": "11.2.0", @@ -4626,8 +4624,7 @@ }, "node_modules/@mikro-orm/migrations/node_modules/fs-extra": { "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -4639,8 +4636,7 @@ }, "node_modules/@mikro-orm/mysql": { "version": "6.4.3", - "resolved": "https://registry.npmjs.org/@mikro-orm/mysql/-/mysql-6.4.3.tgz", - "integrity": "sha512-ZkrrzOWE9ouifU331q70K9BfAOD9SFRiNLNnECnzVrvDPWnthMV0ahGium9HyHpG4nev0Ybg6vnvq9IQzW1brg==", + "license": "MIT", "dependencies": { "@mikro-orm/knex": "6.4.3", "mysql2": "3.12.0" @@ -4653,22 +4649,20 @@ } }, "node_modules/@mikro-orm/nestjs": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@mikro-orm/nestjs/-/nestjs-6.0.2.tgz", - "integrity": "sha512-3bUBnJ0HwwIjsNPb0n7dfTWayqA5iSLHv/zM9juyBADSpJB2oBAd96QlUqDvNi/RckSg0m+ifLVT0Uw8e0+POg==", + "version": "6.1.1", + "license": "MIT", "engines": { "node": ">= 18.12.0" }, "peerDependencies": { - "@mikro-orm/core": "^6.0.0 || ^6.0.0-dev.0", - "@nestjs/common": "^10.0.0", - "@nestjs/core": "^10.0.0" + "@mikro-orm/core": "^6.0.0 || ^6.0.0-dev.0 || ^7.0.0-dev.0", + "@nestjs/common": "^10.0.0 || ^11.0.5", + "@nestjs/core": "^10.0.0 || ^11.0.5" } }, "node_modules/@mikro-orm/postgresql": { "version": "6.4.3", - "resolved": "https://registry.npmjs.org/@mikro-orm/postgresql/-/postgresql-6.4.3.tgz", - "integrity": "sha512-3cGi1gW6ME3SyuRRiJmSBtzHFa6Kavy6bK9rsSAAfXz+Pso6UBsqvesATbruKxDF7/CLdQlIY3CZZHXksUIrQg==", + "license": "MIT", "dependencies": { "@mikro-orm/knex": "6.4.3", "pg": "8.13.1", @@ -4685,8 +4679,7 @@ }, "node_modules/@mikro-orm/postgresql/node_modules/pg": { "version": "8.13.1", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.13.1.tgz", - "integrity": "sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ==", + "license": "MIT", "dependencies": { "pg-connection-string": "^2.7.0", "pg-pool": "^3.7.0", @@ -4711,37 +4704,32 @@ }, "node_modules/@mikro-orm/postgresql/node_modules/pg-connection-string": { "version": "2.7.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.7.0.tgz", - "integrity": "sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==" + "license": "MIT" }, "node_modules/@mikro-orm/postgresql/node_modules/postgres-array": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-3.0.2.tgz", - "integrity": "sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==", + "license": "MIT", "engines": { "node": ">=12" } }, "node_modules/@mikro-orm/postgresql/node_modules/postgres-date": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-2.1.0.tgz", - "integrity": "sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==", + "license": "MIT", "engines": { "node": ">=12" } }, "node_modules/@mikro-orm/postgresql/node_modules/postgres-interval": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-4.0.2.tgz", - "integrity": "sha512-EMsphSQ1YkQqKZL2cuG0zHkmjCCzQqQ71l2GXITqRwjhRleCdv00bDk/ktaSi0LnlaPzAc3535KTrjXsTdtx7A==", + "license": "MIT", "engines": { "node": ">=12" } }, "node_modules/@mikro-orm/sql-highlighter": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@mikro-orm/sql-highlighter/-/sql-highlighter-1.0.1.tgz", - "integrity": "sha512-iO+FwRNuqNDVlIo5zfgOu2mMGVicX/FqzP+F/A0xpJLHyqvWyXzVwntgAMimBjQaxiX9Rpmc0u3Jq6/A6V6JQA==", + "license": "MIT", "dependencies": { "ansi-colors": "^4.1.1" }, @@ -4750,24 +4738,24 @@ } }, "node_modules/@module-federation/bridge-react-webpack-plugin": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.7.6.tgz", - "integrity": "sha512-eD1JZDQ+h5WLdA58MmAE1DzLwvFaGJeeam3Tswc/sEUb4QGT86X4Fme+dMTBRYRoAq/tRYql3DlVTFhdmrUVzg==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.9.1.tgz", + "integrity": "sha512-znN/Qm6M0U1t3iF10gu1hSxDkk18yz78yvk+AMB34UDzpXHiC1zbpIeV2CQNV5GCeafmCICmcn9y1qh7F54KTg==", "dev": true, "dependencies": { - "@module-federation/sdk": "0.7.6", + "@module-federation/sdk": "0.9.1", "@types/semver": "7.5.8", "semver": "7.6.3" } }, "node_modules/@module-federation/data-prefetch": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.7.6.tgz", - "integrity": "sha512-AMpfnuIAK/Y5M682BUsnc13ARCEKhEvb0tXF4S+l7jfL08oE9gyo+G/nk0LIzZBO2mLDz5g2AydAERanM6gswQ==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.9.1.tgz", + "integrity": "sha512-rS1AsgRvIMAWK8oMprEBF0YQ3WvsqnumjinvAZU1Dqut5DICmpQMTPEO1OrAKyjO+PQgEhmq13HggzN6ebGLrQ==", "dev": true, "dependencies": { - "@module-federation/runtime": "0.7.6", - "@module-federation/sdk": "0.7.6", + "@module-federation/runtime": "0.9.1", + "@module-federation/sdk": "0.9.1", "fs-extra": "9.1.0" }, "peerDependencies": { @@ -4776,22 +4764,22 @@ } }, "node_modules/@module-federation/dts-plugin": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.7.6.tgz", - "integrity": "sha512-K8T8+Ip+fCQkTOxAQbAW47drphN36+WcvcOusn/fsIT+1exdhyvqxSCj8V7MLCtjA9kGDi0jHIGN6MN4p2cV0Q==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.9.1.tgz", + "integrity": "sha512-DezBrFaIKfDcEY7UhqyO1WbYocERYsR/CDN8AV6OvMnRlQ8u0rgM8qBUJwx0s+K59f+CFQFKEN4C8p7naCiHrw==", "dev": true, "dependencies": { - "@module-federation/error-codes": "0.7.6", - "@module-federation/managers": "0.7.6", - "@module-federation/sdk": "0.7.6", - "@module-federation/third-party-dts-extractor": "0.7.6", + "@module-federation/error-codes": "0.9.1", + "@module-federation/managers": "0.9.1", + "@module-federation/sdk": "0.9.1", + "@module-federation/third-party-dts-extractor": "0.9.1", "adm-zip": "^0.5.10", "ansi-colors": "^4.1.3", "axios": "^1.7.4", "chalk": "3.0.0", "fs-extra": "9.1.0", "isomorphic-ws": "5.0.0", - "koa": "2.15.3", + "koa": "2.15.4", "lodash.clonedeepwith": "4.5.0", "log4js": "6.9.1", "node-schedule": "2.1.1", @@ -4808,41 +4796,22 @@ } } }, - "node_modules/@module-federation/dts-plugin/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/@module-federation/enhanced": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.7.6.tgz", - "integrity": "sha512-ivTVuRKhew/25fiblAW22RybYzyacQsvnQG3y9zSNsYbwcj+0u7THWMmsK8vNKxDUpjxuQulCK07BEycDjoB5Q==", - "dev": true, - "dependencies": { - "@module-federation/bridge-react-webpack-plugin": "0.7.6", - "@module-federation/data-prefetch": "0.7.6", - "@module-federation/dts-plugin": "0.7.6", - "@module-federation/managers": "0.7.6", - "@module-federation/manifest": "0.7.6", - "@module-federation/rspack": "0.7.6", - "@module-federation/runtime-tools": "0.7.6", - "@module-federation/sdk": "0.7.6", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.9.1.tgz", + "integrity": "sha512-c9siKVjcgT2gtDdOTqEr+GaP2X/PWAS0OV424ljKLstFL1lcS/BIsxWFDmxPPl5hDByAH+1q4YhC1LWY4LNDQw==", + "dev": true, + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "0.9.1", + "@module-federation/data-prefetch": "0.9.1", + "@module-federation/dts-plugin": "0.9.1", + "@module-federation/error-codes": "0.9.1", + "@module-federation/inject-external-runtime-core-plugin": "0.9.1", + "@module-federation/managers": "0.9.1", + "@module-federation/manifest": "0.9.1", + "@module-federation/rspack": "0.9.1", + "@module-federation/runtime-tools": "0.9.1", + "@module-federation/sdk": "0.9.1", "btoa": "^1.2.1", "upath": "2.0.1" }, @@ -4864,45 +4833,54 @@ } }, "node_modules/@module-federation/error-codes": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.7.6.tgz", - "integrity": "sha512-XVzX/sRFj1h5JvOOVMoFppxq0t1t3o/AlEICHgWX+dybIwJgz9g4gihZOWVZfz5/xsKGcUwdH5X7Z2nkuYhJEw==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.9.1.tgz", + "integrity": "sha512-q8spCvlwUzW42iX1irnlBTcwcZftRNHyGdlaoFO1z/fW4iphnBIfijzkigWQzOMhdPgzqN/up7XN+g5hjBGBtw==", "dev": true }, + "node_modules/@module-federation/inject-external-runtime-core-plugin": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-0.9.1.tgz", + "integrity": "sha512-BPfzu1cqDU5BhM493enVF1VfxJWmruen0ktlHrWdJJlcddhZzyFBGaLAGoGc+83fS75aEllvJTEthw4kMViMQQ==", + "dev": true, + "peerDependencies": { + "@module-federation/runtime-tools": "0.9.1" + } + }, "node_modules/@module-federation/managers": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.7.6.tgz", - "integrity": "sha512-NW0LJ6TL13oN004D9e50EalcGZyTYHHgyaeKOc90Omb/HMeHxjyhHx7wl1TLRwVN2E5Rk+IO0JrwgrdlNMfAzg==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.9.1.tgz", + "integrity": "sha512-8hpIrvGfiODxS1qelTd7eaLRVF7jrp17RWgeH1DWoprxELANxm5IVvqUryB+7j+BhoQzamog9DL5q4MuNfGgIA==", "dev": true, "dependencies": { - "@module-federation/sdk": "0.7.6", + "@module-federation/sdk": "0.9.1", "find-pkg": "2.0.0", "fs-extra": "9.1.0" } }, "node_modules/@module-federation/manifest": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.7.6.tgz", - "integrity": "sha512-xBrFwLjDMUjKRnp+P4X29ZNyhgXSsp+SfrBxVsKJpEESOHalDoNClbo6gXvZAvkBZyo9sY3SJhAwduDwNkg04w==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.9.1.tgz", + "integrity": "sha512-+GteKBXrAUkq49i2CSyWZXM4vYa+mEVXxR9Du71R55nXXxgbzAIoZj9gxjRunj9pcE8+YpAOyfHxLEdWngxWdg==", "dev": true, "dependencies": { - "@module-federation/dts-plugin": "0.7.6", - "@module-federation/managers": "0.7.6", - "@module-federation/sdk": "0.7.6", + "@module-federation/dts-plugin": "0.9.1", + "@module-federation/managers": "0.9.1", + "@module-federation/sdk": "0.9.1", "chalk": "3.0.0", "find-pkg": "2.0.0" } }, "node_modules/@module-federation/node": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/@module-federation/node/-/node-2.6.11.tgz", - "integrity": "sha512-ytCNML9Q9dQ7Xi/pTYp4Y+yP/YUiFyyCa8BEKnSt5Ipiqtu4QMxj46EkOIgvLv0nSlK+xOVgAzqtXLI89SfhCg==", + "version": "2.6.28", + "resolved": "https://registry.npmjs.org/@module-federation/node/-/node-2.6.28.tgz", + "integrity": "sha512-0N0vb4wRRvbKXWQUIWcurvBYHXzkzV8M1yzhhQzeYAVGyfGMmx/WRXPLTld6rEk1iymRuhyC7gYNcA1TnXDb6w==", "dev": true, "dependencies": { - "@module-federation/enhanced": "0.7.6", - "@module-federation/runtime": "0.7.6", - "@module-federation/sdk": "0.7.6", - "@module-federation/utilities": "3.1.29", + "@module-federation/enhanced": "0.10.0", + "@module-federation/runtime": "0.10.0", + "@module-federation/sdk": "0.10.0", + "@module-federation/utilities": "3.1.46", "btoa": "1.2.1", "encoding": "^0.1.13", "node-fetch": "2.7.0" @@ -4924,20 +4902,242 @@ } } }, + "node_modules/@module-federation/node/node_modules/@module-federation/bridge-react-webpack-plugin": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.10.0.tgz", + "integrity": "sha512-wvqsjqqVXNI36Q98zFFK4saBFH3M+kJC9c/UZfGIWC86kBVRgWDOKphP4nF+cpjJsFEexoGCNefUswqsx14Y1Q==", + "dev": true, + "dependencies": { + "@module-federation/sdk": "0.10.0", + "@types/semver": "7.5.8", + "semver": "7.6.3" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/data-prefetch": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.10.0.tgz", + "integrity": "sha512-aXomkuNNTNhJmU9TQALvvRbf8NlDkPd3Q3iGJ817qAwnHIXAQ3x9nRtWqhAIovQra3R7i3u3KI1hIe0ivTIrNg==", + "dev": true, + "dependencies": { + "@module-federation/runtime": "0.10.0", + "@module-federation/sdk": "0.10.0", + "fs-extra": "9.1.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/dts-plugin": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.10.0.tgz", + "integrity": "sha512-RP5Rv0dhU2OovcMKjnMIoi6ybcS2vftT/v5Ia5qCHIyl3YtvbqS1Eo4C59sKEfnYUkGYMFZxjPhKNZjKVfrATg==", + "dev": true, + "dependencies": { + "@module-federation/error-codes": "0.10.0", + "@module-federation/managers": "0.10.0", + "@module-federation/sdk": "0.10.0", + "@module-federation/third-party-dts-extractor": "0.10.0", + "adm-zip": "^0.5.10", + "ansi-colors": "^4.1.3", + "axios": "^1.7.4", + "chalk": "3.0.0", + "fs-extra": "9.1.0", + "isomorphic-ws": "5.0.0", + "koa": "2.15.4", + "lodash.clonedeepwith": "4.5.0", + "log4js": "6.9.1", + "node-schedule": "2.1.1", + "rambda": "^9.1.0", + "ws": "8.18.0" + }, + "peerDependencies": { + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24" + }, + "peerDependenciesMeta": { + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/enhanced": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.10.0.tgz", + "integrity": "sha512-JN6LXGM2mu17JaXJMRZVSwbsxnBDO+6vz2VcQAwnlAQkBn2dvTwBBj0YyCYaO6BzNWjiYtGF8TEu5NAVhAxxLQ==", + "dev": true, + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "0.10.0", + "@module-federation/data-prefetch": "0.10.0", + "@module-federation/dts-plugin": "0.10.0", + "@module-federation/error-codes": "0.10.0", + "@module-federation/inject-external-runtime-core-plugin": "0.10.0", + "@module-federation/managers": "0.10.0", + "@module-federation/manifest": "0.10.0", + "@module-federation/rspack": "0.10.0", + "@module-federation/runtime-tools": "0.10.0", + "@module-federation/sdk": "0.10.0", + "btoa": "^1.2.1", + "upath": "2.0.1" + }, + "peerDependencies": { + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue-tsc": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/error-codes": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.10.0.tgz", + "integrity": "sha512-DfLcssfcCG0gXW2GY8v1ZCa7u0oSwtRnrk1gCjL+SfQxvpCL4S9RgYdl6me3vKOjirttCp289MVa1IHF7wu8qg==", + "dev": true + }, + "node_modules/@module-federation/node/node_modules/@module-federation/inject-external-runtime-core-plugin": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-0.10.0.tgz", + "integrity": "sha512-+Da+uvnexREenBDISIuwEj0dC9ZjLFkMM06xxUBJ7ahvq0rk0/11XVBO2G4oo2ceqQQpUex0BzRWKSZ7ys8IFQ==", + "dev": true, + "peerDependencies": { + "@module-federation/runtime-tools": "0.10.0" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/managers": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.10.0.tgz", + "integrity": "sha512-k+AM7Cg9mwlfSo4KPK04oSxXWwv9EHWOMgOJnrb77r5ZBGQoBE6cwrICJGfppiIZGyY7z2k1RvYuy/1DK1PXDA==", + "dev": true, + "dependencies": { + "@module-federation/sdk": "0.10.0", + "find-pkg": "2.0.0", + "fs-extra": "9.1.0" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/manifest": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.10.0.tgz", + "integrity": "sha512-XdZqYb5hQCzZhJPbgfXM9VDgDKLqZmHKpQrsYFeK5MTOJX6EmpHSCCZs8vcnf9DXUy9flxtjwBzDeHgASQnpJQ==", + "dev": true, + "dependencies": { + "@module-federation/dts-plugin": "0.10.0", + "@module-federation/managers": "0.10.0", + "@module-federation/sdk": "0.10.0", + "chalk": "3.0.0", + "find-pkg": "2.0.0" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/rspack": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.10.0.tgz", + "integrity": "sha512-qLbQbPVVOhpmehfGjsnJBdSQqqsLhbEcCMnKG+/e5FZma0I+J716wo70WaXyGk2GsCLe4O0yJOm3kvKygKwR+A==", + "dev": true, + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "0.10.0", + "@module-federation/dts-plugin": "0.10.0", + "@module-federation/inject-external-runtime-core-plugin": "0.10.0", + "@module-federation/managers": "0.10.0", + "@module-federation/manifest": "0.10.0", + "@module-federation/runtime-tools": "0.10.0", + "@module-federation/sdk": "0.10.0" + }, + "peerDependencies": { + "@rspack/core": ">=0.7", + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/runtime": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.10.0.tgz", + "integrity": "sha512-qO09AAuiVhYzHXeZiNd04oPb/I6O2/voW/GrSHvQQ2/CterakKHXq27xfFcmlKMY0TnxQNpIV0dQq2vWUEjeRw==", + "dev": true, + "dependencies": { + "@module-federation/error-codes": "0.10.0", + "@module-federation/runtime-core": "0.10.0", + "@module-federation/sdk": "0.10.0" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/runtime-core": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.10.0.tgz", + "integrity": "sha512-eIQoJ302ZNVcz3B5OfRCg2+CykK6+tKtLzyyN1hRaK8rzhuEj9UpNugshPeGWw+G+n0mtYmE7oydKGKWnkqgFA==", + "dev": true, + "dependencies": { + "@module-federation/error-codes": "0.10.0", + "@module-federation/sdk": "0.10.0" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/runtime-tools": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.10.0.tgz", + "integrity": "sha512-RB0lfWFlhgjnAeGD+Mn1xrg7X91QSAtsC39cR/nwhb0InNB/ZSK8naP3/O/V6lz6Za9GPNpoXa06NOexdn0tOg==", + "dev": true, + "dependencies": { + "@module-federation/runtime": "0.10.0", + "@module-federation/webpack-bundler-runtime": "0.10.0" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/sdk": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.10.0.tgz", + "integrity": "sha512-enS4rKLSsoLCB6RxmRgcIdPRiRLgk94qtT2x0CKYhsqz3OJmHVkD0c6Pt5dMgSyLd+1Uo83d9rI492YqzuxO6Q==", + "dev": true + }, + "node_modules/@module-federation/node/node_modules/@module-federation/third-party-dts-extractor": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.10.0.tgz", + "integrity": "sha512-QEsCm24F3M6rWwoD0IYB/15DzQvqfbdwzGxAc0BsZ2iD/t//Pz8MQ4w+U0nizFto94i8T1gQBYP4nfPcfWUpjg==", + "dev": true, + "dependencies": { + "find-pkg": "2.0.0", + "fs-extra": "9.1.0", + "resolve": "1.22.8" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/webpack-bundler-runtime": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.10.0.tgz", + "integrity": "sha512-ArgG3qaB99JkfJ6+EfH/Omgq01FB/tnJZrkw//rFfXpPMCXO7vo9ZURrbT2YPZGGrjDsT9PCdPKfPmUPKnTaqw==", + "dev": true, + "dependencies": { + "@module-federation/runtime": "0.10.0", + "@module-federation/sdk": "0.10.0" + } + }, "node_modules/@module-federation/rspack": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.7.6.tgz", - "integrity": "sha512-alfX85C+2AQLXGrtpa08ImwhHIGwFIkJ/6i/XhxpYL5iFu0mC0xRIJPJUw0tiBWdFpP4p+Ykij3hP3FqfvaiKg==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.9.1.tgz", + "integrity": "sha512-ZJqG75dWHhyTMa9I0YPJEV2XRt0MFxnDiuMOpI92esdmwWY633CBKyNh1XxcLd629YVeTv03+whr+Fz/f91JEw==", "dev": true, "dependencies": { - "@module-federation/bridge-react-webpack-plugin": "0.7.6", - "@module-federation/dts-plugin": "0.7.6", - "@module-federation/managers": "0.7.6", - "@module-federation/manifest": "0.7.6", - "@module-federation/runtime-tools": "0.7.6", - "@module-federation/sdk": "0.7.6" + "@module-federation/bridge-react-webpack-plugin": "0.9.1", + "@module-federation/dts-plugin": "0.9.1", + "@module-federation/inject-external-runtime-core-plugin": "0.9.1", + "@module-federation/managers": "0.9.1", + "@module-federation/manifest": "0.9.1", + "@module-federation/runtime-tools": "0.9.1", + "@module-federation/sdk": "0.9.1" }, "peerDependencies": { + "@rspack/core": ">=0.7", "typescript": "^4.9.0 || ^5.0.0", "vue-tsc": ">=1.0.24" }, @@ -4951,38 +5151,46 @@ } }, "node_modules/@module-federation/runtime": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.7.6.tgz", - "integrity": "sha512-TEEDbGwaohZ2dMa+Sk/Igq8XpcyfjqJfbL20mdAZeifSFVZYRSCaTd/xIXP7pEw8+5BaCMc4YfCf/XcjFAUrVA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.9.1.tgz", + "integrity": "sha512-jp7K06weabM5BF5sruHr/VLyalO+cilvRDy7vdEBqq88O9mjc0RserD8J+AP4WTl3ZzU7/GRqwRsiwjjN913dA==", "dev": true, "dependencies": { - "@module-federation/error-codes": "0.7.6", - "@module-federation/sdk": "0.7.6" + "@module-federation/error-codes": "0.9.1", + "@module-federation/runtime-core": "0.9.1", + "@module-federation/sdk": "0.9.1" } }, - "node_modules/@module-federation/runtime-tools": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.7.6.tgz", - "integrity": "sha512-SvokF6gn2sNrTEPG51H0LrowHnf3iNfznO2PzKpxAhZOBdb1pm0wJPwWSMHYrjMdDpjr7bzaqAywnkHdA6lqeQ==", + "node_modules/@module-federation/runtime-core": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.9.1.tgz", + "integrity": "sha512-r61ufhKt5pjl81v7TkmhzeIoSPOaNtLynW6+aCy3KZMa3RfRevFxmygJqv4Nug1L0NhqUeWtdLejh4VIglNy5Q==", "dev": true, "dependencies": { - "@module-federation/runtime": "0.7.6", - "@module-federation/webpack-bundler-runtime": "0.7.6" + "@module-federation/error-codes": "0.9.1", + "@module-federation/sdk": "0.9.1" } }, - "node_modules/@module-federation/sdk": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.7.6.tgz", - "integrity": "sha512-MFE+RtsHnutZOCp2eKpa3A/yzZ8tOPmjX7QRdVnB2qqR9JA2SH3ZP5+cYq76tzFQZvU1BCWAQVNMvqGOW2yVZQ==", + "node_modules/@module-federation/runtime-tools": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.9.1.tgz", + "integrity": "sha512-JQZ//ab+lEXoU2DHAH+JtYASGzxEjXB0s4rU+6VJXc8c+oUPxH3kWIwzjdncg2mcWBmC1140DCk+K+kDfOZ5CQ==", "dev": true, "dependencies": { - "isomorphic-rslog": "0.0.6" + "@module-federation/runtime": "0.9.1", + "@module-federation/webpack-bundler-runtime": "0.9.1" } }, + "node_modules/@module-federation/sdk": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.9.1.tgz", + "integrity": "sha512-YQonPTImgnCqZjE/A+3N2g3J5ypR6kx1tbBzc9toUANKr/dw/S63qlh/zHKzWQzxjjNNVMdXRtTMp07g3kgEWg==", + "dev": true + }, "node_modules/@module-federation/third-party-dts-extractor": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.7.6.tgz", - "integrity": "sha512-JME76/rgr41AKXG6kUTQXdQJiMCypN3qHOgPv4VuIag10UdLo/0gdeN6PYronvYmvPOQMfYev80GcEwl4l531A==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.9.1.tgz", + "integrity": "sha512-KeIByP718hHyq+Mc53enZ419pZZ1fh9Ns6+/bYLkc3iCoJr/EDBeiLzkbMwh2AS4Qk57WW0yNC82xzf7r0Zrrw==", "dev": true, "dependencies": { "find-pkg": "2.0.0", @@ -4991,12 +5199,12 @@ } }, "node_modules/@module-federation/utilities": { - "version": "3.1.29", - "resolved": "https://registry.npmjs.org/@module-federation/utilities/-/utilities-3.1.29.tgz", - "integrity": "sha512-yhHOgm3mkZBvQzT4HoBJAVhGIa7Nfhpd4Zdc11g0vYEMapU6lfN5HHipUFdj6bLUzHhDyrY6CaF3syqTuabAfQ==", + "version": "3.1.46", + "resolved": "https://registry.npmjs.org/@module-federation/utilities/-/utilities-3.1.46.tgz", + "integrity": "sha512-m0J5TirDzJfOjiDnn5YrcTLEPjOwc7MI2q4DNxc41YOXoSyochwSJLy6PBMkdbCwlUHE2aNhFn6zgHtvGYpsmQ==", "dev": true, "dependencies": { - "@module-federation/sdk": "0.7.6" + "@module-federation/sdk": "0.10.0" }, "peerDependencies": { "react": "^16 || ^17 || ^18", @@ -5015,14 +5223,20 @@ } } }, + "node_modules/@module-federation/utilities/node_modules/@module-federation/sdk": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.10.0.tgz", + "integrity": "sha512-enS4rKLSsoLCB6RxmRgcIdPRiRLgk94qtT2x0CKYhsqz3OJmHVkD0c6Pt5dMgSyLd+1Uo83d9rI492YqzuxO6Q==", + "dev": true + }, "node_modules/@module-federation/webpack-bundler-runtime": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.7.6.tgz", - "integrity": "sha512-kB9hQ0BfwNAcQWGskDEOxYP2z2bB/1ABXKr8MDomCFl2mbW3vvfYMQrb8UhJmJvE3rbGI/iXhJUdgBLNREnjUg==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.9.1.tgz", + "integrity": "sha512-CxySX01gT8cBowKl9xZh+voiHvThMZ471icasWnlDIZb14KasZoX1eCh9wpGvwoOdIk9rIRT7h70UvW9nmop6w==", "dev": true, "dependencies": { - "@module-federation/runtime": "0.7.6", - "@module-federation/sdk": "0.7.6" + "@module-federation/runtime": "0.9.1", + "@module-federation/sdk": "0.9.1" } }, "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { @@ -5105,9 +5319,8 @@ }, "node_modules/@napi-rs/nice": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.0.1.tgz", - "integrity": "sha512-zM0mVWSXE0a0h9aKACLwKmD6nHcRiKrPpCfvaKqG1CqDEyjEawId0ocXxVzPMCAm6kkWr2P025msfxXEnt8UGQ==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">= 10" @@ -5135,46 +5348,13 @@ "@napi-rs/nice-win32-x64-msvc": "1.0.1" } }, - "node_modules/@napi-rs/nice-android-arm-eabi": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.0.1.tgz", - "integrity": "sha512-5qpvOu5IGwDo7MEKVqqyAxF90I6aLj4n07OzpARdgDRfz8UbBztTByBp0RC59r3J1Ij8uzYi6jI7r5Lws7nn6w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-android-arm64": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.0.1.tgz", - "integrity": "sha512-GqvXL0P8fZ+mQqG1g0o4AO9hJjQaeYG84FRfZaYjyJtZZZcMjXW5TwkL8Y8UApheJgyE13TQ4YNUssQaTgTyvA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@napi-rs/nice-darwin-arm64": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.0.1.tgz", - "integrity": "sha512-91k3HEqUl2fsrz/sKkuEkscj6EAj3/eZNCLqzD2AA0TtVbkQi8nqxZCZDMkfklULmxLkMxuUdKe7RvG/T6s2AA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -5183,232 +5363,22 @@ "node": ">= 10" } }, - "node_modules/@napi-rs/nice-darwin-x64": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.0.1.tgz", - "integrity": "sha512-jXnMleYSIR/+TAN/p5u+NkCA7yidgswx5ftqzXdD5wgy/hNR92oerTXHc0jrlBisbd7DpzoaGY4cFD7Sm5GlgQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-freebsd-x64": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.0.1.tgz", - "integrity": "sha512-j+iJ/ezONXRQsVIB/FJfwjeQXX7A2tf3gEXs4WUGFrJjpe/z2KB7sOv6zpkm08PofF36C9S7wTNuzHZ/Iiccfw==", - "cpu": [ - "x64" - ], + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.4", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-arm-gnueabihf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.0.1.tgz", - "integrity": "sha512-G8RgJ8FYXYkkSGQwywAUh84m946UTn6l03/vmEXBYNJxQJcD+I3B3k5jmjFG/OPiU8DfvxutOP8bi+F89MCV7Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-arm64-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.0.1.tgz", - "integrity": "sha512-IMDak59/W5JSab1oZvmNbrms3mHqcreaCeClUjwlwDr0m3BoR09ZiN8cKFBzuSlXgRdZ4PNqCYNeGQv7YMTjuA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-arm64-musl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.0.1.tgz", - "integrity": "sha512-wG8fa2VKuWM4CfjOjjRX9YLIbysSVV1S3Kgm2Fnc67ap/soHBeYZa6AGMeR5BJAylYRjnoVOzV19Cmkco3QEPw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-ppc64-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.0.1.tgz", - "integrity": "sha512-lxQ9WrBf0IlNTCA9oS2jg/iAjQyTI6JHzABV664LLrLA/SIdD+I1i3Mjf7TsnoUbgopBcCuDztVLfJ0q9ubf6Q==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-riscv64-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.0.1.tgz", - "integrity": "sha512-3xs69dO8WSWBb13KBVex+yvxmUeEsdWexxibqskzoKaWx9AIqkMbWmE2npkazJoopPKX2ULKd8Fm9veEn0g4Ig==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-s390x-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.0.1.tgz", - "integrity": "sha512-lMFI3i9rlW7hgToyAzTaEybQYGbQHDrpRkg+1gJWEpH0PLAQoZ8jiY0IzakLfNWnVda1eTYYlxxFYzW8Rqczkg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-x64-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.0.1.tgz", - "integrity": "sha512-XQAJs7DRN2GpLN6Fb+ZdGFeYZDdGl2Fn3TmFlqEL5JorgWKrQGRUrpGKbgZ25UeZPILuTKJ+OowG2avN8mThBA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-x64-musl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.0.1.tgz", - "integrity": "sha512-/rodHpRSgiI9o1faq9SZOp/o2QkKQg7T+DK0R5AkbnI/YxvAIEHf2cngjYzLMQSQgUhxym+LFr+UGZx4vK4QdQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-win32-arm64-msvc": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.0.1.tgz", - "integrity": "sha512-rEcz9vZymaCB3OqEXoHnp9YViLct8ugF+6uO5McifTedjq4QMQs3DHz35xBEGhH3gJWEsXMUbzazkz5KNM5YUg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-win32-ia32-msvc": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.0.1.tgz", - "integrity": "sha512-t7eBAyPUrWL8su3gDxw9xxxqNwZzAqKo0Szv3IjVQd1GpXXVkb6vBBQUuxfIYaXMzZLwlxRQ7uzM2vdUE9ULGw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-win32-x64-msvc": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.0.1.tgz", - "integrity": "sha512-JlF+uDcatt3St2ntBG8H02F1mM45i5SF9W+bIKiReVE6wiy3o16oBP/yxt+RZ+N6LbCImJXJ6bXNO2kn9AXicg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", - "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", - "dev": true, - "dependencies": { - "@emnapi/core": "^1.1.0", - "@emnapi/runtime": "^1.1.0", - "@tybys/wasm-util": "^0.9.0" + "license": "MIT", + "dependencies": { + "@emnapi/core": "^1.1.0", + "@emnapi/runtime": "^1.1.0", + "@tybys/wasm-util": "^0.9.0" } }, "node_modules/@nestjs/common": { - "version": "10.3.3", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.3.3.tgz", - "integrity": "sha512-LAkTe8/CF0uNWM0ecuDwUNTHCi1lVSITmmR4FQ6Ftz1E7ujQCnJ5pMRzd8JRN14vdBkxZZ8VbVF0BDUKoKNxMQ==", + "version": "11.0.10", + "license": "MIT", "dependencies": { "iterare": "1.2.1", - "tslib": "2.6.2", + "tslib": "2.8.1", "uid": "2.0.2" }, "funding": { @@ -5431,27 +5401,29 @@ } }, "node_modules/@nestjs/core": { - "version": "10.3.3", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-10.3.3.tgz", - "integrity": "sha512-kxJWggQAPX3RuZx9JVec69eSLaYLNIox2emkZJpfBJ5Qq7cAq7edQIt1r4LGjTKq6kFubNTPsqhWf5y7yFRBPw==", + "version": "11.0.10", "hasInstallScript": true, + "license": "MIT", "dependencies": { - "@nuxtjs/opencollective": "0.3.2", + "@nuxt/opencollective": "0.4.1", "fast-safe-stringify": "2.1.1", "iterare": "1.2.1", - "path-to-regexp": "3.2.0", - "tslib": "2.6.2", + "path-to-regexp": "8.2.0", + "tslib": "2.8.1", "uid": "2.0.2" }, + "engines": { + "node": ">= 20" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/nest" }, "peerDependencies": { - "@nestjs/common": "^10.0.0", - "@nestjs/microservices": "^10.0.0", - "@nestjs/platform-express": "^10.0.0", - "@nestjs/websockets": "^10.0.0", + "@nestjs/common": "^11.0.0", + "@nestjs/microservices": "^11.0.0", + "@nestjs/platform-express": "^11.0.0", + "@nestjs/websockets": "^11.0.0", "reflect-metadata": "^0.1.12 || ^0.2.0", "rxjs": "^7.1.0" }, @@ -5468,11 +5440,10 @@ } }, "node_modules/@nestjs/mapped-types": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.0.5.tgz", - "integrity": "sha512-bSJv4pd6EY99NX9CjBIyn4TVDoSit82DUZlL4I3bqNfy5Gt+gXTa86i3I/i0iIV9P4hntcGM5GyO+FhZAhxtyg==", + "version": "2.1.0", + "license": "MIT", "peerDependencies": { - "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", + "@nestjs/common": "^10.0.0 || ^11.0.0", "class-transformer": "^0.4.0 || ^0.5.0", "class-validator": "^0.13.0 || ^0.14.0", "reflect-metadata": "^0.1.12 || ^0.2.0" @@ -5487,228 +5458,402 @@ } }, "node_modules/@nestjs/platform-express": { - "version": "10.3.3", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-10.3.3.tgz", - "integrity": "sha512-GGKSEU48Os7nYFIsUM0nutuFUGn5AbeP8gzFBiBCAtiuJWrXZXpZ58pMBYxAbMf7IrcOZFInHEukjHGAQU0OZw==", + "version": "11.0.10", + "license": "MIT", "dependencies": { - "body-parser": "1.20.2", "cors": "2.8.5", - "express": "4.18.2", - "multer": "1.4.4-lts.1", - "tslib": "2.6.2" + "express": "5.0.1", + "multer": "1.4.5-lts.1", + "path-to-regexp": "8.2.0", + "tslib": "2.8.1" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/nest" }, "peerDependencies": { - "@nestjs/common": "^10.0.0", - "@nestjs/core": "^10.0.0" + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0" } }, - "node_modules/@nestjs/platform-socket.io": { - "version": "10.3.7", - "resolved": "https://registry.npmjs.org/@nestjs/platform-socket.io/-/platform-socket.io-10.3.7.tgz", - "integrity": "sha512-T9VbVgEUnbid/RiywN9/8YQ8pAGDP++0nX73l4kIWeDWkz5DEh4aLB7O/JvLA3/xRHdjTZ4RiRZazwqSWi1Sog==", + "node_modules/@nestjs/platform-express/node_modules/accepts": { + "version": "2.0.0", + "license": "MIT", "dependencies": { - "socket.io": "4.7.5", - "tslib": "2.6.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" }, - "peerDependencies": { - "@nestjs/common": "^10.0.0", - "@nestjs/websockets": "^10.0.0", - "rxjs": "^7.1.0" + "engines": { + "node": ">= 0.6" } }, - "node_modules/@nestjs/platform-ws": { - "version": "10.3.7", - "resolved": "https://registry.npmjs.org/@nestjs/platform-ws/-/platform-ws-10.3.7.tgz", - "integrity": "sha512-lOvZ8u5UdL0FgAOdWosDXefVgDikPd4j5el81emkx+H0pFsysfHXSSoSvMLQijdhENqHSl3buRhO5n3M3uia1w==", + "node_modules/@nestjs/platform-express/node_modules/content-disposition": { + "version": "1.0.0", + "license": "MIT", "dependencies": { - "tslib": "2.6.2", - "ws": "8.16.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" + "safe-buffer": "5.2.1" }, - "peerDependencies": { - "@nestjs/common": "^10.0.0", - "@nestjs/websockets": "^10.0.0", - "rxjs": "^7.1.0" + "engines": { + "node": ">= 0.6" } }, - "node_modules/@nestjs/schematics": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-10.1.1.tgz", - "integrity": "sha512-o4lfCnEeIkfJhGBbLZxTuVWcGuqDCFwg5OrvpgRUBM7vI/vONvKKiB5riVNpO+JqXoH0I42NNeDb0m4V5RREig==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "17.1.2", - "@angular-devkit/schematics": "17.1.2", - "comment-json": "4.2.3", - "jsonc-parser": "3.2.1", - "pluralize": "8.0.0" - }, - "peerDependencies": { - "typescript": ">=4.8.2" + "node_modules/@nestjs/platform-express/node_modules/cookie-signature": { + "version": "1.2.2", + "license": "MIT", + "engines": { + "node": ">=6.6.0" } }, - "node_modules/@nestjs/schematics/node_modules/@angular-devkit/core": { - "version": "17.1.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.1.2.tgz", - "integrity": "sha512-ku+/W/HMCBacSWFppenr9y6Lx8mDuTuQvn1IkTyBLiJOpWnzgVbx9kHDeaDchGa1PwLlJUBBrv27t3qgJOIDPw==", - "dev": true, + "node_modules/@nestjs/platform-express/node_modules/debug": { + "version": "4.3.6", + "license": "MIT", "dependencies": { - "ajv": "8.12.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.0", - "picomatch": "3.0.1", - "rxjs": "7.8.1", - "source-map": "0.7.4" + "ms": "2.1.2" }, "engines": { - "node": "^18.13.0 || >=20.9.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^3.5.2" + "node": ">=6.0" }, "peerDependenciesMeta": { - "chokidar": { + "supports-color": { "optional": true } } }, - "node_modules/@nestjs/schematics/node_modules/@angular-devkit/core/node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "node_modules/@nestjs/schematics/node_modules/@angular-devkit/schematics": { - "version": "17.1.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.1.2.tgz", - "integrity": "sha512-8S9RuM8olFN/gwN+mjbuF1CwHX61f0i59EGXz9tXLnKRUTjsRR+8vVMTAmX0dvVAT5fJTG/T69X+HX7FeumdqA==", - "dev": true, + "node_modules/@nestjs/platform-express/node_modules/express": { + "version": "5.0.1", + "license": "MIT", "dependencies": { - "@angular-devkit/core": "17.1.2", - "jsonc-parser": "3.2.0", - "magic-string": "0.30.5", - "ora": "5.4.1", - "rxjs": "7.8.1" + "accepts": "^2.0.0", + "body-parser": "^2.0.1", + "content-disposition": "^1.0.0", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "^1.2.1", + "debug": "4.3.6", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "^2.0.0", + "fresh": "2.0.0", + "http-errors": "2.0.0", + "merge-descriptors": "^2.0.0", + "methods": "~1.1.2", + "mime-types": "^3.0.0", + "on-finished": "2.4.1", + "once": "1.4.0", + "parseurl": "~1.3.3", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "router": "^2.0.0", + "safe-buffer": "5.2.1", + "send": "^1.1.0", + "serve-static": "^2.1.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "^2.0.0", + "utils-merge": "1.0.1", + "vary": "~1.1.2" }, "engines": { - "node": "^18.13.0 || >=20.9.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "node": ">= 18" } }, - "node_modules/@nestjs/schematics/node_modules/@angular-devkit/schematics/node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "node_modules/@nestjs/schematics/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "node_modules/@nestjs/platform-express/node_modules/finalhandler": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 0.8" + } + }, + "node_modules/@nestjs/platform-express/node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/@nestjs/platform-express/node_modules/finalhandler/node_modules/encodeurl": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@nestjs/platform-express/node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/@nestjs/platform-express/node_modules/fresh": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@nestjs/platform-express/node_modules/media-typer": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@nestjs/platform-express/node_modules/merge-descriptors": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=18" }, "funding": { - "url": "https://paulmillr.com/funding/" + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nestjs/platform-express/node_modules/mime-db": { + "version": "1.53.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nestjs/platform-express/node_modules/mime-types": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "mime-db": "^1.53.0" }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "engines": { + "node": ">= 0.6" } }, - "node_modules/@nestjs/schematics/node_modules/magic-string": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", - "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", - "dev": true, + "node_modules/@nestjs/platform-express/node_modules/negotiator": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nestjs/platform-express/node_modules/send": { + "version": "1.1.0", + "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" + "debug": "^4.3.5", + "destroy": "^1.2.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^0.5.2", + "http-errors": "^2.0.0", + "mime-types": "^2.1.35", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" }, "engines": { - "node": ">=12" + "node": ">= 18" } }, - "node_modules/@nestjs/schematics/node_modules/picomatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", - "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", - "dev": true, + "node_modules/@nestjs/platform-express/node_modules/send/node_modules/fresh": { + "version": "0.5.2", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 0.6" + } + }, + "node_modules/@nestjs/platform-express/node_modules/send/node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nestjs/platform-express/node_modules/send/node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nestjs/platform-express/node_modules/send/node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/@nestjs/platform-express/node_modules/serve-static": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nestjs/platform-express/node_modules/type-is": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nestjs/platform-socket.io": { + "version": "11.0.10", + "license": "MIT", + "dependencies": { + "socket.io": "4.8.1", + "tslib": "2.8.1" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^11.0.0", + "@nestjs/websockets": "^11.0.0", + "rxjs": "^7.1.0" } }, - "node_modules/@nestjs/schematics/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/@nestjs/platform-ws": { + "version": "11.0.10", + "license": "MIT", + "dependencies": { + "tslib": "2.8.1", + "ws": "8.18.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^11.0.0", + "@nestjs/websockets": "^11.0.0", + "rxjs": "^7.1.0" + } + }, + "node_modules/@nestjs/schematics": { + "version": "11.0.1", "dev": true, - "optional": true, - "peer": true, + "license": "MIT", "dependencies": { - "picomatch": "^2.2.1" + "@angular-devkit/core": "19.1.7", + "@angular-devkit/schematics": "19.1.7", + "comment-json": "4.2.5", + "jsonc-parser": "3.3.1", + "pluralize": "8.0.0" + }, + "peerDependencies": { + "typescript": ">=4.8.2" + } + }, + "node_modules/@nestjs/schematics/node_modules/@angular-devkit/core": { + "version": "19.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", + "rxjs": "7.8.1", + "source-map": "0.7.4" }, "engines": { - "node": ">=8.10.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } } }, - "node_modules/@nestjs/schematics/node_modules/readdirp/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/@nestjs/schematics/node_modules/@angular-devkit/schematics": { + "version": "19.1.7", "dev": true, - "optional": true, - "peer": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "19.1.7", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, "engines": { - "node": ">=8.6" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@nestjs/schematics/node_modules/ajv": { + "version": "8.17.1", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@nestjs/schematics/node_modules/ajv-formats": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, "node_modules/@nestjs/swagger": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-7.4.2.tgz", - "integrity": "sha512-Mu6TEn1M/owIvAx2B4DUQObQXqo2028R2s9rSZ/hJEgBK95+doTwS0DjmVA2wTeZTyVtXOoN7CsoM5pONBzvKQ==", + "version": "11.0.4", + "license": "MIT", "dependencies": { - "@microsoft/tsdoc": "^0.15.0", - "@nestjs/mapped-types": "2.0.5", + "@microsoft/tsdoc": "0.15.1", + "@nestjs/mapped-types": "2.1.0", "js-yaml": "4.1.0", "lodash": "4.17.21", - "path-to-regexp": "3.3.0", - "swagger-ui-dist": "5.17.14" + "path-to-regexp": "8.2.0", + "swagger-ui-dist": "5.19.0" }, "peerDependencies": { - "@fastify/static": "^6.0.0 || ^7.0.0", - "@nestjs/common": "^9.0.0 || ^10.0.0", - "@nestjs/core": "^9.0.0 || ^10.0.0", + "@fastify/static": "^8.0.0", + "@nestjs/common": "^11.0.1", + "@nestjs/core": "^11.0.1", "class-transformer": "*", "class-validator": "*", "reflect-metadata": "^0.1.12 || ^0.2.0" @@ -5725,28 +5870,22 @@ } } }, - "node_modules/@nestjs/swagger/node_modules/path-to-regexp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", - "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==" - }, "node_modules/@nestjs/testing": { - "version": "10.3.3", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.3.3.tgz", - "integrity": "sha512-kX20GfjAImL5grd/i69uD/x7sc00BaqGcP2dRG3ilqshQUuy5DOmspLCr3a2C8xmVU7kzK4spT0oTxhe6WcCAA==", + "version": "11.0.10", "dev": true, + "license": "MIT", "dependencies": { - "tslib": "2.6.2" + "tslib": "2.8.1" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/nest" }, "peerDependencies": { - "@nestjs/common": "^10.0.0", - "@nestjs/core": "^10.0.0", - "@nestjs/microservices": "^10.0.0", - "@nestjs/platform-express": "^10.0.0" + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0", + "@nestjs/microservices": "^11.0.0", + "@nestjs/platform-express": "^11.0.0" }, "peerDependenciesMeta": { "@nestjs/microservices": { @@ -5758,45 +5897,28 @@ } }, "node_modules/@nestjs/typeorm": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-10.0.2.tgz", - "integrity": "sha512-H738bJyydK4SQkRCTeh1aFBxoO1E9xdL/HaLGThwrqN95os5mEyAtK7BLADOS+vldP4jDZ2VQPLj4epWwRqCeQ==", - "dependencies": { - "uuid": "9.0.1" - }, + "version": "11.0.0", + "license": "MIT", "peerDependencies": { - "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", - "@nestjs/core": "^8.0.0 || ^9.0.0 || ^10.0.0", + "@nestjs/common": "^10.0.0 || ^11.0.0", + "@nestjs/core": "^10.0.0 || ^11.0.0", "reflect-metadata": "^0.1.13 || ^0.2.0", "rxjs": "^7.2.0", "typeorm": "^0.3.0" } }, - "node_modules/@nestjs/typeorm/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/@nestjs/websockets": { - "version": "10.3.7", - "resolved": "https://registry.npmjs.org/@nestjs/websockets/-/websockets-10.3.7.tgz", - "integrity": "sha512-iYdsWiRNPUy0XzPoW44bx2MW1griuraTr5fNhoe2rUSNO0mEW1aeXp4v56KeZDLAss31WbeckC5P3N223Fys5g==", + "version": "11.0.10", + "license": "MIT", "dependencies": { "iterare": "1.2.1", "object-hash": "3.0.0", - "tslib": "2.6.2" + "tslib": "2.8.1" }, "peerDependencies": { - "@nestjs/common": "^10.0.0", - "@nestjs/core": "^10.0.0", - "@nestjs/platform-socket.io": "^10.0.0", + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0", + "@nestjs/platform-socket.io": "^11.0.0", "reflect-metadata": "^0.1.12 || ^0.2.0", "rxjs": "^7.1.0" }, @@ -5808,16 +5930,15 @@ }, "node_modules/@nestjs/websockets/node_modules/object-hash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/@ngtools/webpack": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.0.4.tgz", - "integrity": "sha512-N3WCbQz5ipdAZoSWHNf81RLET6+isq35+GZu9u0StpFtJCpXAmRRAv4vdMUYL7DLOzRmvEgwww6Rd5AwGeLFSw==", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.2.1.tgz", + "integrity": "sha512-K8b3+eCG+Iz0EXTE/UDuXabr6yOL9NP6sW1CLk9AUdUUnL4AhoQy/vjfaOtxZx1T8qEErAWizJ51dHD25ysXHw==", "dev": true, "engines": { "node": "^18.19.1 || ^20.11.1 || >=22.0.0", @@ -5825,15 +5946,14 @@ "yarn": ">= 1.13.0" }, "peerDependencies": { - "@angular/compiler-cli": "^19.0.0", - "typescript": ">=5.5 <5.7", + "@angular/compiler-cli": "^19.0.0 || ^19.2.0-next.0", + "typescript": ">=5.5 <5.9", "webpack": "^5.54.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==", + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -5844,16 +5964,14 @@ }, "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==", + "license": "MIT", "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==", + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -5864,9 +5982,8 @@ }, "node_modules/@npmcli/agent": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", - "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", "dev": true, + "license": "ISC", "dependencies": { "agent-base": "^7.1.0", "http-proxy-agent": "^7.0.0", @@ -5880,9 +5997,8 @@ }, "node_modules/@npmcli/agent/node_modules/http-proxy-agent": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -5893,15 +6009,13 @@ }, "node_modules/@npmcli/agent/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/@npmcli/fs": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", - "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", "dev": true, + "license": "ISC", "dependencies": { "semver": "^7.3.5" }, @@ -5911,9 +6025,8 @@ }, "node_modules/@npmcli/git": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-6.0.1.tgz", - "integrity": "sha512-BBWMMxeQzalmKadyimwb2/VVQyJB01PH0HhVSNLHNBDZN/M/h/02P6f8fxedIiFhpMj11SO9Ep5tKTBE7zL2nw==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/promise-spawn": "^8.0.0", "ini": "^5.0.0", @@ -5931,33 +6044,29 @@ }, "node_modules/@npmcli/git/node_modules/isexe": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=16" } }, "node_modules/@npmcli/git/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/@npmcli/git/node_modules/proc-log": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@npmcli/git/node_modules/which": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^3.1.1" }, @@ -5970,9 +6079,8 @@ }, "node_modules/@npmcli/installed-package-contents": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-3.0.0.tgz", - "integrity": "sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q==", "dev": true, + "license": "ISC", "dependencies": { "npm-bundled": "^4.0.0", "npm-normalize-package-bin": "^4.0.0" @@ -5986,18 +6094,16 @@ }, "node_modules/@npmcli/node-gyp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-4.0.0.tgz", - "integrity": "sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@npmcli/package-json": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.1.0.tgz", - "integrity": "sha512-t6G+6ZInT4X+tqj2i+wlLIeCKnKOTuz9/VFYDtj+TGTur5q7sp/OYrQA19LdBbWfXDOi0Y4jtedV6xtB8zQ9ug==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/git": "^6.0.0", "glob": "^10.2.2", @@ -6013,9 +6119,8 @@ }, "node_modules/@npmcli/package-json/node_modules/glob": { "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -6033,9 +6138,8 @@ }, "node_modules/@npmcli/package-json/node_modules/hosted-git-info": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.0.2.tgz", - "integrity": "sha512-sYKnA7eGln5ov8T8gnYlkSOxFJvywzEx9BueN6xo/GKO8PGiI6uK6xx+DIGe45T3bdVjLAQDQW1aicT8z8JwQg==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^10.0.1" }, @@ -6045,9 +6149,8 @@ }, "node_modules/@npmcli/package-json/node_modules/jackspeak": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -6060,15 +6163,13 @@ }, "node_modules/@npmcli/package-json/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/@npmcli/package-json/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -6081,18 +6182,16 @@ }, "node_modules/@npmcli/package-json/node_modules/proc-log": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@npmcli/promise-spawn": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.2.tgz", - "integrity": "sha512-/bNJhjc+o6qL+Dwz/bqfTQClkEO5nTQ1ZEcdCkAQjhkZMHIh22LPG7fNh1enJP1NKWDqYiiABnjFCY7E0zHYtQ==", "dev": true, + "license": "ISC", "dependencies": { "which": "^5.0.0" }, @@ -6102,18 +6201,16 @@ }, "node_modules/@npmcli/promise-spawn/node_modules/isexe": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=16" } }, "node_modules/@npmcli/promise-spawn/node_modules/which": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^3.1.1" }, @@ -6126,18 +6223,16 @@ }, "node_modules/@npmcli/redact": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.0.0.tgz", - "integrity": "sha512-/1uFzjVcfzqrgCeGW7+SZ4hv0qLWmKXVzFahZGJ6QuJBj6Myt9s17+JL86i76NV9YSnJRcGXJYQbAU0rn1YTCQ==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@npmcli/run-script": { "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-9.0.2.tgz", - "integrity": "sha512-cJXiUlycdizQwvqE1iaAb4VRUM3RX09/8q46zjvy+ct9GhfZRWd7jXYVc1tn/CfRlGPVkX/u4sstRlepsm7hfw==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/node-gyp": "^4.0.0", "@npmcli/package-json": "^6.0.0", @@ -6152,27 +6247,24 @@ }, "node_modules/@npmcli/run-script/node_modules/isexe": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=16" } }, "node_modules/@npmcli/run-script/node_modules/proc-log": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@npmcli/run-script/node_modules/which": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^3.1.1" }, @@ -6183,56 +6275,38 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@nuxtjs/opencollective": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", - "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==", + "node_modules/@nuxt/opencollective": { + "version": "0.4.1", + "license": "MIT", "dependencies": { - "chalk": "^4.1.0", - "consola": "^2.15.0", - "node-fetch": "^2.6.1" + "consola": "^3.2.3" }, "bin": { "opencollective": "bin/opencollective.js" }, "engines": { - "node": ">=8.0.0", - "npm": ">=5.0.0" - } - }, - "node_modules/@nuxtjs/opencollective/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^14.18.0 || >=16.10.0", + "npm": ">=5.10.0" } }, "node_modules/@nx/angular": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/angular/-/angular-20.2.1.tgz", - "integrity": "sha512-gXaYO9ECwg397ueA/WCWHrojksaXbNv+erdjXXLG973KNcQFzJqLS/l/1IktVNu0OpQvdAVqCKTpXN5RYlxCJA==", - "dev": true, - "dependencies": { - "@nx/devkit": "20.2.1", - "@nx/eslint": "20.2.1", - "@nx/js": "20.2.1", - "@nx/module-federation": "20.2.1", - "@nx/web": "20.2.1", - "@nx/webpack": "20.2.1", - "@nx/workspace": "20.2.1", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/angular/-/angular-20.5.0.tgz", + "integrity": "sha512-xAImgqAe0tosatUPuTB5dM5vjdIhlvMqmLzVpqcszlAdNK0sud0AuDo783axKCEkVnZplD79rtv7EytltK1NjQ==", + "dev": true, + "dependencies": { + "@nx/devkit": "20.5.0", + "@nx/eslint": "20.5.0", + "@nx/js": "20.5.0", + "@nx/module-federation": "20.5.0", + "@nx/web": "20.5.0", + "@nx/webpack": "20.5.0", + "@nx/workspace": "20.5.0", "@phenomnomnominal/tsquery": "~5.0.1", "@typescript-eslint/type-utils": "^8.0.0", - "chalk": "^4.1.0", "magic-string": "~0.30.2", "minimatch": "9.0.3", + "picocolors": "^1.1.0", "piscina": "^4.4.0", "semver": "^7.5.3", "tslib": "^2.3.0", @@ -6248,9 +6322,8 @@ }, "node_modules/@nx/angular/node_modules/@typescript-eslint/scope-manager": { "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.17.0.tgz", - "integrity": "sha512-/ewp4XjvnxaREtqsZjF4Mfn078RD/9GmiEAtTeLQ7yFdKnqwTOgRMSvFz4et9U5RiJQ15WTGXPLj89zGusvxBg==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "8.17.0", "@typescript-eslint/visitor-keys": "8.17.0" @@ -6265,9 +6338,8 @@ }, "node_modules/@nx/angular/node_modules/@typescript-eslint/type-utils": { "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.17.0.tgz", - "integrity": "sha512-q38llWJYPd63rRnJ6wY/ZQqIzPrBCkPdpIsaCfkR3Q4t3p6sb422zougfad4TFW9+ElIFLVDzWGiGAfbb/v2qw==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/typescript-estree": "8.17.0", "@typescript-eslint/utils": "8.17.0", @@ -6292,9 +6364,8 @@ }, "node_modules/@nx/angular/node_modules/@typescript-eslint/types": { "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.17.0.tgz", - "integrity": "sha512-gY2TVzeve3z6crqh2Ic7Cr+CAv6pfb0Egee7J5UAVWCpVvDI/F71wNfolIim4FE6hT15EbpZFVUj9j5i38jYXA==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -6305,9 +6376,8 @@ }, "node_modules/@nx/angular/node_modules/@typescript-eslint/typescript-estree": { "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.17.0.tgz", - "integrity": "sha512-JqkOopc1nRKZpX+opvKqnM3XUlM7LpFMD0lYxTqOTKQfCWAmxw45e3qlOCsEqEB2yuacujivudOFpCnqkBDNMw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "8.17.0", "@typescript-eslint/visitor-keys": "8.17.0", @@ -6333,9 +6403,8 @@ }, "node_modules/@nx/angular/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -6348,9 +6417,8 @@ }, "node_modules/@nx/angular/node_modules/@typescript-eslint/utils": { "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.17.0.tgz", - "integrity": "sha512-bQC8BnEkxqG8HBGKwG9wXlZqg37RKSMY7v/X8VEWD8JG2JuTHuNK0VFvMPMUKQcbk6B+tf05k+4AShAEtCtJ/w==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.17.0", @@ -6375,9 +6443,8 @@ }, "node_modules/@nx/angular/node_modules/@typescript-eslint/visitor-keys": { "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.17.0.tgz", - "integrity": "sha512-1Hm7THLpO6ww5QU6H/Qp+AusUUl+z/CAm3cNZZ0jQvon9yicgO7Rwd+/WWRpMKLYV6p2UvdbR27c86rzCPpreg==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "8.17.0", "eslint-visitor-keys": "^4.2.0" @@ -6390,27 +6457,10 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@nx/angular/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/@nx/angular/node_modules/eslint-visitor-keys": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -6419,9 +6469,9 @@ } }, "node_modules/@nx/devkit": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-20.2.1.tgz", - "integrity": "sha512-boNTu7Z7oHkYjrYg5Wzg+cQfbEJ2nntRj1eI99w8mp4qz2B4PEEjJOB0BZafR54ZcKpGEbyp/QBB945GsjTUbw==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-20.5.0.tgz", + "integrity": "sha512-FLHjNRb6VImdlnDsp3ioIdM600y2xPvN88LFV9zPrG2hDXSaD9Np9YBZvvfCr4x46MrPCTTMoAVwWsCXIBgchg==", "dev": true, "dependencies": { "ejs": "^3.1.7", @@ -6438,16 +6488,16 @@ } }, "node_modules/@nx/eslint": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-20.2.1.tgz", - "integrity": "sha512-HY3Sy7AOZR9Z5NZ0kv/aagma/7DviYg+dCH4mHBja5nJmzX0XtAwxcTIzJuo2DBNMw/4aDfGtGgwhXyRhnmXsw==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-20.5.0.tgz", + "integrity": "sha512-9rMnlkSJ+Be+rXICDXaBoDfE5PbSV4TBnG0BM2V9dB1iRWpVtgv49ZreDUFYW0AAJ/RrlGHtlbYl6vupxL9EGg==", "dev": true, "dependencies": { - "@nx/devkit": "20.2.1", - "@nx/js": "20.2.1", + "@nx/devkit": "20.5.0", + "@nx/js": "20.5.0", "semver": "^7.5.3", "tslib": "^2.3.0", - "typescript": "~5.6.2" + "typescript": "~5.7.2" }, "peerDependencies": { "@zkochan/js-yaml": "0.0.7", @@ -6460,13 +6510,13 @@ } }, "node_modules/@nx/eslint-plugin": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/eslint-plugin/-/eslint-plugin-20.2.1.tgz", - "integrity": "sha512-cgJWWuORPOWssxq0qC7ZWOiqZoa4cH4kyVMIjsv6CAKFfFvUjIOu/nH19WeRIt8KgTEot3l6li/f+XmYo0GfFw==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/eslint-plugin/-/eslint-plugin-20.5.0.tgz", + "integrity": "sha512-SEryJj5c50JWZgv2NaJUgQTy6l2Xwzmgu7hJpDD4Xc0LWMirrLix95XY8Plkom4y328GXL5k8CuFESjCh+9aew==", "dev": true, "dependencies": { - "@nx/devkit": "20.2.1", - "@nx/js": "20.2.1", + "@nx/devkit": "20.5.0", + "@nx/js": "20.5.0", "@typescript-eslint/type-utils": "^8.0.0", "@typescript-eslint/utils": "^8.0.0", "chalk": "^4.1.0", @@ -6488,9 +6538,8 @@ }, "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.17.0.tgz", - "integrity": "sha512-/ewp4XjvnxaREtqsZjF4Mfn078RD/9GmiEAtTeLQ7yFdKnqwTOgRMSvFz4et9U5RiJQ15WTGXPLj89zGusvxBg==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "8.17.0", "@typescript-eslint/visitor-keys": "8.17.0" @@ -6505,9 +6554,8 @@ }, "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/type-utils": { "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.17.0.tgz", - "integrity": "sha512-q38llWJYPd63rRnJ6wY/ZQqIzPrBCkPdpIsaCfkR3Q4t3p6sb422zougfad4TFW9+ElIFLVDzWGiGAfbb/v2qw==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/typescript-estree": "8.17.0", "@typescript-eslint/utils": "8.17.0", @@ -6532,9 +6580,8 @@ }, "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/types": { "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.17.0.tgz", - "integrity": "sha512-gY2TVzeve3z6crqh2Ic7Cr+CAv6pfb0Egee7J5UAVWCpVvDI/F71wNfolIim4FE6hT15EbpZFVUj9j5i38jYXA==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -6545,9 +6592,8 @@ }, "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.17.0.tgz", - "integrity": "sha512-JqkOopc1nRKZpX+opvKqnM3XUlM7LpFMD0lYxTqOTKQfCWAmxw45e3qlOCsEqEB2yuacujivudOFpCnqkBDNMw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "8.17.0", "@typescript-eslint/visitor-keys": "8.17.0", @@ -6573,9 +6619,8 @@ }, "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/utils": { "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.17.0.tgz", - "integrity": "sha512-bQC8BnEkxqG8HBGKwG9wXlZqg37RKSMY7v/X8VEWD8JG2JuTHuNK0VFvMPMUKQcbk6B+tf05k+4AShAEtCtJ/w==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.17.0", @@ -6600,9 +6645,8 @@ }, "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.17.0.tgz", - "integrity": "sha512-1Hm7THLpO6ww5QU6H/Qp+AusUUl+z/CAm3cNZZ0jQvon9yicgO7Rwd+/WWRpMKLYV6p2UvdbR27c86rzCPpreg==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "8.17.0", "eslint-visitor-keys": "^4.2.0" @@ -6617,9 +6661,8 @@ }, "node_modules/@nx/eslint-plugin/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6633,9 +6676,8 @@ }, "node_modules/@nx/eslint-plugin/node_modules/eslint-visitor-keys": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -6645,9 +6687,8 @@ }, "node_modules/@nx/eslint-plugin/node_modules/globals": { "version": "15.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.13.0.tgz", - "integrity": "sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -6657,9 +6698,8 @@ }, "node_modules/@nx/eslint-plugin/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -6671,48 +6711,32 @@ } }, "node_modules/@nx/jest": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-20.2.1.tgz", - "integrity": "sha512-bTNF3uHF+y0HvP+09MFEce2eqhSku73O8+akJk4M8eEaXlyWjWG54V0x8cYkZV57D8tYPiYQpWlhtLNkQA45YA==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-20.5.0.tgz", + "integrity": "sha512-/wfADqIHQx2QYmylkAYimP1J7XFbBThce9fPaRQ/Ybows3x9YCfHJT0A7eetIf0qEaxmogigm/0QVmtkPArorg==", "dev": true, "dependencies": { "@jest/reporters": "^29.4.1", "@jest/test-result": "^29.4.1", - "@nx/devkit": "20.2.1", - "@nx/js": "20.2.1", + "@nx/devkit": "20.5.0", + "@nx/js": "20.5.0", "@phenomnomnominal/tsquery": "~5.0.1", - "chalk": "^4.1.0", "identity-obj-proxy": "3.0.0", "jest-config": "^29.4.1", "jest-resolve": "^29.4.1", "jest-util": "^29.4.1", "minimatch": "9.0.3", - "resolve.exports": "1.1.0", + "picocolors": "^1.1.0", + "resolve.exports": "2.0.3", "semver": "^7.5.3", "tslib": "^2.3.0", "yargs-parser": "21.1.1" } }, - "node_modules/@nx/jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/@nx/js": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/js/-/js-20.2.1.tgz", - "integrity": "sha512-2Ecsk7VRODXys6IgjVVhq+8zzajJzfes5SOdc82DApuNEb/cqj7gTKZlIFvqjup7t3z5yyXFd2Vi9js/JfCcZQ==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/js/-/js-20.5.0.tgz", + "integrity": "sha512-TFdmmSARDNYiwxXUsVowHgMYhjuGzYG4wWExCXkb8m4g6ER1zT9oUzGRf9eC7CHFTGonvAQ8hgBt90xt2EUdQA==", "dev": true, "dependencies": { "@babel/core": "^7.23.2", @@ -6722,32 +6746,33 @@ "@babel/preset-env": "^7.23.2", "@babel/preset-typescript": "^7.22.5", "@babel/runtime": "^7.22.6", - "@nx/devkit": "20.2.1", - "@nx/workspace": "20.2.1", + "@nx/devkit": "20.5.0", + "@nx/workspace": "20.5.0", "@zkochan/js-yaml": "0.0.7", "babel-plugin-const-enum": "^1.0.1", - "babel-plugin-macros": "^2.8.0", + "babel-plugin-macros": "^3.1.0", "babel-plugin-transform-typescript-metadata": "^0.3.1", "chalk": "^4.1.0", "columnify": "^1.6.0", "detect-port": "^1.5.1", "enquirer": "~2.3.6", - "fast-glob": "3.2.7", "ignore": "^5.0.4", "js-tokens": "^4.0.0", "jsonc-parser": "3.2.0", - "minimatch": "9.0.3", "npm-package-arg": "11.0.1", "npm-run-path": "^4.0.1", "ora": "5.3.0", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", "semver": "^7.5.3", "source-map-support": "0.5.19", + "tinyglobby": "^0.2.10", "ts-node": "10.9.1", "tsconfig-paths": "^4.1.2", "tslib": "^2.3.0" }, "peerDependencies": { - "verdaccio": "^5.0.4" + "verdaccio": "^6.0.5" }, "peerDependenciesMeta": { "verdaccio": { @@ -6757,9 +6782,8 @@ }, "node_modules/@nx/js/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6771,33 +6795,15 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@nx/js/node_modules/fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@nx/js/node_modules/jsonc-parser": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@nx/js/node_modules/ora": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", - "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", "dev": true, + "license": "MIT", "dependencies": { "bl": "^4.0.3", "chalk": "^4.1.0", @@ -6817,487 +6823,153 @@ }, "node_modules/@nx/js/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/@nx/js/node_modules/source-map-support": { "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "node_modules/@nx/module-federation": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/module-federation/-/module-federation-20.2.1.tgz", - "integrity": "sha512-yGYjU78WaA19WdbDphYnYbEGYPdiFKUtDHdrDedXPGQQT6P7XD38iLDnGJ/dz1XytEKrAgZeBPKqa8lDKxqgoA==", - "dev": true, - "dependencies": { - "@module-federation/enhanced": "0.7.6", - "@module-federation/node": "2.6.11", - "@module-federation/sdk": "0.7.6", - "@nx/devkit": "20.2.1", - "@nx/js": "20.2.1", - "@nx/web": "20.2.1", - "@rspack/core": "^1.1.5", - "express": "^4.19.2", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/module-federation/-/module-federation-20.5.0.tgz", + "integrity": "sha512-dQG3QSsWpdbammmPBP1E4sCkcUCxL5OIwwIDVyYrf2Rdw4f8s6VAGq+BlVFOfP28sVi5xB0wOgDomohVrUXoig==", + "dev": true, + "dependencies": { + "@module-federation/enhanced": "^0.9.0", + "@module-federation/node": "^2.6.26", + "@module-federation/sdk": "^0.9.0", + "@nx/devkit": "20.5.0", + "@nx/js": "20.5.0", + "@nx/web": "20.5.0", + "express": "^4.21.2", "http-proxy-middleware": "^3.0.3", "picocolors": "^1.1.0", "tslib": "^2.3.0", - "webpack": "5.88.0" + "webpack": "^5.88.0" + }, + "peerDependencies": { + "@rspack/core": "^1.1.5" } }, - "node_modules/@nx/module-federation/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/@nx/nest": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/nest/-/nest-20.5.0.tgz", + "integrity": "sha512-/rbI9snHVY+cCUjlee5jjPufBTJYjFUFpZ/n30CuvitGIa+oBvzQlSPYH8n9N3v4/7I6Hg/CYcn9+jDl3DNu/w==", "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" + "@nestjs/schematics": "^9.1.0", + "@nx/devkit": "20.5.0", + "@nx/eslint": "20.5.0", + "@nx/js": "20.5.0", + "@nx/node": "20.5.0", + "tslib": "^2.3.0" } }, - "node_modules/@nx/module-federation/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "node_modules/@nx/nest/node_modules/@angular-devkit/core": { + "version": "16.0.1", "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.0", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, "peerDependencies": { - "ajv": "^6.9.1" + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } } }, - "node_modules/@nx/module-federation/node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "node_modules/@nx/nest/node_modules/@angular-devkit/schematics": { + "version": "16.0.1", "dev": true, + "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "@angular-devkit/core": "16.0.1", + "jsonc-parser": "3.2.0", + "magic-string": "0.30.0", + "ora": "5.4.1", + "rxjs": "7.8.1" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" } }, - "node_modules/@nx/module-federation/node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "node_modules/@nx/nest/node_modules/@nestjs/schematics": { + "version": "9.2.0", "dev": true, - "engines": { - "node": ">= 0.6" + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "16.0.1", + "@angular-devkit/schematics": "16.0.1", + "jsonc-parser": "3.2.0", + "pluralize": "8.0.0" + }, + "peerDependencies": { + "typescript": ">=4.3.5" } }, - "node_modules/@nx/module-federation/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/@nx/nest/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "ms": "2.0.0" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/@nx/module-federation/node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "node_modules/@nx/nest/node_modules/jsonc-parser": { + "version": "3.2.0", "dev": true, - "engines": { - "node": ">= 0.8" - } + "license": "MIT" }, - "node_modules/@nx/module-federation/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "node_modules/@nx/nest/node_modules/magic-string": { + "version": "0.30.0", "dev": true, + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "@jridgewell/sourcemap-codec": "^1.4.13" }, "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@nx/module-federation/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@nx/module-federation/node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", - "dev": true, - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@nx/module-federation/node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@nx/module-federation/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/@nx/module-federation/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/@nx/module-federation/node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@nx/module-federation/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/@nx/module-federation/node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "dev": true - }, - "node_modules/@nx/module-federation/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/@nx/module-federation/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/@nx/module-federation/node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@nx/module-federation/node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@nx/module-federation/node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/@nx/module-federation/node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dev": true, - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@nx/module-federation/node_modules/webpack": { - "version": "5.88.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.0.tgz", - "integrity": "sha512-O3jDhG5e44qIBSi/P6KpcCcH7HD+nYIHVBhdWFxcLOcIGN8zGo5nqF3BjyNCxIh4p1vFdNnreZv2h2KkoAw3lw==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/@nx/nest": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/nest/-/nest-20.2.1.tgz", - "integrity": "sha512-00+lwnvi3dzOmQiQt0CrZAMIYBKq18KwGFTbMsvzSCbXIjOCC1hOTbL3hiQCH2zdvZJFwDqTwZeC199fkU+l0g==", - "dev": true, - "dependencies": { - "@nestjs/schematics": "^9.1.0", - "@nx/devkit": "20.2.1", - "@nx/eslint": "20.2.1", - "@nx/js": "20.2.1", - "@nx/node": "20.2.1", - "tslib": "^2.3.0" - } - }, - "node_modules/@nx/nest/node_modules/@angular-devkit/core": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.0.1.tgz", - "integrity": "sha512-2uz98IqkKJlgnHbWQ7VeL4pb+snGAZXIama2KXi+k9GsRntdcw+udX8rL3G9SdUGUF+m6+147Y1oRBMHsO/v4w==", - "dev": true, - "dependencies": { - "ajv": "8.12.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.0", - "rxjs": "7.8.1", - "source-map": "0.7.4" - }, - "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@nx/nest/node_modules/@angular-devkit/schematics": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.0.1.tgz", - "integrity": "sha512-A9D0LTYmiqiBa90GKcSuWb7hUouGIbm/AHbJbjL85WLLRbQA2PwKl7P5Mpd6nS/ZC0kfG4VQY3VOaDvb3qpI9g==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "16.0.1", - "jsonc-parser": "3.2.0", - "magic-string": "0.30.0", - "ora": "5.4.1", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@nx/nest/node_modules/@nestjs/schematics": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-9.2.0.tgz", - "integrity": "sha512-wHpNJDPzM6XtZUOB3gW0J6mkFCSJilzCM3XrHI1o0C8vZmFE1snbmkIXNyoi1eV0Nxh1BMymcgz5vIMJgQtTqw==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "16.0.1", - "@angular-devkit/schematics": "16.0.1", - "jsonc-parser": "3.2.0", - "pluralize": "8.0.0" - }, - "peerDependencies": { - "typescript": ">=4.3.5" - } - }, - "node_modules/@nx/nest/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/@nx/nest/node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "node_modules/@nx/nest/node_modules/magic-string": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", - "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" - }, - "engines": { - "node": ">=12" + "node": ">=12" } }, "node_modules/@nx/nest/node_modules/picomatch": { @@ -7329,22 +7001,22 @@ } }, "node_modules/@nx/node": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/node/-/node-20.2.1.tgz", - "integrity": "sha512-8agEqP+qJCcIIIlMy+mNhZid7AVmXXLnI8iFktnb8AMjnGcg1qLZIGhqucgpDZjwQP+iGZOlz2gMxWTuc59fSg==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/node/-/node-20.5.0.tgz", + "integrity": "sha512-L89o7daSJpgjBfYRQVbpr0i/WNE8zs/lRIcI6+cbP0mgZA6Wa7lzgQ3qR8hP+Bqttl8SCooJodv3Wyk57qnbdQ==", "dev": true, "dependencies": { - "@nx/devkit": "20.2.1", - "@nx/eslint": "20.2.1", - "@nx/jest": "20.2.1", - "@nx/js": "20.2.1", + "@nx/devkit": "20.5.0", + "@nx/eslint": "20.5.0", + "@nx/jest": "20.5.0", + "@nx/js": "20.5.0", "tslib": "^2.3.0" } }, "node_modules/@nx/nx-darwin-arm64": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-20.2.1.tgz", - "integrity": "sha512-nJcyPZfH6Vq4cG6gRnQ8PcnVOLePeT3exzLnQu0I4I2EtCTPyCSRA3gxoGzZ3qZFMQTsCbwv4HYfdx42AXOTAQ==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-20.5.0.tgz", + "integrity": "sha512-HlMMC4d253kk/yrafiepk8bhXMl+v4BIugftwUzRl7AOznyNgaj5WDaIVXZLZzt+WwYw6CTb+zYxfY4LuPFvOg==", "cpu": [ "arm64" ], @@ -7358,9 +7030,9 @@ } }, "node_modules/@nx/nx-darwin-x64": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-20.2.1.tgz", - "integrity": "sha512-SEiN8fjEs010ME4PRP8O9f8qG8AMZBGz8hOkF6ZrdlC+iEi4iyAGpgWFq8PKBlpVW4G5gxR91Y7eVaTKAsgH5w==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-20.5.0.tgz", + "integrity": "sha512-+LO8YC5Iy1168saPeItNePChToP2TuRCj3MuxEtTTJXoRlab38rNaOjWaV1itvtcgrzkQi/IohINWMI8WC5b7g==", "cpu": [ "x64" ], @@ -7374,9 +7046,9 @@ } }, "node_modules/@nx/nx-freebsd-x64": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-20.2.1.tgz", - "integrity": "sha512-/yEKS9q17EG2Ci130McvpZM5YUghH1ql9UXWbVmitufn+RQD90hoblkG/B+cxJeZonrdKAjdpLQ+hfVz+FBd/g==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-20.5.0.tgz", + "integrity": "sha512-he3VOuj35XDAAmO3s6LqiWx00CsCMgHceNOHziCELQL0tfQlvvyI0Agmhesw68BAbabt+mKH9g+miENiaMknbg==", "cpu": [ "x64" ], @@ -7390,9 +7062,9 @@ } }, "node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-20.2.1.tgz", - "integrity": "sha512-DPtRjTCJ5++stTGtjqYftCb2c0CNed2s2EZZLQuDP+tikTsLm0d3S3ZaU5eHhqZW35tQuMOVweOfC1nJ3/DTSA==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-20.5.0.tgz", + "integrity": "sha512-xeysjXvm4xZa/ED7XlbzuS28sCOGZ0AlS7DKWRxEMv60iprxewj0WKPdH7RveiNNauzgHWOW/wxvTWXRu+i36Q==", "cpu": [ "arm" ], @@ -7406,9 +7078,9 @@ } }, "node_modules/@nx/nx-linux-arm64-gnu": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-20.2.1.tgz", - "integrity": "sha512-ggGwHOEP6UjXeqv6DtRxizeBnX/zRZi8BRJbEJBwAt1cAUnLlklk8d+Hmjs+j/FlFXBV9f+ylpAqoYkplFR8jg==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-20.5.0.tgz", + "integrity": "sha512-pj+6OA7d1ltkW/ZYFooi3bDtqVFPxi8YYiZlQx7enEuOxbrTvpjEPvBjVyf+oYpCe9rfKlx9ghzufqsI4uGM0w==", "cpu": [ "arm64" ], @@ -7422,9 +7094,9 @@ } }, "node_modules/@nx/nx-linux-arm64-musl": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-20.2.1.tgz", - "integrity": "sha512-HZBGxsBJUFbWVTiyJxqt0tS8tlvp+Tp0D533mGKW75cU0rv9dnmbtTwkkkx+LXqerjSRvNS3Qtj0Uh2w92Vtig==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-20.5.0.tgz", + "integrity": "sha512-gCIJEb/VYv6pxiAcSeizX0jpOmTnPmgYVi2EZLSWus0Pg6FIwMHE4MX5kuqehyvnDt9xInb7Rh8vgz/JBOOsbA==", "cpu": [ "arm64" ], @@ -7438,9 +7110,9 @@ } }, "node_modules/@nx/nx-linux-x64-gnu": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-20.2.1.tgz", - "integrity": "sha512-pTytPwGiPRakqz2PKiWTSRNm9taE1U9n0+kRAAFzbOtzeW+eIoebe5xY5QMoZ+XtIZ6pJM2BUOyMD+/TX57r8Q==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-20.5.0.tgz", + "integrity": "sha512-hfCDmfy7TBQJdgBwNvOh55e8Y00Cxcddw2QeKguvy6vsnVa7fesXDWCw2t3m/VPPQDKQGd8cY1lS1JqX3N+wCA==", "cpu": [ "x64" ], @@ -7454,9 +7126,9 @@ } }, "node_modules/@nx/nx-linux-x64-musl": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-20.2.1.tgz", - "integrity": "sha512-p3egqe5zmwiDl6xSwHi2K9UZWiKbZ/s/j4qV+pZttzMyNPfhohTeP+VwQqjTeQ1hPBl2YhwmmktEPsIPYJG7YA==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-20.5.0.tgz", + "integrity": "sha512-RTTCPjZNSDFE5mUdavDFimDw/aXNBY0w+iuRM5q17rDHxwa//DghCY0GEkBdfuxD7wpw+sRwE18mWsNDek5lXA==", "cpu": [ "x64" ], @@ -7470,9 +7142,9 @@ } }, "node_modules/@nx/nx-win32-arm64-msvc": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-20.2.1.tgz", - "integrity": "sha512-Wujist6k08pjgWWQ1pjXrCArmMgnyIXNVmDP14cWo1KHecBuxNWa9i62PrxQ0K8MLYMcAzLHJxN9t54GzBbd+g==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-20.5.0.tgz", + "integrity": "sha512-nT9WlG0QA8D74UJhEP1feGrV00/bas1nnqS+zkwnpJs0vcPmMuIktdETh3lEnqrGD04R7GtwbKtoGIGiZh5m9w==", "cpu": [ "arm64" ], @@ -7486,9 +7158,9 @@ } }, "node_modules/@nx/nx-win32-x64-msvc": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-20.2.1.tgz", - "integrity": "sha512-tsEYfNV2+CWSQmbh9TM8cX5wk6F2QAH0tfvt4topyOOaR40eszW8qc/eDM/kkJ5nj87BbNEqPBQAYFE0AP1OMA==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-20.5.0.tgz", + "integrity": "sha512-KQVqFSYfc8ToSBgzhVNV8WcFEvLdy1zp58qwewa0xnE7DDncMbA+6YoVizUcQ/6GZRlMJ9sdVn3kwm5B8eD5mg==", "cpu": [ "x64" ], @@ -7502,13 +7174,13 @@ } }, "node_modules/@nx/web": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/web/-/web-20.2.1.tgz", - "integrity": "sha512-o8/onqLqxnPw3vW/QQPjiFVE/K3Hclg8tw4pnlzCxis258ywZc8iAtmIZnDJeO3VenMagjRJdzwOZ49yDFvj2Q==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/web/-/web-20.5.0.tgz", + "integrity": "sha512-hxM9CKedYC8uE4e6Wo2/5xt2wCzJPHiJLq/6AK3liwK/o7bAJfkvwM/b9gwPAIVYy5R0DDgfA4N6vYO231eflA==", "dev": true, "dependencies": { - "@nx/devkit": "20.2.1", - "@nx/js": "20.2.1", + "@nx/devkit": "20.5.0", + "@nx/js": "20.5.0", "detect-port": "^1.5.1", "http-server": "^14.1.0", "picocolors": "^1.1.0", @@ -7516,14 +7188,14 @@ } }, "node_modules/@nx/webpack": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/webpack/-/webpack-20.2.1.tgz", - "integrity": "sha512-nw64O2qHMXKiMmDi/MdvQUCBAs18AvhrAjigQ2lINsk643Akg1gI/ZvXUZ2GIZLsdNNWT9jHPm66cUfX2mYpPg==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/webpack/-/webpack-20.5.0.tgz", + "integrity": "sha512-sA02FviLw8D/hWm/u4l13onwNTl1lJX2nJaC0dOIJ1RfZZauD7Ca5tYjqwPC8uXh4/9h+0Kpewm66aJYML+WnA==", "dev": true, "dependencies": { "@babel/core": "^7.23.2", - "@nx/devkit": "20.2.1", - "@nx/js": "20.2.1", + "@nx/devkit": "20.5.0", + "@nx/js": "20.5.0", "@phenomnomnominal/tsquery": "~5.0.1", "ajv": "^8.12.0", "autoprefixer": "^10.4.9", @@ -7544,8 +7216,9 @@ "postcss-import": "~14.1.0", "postcss-loader": "^6.1.1", "rxjs": "^7.8.0", - "sass": "^1.42.1", - "sass-loader": "^12.2.0", + "sass": "^1.85.0", + "sass-embedded": "^1.83.4", + "sass-loader": "^16.0.4", "source-map-loader": "^5.0.0", "style-loader": "^3.3.0", "stylus": "^0.64.0", @@ -7596,22 +7269,6 @@ "webpack": "^5.1.0" } }, - "node_modules/@nx/webpack/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@nx/webpack/node_modules/css-loader": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", @@ -7794,44 +7451,6 @@ "webpack": "^5.0.0" } }, - "node_modules/@nx/webpack/node_modules/sass-loader": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", - "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", - "dev": true, - "dependencies": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", - "sass": "^1.3.0", - "sass-embedded": "*", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - } - } - }, "node_modules/@nx/webpack/node_modules/slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", @@ -7855,15 +7474,15 @@ } }, "node_modules/@nx/workspace": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-20.2.1.tgz", - "integrity": "sha512-YJnOyqJDzuTHOWQ/eFCfBwGg0x3ByxBYk4PPF48tUN21TLoXbq39GP+/I3tsRNm9rvhcOTRoGybWu06t21ty4Q==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-20.5.0.tgz", + "integrity": "sha512-Oe5p7rcgF/o4G2XDHYOxQxa/eDEfvmQV+kFCs8DBQwlzUwREAP4/pHFI0AIdWSfYkq55C5PE/PNKUGHrk2/xTA==", "dev": true, "dependencies": { - "@nx/devkit": "20.2.1", + "@nx/devkit": "20.5.0", "chalk": "^4.1.0", "enquirer": "~2.3.6", - "nx": "20.2.1", + "nx": "20.5.0", "tslib": "^2.3.0", "yargs-parser": "21.1.1" } @@ -7884,66 +7503,10 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@parcel/watcher": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", - "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "dependencies": { - "detect-libc": "^1.0.3", - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.0", - "@parcel/watcher-darwin-arm64": "2.5.0", - "@parcel/watcher-darwin-x64": "2.5.0", - "@parcel/watcher-freebsd-x64": "2.5.0", - "@parcel/watcher-linux-arm-glibc": "2.5.0", - "@parcel/watcher-linux-arm-musl": "2.5.0", - "@parcel/watcher-linux-arm64-glibc": "2.5.0", - "@parcel/watcher-linux-arm64-musl": "2.5.0", - "@parcel/watcher-linux-x64-glibc": "2.5.0", - "@parcel/watcher-linux-x64-musl": "2.5.0", - "@parcel/watcher-win32-arm64": "2.5.0", - "@parcel/watcher-win32-ia32": "2.5.0", - "@parcel/watcher-win32-x64": "2.5.0" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", - "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", - "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", + "node_modules/@oxc-resolver/binding-darwin-arm64": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-arm64/-/binding-darwin-arm64-1.12.0.tgz", + "integrity": "sha512-wYe+dlF8npM7cwopOOxbdNjtmJp17e/xF5c0K2WooQXy5VOh74icydM33+Uh/SZDgwyum09/U1FVCX5GdeQk+A==", "cpu": [ "arm64" ], @@ -7951,79 +7514,38 @@ "optional": true, "os": [ "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", - "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + ] }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", - "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", + "node_modules/@oxc-resolver/binding-darwin-x64": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-x64/-/binding-darwin-x64-1.12.0.tgz", + "integrity": "sha512-FZxxp99om+SlvBr1cjzF8A3TjYcS0BInCqjUlM+2f9m9bPTR2Bng9Zq5Q09ZQyrKJjfGKqlOEHs3akuVOnrx3Q==", "cpu": [ "x64" ], "dev": true, "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + "os": [ + "darwin" + ] }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", - "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", + "node_modules/@oxc-resolver/binding-freebsd-x64": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-freebsd-x64/-/binding-freebsd-x64-1.12.0.tgz", + "integrity": "sha512-BZi0iU6IEOnXGSkqt1OjTTkN9wfyaK6kTpQwL/axl8eCcNDc7wbv1vloHgILf7ozAY1TP75nsLYlASYI4B5kGA==", "cpu": [ - "arm" + "x64" ], "dev": true, "optional": true, "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + "freebsd" + ] }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", - "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", + "node_modules/@oxc-resolver/binding-linux-arm-gnueabihf": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.12.0.tgz", + "integrity": "sha512-L2qnMEnZAqxbG9b1J3di/w/THIm+1fMVfbbTMWIQNMMXdMeqqDN6ojnOLDtuP564rAh4TBFPdLyEfGhMz6ipNA==", "cpu": [ "arm" ], @@ -8031,19 +7553,12 @@ "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + ] }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", - "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", + "node_modules/@oxc-resolver/binding-linux-arm64-gnu": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.12.0.tgz", + "integrity": "sha512-otVbS4zeo3n71zgGLBYRTriDzc0zpruC0WI3ICwjpIk454cLwGV0yzh4jlGYWQJYJk0BRAmXFd3ooKIF+bKBHw==", "cpu": [ "arm64" ], @@ -8051,19 +7566,12 @@ "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + ] }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", - "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", + "node_modules/@oxc-resolver/binding-linux-arm64-musl": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.12.0.tgz", + "integrity": "sha512-IStQDjIT7Lzmqg1i9wXvPL/NsYsxF24WqaQFS8b8rxra+z0VG7saBOsEnOaa4jcEY8MVpLYabFhTV+fSsA2vnA==", "cpu": [ "arm64" ], @@ -8071,19 +7579,12 @@ "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + ] }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", - "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", + "node_modules/@oxc-resolver/binding-linux-x64-gnu": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.12.0.tgz", + "integrity": "sha512-SipT7EVORz8pOQSFwemOm91TpSiBAGmOjG830/o+aLEsvQ4pEy223+SAnCfITh7+AahldYsJnVoIs519jmIlKQ==", "cpu": [ "x64" ], @@ -8091,19 +7592,12 @@ "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + ] }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", - "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", + "node_modules/@oxc-resolver/binding-linux-x64-musl": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-musl/-/binding-linux-x64-musl-1.12.0.tgz", + "integrity": "sha512-mGh0XfUzKdn+WFaqPacziNraCWL5znkHRfQVxG9avGS9zb2KC/N1EBbPzFqutDwixGDP54r2gx4q54YCJEZ4iQ==", "cpu": [ "x64" ], @@ -8111,19 +7605,28 @@ "optional": true, "os": [ "linux" + ] + }, + "node_modules/@oxc-resolver/binding-wasm32-wasi": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-wasm32-wasi/-/binding-wasm32-wasi-1.12.0.tgz", + "integrity": "sha512-SZN6v7apKmQf/Vwiqb6e/s3Y2Oacw8uW8V2i1AlxtyaEFvnFE0UBn89zq6swEwE3OCajNWs0yPvgAXUMddYc7Q==", + "cpu": [ + "wasm32" ], - "engines": { - "node": ">= 10.0.0" + "dev": true, + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.4" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", - "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", + "node_modules/@oxc-resolver/binding-win32-arm64-msvc": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.12.0.tgz", + "integrity": "sha512-GRe4bqCfFsyghruEn5bv47s9w3EWBdO2q72xCz5kpQ0LWbw+enPHtTjw3qX5PUcFYpKykM55FaO0hFDs1yzatw==", "cpu": [ "arm64" ], @@ -8131,46 +7634,66 @@ "optional": true, "os": [ "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + ] }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", - "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", + "node_modules/@oxc-resolver/binding-win32-x64-msvc": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.12.0.tgz", + "integrity": "sha512-Z3llHH0jfJP4mlWq3DT7bK6qV+/vYe0+xzCgfc67+Tc/U3eYndujl880bexeGdGNPh87JeYznpZAOJ44N7QVVQ==", "cpu": [ - "ia32" + "x64" ], "dev": true, "optional": true, "os": [ "win32" - ], + ] + }, + "node_modules/@parcel/watcher": { + "version": "2.5.0", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, "engines": { "node": ">= 10.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.0", + "@parcel/watcher-darwin-arm64": "2.5.0", + "@parcel/watcher-darwin-x64": "2.5.0", + "@parcel/watcher-freebsd-x64": "2.5.0", + "@parcel/watcher-linux-arm-glibc": "2.5.0", + "@parcel/watcher-linux-arm-musl": "2.5.0", + "@parcel/watcher-linux-arm64-glibc": "2.5.0", + "@parcel/watcher-linux-arm64-musl": "2.5.0", + "@parcel/watcher-linux-x64-glibc": "2.5.0", + "@parcel/watcher-linux-x64-musl": "2.5.0", + "@parcel/watcher-win32-arm64": "2.5.0", + "@parcel/watcher-win32-ia32": "2.5.0", + "@parcel/watcher-win32-x64": "2.5.0" } }, - "node_modules/@parcel/watcher-win32-x64": { + "node_modules/@parcel/watcher-darwin-arm64": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", - "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", "cpu": [ - "x64" + "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ - "win32" + "darwin" ], "engines": { "node": ">= 10.0.0" @@ -8182,9 +7705,8 @@ }, "node_modules/@parcel/watcher/node_modules/detect-libc": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", "dev": true, + "license": "Apache-2.0", "optional": true, "bin": { "detect-libc": "bin/detect-libc.js" @@ -8195,16 +7717,14 @@ }, "node_modules/@parcel/watcher/node_modules/node-addon-api": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/@phenomnomnominal/tsquery": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@phenomnomnominal/tsquery/-/tsquery-5.0.1.tgz", - "integrity": "sha512-3nVv+e2FQwsW8Aw6qTU6f+1rfcJ3hrcnvH/mu9i8YhxO+9sqbOfpL8m6PbET5+xKOlz/VSbp0RoYWYCtIsnmuA==", "dev": true, + "license": "MIT", "dependencies": { "esquery": "^1.4.0" }, @@ -8214,8 +7734,7 @@ }, "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==", + "license": "MIT", "optional": true, "engines": { "node": ">=14" @@ -8223,9 +7742,8 @@ }, "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" }, @@ -8243,9 +7761,8 @@ }, "node_modules/@rollup/pluginutils": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", - "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", @@ -8265,9 +7782,8 @@ }, "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, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -8276,9 +7792,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.26.0.tgz", - "integrity": "sha512-gJNwtPDGEaOEgejbaseY6xMFu+CPltsc8/T+diUTTbOQLqD+bnrJq9ulH6WD69TqwqWmrfRAtUv30cCFZlbGTQ==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz", + "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==", "cpu": [ "arm" ], @@ -8289,9 +7805,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.26.0.tgz", - "integrity": "sha512-YJa5Gy8mEZgz5JquFruhJODMq3lTHWLm1fOy+HIANquLzfIOzE9RA5ie3JjCdVb9r46qfAQY/l947V0zfGJ0OQ==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz", + "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==", "cpu": [ "arm64" ], @@ -8302,9 +7818,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.26.0.tgz", - "integrity": "sha512-ErTASs8YKbqTBoPLp/kA1B1Um5YSom8QAc4rKhg7b9tyyVqDBlQxy7Bf2wW7yIlPGPg2UODDQcbkTlruPzDosw==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz", + "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==", "cpu": [ "arm64" ], @@ -8315,9 +7831,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.26.0.tgz", - "integrity": "sha512-wbgkYDHcdWW+NqP2mnf2NOuEbOLzDblalrOWcPyY6+BRbVhliavon15UploG7PpBRQ2bZJnbmh8o3yLoBvDIHA==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz", + "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==", "cpu": [ "x64" ], @@ -8328,9 +7844,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.26.0.tgz", - "integrity": "sha512-Y9vpjfp9CDkAG4q/uwuhZk96LP11fBz/bYdyg9oaHYhtGZp7NrbkQrj/66DYMMP2Yo/QPAsVHkV891KyO52fhg==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz", + "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==", "cpu": [ "arm64" ], @@ -8341,9 +7857,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.26.0.tgz", - "integrity": "sha512-A/jvfCZ55EYPsqeaAt/yDAG4q5tt1ZboWMHEvKAH9Zl92DWvMIbnZe/f/eOXze65aJaaKbL+YeM0Hz4kLQvdwg==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz", + "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==", "cpu": [ "x64" ], @@ -8354,9 +7870,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.26.0.tgz", - "integrity": "sha512-paHF1bMXKDuizaMODm2bBTjRiHxESWiIyIdMugKeLnjuS1TCS54MF5+Y5Dx8Ui/1RBPVRE09i5OUlaLnv8OGnA==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz", + "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==", "cpu": [ "arm" ], @@ -8367,9 +7883,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.26.0.tgz", - "integrity": "sha512-cwxiHZU1GAs+TMxvgPfUDtVZjdBdTsQwVnNlzRXC5QzIJ6nhfB4I1ahKoe9yPmoaA/Vhf7m9dB1chGPpDRdGXg==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz", + "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==", "cpu": [ "arm" ], @@ -8380,9 +7896,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.26.0.tgz", - "integrity": "sha512-4daeEUQutGRCW/9zEo8JtdAgtJ1q2g5oHaoQaZbMSKaIWKDQwQ3Yx0/3jJNmpzrsScIPtx/V+1AfibLisb3AMQ==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz", + "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==", "cpu": [ "arm64" ], @@ -8393,9 +7909,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.26.0.tgz", - "integrity": "sha512-eGkX7zzkNxvvS05ROzJ/cO/AKqNvR/7t1jA3VZDi2vRniLKwAWxUr85fH3NsvtxU5vnUUKFHKh8flIBdlo2b3Q==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz", + "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==", "cpu": [ "arm64" ], @@ -8405,10 +7921,23 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz", + "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.26.0.tgz", - "integrity": "sha512-Odp/lgHbW/mAqw/pU21goo5ruWsytP7/HCC/liOt0zcGG0llYWKrd10k9Fj0pdj3prQ63N5yQLCLiE7HTX+MYw==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz", + "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==", "cpu": [ "ppc64" ], @@ -8419,9 +7948,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.26.0.tgz", - "integrity": "sha512-MBR2ZhCTzUgVD0OJdTzNeF4+zsVogIR1U/FsyuFerwcqjZGvg2nYe24SAHp8O5sN8ZkRVbHwlYeHqcSQ8tcYew==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz", + "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==", "cpu": [ "riscv64" ], @@ -8432,9 +7961,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.26.0.tgz", - "integrity": "sha512-YYcg8MkbN17fMbRMZuxwmxWqsmQufh3ZJFxFGoHjrE7bv0X+T6l3glcdzd7IKLiwhT+PZOJCblpnNlz1/C3kGQ==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz", + "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==", "cpu": [ "s390x" ], @@ -8445,9 +7974,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.26.0.tgz", - "integrity": "sha512-ZuwpfjCwjPkAOxpjAEjabg6LRSfL7cAJb6gSQGZYjGhadlzKKywDkCUnJ+KEfrNY1jH5EEoSIKLCb572jSiglA==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz", + "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==", "cpu": [ "x64" ], @@ -8458,9 +7987,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.26.0.tgz", - "integrity": "sha512-+HJD2lFS86qkeF8kNu0kALtifMpPCZU80HvwztIKnYwym3KnA1os6nsX4BGSTLtS2QVAGG1P3guRgsYyMA0Yhg==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz", + "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==", "cpu": [ "x64" ], @@ -8471,9 +8000,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.26.0.tgz", - "integrity": "sha512-WUQzVFWPSw2uJzX4j6YEbMAiLbs0BUysgysh8s817doAYhR5ybqTI1wtKARQKo6cGop3pHnrUJPFCsXdoFaimQ==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz", + "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==", "cpu": [ "arm64" ], @@ -8484,9 +8013,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.26.0.tgz", - "integrity": "sha512-D4CxkazFKBfN1akAIY6ieyOqzoOoBV1OICxgUblWxff/pSjCA2khXlASUx7mK6W1oP4McqhgcCsu6QaLj3WMWg==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz", + "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==", "cpu": [ "ia32" ], @@ -8497,9 +8026,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.26.0.tgz", - "integrity": "sha512-2x8MO1rm4PGEP0xWbubJW5RtbNLk3puzAMaLQd3B3JHVw4KcHlmXcO+Wewx9zCoo7EUFiMlu/aZbCJ7VjMzAag==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz", + "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==", "cpu": [ "x64" ], @@ -8511,9 +8040,8 @@ }, "node_modules/@rollup/wasm-node": { "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/wasm-node/-/wasm-node-4.28.1.tgz", - "integrity": "sha512-t4ckEC09V3wbe0r6T4fGjq85lEbvGcGxn7QYYgjHyKNzZaQU5kFqr4FsavXYHRiVNYq8m+dRhdGjpfcC9UzzPg==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "1.0.6" }, @@ -8529,26 +8057,27 @@ } }, "node_modules/@rspack/binding": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.1.5.tgz", - "integrity": "sha512-RsSkgi56Q5XUXut0qweLSE1C4Ogcm7g/ueKoOgsbHAYVKrCs9/dTFlPHWSIAaI7QWh0GWEePR/MM2O2HIu+1rw==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.2.7.tgz", + "integrity": "sha512-QH+kxkG0I9C6lmlwgBUDFsy24ihXMGG5lfiNtQilk4CyBN+AgSWFENcYrnkUaBioZAvMBznQLiccV3X0JeH9iQ==", "dev": true, + "peer": true, "optionalDependencies": { - "@rspack/binding-darwin-arm64": "1.1.5", - "@rspack/binding-darwin-x64": "1.1.5", - "@rspack/binding-linux-arm64-gnu": "1.1.5", - "@rspack/binding-linux-arm64-musl": "1.1.5", - "@rspack/binding-linux-x64-gnu": "1.1.5", - "@rspack/binding-linux-x64-musl": "1.1.5", - "@rspack/binding-win32-arm64-msvc": "1.1.5", - "@rspack/binding-win32-ia32-msvc": "1.1.5", - "@rspack/binding-win32-x64-msvc": "1.1.5" + "@rspack/binding-darwin-arm64": "1.2.7", + "@rspack/binding-darwin-x64": "1.2.7", + "@rspack/binding-linux-arm64-gnu": "1.2.7", + "@rspack/binding-linux-arm64-musl": "1.2.7", + "@rspack/binding-linux-x64-gnu": "1.2.7", + "@rspack/binding-linux-x64-musl": "1.2.7", + "@rspack/binding-win32-arm64-msvc": "1.2.7", + "@rspack/binding-win32-ia32-msvc": "1.2.7", + "@rspack/binding-win32-x64-msvc": "1.2.7" } }, "node_modules/@rspack/binding-darwin-arm64": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", - "integrity": "sha512-eEynmyPPl+OGYQ9LRFwiQosyRfcca3OQB73akqY4mqDRl39OyiBjq7347DLHJysgbm9z+B1bsiLuh2xc6mdclQ==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.2.7.tgz", + "integrity": "sha512-dT5eSMTknZaI8Djmz8KnaWM68rjZuBZwsKyF144o+ZSJM55vgiNXyL0lQYB8mX9nR3Gck+jKuGUAT2W/EF/t5Q==", "cpu": [ "arm64" ], @@ -8556,12 +8085,13 @@ "optional": true, "os": [ "darwin" - ] + ], + "peer": true }, "node_modules/@rspack/binding-darwin-x64": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", - "integrity": "sha512-I6HPRgogewU5v1OKe3noEzq2U1FCEYAbW+smy+lPvpTW+3X6PlVMzTT4oelhB0EXDQ+KxjXH9KpOKON1hg/JGg==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.2.7.tgz", + "integrity": "sha512-5n8IhKBxH71d4BUIvyzTwSOAOKNneLPJwLIphSPNIbCMGjLI59/EVpxSQ/AAUfyMkqOs635NNCn0eGQVuzpI/w==", "cpu": [ "x64" ], @@ -8569,12 +8099,13 @@ "optional": true, "os": [ "darwin" - ] + ], + "peer": true }, "node_modules/@rspack/binding-linux-arm64-gnu": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", - "integrity": "sha512-LQnqucNa6Dr6y3By+/M2ARO4jDR3AM+PuCsHgzlYT0RDRLS+Ow3f50WbNBf7eI/DhrEA0aucYL3sz1ljguB3EA==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.7.tgz", + "integrity": "sha512-DTtFBJmgQQrVWjbklpgJDr3kE9Uf1fHsPh+1GVslsBuyn+o4O7JslrnjuVsQCYKoiEg0Lg4ZPQmwnhJLHssZ5A==", "cpu": [ "arm64" ], @@ -8582,12 +8113,13 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rspack/binding-linux-arm64-musl": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", - "integrity": "sha512-b9L/9HJxrWY4cezPWqgj28I9Xe2XxwLHu8x0CMGobwF2XKR0QQVLAst38RW/EusJ8TURdyvNEOuRZlWEIJuYOw==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.7.tgz", + "integrity": "sha512-01/OoQQF9eyDvRKkxj4DzCznfGZIvnzI8qOsrv+M7VBm8FLoKpb3hygXixaGQOXmNL42XTh61qjgm++fBu6aUA==", "cpu": [ "arm64" ], @@ -8595,12 +8127,13 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rspack/binding-linux-x64-gnu": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", - "integrity": "sha512-0az52ZXTg/ErCGC1v/oFLWByKAiXvng4euv+prwMWF6p1pA7lfLRLzdibDFO4KgC16Zlfcg3hqs7YikLng4x+w==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.7.tgz", + "integrity": "sha512-lUOAUq0YSsofCXsP6XnlgfH0ZRDZ2X2XqXLXYjqf4xkSxCl5eBmE0EQYjAHF4zjUvU5rVx4a4bDLWv7+t3bOHg==", "cpu": [ "x64" ], @@ -8608,12 +8141,13 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rspack/binding-linux-x64-musl": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", - "integrity": "sha512-EF/LJTtCTkuti2gJnCyvXHC5Q2L5M4+RXm5kj9Bfu/t0Zmmfe6Jd5QUsifgogioeL0ZsH/Pou5QiiVcOFcqFKQ==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.7.tgz", + "integrity": "sha512-ZrPXfgT30p4DlydYavaTHiluxHkWvZHt7K4q7qNyTfYYowG6jRGwWi/PATdugNICGv027Wsh5nzEO4o27Iuhwg==", "cpu": [ "x64" ], @@ -8621,12 +8155,13 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rspack/binding-win32-arm64-msvc": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", - "integrity": "sha512-VEqhK6HwIHby6gtOkxIx66SkqYndiaP1ddZ3X39RLE40TY3KlNgfG/SzbN9J5Qb+8jjq3ogV8n50+wLEGkhiWw==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.7.tgz", + "integrity": "sha512-1OzzM+OUSWX39XYcDfxJ8bGX5vNNrRejCMGotBEdP+uQ3KMWCPz0G4KRc3QIjghaLIYk3ofd83hcfUxyk/2Xog==", "cpu": [ "arm64" ], @@ -8634,12 +8169,13 @@ "optional": true, "os": [ "win32" - ] + ], + "peer": true }, "node_modules/@rspack/binding-win32-ia32-msvc": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.1.5.tgz", - "integrity": "sha512-Yi2BwYehc5/sRVgI7zTGYJKjnV8UszAJt/stWdFHaq82chHiuuF/tQd1WcBUq0Iin9ylBMo16mRJAuFkFmJ74Q==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.2.7.tgz", + "integrity": "sha512-VWlDCV9kDtijk9GK6ZtBQmYoVzKGpnrJB0iI3d2gIEa/2NwikJ89bLMFE4dFx8UNH3p/sSyb5pmPOQnbudFK7Q==", "cpu": [ "ia32" ], @@ -8647,12 +8183,13 @@ "optional": true, "os": [ "win32" - ] + ], + "peer": true }, "node_modules/@rspack/binding-win32-x64-msvc": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", - "integrity": "sha512-4UArXYqJO1Ni7TmCw1T11JnrwfpoThDdiQ9k1P1voBWK3bDahPEBOptk9ZPu2+ZuRX8hFrvumRKkLY3oy7fTMw==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.7.tgz", + "integrity": "sha512-l/sTdeMsQF1a1aB79cWykDNRZG6nkUA0biJo2/sEARP3ijdr8TuwUdirp2JRDmZfQJkoJnQ2un9y9qyW+TIZzA==", "cpu": [ "x64" ], @@ -8660,64 +8197,85 @@ "optional": true, "os": [ "win32" - ] + ], + "peer": true }, "node_modules/@rspack/core": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.1.5.tgz", - "integrity": "sha512-/FmxDeMuW8fJkhz8fHuCu7OiJHFKW78xclEu7LkEujWl4PqJgdWjUL/6FWIj50spRwj6PRfuc31hFSL4hbNfCA==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.2.7.tgz", + "integrity": "sha512-Vg7ySflnqI1nNOBPd6VJkQozWADssxn3einbxa9OqDVAB+dGSj8qihTs6rlaTSewidoaYTGIAiTMHO2y+61qqQ==", "dev": true, + "peer": true, "dependencies": { - "@module-federation/runtime-tools": "0.5.1", - "@rspack/binding": "1.1.5", + "@module-federation/runtime-tools": "0.8.4", + "@rspack/binding": "1.2.7", "@rspack/lite-tapable": "1.0.1", - "caniuse-lite": "^1.0.30001616" + "caniuse-lite": "^1.0.30001700" }, "engines": { "node": ">=16.0.0" }, "peerDependencies": { + "@rspack/tracing": "^1.x", "@swc/helpers": ">=0.5.1" }, "peerDependenciesMeta": { + "@rspack/tracing": { + "optional": true + }, "@swc/helpers": { "optional": true } } }, + "node_modules/@rspack/core/node_modules/@module-federation/error-codes": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.8.4.tgz", + "integrity": "sha512-55LYmrDdKb4jt+qr8qE8U3al62ZANp3FhfVaNPOaAmdTh0jHdD8M3yf5HKFlr5xVkVO4eV/F/J2NCfpbh+pEXQ==", + "dev": true, + "peer": true + }, "node_modules/@rspack/core/node_modules/@module-federation/runtime": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.5.1.tgz", - "integrity": "sha512-xgiMUWwGLWDrvZc9JibuEbXIbhXg6z2oUkemogSvQ4LKvrl/n0kbqP1Blk669mXzyWbqtSp6PpvNdwaE1aN5xQ==", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.8.4.tgz", + "integrity": "sha512-yZeZ7z2Rx4gv/0E97oLTF3V6N25vglmwXGgoeju/W2YjsFvWzVtCDI7zRRb0mJhU6+jmSM8jP1DeQGbea/AiZQ==", "dev": true, + "peer": true, "dependencies": { - "@module-federation/sdk": "0.5.1" + "@module-federation/error-codes": "0.8.4", + "@module-federation/sdk": "0.8.4" } }, "node_modules/@rspack/core/node_modules/@module-federation/runtime-tools": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.5.1.tgz", - "integrity": "sha512-nfBedkoZ3/SWyO0hnmaxuz0R0iGPSikHZOAZ0N/dVSQaIzlffUo35B5nlC2wgWIc0JdMZfkwkjZRrnuuDIJbzg==", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.8.4.tgz", + "integrity": "sha512-fjVOsItJ1u5YY6E9FnS56UDwZgqEQUrWFnouRiPtK123LUuqUI9FH4redZoKWlE1PB0ir1Z3tnqy8eFYzPO38Q==", "dev": true, + "peer": true, "dependencies": { - "@module-federation/runtime": "0.5.1", - "@module-federation/webpack-bundler-runtime": "0.5.1" + "@module-federation/runtime": "0.8.4", + "@module-federation/webpack-bundler-runtime": "0.8.4" } }, "node_modules/@rspack/core/node_modules/@module-federation/sdk": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.5.1.tgz", - "integrity": "sha512-exvchtjNURJJkpqjQ3/opdbfeT2wPKvrbnGnyRkrwW5o3FH1LaST1tkiNviT6OXTexGaVc2DahbdniQHVtQ7pA==", - "dev": true + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.8.4.tgz", + "integrity": "sha512-waABomIjg/5m1rPDBWYG4KUhS5r7OUUY7S+avpaVIY/tkPWB3ibRDKy2dNLLAMaLKq0u+B1qIdEp4NIWkqhqpg==", + "dev": true, + "peer": true, + "dependencies": { + "isomorphic-rslog": "0.0.6" + } }, "node_modules/@rspack/core/node_modules/@module-federation/webpack-bundler-runtime": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.5.1.tgz", - "integrity": "sha512-mMhRFH0k2VjwHt3Jol9JkUsmI/4XlrAoBG3E0o7HoyoPYv1UFOWyqAflfANcUPgbYpvqmyLzDcO+3IT36LXnrA==", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.8.4.tgz", + "integrity": "sha512-HggROJhvHPUX7uqBD/XlajGygMNM1DG0+4OAkk8MBQe4a18QzrRNzZt6XQbRTSG4OaEoyRWhQHvYD3Yps405tQ==", "dev": true, + "peer": true, "dependencies": { - "@module-federation/runtime": "0.5.1", - "@module-federation/sdk": "0.5.1" + "@module-federation/runtime": "0.8.4", + "@module-federation/sdk": "0.8.4" } }, "node_modules/@rspack/lite-tapable": { @@ -8725,14 +8283,14 @@ "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.0.1.tgz", "integrity": "sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==", "dev": true, + "peer": true, "engines": { "node": ">=16.0.0" } }, "node_modules/@rushstack/node-core-library": { "version": "5.10.2", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.10.2.tgz", - "integrity": "sha512-xOF/2gVJZTfjTxbo4BDj9RtQq/HFnrrKdtem4JkyRLnwsRz2UDTg8gA1/et10fBx5RxmZD9bYVGST69W8ME5OQ==", + "license": "MIT", "dependencies": { "ajv": "~8.13.0", "ajv-draft-04": "~1.0.0", @@ -8754,8 +8312,7 @@ }, "node_modules/@rushstack/node-core-library/node_modules/ajv": { "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", - "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", @@ -8769,8 +8326,7 @@ }, "node_modules/@rushstack/node-core-library/node_modules/ajv-formats": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -8785,8 +8341,7 @@ }, "node_modules/@rushstack/node-core-library/node_modules/fs-extra": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -8798,16 +8353,14 @@ }, "node_modules/@rushstack/node-core-library/node_modules/jsonfile": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/@rushstack/node-core-library/node_modules/lru-cache": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -8817,8 +8370,7 @@ }, "node_modules/@rushstack/node-core-library/node_modules/semver": { "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -8831,21 +8383,18 @@ }, "node_modules/@rushstack/node-core-library/node_modules/universalify": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "license": "MIT", "engines": { "node": ">= 4.0.0" } }, "node_modules/@rushstack/node-core-library/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "license": "ISC" }, "node_modules/@rushstack/terminal": { "version": "0.14.5", - "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.14.5.tgz", - "integrity": "sha512-TEOpNwwmsZVrkp0omnuTUTGZRJKTr6n6m4OITiNjkqzLAkcazVpwR1SOtBg6uzpkIBLgrcNHETqI8rbw3uiUfw==", + "license": "MIT", "dependencies": { "@rushstack/node-core-library": "5.10.2", "supports-color": "~8.1.1" @@ -8861,8 +8410,7 @@ }, "node_modules/@rushstack/terminal/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -8875,8 +8423,7 @@ }, "node_modules/@rushstack/ts-command-line": { "version": "4.23.3", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.23.3.tgz", - "integrity": "sha512-HazKL8fv4HMQMzrKJCrOrhyBPPdzk7iajUXgsASwjQ8ROo1cmgyqxt/k9+SdmrNLGE1zATgRqMUH3s/6smbRMA==", + "license": "MIT", "dependencies": { "@rushstack/terminal": "0.14.5", "@types/argparse": "1.0.38", @@ -8886,25 +8433,28 @@ }, "node_modules/@rushstack/ts-command-line/node_modules/argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/@rushstack/ts-command-line/node_modules/sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + "license": "BSD-3-Clause" + }, + "node_modules/@scarf/scarf": { + "version": "1.4.0", + "hasInstallScript": true, + "license": "Apache-2.0" }, "node_modules/@schematics/angular": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.0.4.tgz", - "integrity": "sha512-1fXBtkA/AjgMPxHLpGlw7NuT/wggCqAwBAmDnSiRnBBV7Pgs/tHorLgh7A9eoUi3c8CYCuAh8zqWNyjBGGigOQ==", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.2.1.tgz", + "integrity": "sha512-QYYGVR2n+YtLzqo0IsQq7OUnBMeP6OjyuVlGdjsAnSDCKQ9kUcqZDwjxxh5NUj25R4vvu+5aVaa6W6iTxfHadQ==", "dev": true, "dependencies": { - "@angular-devkit/core": "19.0.4", - "@angular-devkit/schematics": "19.0.4", + "@angular-devkit/core": "19.2.1", + "@angular-devkit/schematics": "19.2.1", "jsonc-parser": "3.3.1" }, "engines": { @@ -8913,17 +8463,10 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@schematics/angular/node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true - }, "node_modules/@sigstore/bundle": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.0.0.tgz", - "integrity": "sha512-XDUYX56iMPAn/cdgh/DTJxz5RWmqKV4pwvUAEKEWJl+HzKdCd/24wUa9JYNMlDSCb7SUHAdtksxYX779Nne/Zg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@sigstore/protobuf-specs": "^0.3.2" }, @@ -8933,27 +8476,24 @@ }, "node_modules/@sigstore/core": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-2.0.0.tgz", - "integrity": "sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@sigstore/protobuf-specs": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz", - "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/@sigstore/sign": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.0.0.tgz", - "integrity": "sha512-UjhDMQOkyDoktpXoc5YPJpJK6IooF2gayAr5LvXI4EL7O0vd58okgfRcxuaH+YTdhvb5aa1Q9f+WJ0c2sVuYIw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^3.0.0", "@sigstore/core": "^2.0.0", @@ -8968,18 +8508,16 @@ }, "node_modules/@sigstore/sign/node_modules/proc-log": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@sigstore/tuf": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.0.0.tgz", - "integrity": "sha512-9Xxy/8U5OFJu7s+OsHzI96IX/OzjF/zj0BSSaWhgJgTqtlBhQIV2xdrQI5qxLD7+CWWDepadnXAxzaZ3u9cvRw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@sigstore/protobuf-specs": "^0.3.2", "tuf-js": "^3.0.1" @@ -8990,9 +8528,8 @@ }, "node_modules/@sigstore/verify": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.0.0.tgz", - "integrity": "sha512-Ggtq2GsJuxFNUvQzLoXqRwS4ceRfLAJnrIHUDrzAD0GgnOhwujJkKkxM/s5Bako07c3WtAs/sZo5PJq7VHjeDg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^3.0.0", "@sigstore/core": "^2.0.0", @@ -9004,15 +8541,13 @@ }, "node_modules/@sinclair/typebox": { "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@sindresorhus/merge-streams": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -9022,36 +8557,32 @@ }, "node_modules/@sinonjs/commons": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.0" } }, "node_modules/@socket.io/component-emitter": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" + "license": "MIT" }, "node_modules/@sqltools/formatter": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.5.tgz", - "integrity": "sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==" + "license": "MIT" }, "node_modules/@swc-node/core": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/@swc-node/core/-/core-1.13.1.tgz", - "integrity": "sha512-emB5l2nZsXjUEAuusqjYvWnQMLWZp6K039Mv8aq5SX1rsNM/N7DNhw1i4/DX7AyzNZ0tT+ASWyTvqEURldp5HA==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/@swc-node/core/-/core-1.13.3.tgz", + "integrity": "sha512-OGsvXIid2Go21kiNqeTIn79jcaX4l0G93X2rAnas4LFoDyA9wAwVK7xZdm+QsKoMn5Mus2yFLCc4OtX2dD/PWA==", "dev": true, "engines": { "node": ">= 10" @@ -9066,17 +8597,18 @@ } }, "node_modules/@swc-node/register": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@swc-node/register/-/register-1.9.2.tgz", - "integrity": "sha512-BBjg0QNuEEmJSoU/++JOXhrjWdu3PTyYeJWsvchsI0Aqtj8ICkz/DqlwtXbmZVZ5vuDPpTfFlwDBZe81zgShMA==", + "version": "1.10.9", + "resolved": "https://registry.npmjs.org/@swc-node/register/-/register-1.10.9.tgz", + "integrity": "sha512-iXy2sjP0phPEpK2yivjRC3PAgoLaT4sjSk0LDWCTdcTBJmR4waEog0E6eJbvoOkLkOtWw37SB8vCkl/bbh4+8A==", "dev": true, "dependencies": { - "@swc-node/core": "^1.13.1", - "@swc-node/sourcemap-support": "^0.5.0", + "@swc-node/core": "^1.13.3", + "@swc-node/sourcemap-support": "^0.5.1", "colorette": "^2.0.20", - "debug": "^4.3.4", + "debug": "^4.3.5", + "oxc-resolver": "^1.10.2", "pirates": "^4.0.6", - "tslib": "^2.6.2" + "tslib": "^2.6.3" }, "funding": { "type": "github", @@ -9087,25 +8619,48 @@ "typescript": ">= 4.3" } }, + "node_modules/@swc-node/register/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@swc-node/register/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, "node_modules/@swc-node/sourcemap-support": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@swc-node/sourcemap-support/-/sourcemap-support-0.5.0.tgz", - "integrity": "sha512-fbhjL5G0YvFoWwNhWleuBUfotiX+USiA9oJqu9STFw+Hb0Cgnddn+HVS/K5fI45mn92e8V+cHD2jgFjk4w2T9Q==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@swc-node/sourcemap-support/-/sourcemap-support-0.5.1.tgz", + "integrity": "sha512-JxIvIo/Hrpv0JCHSyRpetAdQ6lB27oFYhv0PKCNf1g2gUXOjpeR1exrXccRxLMuAV5WAmGFBwRnNOJqN38+qtg==", "dev": true, "dependencies": { "source-map-support": "^0.5.21", - "tslib": "^2.6.2" + "tslib": "^2.6.3" } }, "node_modules/@swc/core": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.5.7.tgz", - "integrity": "sha512-U4qJRBefIJNJDRCCiVtkfa/hpiZ7w0R6kASea+/KLp+vkus3zcLSB8Ub8SvKgTIxjWpwsKcZlPf5nrv4ls46SQ==", + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.11.7.tgz", + "integrity": "sha512-ICuzjyfz8Hh3U16Mb21uCRJeJd/lUgV999GjgvPhJSISM1L8GDSB5/AMNcwuGs7gFywTKI4vAeeXWyCETUXHAg==", "dev": true, "hasInstallScript": true, "dependencies": { - "@swc/counter": "^0.1.2", - "@swc/types": "0.1.7" + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.19" }, "engines": { "node": ">=10" @@ -9115,19 +8670,19 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.5.7", - "@swc/core-darwin-x64": "1.5.7", - "@swc/core-linux-arm-gnueabihf": "1.5.7", - "@swc/core-linux-arm64-gnu": "1.5.7", - "@swc/core-linux-arm64-musl": "1.5.7", - "@swc/core-linux-x64-gnu": "1.5.7", - "@swc/core-linux-x64-musl": "1.5.7", - "@swc/core-win32-arm64-msvc": "1.5.7", - "@swc/core-win32-ia32-msvc": "1.5.7", - "@swc/core-win32-x64-msvc": "1.5.7" + "@swc/core-darwin-arm64": "1.11.7", + "@swc/core-darwin-x64": "1.11.7", + "@swc/core-linux-arm-gnueabihf": "1.11.7", + "@swc/core-linux-arm64-gnu": "1.11.7", + "@swc/core-linux-arm64-musl": "1.11.7", + "@swc/core-linux-x64-gnu": "1.11.7", + "@swc/core-linux-x64-musl": "1.11.7", + "@swc/core-win32-arm64-msvc": "1.11.7", + "@swc/core-win32-ia32-msvc": "1.11.7", + "@swc/core-win32-x64-msvc": "1.11.7" }, "peerDependencies": { - "@swc/helpers": "^0.5.0" + "@swc/helpers": "*" }, "peerDependenciesMeta": { "@swc/helpers": { @@ -9136,9 +8691,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.5.7.tgz", - "integrity": "sha512-bZLVHPTpH3h6yhwVl395k0Mtx8v6CGhq5r4KQdAoPbADU974Mauz1b6ViHAJ74O0IVE5vyy7tD3OpkQxL/vMDQ==", + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.11.7.tgz", + "integrity": "sha512-3+LhCP2H50CLI6yv/lhOtoZ5B/hi7Q/23dye1KhbSDeDprLTm/KfLJh/iQqwaHUponf5m8C2U0y6DD+HGLz8Yw==", "cpu": [ "arm64" ], @@ -9152,9 +8707,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.5.7.tgz", - "integrity": "sha512-RpUyu2GsviwTc2qVajPL0l8nf2vKj5wzO3WkLSHAHEJbiUZk83NJrZd1RVbEknIMO7+Uyjh54hEh8R26jSByaw==", + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.11.7.tgz", + "integrity": "sha512-1diWpJqwX1XmOghf9ENFaeRaTtqLiqlZIW56RfOqmeZ7tPp3qS7VygWb9akptBsO5pEA5ZwNgSerD6AJlQcjAw==", "cpu": [ "x64" ], @@ -9168,9 +8723,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.5.7.tgz", - "integrity": "sha512-cTZWTnCXLABOuvWiv6nQQM0hP6ZWEkzdgDvztgHI/+u/MvtzJBN5lBQ2lue/9sSFYLMqzqff5EHKlFtrJCA9dQ==", + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.11.7.tgz", + "integrity": "sha512-MV8+hLREf0NN23NuSKemsjFaWjl/HnqdOkE7uhXTnHzg8WTwp6ddVtU5Yriv15+d/ktfLWPVAOhLHQ4gzaoa8A==", "cpu": [ "arm" ], @@ -9184,9 +8739,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.5.7.tgz", - "integrity": "sha512-hoeTJFBiE/IJP30Be7djWF8Q5KVgkbDtjySmvYLg9P94bHg9TJPSQoC72tXx/oXOgXvElDe/GMybru0UxhKx4g==", + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.11.7.tgz", + "integrity": "sha512-5GNs8ZjHQy/UTSnzzn+gm1RCUpCYo43lsxYOl8mpcnZSfxkNFVpjfylBv0QuJ5qhdfZ2iU55+v4iJCwCMtw0nA==", "cpu": [ "arm64" ], @@ -9200,9 +8755,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.5.7.tgz", - "integrity": "sha512-+NDhK+IFTiVK1/o7EXdCeF2hEzCiaRSrb9zD7X2Z7inwWlxAntcSuzZW7Y6BRqGQH89KA91qYgwbnjgTQ22PiQ==", + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.11.7.tgz", + "integrity": "sha512-cTydaYBwDbVV5CspwVcCp9IevYWpGD1cF5B5KlBdjmBzxxeWyTAJRtKzn8w5/UJe/MfdAptarpqMPIs2f33YEQ==", "cpu": [ "arm64" ], @@ -9216,9 +8771,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.5.7.tgz", - "integrity": "sha512-25GXpJmeFxKB+7pbY7YQLhWWjkYlR+kHz5I3j9WRl3Lp4v4UD67OGXwPe+DIcHqcouA1fhLhsgHJWtsaNOMBNg==", + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.11.7.tgz", + "integrity": "sha512-YAX2KfYPlbDsnZiVMI4ZwotF3VeURUrzD+emJgFf1g26F4eEmslldgnDrKybW7V+bObsH22cDqoy6jmQZgpuPQ==", "cpu": [ "x64" ], @@ -9232,9 +8787,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.5.7.tgz", - "integrity": "sha512-0VN9Y5EAPBESmSPPsCJzplZHV26akC0sIgd3Hc/7S/1GkSMoeuVL+V9vt+F/cCuzr4VidzSkqftdP3qEIsXSpg==", + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.11.7.tgz", + "integrity": "sha512-mYT6FTDZyYx5pailc8xt6ClS2yjKmP8jNHxA9Ce3K21n5qkKilI5M2N7NShwXkd3Ksw3F29wKrg+wvEMXTRY/A==", "cpu": [ "x64" ], @@ -9248,9 +8803,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.5.7.tgz", - "integrity": "sha512-RtoNnstBwy5VloNCvmvYNApkTmuCe4sNcoYWpmY7C1+bPR+6SOo8im1G6/FpNem8AR5fcZCmXHWQ+EUmRWJyuA==", + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.11.7.tgz", + "integrity": "sha512-uLDQEcv0BHcepypstyxKkNsW6KfLyI5jVxTbcxka+B2UnMcFpvoR87nGt2JYW0grO2SNZPoFz+UnoKL9c6JxpA==", "cpu": [ "arm64" ], @@ -9264,9 +8819,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.5.7.tgz", - "integrity": "sha512-Xm0TfvcmmspvQg1s4+USL3x8D+YPAfX2JHygvxAnCJ0EHun8cm2zvfNBcsTlnwYb0ybFWXXY129aq1wgFC9TpQ==", + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.11.7.tgz", + "integrity": "sha512-wiq5G3fRizdxAJVFcon7zpyfbfrb+YShuTy+TqJ4Nf5PC0ueMOXmsmeuyQGApn6dVWtGCyymYQYt77wHeQajdA==", "cpu": [ "ia32" ], @@ -9280,9 +8835,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.5.7.tgz", - "integrity": "sha512-tp43WfJLCsKLQKBmjmY/0vv1slVywR5Q4qKjF5OIY8QijaEW7/8VwPyUyVoJZEnDgv9jKtUTG5PzqtIYPZGnyg==", + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.11.7.tgz", + "integrity": "sha512-/zQdqY4fHkSORxEJ2cKtRBOwglvf/8gs6Tl4Q6VMx2zFtFpIOwFQstfY5u8wBNN2Z+PkAzyUCPoi8/cQFK8HLQ==", "cpu": [ "x64" ], @@ -9302,18 +8857,18 @@ "dev": true }, "node_modules/@swc/helpers": { - "version": "0.5.11", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.11.tgz", - "integrity": "sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A==", + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", "dev": true, "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.8.0" } }, "node_modules/@swc/types": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.7.tgz", - "integrity": "sha512-scHWahbHF0eyj3JsxG9CFJgFdFNaVQCNAimBlT6PzS3n/HptxqREjsm4OH6AN3lYcffZYSPxXW8ua2BEHp0lJQ==", + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.19.tgz", + "integrity": "sha512-WkAZaAfj44kh/UFdAQcrMP1I0nwRqpt27u+08LMBYMqmQfwwMofYoMh/48NGkMMRfC4ynpfwRbJuu8ErfNloeA==", "dev": true, "dependencies": { "@swc/counter": "^0.1.3" @@ -9321,9 +8876,8 @@ }, "node_modules/@tootallnate/once": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10" } @@ -9339,42 +8893,44 @@ }, "node_modules/@tsconfig/node10": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/@tsconfig/node16": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "devOptional": true + "devOptional": true, + "license": "MIT" + }, + "node_modules/@tsd/typescript": { + "version": "5.4.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.17" + } }, "node_modules/@tufjs/canonical-json": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", - "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", "dev": true, + "license": "MIT", "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/@tufjs/models": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-3.0.1.tgz", - "integrity": "sha512-UUYHISyhCU3ZgN8yaear3cGATHb3SMuKHsQ/nVbHXcmnBf+LzQ/cQfhNG+rfaSHgqGKNEm2cOCLVLELStUQ1JA==", "dev": true, + "license": "MIT", "dependencies": { "@tufjs/canonical-json": "2.0.0", "minimatch": "^9.0.5" @@ -9385,9 +8941,8 @@ }, "node_modules/@tufjs/models/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -9400,23 +8955,20 @@ }, "node_modules/@tybys/wasm-util": { "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", - "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.4.0" } }, "node_modules/@types/argparse": { "version": "1.0.38", - "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", - "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==" + "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -9427,18 +8979,16 @@ }, "node_modules/@types/babel__generator": { "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" @@ -9446,18 +8996,16 @@ }, "node_modules/@types/babel__traverse": { "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.20.7" } }, "node_modules/@types/body-parser": { "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dev": true, + "license": "MIT", "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -9465,41 +9013,32 @@ }, "node_modules/@types/bonjour": { "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect": { "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect-history-api-fallback": { "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", "dev": true, + "license": "MIT", "dependencies": { "@types/express-serve-static-core": "*", "@types/node": "*" } }, - "node_modules/@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" - }, "node_modules/@types/cors": { "version": "2.8.17", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", - "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -9526,15 +9065,13 @@ }, "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 + "dev": true, + "license": "MIT" }, "node_modules/@types/express": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -9543,10 +9080,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.2.tgz", - "integrity": "sha512-vluaspfvWEtE4vcSDlKRNer52DvOGrB2xv6diXy6UKyKW0lqZiWHGNApSyxOv+8DE5Z27IzVvE7hNkxg7EXIcg==", + "version": "5.0.6", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -9556,9 +9092,8 @@ }, "node_modules/@types/express/node_modules/@types/express-serve-static-core": { "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -9568,57 +9103,50 @@ }, "node_modules/@types/graceful-fs": { "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/http-errors": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/http-proxy": { "version": "1.17.15", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", - "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, + "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@types/istanbul-reports": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/istanbul-lib-report": "*" } }, "node_modules/@types/jest": { "version": "29.5.12", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", - "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", "dev": true, + "license": "MIT", "dependencies": { "expect": "^29.0.0", "pretty-format": "^29.0.0" @@ -9626,9 +9154,8 @@ }, "node_modules/@types/jsdom": { "version": "20.0.1", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", - "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "@types/tough-cookie": "*", @@ -9637,9 +9164,8 @@ }, "node_modules/@types/jsdom/node_modules/parse5": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "dev": true, + "license": "MIT", "dependencies": { "entities": "^4.4.0" }, @@ -9649,59 +9175,55 @@ }, "node_modules/@types/json-schema": { "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "node_modules/@types/lodash": { - "version": "4.14.202", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", - "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/mime": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { "version": "18.16.20", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.20.tgz", - "integrity": "sha512-nL54VfDjThdP2UXJXZao5wp76CDiDw4zSRO8d4Tk7UgDqNKGKVEQB0/t3ti63NS+YNNkIQDvwEAF04BO+WYu7Q==" + "license": "MIT" }, "node_modules/@types/node-forge": { "version": "1.3.11", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", - "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "dev": true, + "license": "MIT" + }, "node_modules/@types/parse-json": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/qs": { - "version": "6.9.17", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", - "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==", - "dev": true + "version": "6.9.18", + "dev": true, + "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/retry": { "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", - "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/semver": { "version": "7.5.8", @@ -9711,9 +9233,8 @@ }, "node_modules/@types/send": { "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "dev": true, + "license": "MIT", "dependencies": { "@types/mime": "^1", "@types/node": "*" @@ -9721,18 +9242,16 @@ }, "node_modules/@types/serve-index": { "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", "dev": true, + "license": "MIT", "dependencies": { "@types/express": "*" } }, "node_modules/@types/serve-static": { "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dev": true, + "license": "MIT", "dependencies": { "@types/http-errors": "*", "@types/node": "*", @@ -9741,65 +9260,56 @@ }, "node_modules/@types/sockjs": { "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/stack-utils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/tough-cookie": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/uuid": { "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", - "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/validator": { "version": "13.12.2", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.2.tgz", - "integrity": "sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==" + "license": "MIT" }, "node_modules/@types/ws": { - "version": "8.5.13", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", - "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", + "version": "8.5.14", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/yargs": { "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, + "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", - "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "7.18.0", @@ -9830,9 +9340,8 @@ }, "node_modules/@typescript-eslint/parser": { "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", - "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", @@ -9858,9 +9367,8 @@ }, "node_modules/@typescript-eslint/scope-manager": { "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", - "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" @@ -9875,9 +9383,8 @@ }, "node_modules/@typescript-eslint/type-utils": { "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", - "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/typescript-estree": "7.18.0", "@typescript-eslint/utils": "7.18.0", @@ -9902,9 +9409,8 @@ }, "node_modules/@typescript-eslint/types": { "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", - "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || >=20.0.0" }, @@ -9915,9 +9421,8 @@ }, "node_modules/@typescript-eslint/typescript-estree": { "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", - "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", @@ -9943,9 +9448,8 @@ }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -9958,9 +9462,8 @@ }, "node_modules/@typescript-eslint/utils": { "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", - "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", @@ -9980,9 +9483,8 @@ }, "node_modules/@typescript-eslint/visitor-keys": { "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", - "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "7.18.0", "eslint-visitor-keys": "^3.4.3" @@ -9997,8 +9499,87 @@ }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@verdaccio/auth": { + "version": "8.0.0-next-8.7", + "resolved": "https://registry.npmjs.org/@verdaccio/auth/-/auth-8.0.0-next-8.7.tgz", + "integrity": "sha512-CSLBAsCJT1oOpJ4OWnVGmN6o/ZilDNa7Aa5+AU1LI2lbRblqgr4BVRn07GFqimJ//6+tPzl8BHgyiCbBhh1ZiA==", + "dev": true, + "dependencies": { + "@verdaccio/config": "8.0.0-next-8.7", + "@verdaccio/core": "8.0.0-next-8.7", + "@verdaccio/loaders": "8.0.0-next-8.4", + "@verdaccio/signature": "8.0.0-next-8.1", + "@verdaccio/utils": "8.1.0-next-8.7", + "debug": "4.4.0", + "lodash": "4.17.21", + "verdaccio-htpasswd": "13.0.0-next-8.7" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" + } + }, + "node_modules/@verdaccio/auth/node_modules/@verdaccio/utils": { + "version": "8.1.0-next-8.7", + "resolved": "https://registry.npmjs.org/@verdaccio/utils/-/utils-8.1.0-next-8.7.tgz", + "integrity": "sha512-4eqPCnPAJsL6gdVs0/oqZNgs2PnQW3HHBMgBHyEbb5A/ESI10TvRp+B7MRl9glUmy/aR5B6YSI68rgXvAFjdxA==", + "dev": true, + "dependencies": { + "@verdaccio/core": "8.0.0-next-8.7", + "lodash": "4.17.21", + "minimatch": "7.4.6", + "semver": "7.6.3" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" + } + }, + "node_modules/@verdaccio/auth/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@verdaccio/auth/node_modules/minimatch": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@verdaccio/auth/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "node_modules/@verdaccio/commons-api": { @@ -10025,18 +9606,36 @@ "dev": true }, "node_modules/@verdaccio/config": { - "version": "7.0.0-next-7.10", - "resolved": "https://registry.npmjs.org/@verdaccio/config/-/config-7.0.0-next-7.10.tgz", - "integrity": "sha512-mB3qaf8wW4sUgS0h3Z4TXYH/V9spjjFA33kNqWl78IMJHipBddbyBvdmfh/vo/NGtfju8DrDbRZlhKCl6293Qg==", + "version": "8.0.0-next-8.7", + "resolved": "https://registry.npmjs.org/@verdaccio/config/-/config-8.0.0-next-8.7.tgz", + "integrity": "sha512-pA0WCWvvWY6vPRav+X0EuFmuK6M08zIpRzTKkqSriCWk6JUCZ07TDnN054AS8TSSOy6EaWgHxnUw3nTd34Z4Sg==", "dev": true, "dependencies": { - "@verdaccio/core": "7.0.0-next-7.10", - "@verdaccio/utils": "7.0.0-next-7.10", - "debug": "4.3.4", + "@verdaccio/core": "8.0.0-next-8.7", + "@verdaccio/utils": "8.1.0-next-8.7", + "debug": "4.4.0", "js-yaml": "4.1.0", "lodash": "4.17.21", + "minimatch": "7.4.6" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" + } + }, + "node_modules/@verdaccio/config/node_modules/@verdaccio/utils": { + "version": "8.1.0-next-8.7", + "resolved": "https://registry.npmjs.org/@verdaccio/utils/-/utils-8.1.0-next-8.7.tgz", + "integrity": "sha512-4eqPCnPAJsL6gdVs0/oqZNgs2PnQW3HHBMgBHyEbb5A/ESI10TvRp+B7MRl9glUmy/aR5B6YSI68rgXvAFjdxA==", + "dev": true, + "dependencies": { + "@verdaccio/core": "8.0.0-next-8.7", + "lodash": "4.17.21", "minimatch": "7.4.6", - "yup": "0.32.11" + "semver": "7.6.3" }, "engines": { "node": ">=12" @@ -10046,6 +9645,23 @@ "url": "https://opencollective.com/verdaccio" } }, + "node_modules/@verdaccio/config/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/@verdaccio/config/node_modules/minimatch": { "version": "7.4.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", @@ -10061,37 +9677,47 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@verdaccio/config/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, "node_modules/@verdaccio/core": { - "version": "7.0.0-next-7.10", - "resolved": "https://registry.npmjs.org/@verdaccio/core/-/core-7.0.0-next-7.10.tgz", - "integrity": "sha512-kS7/x5y9knbkSksHeawRV5Af8p/g0qk9GgQOZjuvOtv08kMFSttYk/eDglE9++SbvqP34+sDraUIMB/C3tZ2fw==", + "version": "8.0.0-next-8.7", + "resolved": "https://registry.npmjs.org/@verdaccio/core/-/core-8.0.0-next-8.7.tgz", + "integrity": "sha512-pf8M2Z5EI/5Zdhdcm3aadb9Q9jiDsIredPD3+cIoDum8x3di2AIYvQD7i5BEramfzZlLXVICmFAulU7nUY11qg==", "dev": true, "dependencies": { - "ajv": "8.12.0", - "core-js": "3.35.0", + "ajv": "8.17.1", + "core-js": "3.37.1", "http-errors": "2.0.0", "http-status-codes": "2.3.0", "process-warning": "1.0.0", - "semver": "7.5.4" + "semver": "7.6.3" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/verdaccio" } }, - "node_modules/@verdaccio/core/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@verdaccio/core/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, - "engines": { - "node": ">=10" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/@verdaccio/core/node_modules/process-warning": { @@ -10100,27 +9726,6 @@ "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==", "dev": true }, - "node_modules/@verdaccio/core/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@verdaccio/core/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@verdaccio/file-locking": { "version": "10.3.1", "resolved": "https://registry.npmjs.org/@verdaccio/file-locking/-/file-locking-10.3.1.tgz", @@ -10137,10 +9742,50 @@ "url": "https://opencollective.com/verdaccio" } }, - "node_modules/@verdaccio/local-storage": { - "version": "10.3.3", - "resolved": "https://registry.npmjs.org/@verdaccio/local-storage/-/local-storage-10.3.3.tgz", - "integrity": "sha512-/n0FH+1hxVg80YhYBfJuW7F2AuvLY2fra8/DTCilWDll9Y5yZDxwntZfcKHJLerCA4atrbJtvaqpWkoV3Q9x8w==", + "node_modules/@verdaccio/loaders": { + "version": "8.0.0-next-8.4", + "resolved": "https://registry.npmjs.org/@verdaccio/loaders/-/loaders-8.0.0-next-8.4.tgz", + "integrity": "sha512-Powlqb4SuMbe6RVgxyyOXaCjuHCcK7oZA+lygaKZDpV9NSHJtbkkV4L+rXyCfTX3b0tKsBh7FzaIdgWc1rDeGQ==", + "dev": true, + "dependencies": { + "debug": "4.3.7", + "lodash": "4.17.21" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" + } + }, + "node_modules/@verdaccio/loaders/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@verdaccio/loaders/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/@verdaccio/local-storage-legacy": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/@verdaccio/local-storage-legacy/-/local-storage-legacy-11.0.2.tgz", + "integrity": "sha512-7AXG7qlcVFmF+Nue2oKaraprGRtaBvrQIOvc/E89+7hAe399V01KnZI6E/ET56u7U9fq0MSlp92HBcdotlpUXg==", "dev": true, "dependencies": { "@verdaccio/commons-api": "10.2.0", @@ -10153,20 +9798,20 @@ "mkdirp": "1.0.4" }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/verdaccio" } }, - "node_modules/@verdaccio/local-storage/node_modules/async": { + "node_modules/@verdaccio/local-storage-legacy/node_modules/async": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "dev": true }, - "node_modules/@verdaccio/local-storage/node_modules/mkdirp": { + "node_modules/@verdaccio/local-storage-legacy/node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", @@ -10178,133 +9823,79 @@ "node": ">=10" } }, - "node_modules/@verdaccio/logger-7": { - "version": "7.0.0-next-7.10", - "resolved": "https://registry.npmjs.org/@verdaccio/logger-7/-/logger-7-7.0.0-next-7.10.tgz", - "integrity": "sha512-UgbZnnapLmvcVMz7HzJhsyMTFLhVcAKTwKW/5dtaSwD2XrP721YawdTwJEPZnhcNrTcD9dUvRGfW4Dr/5QzJcg==", + "node_modules/@verdaccio/logger": { + "version": "8.0.0-next-8.7", + "resolved": "https://registry.npmjs.org/@verdaccio/logger/-/logger-8.0.0-next-8.7.tgz", + "integrity": "sha512-5EMPdZhz2V08BP2rjhtN/Fz5KxCfPJBkYDitbk/eo+FCZ9nVdMCQE3WRbHEaXyJQcIso/LJ6RnL/zKN20E/rPg==", "dev": true, "dependencies": { - "@verdaccio/logger-commons": "7.0.0-next-7.10", - "pino": "7.11.0" + "@verdaccio/logger-commons": "8.0.0-next-8.7", + "pino": "9.5.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/verdaccio" } }, - "node_modules/@verdaccio/logger-7/node_modules/on-exit-leak-free": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz", - "integrity": "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==", - "dev": true - }, - "node_modules/@verdaccio/logger-7/node_modules/pino": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-7.11.0.tgz", - "integrity": "sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==", + "node_modules/@verdaccio/logger-commons": { + "version": "8.0.0-next-8.7", + "resolved": "https://registry.npmjs.org/@verdaccio/logger-commons/-/logger-commons-8.0.0-next-8.7.tgz", + "integrity": "sha512-sXNx57G1LVp81xF4qHer3AOcMEZ90W4FjxtYF0vmULcVg3ybdtStKAT/9ocZtVMvLWTPAauhqylfnXoRZYf32A==", "dev": true, "dependencies": { - "atomic-sleep": "^1.0.0", - "fast-redact": "^3.0.0", - "on-exit-leak-free": "^0.2.0", - "pino-abstract-transport": "v0.5.0", - "pino-std-serializers": "^4.0.0", - "process-warning": "^1.0.0", - "quick-format-unescaped": "^4.0.3", - "real-require": "^0.1.0", - "safe-stable-stringify": "^2.1.0", - "sonic-boom": "^2.2.1", - "thread-stream": "^0.15.1" + "@verdaccio/core": "8.0.0-next-8.7", + "@verdaccio/logger-prettify": "8.0.0-next-8.1", + "colorette": "2.0.20", + "debug": "4.4.0" }, - "bin": { - "pino": "bin.js" - } - }, - "node_modules/@verdaccio/logger-7/node_modules/pino-abstract-transport": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz", - "integrity": "sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==", - "dev": true, - "dependencies": { - "duplexify": "^4.1.2", - "split2": "^4.0.0" - } - }, - "node_modules/@verdaccio/logger-7/node_modules/pino-std-serializers": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz", - "integrity": "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==", - "dev": true - }, - "node_modules/@verdaccio/logger-7/node_modules/process-warning": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz", - "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==", - "dev": true - }, - "node_modules/@verdaccio/logger-7/node_modules/real-require": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.1.0.tgz", - "integrity": "sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==", - "dev": true, "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/@verdaccio/logger-7/node_modules/sonic-boom": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.8.0.tgz", - "integrity": "sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==", - "dev": true, - "dependencies": { - "atomic-sleep": "^1.0.0" - } - }, - "node_modules/@verdaccio/logger-7/node_modules/thread-stream": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-0.15.2.tgz", - "integrity": "sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==", - "dev": true, - "dependencies": { - "real-require": "^0.1.0" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" } }, - "node_modules/@verdaccio/logger-commons": { - "version": "7.0.0-next-7.10", - "resolved": "https://registry.npmjs.org/@verdaccio/logger-commons/-/logger-commons-7.0.0-next-7.10.tgz", - "integrity": "sha512-RTA4K6KvoCrgqA1aVP4n8IDZfUQtaza2FcPjEsBShLQg0rHFJi/5/yQg+J4MpOvYlKbrusOy9pwN86h9pCe+CA==", + "node_modules/@verdaccio/logger-commons/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, "dependencies": { - "@verdaccio/core": "7.0.0-next-7.10", - "@verdaccio/logger-prettify": "7.0.0-next.1", - "colorette": "2.0.20", - "debug": "4.3.4" + "ms": "^2.1.3" }, "engines": { - "node": ">=12" + "node": ">=6.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/verdaccio" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, + "node_modules/@verdaccio/logger-commons/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, "node_modules/@verdaccio/logger-prettify": { - "version": "7.0.0-next.1", - "resolved": "https://registry.npmjs.org/@verdaccio/logger-prettify/-/logger-prettify-7.0.0-next.1.tgz", - "integrity": "sha512-ZF71AS2k0OiSnKVT05+NUWARZ+yn0keGAlpkgNWU7SHiYeFS1ZDVpapi9PXR23gJ5U756fyPKaqvlRcYgEpsgA==", + "version": "8.0.0-next-8.1", + "resolved": "https://registry.npmjs.org/@verdaccio/logger-prettify/-/logger-prettify-8.0.0-next-8.1.tgz", + "integrity": "sha512-vLhaGq0q7wtMCcqa0aQY6QOsMNarhTu/l4e6Z8mG/5LUH95GGLsBwpXLnKS94P3deIjsHhc9ycnEmG39txbQ1w==", "dev": true, "dependencies": { "colorette": "2.0.20", - "dayjs": "1.11.7", + "dayjs": "1.11.13", "lodash": "4.17.21", - "pino-abstract-transport": "1.0.0", - "sonic-boom": "3.3.0" + "pino-abstract-transport": "1.2.0", + "sonic-boom": "3.8.1" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "type": "opencollective", @@ -10335,16 +9926,10 @@ "ieee754": "^1.2.1" } }, - "node_modules/@verdaccio/logger-prettify/node_modules/dayjs": { - "version": "1.11.7", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", - "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==", - "dev": true - }, "node_modules/@verdaccio/logger-prettify/node_modules/pino-abstract-transport": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.0.0.tgz", - "integrity": "sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", + "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", "dev": true, "dependencies": { "readable-stream": "^4.0.0", @@ -10352,9 +9937,9 @@ } }, "node_modules/@verdaccio/logger-prettify/node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", "dev": true, "dependencies": { "abort-controller": "^3.0.0", @@ -10368,9 +9953,9 @@ } }, "node_modules/@verdaccio/logger-prettify/node_modules/sonic-boom": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.3.0.tgz", - "integrity": "sha512-LYxp34KlZ1a2Jb8ZQgFCK3niIHzibdwtwNUWKg0qQRzsDoJ3Gfgkf8KdBTFU3SkejDEIlWwnSnpVdOZIhFMl/g==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.8.1.tgz", + "integrity": "sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==", "dev": true, "dependencies": { "atomic-sleep": "^1.0.0" @@ -10385,23 +9970,64 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/@verdaccio/logger/node_modules/pino": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.5.0.tgz", + "integrity": "sha512-xSEmD4pLnV54t0NOUN16yCl7RIB1c5UUOse5HSyEXtBp+FgFQyPeDutc+Q2ZO7/22vImV7VfEjH/1zV2QuqvYw==", + "dev": true, + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^2.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^4.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, "node_modules/@verdaccio/middleware": { - "version": "7.0.0-next-7.10", - "resolved": "https://registry.npmjs.org/@verdaccio/middleware/-/middleware-7.0.0-next-7.10.tgz", - "integrity": "sha512-NBQxi6ag2zSIoUUmnQn/n0YwJDnnHqqtyV5c73YTdQV5RSPn5i2YKz+8DSA+iJYa2ff8G4fx8hOdJR+QZZQ24w==", + "version": "8.0.0-next-8.7", + "resolved": "https://registry.npmjs.org/@verdaccio/middleware/-/middleware-8.0.0-next-8.7.tgz", + "integrity": "sha512-Zad7KcdOsI1DUBt1TjQb08rIi/IFFaJKdPhj7M6oy5BX9l/4OM0TtbBueHFNS1+aU+t5eo8ue7ZHbqmjDY/6VQ==", "dev": true, "dependencies": { - "@verdaccio/config": "7.0.0-next-7.10", - "@verdaccio/core": "7.0.0-next-7.10", - "@verdaccio/url": "12.0.0-next-7.10", - "@verdaccio/utils": "7.0.0-next-7.10", - "debug": "4.3.4", - "express": "4.18.2", + "@verdaccio/config": "8.0.0-next-8.7", + "@verdaccio/core": "8.0.0-next-8.7", + "@verdaccio/url": "13.0.0-next-8.7", + "@verdaccio/utils": "8.1.0-next-8.7", + "debug": "4.4.0", + "express": "4.21.2", "express-rate-limit": "5.5.1", "lodash": "4.17.21", "lru-cache": "7.18.3", "mime": "2.6.0" }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" + } + }, + "node_modules/@verdaccio/middleware/node_modules/@verdaccio/utils": { + "version": "8.1.0-next-8.7", + "resolved": "https://registry.npmjs.org/@verdaccio/utils/-/utils-8.1.0-next-8.7.tgz", + "integrity": "sha512-4eqPCnPAJsL6gdVs0/oqZNgs2PnQW3HHBMgBHyEbb5A/ESI10TvRp+B7MRl9glUmy/aR5B6YSI68rgXvAFjdxA==", + "dev": true, + "dependencies": { + "@verdaccio/core": "8.0.0-next-8.7", + "lodash": "4.17.21", + "minimatch": "7.4.6", + "semver": "7.6.3" + }, "engines": { "node": ">=12" }, @@ -10410,6 +10036,23 @@ "url": "https://opencollective.com/verdaccio" } }, + "node_modules/@verdaccio/middleware/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/@verdaccio/middleware/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -10431,13 +10074,34 @@ "node": ">=4.0.0" } }, - "node_modules/@verdaccio/search": { - "version": "7.0.0-next.2", - "resolved": "https://registry.npmjs.org/@verdaccio/search/-/search-7.0.0-next.2.tgz", - "integrity": "sha512-NoGSpubKB+SB4gRMIoEl3E3NkoKE5f0DnANghB3SnMtVxpJGdwZgylosqDxt8swhQ80+16hYdAp6g44uhjVE6Q==", + "node_modules/@verdaccio/middleware/node_modules/minimatch": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, "engines": { - "node": ">=12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@verdaccio/middleware/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/@verdaccio/search-indexer": { + "version": "8.0.0-next-8.2", + "resolved": "https://registry.npmjs.org/@verdaccio/search-indexer/-/search-indexer-8.0.0-next-8.2.tgz", + "integrity": "sha512-sWliVN5BkAGbZ3e/GD0CsZMfPJdRMRuN0tEKQFsvEJifxToq5UkfCw6vKaVvhezsTWqb+Rp5y+2d4n5BDOA49w==", + "dev": true, + "engines": { + "node": ">=18" }, "funding": { "type": "opencollective", @@ -10445,22 +10109,45 @@ } }, "node_modules/@verdaccio/signature": { - "version": "7.0.0-next.3", - "resolved": "https://registry.npmjs.org/@verdaccio/signature/-/signature-7.0.0-next.3.tgz", - "integrity": "sha512-egs1VmEe+COUUZ83I6gzDy79Jo3b/AExPvp9EDuJHkmwxJj+9gb231Rv4wk+UoNPrQRNLljUepQwVrDmbqP5DQ==", + "version": "8.0.0-next-8.1", + "resolved": "https://registry.npmjs.org/@verdaccio/signature/-/signature-8.0.0-next-8.1.tgz", + "integrity": "sha512-lHD/Z2FoPQTtDYz6ZlXhj/lrg0SFirHrwCGt/cibl1GlePpx78WPdo03tgAyl0Qf+I35n484/gR1l9eixBQqYw==", "dev": true, "dependencies": { - "debug": "4.3.4", + "debug": "4.3.7", "jsonwebtoken": "9.0.2" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/verdaccio" } }, + "node_modules/@verdaccio/signature/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@verdaccio/signature/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, "node_modules/@verdaccio/streams": { "version": "10.2.1", "resolved": "https://registry.npmjs.org/@verdaccio/streams/-/streams-10.2.1.tgz", @@ -10476,16 +10163,37 @@ } }, "node_modules/@verdaccio/tarball": { - "version": "12.0.0-next-7.10", - "resolved": "https://registry.npmjs.org/@verdaccio/tarball/-/tarball-12.0.0-next-7.10.tgz", - "integrity": "sha512-kxctkPREUpe0oRDsTelKcLsWGv2llRBcK2AlyCAX7UENKGWvVqITTk81PkVpzlwXOpcRWdLJQmEE+dtXGwLr6Q==", + "version": "13.0.0-next-8.7", + "resolved": "https://registry.npmjs.org/@verdaccio/tarball/-/tarball-13.0.0-next-8.7.tgz", + "integrity": "sha512-EWRuEOLgb3UETxUsYg6+Mml6DDRiwQqKIEsE4Ys6y6rcH2vgW6XMnTt+s/v5pFI+zlbi6fxjOgQB1e6IJAwxVA==", "dev": true, "dependencies": { - "@verdaccio/core": "7.0.0-next-7.10", - "@verdaccio/url": "12.0.0-next-7.10", - "@verdaccio/utils": "7.0.0-next-7.10", - "debug": "4.3.4", - "lodash": "4.17.21" + "@verdaccio/core": "8.0.0-next-8.7", + "@verdaccio/url": "13.0.0-next-8.7", + "@verdaccio/utils": "8.1.0-next-8.7", + "debug": "4.4.0", + "gunzip-maybe": "^1.4.2", + "lodash": "4.17.21", + "tar-stream": "^3.1.7" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" + } + }, + "node_modules/@verdaccio/tarball/node_modules/@verdaccio/utils": { + "version": "8.1.0-next-8.7", + "resolved": "https://registry.npmjs.org/@verdaccio/utils/-/utils-8.1.0-next-8.7.tgz", + "integrity": "sha512-4eqPCnPAJsL6gdVs0/oqZNgs2PnQW3HHBMgBHyEbb5A/ESI10TvRp+B7MRl9glUmy/aR5B6YSI68rgXvAFjdxA==", + "dev": true, + "dependencies": { + "@verdaccio/core": "8.0.0-next-8.7", + "lodash": "4.17.21", + "minimatch": "7.4.6", + "semver": "7.6.3" }, "engines": { "node": ">=12" @@ -10495,22 +10203,113 @@ "url": "https://opencollective.com/verdaccio" } }, - "node_modules/@verdaccio/ui-theme": { - "version": "7.0.0-next-7.10", - "resolved": "https://registry.npmjs.org/@verdaccio/ui-theme/-/ui-theme-7.0.0-next-7.10.tgz", - "integrity": "sha512-I1War/XBg3WzzAojXDtEDjZw/1qPKW0d8EIsJD3h6Xi5Atzvz/xBTbHjgbwApjmISyDWQ8Vevp8zOtGO33zLSw==", + "node_modules/@verdaccio/tarball/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@verdaccio/tarball/node_modules/minimatch": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@verdaccio/tarball/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/@verdaccio/tarball/node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/@verdaccio/ui-theme": { + "version": "8.0.0-next-8.7", + "resolved": "https://registry.npmjs.org/@verdaccio/ui-theme/-/ui-theme-8.0.0-next-8.7.tgz", + "integrity": "sha512-+7f7XqqIU+TVCHjsP6lWzCdsD4sM7MEhn4cu3mLW1kJZ7eenWKEltoqixQnoXJzaBjCiz+yXW1WkjMyEFLNbpg==", + "dev": true + }, + "node_modules/@verdaccio/url": { + "version": "13.0.0-next-8.7", + "resolved": "https://registry.npmjs.org/@verdaccio/url/-/url-13.0.0-next-8.7.tgz", + "integrity": "sha512-biFvwH3zIXYicA+SXNGvjMAe8oIQ5VddsfbO0ZXWlFs0lIz8cgI7QYPeSiCkU2VKpGzZ8pEKgqkxFsfFkU5kGA==", + "dev": true, + "dependencies": { + "@verdaccio/core": "8.0.0-next-8.7", + "debug": "4.4.0", + "lodash": "4.17.21", + "validator": "13.12.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" + } + }, + "node_modules/@verdaccio/url/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@verdaccio/url/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "node_modules/@verdaccio/url": { - "version": "12.0.0-next-7.10", - "resolved": "https://registry.npmjs.org/@verdaccio/url/-/url-12.0.0-next-7.10.tgz", - "integrity": "sha512-AiFG+W/H1iD+iXkh4b6zm3AsZdGdI7tiAPCHymN7jSV6dAvWTuhIEK30mmFyCSmOE0iwyn8ZN4xqsf9Qcu1emw==", + "node_modules/@verdaccio/utils": { + "version": "7.0.1-next-8.1", + "resolved": "https://registry.npmjs.org/@verdaccio/utils/-/utils-7.0.1-next-8.1.tgz", + "integrity": "sha512-cyJdRrVa+8CS7UuIQb3K3IJFjMe64v38tYiBnohSmhRbX7dX9IT3jWbjrwkqWh4KeS1CS6BYENrGG1evJ2ggrQ==", "dev": true, "dependencies": { - "@verdaccio/core": "7.0.0-next-7.10", - "debug": "4.3.4", + "@verdaccio/core": "8.0.0-next-8.1", "lodash": "4.17.21", - "validator": "13.11.0" + "minimatch": "7.4.6", + "semver": "7.6.3" }, "engines": { "node": ">=12" @@ -10520,35 +10319,41 @@ "url": "https://opencollective.com/verdaccio" } }, - "node_modules/@verdaccio/utils": { - "version": "7.0.0-next-7.10", - "resolved": "https://registry.npmjs.org/@verdaccio/utils/-/utils-7.0.0-next-7.10.tgz", - "integrity": "sha512-3sGyBj0leN3RjwPJPDkdsD9j1ahzQccHPj86IlIJqUJFhAcOT/nD6z9+W3sBAiro6Q2psWyWHxBJ8H3LhtlLeA==", + "node_modules/@verdaccio/utils/node_modules/@verdaccio/core": { + "version": "8.0.0-next-8.1", + "resolved": "https://registry.npmjs.org/@verdaccio/core/-/core-8.0.0-next-8.1.tgz", + "integrity": "sha512-kQRCB2wgXEh8H88G51eQgAFK9IxmnBtkQ8sY5FbmB6PbBkyHrbGcCp+2mtRqqo36j0W1VAlfM3XzoknMy6qQnw==", "dev": true, "dependencies": { - "@verdaccio/core": "7.0.0-next-7.10", - "lodash": "4.17.21", - "minimatch": "7.4.6", - "semver": "7.5.4" + "ajv": "8.17.1", + "core-js": "3.37.1", + "http-errors": "2.0.0", + "http-status-codes": "2.3.0", + "process-warning": "1.0.0", + "semver": "7.6.3" }, "engines": { - "node": ">=12" + "node": ">=14" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/verdaccio" } }, - "node_modules/@verdaccio/utils/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@verdaccio/utils/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, - "engines": { - "node": ">=10" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/@verdaccio/utils/node_modules/minimatch": { @@ -10566,37 +10371,22 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@verdaccio/utils/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@verdaccio/utils/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "node_modules/@verdaccio/utils/node_modules/process-warning": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz", + "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==", "dev": true }, "node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", - "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.2.0.tgz", + "integrity": "sha512-mkQnxTkcldAzIsomk1UuLfAu9n+kpQ3JbHcpCp7d2Oo6ITtji8pHS3QToOWjhPFvNQSnhlkAjmGbhv2QvwO/7Q==", "dev": true, "engines": { - "node": ">=14.6.0" + "node": ">=14.21.3" }, "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" } }, "node_modules/@webassemblyjs/ast": { @@ -10747,9 +10537,8 @@ }, "node_modules/@webpack-cli/configtest": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", - "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.15.0" }, @@ -10760,9 +10549,8 @@ }, "node_modules/@webpack-cli/info": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", - "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.15.0" }, @@ -10773,9 +10561,8 @@ }, "node_modules/@webpack-cli/serve": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", - "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.15.0" }, @@ -10803,9 +10590,8 @@ }, "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/@yarnpkg/parsers": { "version": "3.0.2", @@ -10862,16 +10648,13 @@ }, "node_modules/abab": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "deprecated": "Use your platform's native atob() and btoa() methods instead", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/abbrev": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", "dev": true, + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -10880,6 +10663,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, "dependencies": { "event-target-shim": "^5.0.0" }, @@ -10889,8 +10673,7 @@ }, "node_modules/accepts": { "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -10901,9 +10684,8 @@ }, "node_modules/acorn": { "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "devOptional": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -10913,56 +10695,41 @@ }, "node_modules/acorn-globals": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", - "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", "dev": true, + "license": "MIT", "dependencies": { "acorn": "^8.1.0", "acorn-walk": "^8.0.2" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "deprecated": "package has been renamed to acorn-import-attributes", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/acorn-walk": { "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/address": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/adjust-sourcemap-loader": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", - "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", "dev": true, + "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "regex-parser": "^2.2.11" @@ -10973,9 +10740,8 @@ }, "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, + "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -10996,9 +10762,8 @@ }, "node_modules/agent-base": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.2.tgz", - "integrity": "sha512-JVzqkCNRT+VfqzzgPWDPnwvDheSAUdiMUn3NoLXpDJF5lRqeJqyC9iGsAxIOAW+mzIdq+uP1TvcX6bMtrH0agg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.3.4" }, @@ -11008,9 +10773,8 @@ }, "node_modules/ajv": { "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "devOptional": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -11024,8 +10788,7 @@ }, "node_modules/ajv-draft-04": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", - "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "license": "MIT", "peerDependencies": { "ajv": "^8.5.0" }, @@ -11037,9 +10800,8 @@ }, "node_modules/ajv-formats": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -11054,9 +10816,8 @@ }, "node_modules/ajv-keywords": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -11066,17 +10827,15 @@ }, "node_modules/ansi-colors": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/ansi-escapes": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.21.3" }, @@ -11089,28 +10848,25 @@ }, "node_modules/ansi-html-community": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "dev": true, "engines": [ "node >= 0.8.0" ], + "license": "Apache-2.0", "bin": { "ansi-html": "bin/ansi-html" } }, "node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -11123,14 +10879,12 @@ }, "node_modules/any-promise": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + "license": "MIT" }, "node_modules/anymatch": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -11141,9 +10895,8 @@ }, "node_modules/anymatch/node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -11162,56 +10915,57 @@ }, "node_modules/app-root-path": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz", - "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==", + "license": "MIT", "engines": { "node": ">= 6.0.0" } }, "node_modules/append-field": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" + "license": "MIT" }, "node_modules/arg": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "license": "Python-2.0" }, "node_modules/aria-query": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">= 0.4" } }, "node_modules/array-flatten": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + "dev": true, + "license": "MIT" }, "node_modules/array-timsort": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", - "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/array-union": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/arrify": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -11231,15 +10985,14 @@ } }, "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "dev": true }, "node_modules/asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "license": "MIT" }, "node_modules/at-least-node": { "version": "1.0.0", @@ -11252,16 +11005,13 @@ }, "node_modules/atomic-sleep": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", - "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "license": "MIT", "engines": { "node": ">=8.0.0" } }, "node_modules/autoprefixer": { "version": "10.4.20", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", - "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", "dev": true, "funding": [ { @@ -11277,6 +11027,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "browserslist": "^4.23.3", "caniuse-lite": "^1.0.30001646", @@ -11306,22 +11057,20 @@ }, "node_modules/aws-ssl-profiles": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", - "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==", + "license": "MIT", "engines": { "node": ">= 6.0.0" } }, "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", "dev": true }, "node_modules/axios": { "version": "1.7.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", - "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", + "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -11330,18 +11079,22 @@ }, "node_modules/axobject-query": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">= 0.4" } }, + "node_modules/b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "dev": true + }, "node_modules/babel-jest": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -11360,9 +11113,8 @@ }, "node_modules/babel-jest/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -11376,9 +11128,8 @@ }, "node_modules/babel-loader": { "version": "9.2.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", - "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", "dev": true, + "license": "MIT", "dependencies": { "find-cache-dir": "^4.0.0", "schema-utils": "^4.0.0" @@ -11393,9 +11144,8 @@ }, "node_modules/babel-loader/node_modules/find-cache-dir": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", "dev": true, + "license": "MIT", "dependencies": { "common-path-prefix": "^3.0.0", "pkg-dir": "^7.0.0" @@ -11409,9 +11159,8 @@ }, "node_modules/babel-loader/node_modules/find-up": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" @@ -11425,9 +11174,8 @@ }, "node_modules/babel-loader/node_modules/locate-path": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^6.0.0" }, @@ -11440,9 +11188,8 @@ }, "node_modules/babel-loader/node_modules/p-limit": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^1.0.0" }, @@ -11455,9 +11202,8 @@ }, "node_modules/babel-loader/node_modules/p-locate": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^4.0.0" }, @@ -11470,18 +11216,16 @@ }, "node_modules/babel-loader/node_modules/path-exists": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/babel-loader/node_modules/pkg-dir": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^6.3.0" }, @@ -11494,9 +11238,8 @@ }, "node_modules/babel-loader/node_modules/yocto-queue": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", - "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.20" }, @@ -11506,9 +11249,8 @@ }, "node_modules/babel-plugin-const-enum": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-const-enum/-/babel-plugin-const-enum-1.2.0.tgz", - "integrity": "sha512-o1m/6iyyFnp9MRsK1dHF3bneqyf3AlM2q3A/YbgQr2pCat6B6XJVDv2TXqzfY2RYUi4mak6WAksSBPlyYGx9dg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-syntax-typescript": "^7.3.3", @@ -11520,9 +11262,8 @@ }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -11536,9 +11277,8 @@ }, "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -11552,18 +11292,16 @@ }, "node_modules/babel-plugin-istanbul/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/babel-plugin-jest-hoist": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -11575,21 +11313,23 @@ } }, "node_modules/babel-plugin-macros": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", - "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", + "version": "3.1.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" } }, "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", @@ -11601,18 +11341,16 @@ }, "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" @@ -11623,9 +11361,8 @@ }, "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" }, @@ -11635,18 +11372,16 @@ }, "node_modules/babel-plugin-transform-typescript-metadata": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-typescript-metadata/-/babel-plugin-transform-typescript-metadata-0.3.2.tgz", - "integrity": "sha512-mWEvCQTgXQf48yDqgN7CH50waTyYBeP2Lpqx4nNWab9sxEpdXVeKgfj1qYI2/TgUPQtNFZ85i3PemRtnXVYYJg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0" } }, "node_modules/babel-preset-current-node-syntax": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -11667,9 +11402,8 @@ }, "node_modules/babel-preset-jest": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, + "license": "MIT", "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -11683,13 +11417,17 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "license": "MIT" + }, + "node_modules/bare-events": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", + "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "dev": true, + "optional": true }, "node_modules/base64-js": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -11703,12 +11441,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/base64id": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "license": "MIT", "engines": { "node": "^4.5.0 || >= 5.9" } @@ -11733,9 +11471,8 @@ }, "node_modules/batch": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", @@ -11753,35 +11490,36 @@ "dev": true }, "node_modules/beasties": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.1.0.tgz", - "integrity": "sha512-+Ssscd2gVG24qRNC+E2g88D+xsQW4xwakWtKAiGEQ3Pw54/FGdyo9RrfxhGhEv6ilFVbB7r3Lgx+QnAxnSpECw==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.2.0.tgz", + "integrity": "sha512-Ljqskqx/tbZagIglYoJIMzH5zgssyp+in9+9sAyh15N22AornBeIDnb8EZ6Rk+6ShfMxd92uO3gfpT0NtZbpow==", "dev": true, "dependencies": { "css-select": "^5.1.0", "css-what": "^6.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", - "htmlparser2": "^9.0.0", + "htmlparser2": "^9.1.0", "picocolors": "^1.1.1", - "postcss": "^8.4.47", + "postcss": "^8.4.49", "postcss-media-query-parser": "^0.2.3" + }, + "engines": { + "node": ">=14.0.0" } }, "node_modules/big.js": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } }, "node_modules/binary-extensions": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -11791,9 +11529,8 @@ }, "node_modules/bl": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, + "license": "MIT", "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -11802,9 +11539,8 @@ }, "node_modules/bl/node_modules/readable-stream": { "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -11815,46 +11551,128 @@ } }, "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.5.2", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "4.4.0", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.5.2", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/media-typer": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/mime-db": { + "version": "1.53.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/body-parser/node_modules/mime-types": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "mime-db": "^1.53.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.14.0", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/body-parser/node_modules/raw-body": { + "version": "3.0.0", + "license": "MIT", "dependencies": { "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", + "iconv-lite": "0.6.3", "unpipe": "1.0.0" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">= 0.8" } }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/body-parser/node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.6.3", + "license": "MIT", "dependencies": { - "ms": "2.0.0" + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/body-parser/node_modules/ms": { + "node_modules/body-parser/node_modules/type-is": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } }, "node_modules/bonjour-service": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", - "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "multicast-dns": "^7.2.5" @@ -11868,16 +11686,14 @@ }, "node_modules/brace-expansion": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/braces": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -11885,10 +11701,19 @@ "node": ">=8" } }, + "node_modules/browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==", + "dev": true, + "dependencies": { + "pako": "~0.2.0" + } + }, "node_modules/browserslist": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", - "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, "funding": [ { @@ -11905,9 +11730,9 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001669", - "electron-to-chromium": "^1.5.41", - "node-releases": "^2.0.18", + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "bin": { @@ -11919,9 +11744,8 @@ }, "node_modules/bs-logger": { "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", "dev": true, + "license": "MIT", "dependencies": { "fast-json-stable-stringify": "2.x" }, @@ -11931,9 +11755,8 @@ }, "node_modules/bser": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "node-int64": "^0.4.0" } @@ -11952,8 +11775,6 @@ }, "node_modules/buffer": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, "funding": [ { @@ -11969,11 +11790,18 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, + "node_modules/buffer-builder": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/buffer-builder/-/buffer-builder-0.2.0.tgz", + "integrity": "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==", + "dev": true + }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -11982,31 +11810,27 @@ }, "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==" + "license": "MIT" }, "node_modules/buffer-writer": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", - "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/builtins": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^7.0.0" } }, "node_modules/bundle-name": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", "dev": true, + "license": "MIT", "dependencies": { "run-applescript": "^7.0.0" }, @@ -12019,8 +11843,6 @@ }, "node_modules/busboy": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", "dependencies": { "streamsearch": "^1.1.0" }, @@ -12030,17 +11852,15 @@ }, "node_modules/bytes": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/cacache": { "version": "19.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", - "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/fs": "^4.0.0", "fs-minipass": "^3.0.0", @@ -12061,18 +11881,16 @@ }, "node_modules/cacache/node_modules/chownr": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, + "license": "BlueOak-1.0.0", "engines": { "node": ">=18" } }, "node_modules/cacache/node_modules/glob": { "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -12090,9 +11908,8 @@ }, "node_modules/cacache/node_modules/jackspeak": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -12105,15 +11922,13 @@ }, "node_modules/cacache/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/cacache/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -12126,9 +11941,8 @@ }, "node_modules/cacache/node_modules/mkdirp": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", "dev": true, + "license": "MIT", "bin": { "mkdirp": "dist/cjs/src/bin.js" }, @@ -12141,9 +11955,8 @@ }, "node_modules/cacache/node_modules/tar": { "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", "dev": true, + "license": "ISC", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -12158,9 +11971,8 @@ }, "node_modules/cacache/node_modules/yallist": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, + "license": "BlueOak-1.0.0", "engines": { "node": ">=18" } @@ -12180,8 +11992,8 @@ }, "node_modules/call-bind": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -12196,24 +12008,63 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/camelcase": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -12227,9 +12078,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001687", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz", - "integrity": "sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==", + "version": "1.0.30001702", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001702.tgz", + "integrity": "sha512-LoPe/D7zioC0REI5W73PeR1e1MLCipRGq/VkovJnd6Df+QVqT+vT33OXCp8QUd7kA7RZrHWxb1B36OQKI/0gOA==", "dev": true, "funding": [ { @@ -12265,11 +12116,14 @@ "node": ">=8" } }, + "node_modules/change-case-commonjs": { + "version": "5.4.4", + "license": "MIT" + }, "node_modules/char-regex": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } @@ -12282,9 +12136,8 @@ }, "node_modules/chokidar": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", - "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", "dev": true, + "license": "MIT", "dependencies": { "readdirp": "^4.0.1" }, @@ -12297,9 +12150,8 @@ }, "node_modules/chownr": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -12315,8 +12167,6 @@ }, "node_modules/ci-info": { "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, "funding": [ { @@ -12324,25 +12174,23 @@ "url": "https://github.com/sponsors/sibiraj-s" } ], + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/cjs-module-lexer": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/class-transformer": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", - "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==" + "license": "MIT" }, "node_modules/class-validator": { "version": "0.14.1", - "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.1.tgz", - "integrity": "sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==", + "license": "MIT", "dependencies": { "@types/validator": "^13.11.8", "libphonenumber-js": "^1.10.53", @@ -12351,9 +12199,8 @@ }, "node_modules/cli-cursor": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, + "license": "MIT", "dependencies": { "restore-cursor": "^3.1.0" }, @@ -12363,8 +12210,7 @@ }, "node_modules/cli-highlight": { "version": "2.1.11", - "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", - "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "license": "ISC", "dependencies": { "chalk": "^4.0.0", "highlight.js": "^10.7.1", @@ -12383,8 +12229,7 @@ }, "node_modules/cli-highlight/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -12398,8 +12243,7 @@ }, "node_modules/cli-highlight/node_modules/cliui": { "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -12408,13 +12252,11 @@ }, "node_modules/cli-highlight/node_modules/parse5": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" + "license": "MIT" }, "node_modules/cli-highlight/node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -12429,8 +12271,7 @@ }, "node_modules/cli-highlight/node_modules/yargs": { "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "license": "MIT", "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -12446,17 +12287,15 @@ }, "node_modules/cli-highlight/node_modules/yargs-parser": { "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/cli-spinners": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", - "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -12466,9 +12305,8 @@ }, "node_modules/cli-truncate": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", - "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", "dev": true, + "license": "MIT", "dependencies": { "slice-ansi": "^5.0.0", "string-width": "^7.0.0" @@ -12482,9 +12320,8 @@ }, "node_modules/cli-truncate/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -12494,15 +12331,13 @@ }, "node_modules/cli-truncate/node_modules/emoji-regex": { "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cli-truncate/node_modules/string-width": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -12517,9 +12352,8 @@ }, "node_modules/cli-truncate/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -12532,18 +12366,20 @@ }, "node_modules/cli-width": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", "dev": true, + "license": "ISC", "engines": { "node": ">= 12" } }, "node_modules/clipanion": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/clipanion/-/clipanion-3.2.1.tgz", - "integrity": "sha512-dYFdjLb7y1ajfxQopN05mylEpK9ZX0sO1/RfMXdfmwjlIsPkbh4p7A682x++zFPLDCo1x3p82dtljHf5cW2LKA==", + "version": "4.0.0-rc.4", + "resolved": "https://registry.npmjs.org/clipanion/-/clipanion-4.0.0-rc.4.tgz", + "integrity": "sha512-CXkMQxU6s9GklO/1f714dkKBMu1lopS1WFF0B8o4AxPykR1hpozxSiUZ5ZUeBjfPgCWqbcNOtZVFhB8Lkfp1+Q==", "dev": true, + "workspaces": [ + "website" + ], "dependencies": { "typanion": "^3.8.0" }, @@ -12553,8 +12389,7 @@ }, "node_modules/cliui": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -12566,8 +12401,7 @@ }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -12582,18 +12416,16 @@ }, "node_modules/clone": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8" } }, "node_modules/clone-deep": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, + "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -12605,9 +12437,8 @@ }, "node_modules/co": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, + "license": "MIT", "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" @@ -12615,14 +12446,12 @@ }, "node_modules/collect-v8-coverage": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -12632,8 +12461,7 @@ }, "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "license": "MIT" }, "node_modules/colord": { "version": "2.9.3", @@ -12643,15 +12471,19 @@ }, "node_modules/colorette": { "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorjs.io": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", + "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", "dev": true }, "node_modules/columnify": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", - "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", "dev": true, + "license": "MIT", "dependencies": { "strip-ansi": "^6.0.1", "wcwidth": "^1.0.0" @@ -12662,8 +12494,7 @@ }, "node_modules/combined-stream": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -12673,15 +12504,13 @@ }, "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 + "dev": true, + "license": "MIT" }, "node_modules/comment-json": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.2.3.tgz", - "integrity": "sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==", + "version": "4.2.5", "dev": true, + "license": "MIT", "dependencies": { "array-timsort": "^1.0.3", "core-util-is": "^1.0.3", @@ -12695,21 +12524,18 @@ }, "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 + "dev": true, + "license": "ISC" }, "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 + "dev": true, + "license": "MIT" }, "node_modules/compressible": { "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, + "license": "MIT", "dependencies": { "mime-db": ">= 1.43.0 < 2" }, @@ -12718,66 +12544,56 @@ } }, "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.5.tgz", + "integrity": "sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==", "dev": true, "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", + "bytes": "3.1.2", + "compressible": "~2.0.18", "debug": "2.6.9", + "negotiator": "~0.6.4", "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", + "safe-buffer": "5.2.1", "vary": "~1.1.2" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/compression/node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/compression/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "node_modules/compression/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/concat-stream": { "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "engines": [ "node >= 0.8" ], + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -12787,28 +12603,28 @@ }, "node_modules/confusing-browser-globals": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/connect-history-api-fallback": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8" } }, "node_modules/consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" + "version": "3.4.0", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } }, "node_modules/content-disposition": { "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, @@ -12818,30 +12634,28 @@ }, "node_modules/content-type": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/convert-source-map": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "engines": { "node": ">= 0.6" } }, "node_modules/cookie-signature": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + "dev": true, + "license": "MIT" }, "node_modules/cookies": { "version": "0.9.1", @@ -12858,9 +12672,8 @@ }, "node_modules/copy-anything": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", - "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", "dev": true, + "license": "MIT", "dependencies": { "is-what": "^3.14.1" }, @@ -12870,9 +12683,8 @@ }, "node_modules/copy-webpack-plugin": { "version": "12.0.2", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", - "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", "dev": true, + "license": "MIT", "dependencies": { "fast-glob": "^3.3.2", "glob-parent": "^6.0.1", @@ -12894,9 +12706,8 @@ }, "node_modules/copy-webpack-plugin/node_modules/glob-parent": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -12906,9 +12717,8 @@ }, "node_modules/copy-webpack-plugin/node_modules/globby": { "version": "14.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", - "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", "dev": true, + "license": "MIT", "dependencies": { "@sindresorhus/merge-streams": "^2.1.0", "fast-glob": "^3.3.2", @@ -12926,9 +12736,8 @@ }, "node_modules/copy-webpack-plugin/node_modules/path-type": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", - "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -12938,9 +12747,8 @@ }, "node_modules/copy-webpack-plugin/node_modules/slash": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -12949,9 +12757,9 @@ } }, "node_modules/core-js": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.35.0.tgz", - "integrity": "sha512-ntakECeqg81KqMueeGJ79Q5ZgQNR+6eaE8sxGCx62zMbAIj65q+uYvatToew3m6eAGdU4gNZwpZ34NMe4GYswg==", + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.1.tgz", + "integrity": "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==", "dev": true, "hasInstallScript": true, "funding": { @@ -12960,12 +12768,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.39.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz", - "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==", + "version": "3.41.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.41.0.tgz", + "integrity": "sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==", "dev": true, "dependencies": { - "browserslist": "^4.24.2" + "browserslist": "^4.24.4" }, "funding": { "type": "opencollective", @@ -12974,13 +12782,11 @@ }, "node_modules/core-util-is": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "license": "MIT" }, "node_modules/cors": { "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", "dependencies": { "object-assign": "^4", "vary": "^1" @@ -12999,26 +12805,33 @@ } }, "node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "version": "7.1.0", "dev": true, + "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", + "import-fresh": "^3.2.1", "parse-json": "^5.0.0", "path-type": "^4.0.0", - "yaml": "^1.7.2" + "yaml": "^1.10.0" }, "engines": { - "node": ">=8" + "node": ">=10" + } + }, + "node_modules/cosmiconfig/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" } }, "node_modules/create-jest": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", @@ -13037,9 +12850,8 @@ }, "node_modules/create-jest/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -13053,9 +12865,8 @@ }, "node_modules/create-require": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/cron-parser": { "version": "4.9.0", @@ -13071,8 +12882,7 @@ }, "node_modules/cross-spawn": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -13096,9 +12906,8 @@ }, "node_modules/css-loader": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", - "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", "dev": true, + "license": "MIT", "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.33", @@ -13216,9 +13025,8 @@ }, "node_modules/cssesc": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, + "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -13337,15 +13145,13 @@ }, "node_modules/cssom": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cssstyle": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", "dev": true, + "license": "MIT", "dependencies": { "cssom": "~0.3.6" }, @@ -13355,15 +13161,13 @@ }, "node_modules/cssstyle/node_modules/cssom": { "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cuint": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", - "integrity": "sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/dashdash": { "version": "1.14.1", @@ -13379,9 +13183,8 @@ }, "node_modules/data-urls": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", "dev": true, + "license": "MIT", "dependencies": { "abab": "^2.0.6", "whatwg-mimetype": "^3.0.0", @@ -13393,8 +13196,7 @@ }, "node_modules/dataloader": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.2.3.tgz", - "integrity": "sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==" + "license": "MIT" }, "node_modules/date-format": { "version": "4.0.14", @@ -13406,14 +13208,13 @@ } }, "node_modules/dayjs": { - "version": "1.11.10", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", - "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==" }, "node_modules/debug": { "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -13426,11 +13227,41 @@ } } }, + "node_modules/decamelize": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/decimal.js": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/deep-equal": { "version": "1.0.1", @@ -13440,24 +13271,21 @@ }, "node_modules/deep-is": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "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/default-browser": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", "dev": true, + "license": "MIT", "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" @@ -13471,9 +13299,8 @@ }, "node_modules/default-browser-id": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -13483,9 +13310,8 @@ }, "node_modules/defaults": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, + "license": "MIT", "dependencies": { "clone": "^1.0.2" }, @@ -13495,8 +13321,8 @@ }, "node_modules/define-data-property": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -13511,9 +13337,8 @@ }, "node_modules/define-lazy-prop": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -13523,8 +13348,7 @@ }, "node_modules/delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -13537,33 +13361,29 @@ }, "node_modules/denque": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "license": "Apache-2.0", "engines": { "node": ">=0.10" } }, "node_modules/depd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/dependency-graph": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", - "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/destroy": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -13581,24 +13401,21 @@ }, "node_modules/detect-newline": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/detect-node": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/detect-port": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", - "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", "dev": true, + "license": "MIT", "dependencies": { "address": "^1.0.1", "debug": "4" @@ -13610,26 +13427,23 @@ }, "node_modules/diff": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "devOptional": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, "node_modules/diff-sequences": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/dir-glob": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -13639,15 +13453,13 @@ }, "node_modules/discontinuous-range": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", - "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/dns-packet": { "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dev": true, + "license": "MIT", "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" }, @@ -13657,9 +13469,8 @@ }, "node_modules/doctrine": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -13695,10 +13506,8 @@ }, "node_modules/domexception": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "deprecated": "Use your platform's native DOMException instead", "dev": true, + "license": "MIT", "dependencies": { "webidl-conversions": "^7.0.0" }, @@ -13722,9 +13531,9 @@ } }, "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, "dependencies": { "dom-serializer": "^2.0.0", @@ -13737,8 +13546,7 @@ }, "node_modules/dotenv": { "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "license": "BSD-2-Clause", "engines": { "node": ">=12" }, @@ -13761,36 +13569,33 @@ "url": "https://dotenvx.com" } }, - "node_modules/duplexify": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", - "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", - "dev": true, + "node_modules/dunder-proto": { + "version": "1.0.1", + "license": "MIT", "dependencies": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.0" + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/duplexify/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" } }, "node_modules/eastasianwidth": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + "license": "MIT" }, "node_modules/ecc-jsbn": { "version": "0.1.2", @@ -13819,8 +13624,7 @@ }, "node_modules/ee-first": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + "license": "MIT" }, "node_modules/ejs": { "version": "3.1.10", @@ -13838,15 +13642,14 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.71", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.71.tgz", - "integrity": "sha512-dB68l59BI75W1BUGVTAEJy45CEVuEGy9qPVVQ8pnHyHMn36PLPPoE1mjLH+lo9rKulO3HC2OhbACI/8tCqJBcA==", + "version": "1.5.113", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.113.tgz", + "integrity": "sha512-wjT2O4hX+wdWPJ76gWSkMhcHAV2PTMX+QetUCPYEdCIe+cxmgzzSSiGRCKW8nuh4mwKZlpv0xvoW7OF2X+wmHg==", "dev": true }, "node_modules/emittery": { "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -13856,40 +13659,36 @@ }, "node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "license": "MIT" }, "node_modules/emojis-list": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "engines": { "node": ">= 0.8" } }, "node_modules/encoding": { "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "devOptional": true, + "dev": true, + "license": "MIT", "dependencies": { "iconv-lite": "^0.6.2" } }, "node_modules/encoding/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "devOptional": true, + "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -13907,20 +13706,18 @@ } }, "node_modules/engine.io": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz", - "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==", + "version": "6.6.4", + "license": "MIT", "dependencies": { - "@types/cookie": "^0.4.1", "@types/cors": "^2.8.12", "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", - "cookie": "~0.4.1", + "cookie": "~0.7.2", "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", - "ws": "~8.11.0" + "ws": "~8.17.1" }, "engines": { "node": ">=10.2.0" @@ -13928,8 +13725,7 @@ }, "node_modules/engine.io-client": { "version": "6.5.3", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.3.tgz", - "integrity": "sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==", + "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1", @@ -13940,8 +13736,7 @@ }, "node_modules/engine.io-client/node_modules/ws": { "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -13960,30 +13755,27 @@ }, "node_modules/engine.io-parser": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz", - "integrity": "sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==", + "license": "MIT", "engines": { "node": ">=10.0.0" } }, "node_modules/engine.io/node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "version": "0.7.2", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/engine.io/node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "version": "8.17.1", + "license": "MIT", "engines": { "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -13995,9 +13787,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -14009,9 +13801,8 @@ }, "node_modules/enquirer": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", "dev": true, + "license": "MIT", "dependencies": { "ansi-colors": "^4.1.1" }, @@ -14021,9 +13812,8 @@ }, "node_modules/entities": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -14033,17 +13823,16 @@ }, "node_modules/env-paths": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/envinfo": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", - "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", + "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", "dev": true, "bin": { "envinfo": "dist/cli.js" @@ -14054,9 +13843,8 @@ }, "node_modules/environment": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -14066,15 +13854,13 @@ }, "node_modules/err-code": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/errno": { "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "prr": "~1.0.1" @@ -14085,42 +13871,46 @@ }, "node_modules/error-ex": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "version": "1.0.1", + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/es-errors": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", "dev": true }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/esbuild": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", - "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", + "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", "dev": true, "hasInstallScript": true, "bin": { @@ -14130,36 +13920,37 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.0", - "@esbuild/android-arm": "0.24.0", - "@esbuild/android-arm64": "0.24.0", - "@esbuild/android-x64": "0.24.0", - "@esbuild/darwin-arm64": "0.24.0", - "@esbuild/darwin-x64": "0.24.0", - "@esbuild/freebsd-arm64": "0.24.0", - "@esbuild/freebsd-x64": "0.24.0", - "@esbuild/linux-arm": "0.24.0", - "@esbuild/linux-arm64": "0.24.0", - "@esbuild/linux-ia32": "0.24.0", - "@esbuild/linux-loong64": "0.24.0", - "@esbuild/linux-mips64el": "0.24.0", - "@esbuild/linux-ppc64": "0.24.0", - "@esbuild/linux-riscv64": "0.24.0", - "@esbuild/linux-s390x": "0.24.0", - "@esbuild/linux-x64": "0.24.0", - "@esbuild/netbsd-x64": "0.24.0", - "@esbuild/openbsd-arm64": "0.24.0", - "@esbuild/openbsd-x64": "0.24.0", - "@esbuild/sunos-x64": "0.24.0", - "@esbuild/win32-arm64": "0.24.0", - "@esbuild/win32-ia32": "0.24.0", - "@esbuild/win32-x64": "0.24.0" + "@esbuild/aix-ppc64": "0.25.0", + "@esbuild/android-arm": "0.25.0", + "@esbuild/android-arm64": "0.25.0", + "@esbuild/android-x64": "0.25.0", + "@esbuild/darwin-arm64": "0.25.0", + "@esbuild/darwin-x64": "0.25.0", + "@esbuild/freebsd-arm64": "0.25.0", + "@esbuild/freebsd-x64": "0.25.0", + "@esbuild/linux-arm": "0.25.0", + "@esbuild/linux-arm64": "0.25.0", + "@esbuild/linux-ia32": "0.25.0", + "@esbuild/linux-loong64": "0.25.0", + "@esbuild/linux-mips64el": "0.25.0", + "@esbuild/linux-ppc64": "0.25.0", + "@esbuild/linux-riscv64": "0.25.0", + "@esbuild/linux-s390x": "0.25.0", + "@esbuild/linux-x64": "0.25.0", + "@esbuild/netbsd-arm64": "0.25.0", + "@esbuild/netbsd-x64": "0.25.0", + "@esbuild/openbsd-arm64": "0.25.0", + "@esbuild/openbsd-x64": "0.25.0", + "@esbuild/sunos-x64": "0.25.0", + "@esbuild/win32-arm64": "0.25.0", + "@esbuild/win32-ia32": "0.25.0", + "@esbuild/win32-x64": "0.25.0" } }, "node_modules/esbuild-wasm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.24.0.tgz", - "integrity": "sha512-xhNn5tL1AhkPg4ft59yXT6FkwKXiPSYyz1IeinJHUJpjvOHOIPvdmFQc0pGdjxlKSbzZc2mNmtVOWAR1EF/JAg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.25.0.tgz", + "integrity": "sha512-60iuWr6jdTVylmGXjpnqk3pCktUi5Rmjiv6EMza3h4X20BLtfL2BjUGs1+UCt2G9UK7jVGrJdUr5i1k0sL3wBg==", "dev": true, "bin": { "esbuild": "bin/esbuild" @@ -14170,16 +13961,14 @@ }, "node_modules/escalade": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/escape-html": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "1.0.5", @@ -14192,9 +13981,8 @@ }, "node_modules/escodegen": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", @@ -14213,9 +14001,8 @@ }, "node_modules/escodegen/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "optional": true, "engines": { "node": ">=0.10.0" @@ -14223,9 +14010,8 @@ }, "node_modules/eslint": { "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -14278,9 +14064,8 @@ }, "node_modules/eslint-config-prettier": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, + "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -14288,11 +14073,60 @@ "eslint": ">=7.0.0" } }, + "node_modules/eslint-formatter-pretty": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "^7.2.13", + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "eslint-rule-docs": "^1.1.5", + "log-symbols": "^4.0.0", + "plur": "^4.0.0", + "string-width": "^4.2.0", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-formatter-pretty/node_modules/@types/eslint": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/eslint-formatter-pretty/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint-rule-docs": { + "version": "1.1.235", + "dev": true, + "license": "MIT" + }, "node_modules/eslint-scope": { "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", - "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -14306,9 +14140,8 @@ }, "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, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -14318,9 +14151,8 @@ }, "node_modules/eslint/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, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -14334,9 +14166,8 @@ }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -14344,9 +14175,8 @@ }, "node_modules/eslint/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -14360,9 +14190,8 @@ }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -14372,9 +14201,8 @@ }, "node_modules/eslint/node_modules/eslint-scope": { "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -14388,9 +14216,8 @@ }, "node_modules/eslint/node_modules/find-up": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -14404,9 +14231,8 @@ }, "node_modules/eslint/node_modules/glob-parent": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -14416,9 +14242,8 @@ }, "node_modules/eslint/node_modules/globals": { "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -14431,15 +14256,13 @@ }, "node_modules/eslint/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 + "dev": true, + "license": "MIT" }, "node_modules/eslint/node_modules/locate-path": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -14452,9 +14275,8 @@ }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -14464,9 +14286,8 @@ }, "node_modules/eslint/node_modules/p-locate": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -14479,9 +14300,8 @@ }, "node_modules/eslint/node_modules/type-fest": { "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -14491,17 +14311,15 @@ }, "node_modules/esm": { "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "license": "MIT", "engines": { "node": ">=6" } }, "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, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -14516,8 +14334,7 @@ }, "node_modules/esprima": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -14528,9 +14345,8 @@ }, "node_modules/esquery": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -14540,9 +14356,8 @@ }, "node_modules/esrecurse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -14552,32 +14367,28 @@ }, "node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/estree-walker": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/esutils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/etag": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -14586,29 +14397,29 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, "engines": { "node": ">=6" } }, "node_modules/eventemitter3": { "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, "engines": { "node": ">=0.8.x" } }, "node_modules/execa": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -14629,8 +14440,6 @@ }, "node_modules/exit": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, "engines": { "node": ">= 0.8.0" @@ -14650,9 +14459,8 @@ }, "node_modules/expect": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", @@ -14666,41 +14474,41 @@ }, "node_modules/exponential-backoff": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "dev": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.1", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -14709,6 +14517,10 @@ }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/express-rate-limit": { @@ -14718,20 +14530,21 @@ "dev": true }, "node_modules/express/node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dev": true, "dependencies": { "bytes": "3.1.2", - "content-type": "~1.0.4", + "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", + "qs": "6.13.0", + "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" }, @@ -14744,6 +14557,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "dependencies": { "ms": "2.0.0" } @@ -14751,26 +14565,14 @@ "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/express/node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "dev": true }, "node_modules/extend": { "version": "3.0.2", @@ -14815,19 +14617,23 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "license": "MIT" + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -14835,57 +14641,49 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-redact": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.3.0.tgz", - "integrity": "sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/fast-safe-stringify": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + "license": "MIT" }, "node_modules/fast-uri": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", - "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fastest-levenshtein": { "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.9.1" } }, "node_modules/fastq": { "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/faye-websocket": { "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dev": true, + "license": "Apache-2.0", "dependencies": { "websocket-driver": ">=0.5.1" }, @@ -14895,17 +14693,28 @@ }, "node_modules/fb-watchman": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "bser": "2.1.1" } }, + "node_modules/fdir": { + "version": "6.4.3", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/figlet": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.8.0.tgz", - "integrity": "sha512-chzvGjd+Sp7KUvPHZv6EXV5Ir3Q7kYNpCr4aHrRW79qFtTefmQZNny+W1pW9kf5zeE6dikku2W50W/wAH2xWgw==", + "license": "MIT", "bin": { "figlet": "bin/index.js" }, @@ -14930,9 +14739,8 @@ }, "node_modules/file-entry-cache": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, + "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -14963,8 +14771,7 @@ }, "node_modules/fill-range": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -14973,12 +14780,13 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dev": true, "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -14993,6 +14801,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "dependencies": { "ms": "2.0.0" } @@ -15000,13 +14809,13 @@ "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/find-cache-dir": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, + "license": "MIT", "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", @@ -15045,9 +14854,8 @@ }, "node_modules/find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -15058,18 +14866,16 @@ }, "node_modules/flat": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, + "license": "BSD-3-Clause", "bin": { "flat": "cli.js" } }, "node_modules/flat-cache": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -15081,20 +14887,18 @@ }, "node_modules/flatted": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/follow-redirects": { "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -15106,8 +14910,7 @@ }, "node_modules/foreground-child": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -15121,8 +14924,7 @@ }, "node_modules/foreground-child/node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", "engines": { "node": ">=14" }, @@ -15248,22 +15050,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -15340,8 +15126,7 @@ }, "node_modules/form-data": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -15353,17 +15138,15 @@ }, "node_modules/forwarded": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/fraction.js": { "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "dev": true, + "license": "MIT", "engines": { "node": "*" }, @@ -15374,8 +15157,8 @@ }, "node_modules/fresh": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -15440,9 +15223,8 @@ }, "node_modules/fs-minipass": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, @@ -15458,16 +15240,13 @@ }, "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -15478,48 +15257,42 @@ }, "node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/functional-red-black-tree": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/generate-function": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", - "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "license": "MIT", "dependencies": { "is-property": "^1.0.2" } }, "node_modules/gensync": { "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/get-caller-file": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-east-asian-width": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", - "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -15528,15 +15301,19 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.2.7", + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.0", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -15547,17 +15324,26 @@ }, "node_modules/get-package-type": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "license": "MIT", "engines": { "node": ">=8.0.0" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -15567,8 +15353,7 @@ }, "node_modules/getopts": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz", - "integrity": "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==" + "license": "MIT" }, "node_modules/getpass": { "version": "0.1.7", @@ -15581,9 +15366,8 @@ }, "node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -15601,8 +15385,7 @@ }, "node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -15618,9 +15401,8 @@ }, "node_modules/glob/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -15628,9 +15410,8 @@ }, "node_modules/glob/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -15688,17 +15469,15 @@ }, "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/globby": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -15715,11 +15494,10 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -15727,26 +15505,39 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "license": "ISC" }, "node_modules/graphemer": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/gunzip-maybe": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/gunzip-maybe/-/gunzip-maybe-1.4.2.tgz", + "integrity": "sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==", + "dev": true, + "dependencies": { + "browserify-zlib": "^0.1.4", + "is-deflate": "^1.0.0", + "is-gzip": "^1.0.0", + "peek-stream": "^1.1.0", + "pumpify": "^1.3.3", + "through2": "^2.0.3" + }, + "bin": { + "gunzip-maybe": "bin.js" + } }, "node_modules/handle-thing": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/handlebars": { "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", @@ -15765,40 +15556,44 @@ }, "node_modules/handlebars/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/harmony-reflect": { "version": "1.6.2", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", - "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", - "dev": true + "dev": true, + "license": "(Apache-2.0 OR MPL-1.1)" }, "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/has-own-prop": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz", - "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/has-property-descriptors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -15806,21 +15601,9 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -15844,9 +15627,8 @@ } }, "node_modules/hasown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", - "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "version": "2.0.2", + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -15865,8 +15647,7 @@ }, "node_modules/highlight.js": { "version": "10.7.3", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "license": "BSD-3-Clause", "engines": { "node": "*" } @@ -15885,9 +15666,8 @@ }, "node_modules/hosted-git-info": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", - "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^10.0.1" }, @@ -15897,18 +15677,16 @@ }, "node_modules/hosted-git-info/node_modules/lru-cache": { "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", "dev": true, + "license": "ISC", "engines": { "node": "14 || >=16.14" } }, "node_modules/hpack.js": { "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -15918,9 +15696,8 @@ }, "node_modules/html-encoding-sniffer": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", "dev": true, + "license": "MIT", "dependencies": { "whatwg-encoding": "^2.0.0" }, @@ -15928,27 +15705,10 @@ "node": ">=12" } }, - "node_modules/html-entities": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", - "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ] - }, "node_modules/html-escaper": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/htmlparser2": { "version": "9.1.0", @@ -16018,20 +15778,17 @@ }, "node_modules/http-cache-semantics": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/http-deceiver": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/http-errors": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -16044,16 +15801,14 @@ } }, "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true + "version": "0.5.9", + "dev": true, + "license": "MIT" }, "node_modules/http-proxy": { "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, + "license": "MIT", "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -16065,9 +15820,8 @@ }, "node_modules/http-proxy-agent": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dev": true, + "license": "MIT", "dependencies": { "@tootallnate/once": "2", "agent-base": "6", @@ -16079,9 +15833,8 @@ }, "node_modules/http-proxy-agent/node_modules/agent-base": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "4" }, @@ -16091,9 +15844,8 @@ }, "node_modules/http-proxy-middleware": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.3.tgz", - "integrity": "sha512-usY0HG5nyDUwtqpiZdETNbmKtw3QQ1jwYFZ9wi5iHzX2BcILwQKtYDJPo7XHTsu5Z0B2Hj3W9NNnbd+AjFWjqg==", "dev": true, + "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.15", "debug": "^4.3.6", @@ -16108,9 +15860,8 @@ }, "node_modules/http-proxy-middleware/node_modules/debug": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -16125,18 +15876,16 @@ }, "node_modules/http-proxy-middleware/node_modules/is-plain-object": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/http-proxy-middleware/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/http-server": { "version": "14.1.1", @@ -16182,14 +15931,14 @@ } }, "node_modules/http-signature": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", - "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.4.0.tgz", + "integrity": "sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==", "dev": true, "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^2.0.2", - "sshpk": "^1.14.1" + "sshpk": "^1.18.0" }, "engines": { "node": ">=0.10" @@ -16202,12 +15951,11 @@ "dev": true }, "node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "version": "7.0.6", "dev": true, + "license": "MIT", "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { @@ -16216,26 +15964,24 @@ }, "node_modules/human-signals": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } }, "node_modules/hyperdyperid": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", - "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.18" } }, "node_modules/iconv-lite": { "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -16245,9 +15991,8 @@ }, "node_modules/icss-utils": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "dev": true, + "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -16257,9 +16002,8 @@ }, "node_modules/identity-obj-proxy": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", - "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", "dev": true, + "license": "MIT", "dependencies": { "harmony-reflect": "^1.4.6" }, @@ -16269,8 +16013,6 @@ }, "node_modules/ieee754": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -16284,21 +16026,20 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "BSD-3-Clause" }, "node_modules/ignore": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/ignore-walk": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-7.0.0.tgz", - "integrity": "sha512-T4gbf83A4NH95zvhVYZc+qWocBBGlpzUXLPGurJggw/WIOwicfXJChLDP/iBZnN5WqROSu5Bm3hhle4z8a8YGQ==", "dev": true, + "license": "ISC", "dependencies": { "minimatch": "^9.0.0" }, @@ -16308,9 +16049,8 @@ }, "node_modules/image-size": { "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", "dev": true, + "license": "MIT", "optional": true, "bin": { "image-size": "bin/image-size.js" @@ -16321,15 +16061,13 @@ }, "node_modules/immutable": { "version": "4.3.5", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", - "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/import-fresh": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -16343,26 +16081,23 @@ }, "node_modules/import-fresh/node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/import-lazy": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/import-local": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, + "license": "MIT", "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -16379,18 +16114,24 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } }, + "node_modules/indent-string": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -16398,41 +16139,36 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "license": "ISC" }, "node_modules/ini": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", - "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/injection-js": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.4.0.tgz", - "integrity": "sha512-6jiJt0tCAo9zjHbcwLiPL+IuNe9SQ6a9g0PEzafThW3fOQi0mrmiJGBJvDD6tmhPh8cQHIQtCOrJuBfQME4kPA==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.0.0" } }, "node_modules/interpret": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.13.0" } }, "node_modules/ip-address": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", "dev": true, + "license": "MIT", "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" @@ -16443,23 +16179,28 @@ }, "node_modules/ipaddr.js": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", "engines": { "node": ">= 0.10" } }, + "node_modules/irregular-plurals": { + "version": "3.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-binary-path": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, + "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -16468,16 +16209,24 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.16.1", + "license": "MIT", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-deflate": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-deflate/-/is-deflate-1.0.0.tgz", + "integrity": "sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==", + "dev": true + }, "node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -16495,36 +16244,36 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-generator-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -16535,8 +16284,7 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -16544,11 +16292,19 @@ "node": ">=0.10.0" } }, + "node_modules/is-gzip": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", + "integrity": "sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-inside-container": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "dev": true, + "license": "MIT", "dependencies": { "is-docker": "^3.0.0" }, @@ -16564,9 +16320,8 @@ }, "node_modules/is-inside-container/node_modules/is-docker": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true, + "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -16579,18 +16334,16 @@ }, "node_modules/is-interactive": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-network-error": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", - "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==", "dev": true, + "license": "MIT", "engines": { "node": ">=16" }, @@ -16600,26 +16353,23 @@ }, "node_modules/is-number": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/is-path-inside": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-plain-obj": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -16629,9 +16379,8 @@ }, "node_modules/is-plain-object": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, + "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -16641,9 +16390,8 @@ }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-promise": { "version": "2.2.2", @@ -16653,14 +16401,30 @@ }, "node_modules/is-property": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==" + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/is-stream": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -16676,9 +16440,8 @@ }, "node_modules/is-unicode-supported": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -16688,9 +16451,8 @@ }, "node_modules/is-what": { "version": "3.14.1", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", - "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-windows": { "version": "1.0.2", @@ -16703,9 +16465,8 @@ }, "node_modules/is-wsl": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", "dev": true, + "license": "MIT", "dependencies": { "is-inside-container": "^1.0.0" }, @@ -16718,20 +16479,17 @@ }, "node_modules/isarray": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "license": "ISC" }, "node_modules/isobject": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -16741,6 +16499,7 @@ "resolved": "https://registry.npmjs.org/isomorphic-rslog/-/isomorphic-rslog-0.0.6.tgz", "integrity": "sha512-HM0q6XqQ93psDlqvuViNs/Ea3hAyGDkIdVAHlrEocjjAwGrs1fZ+EdQjS9eUPacnYB7Y8SoDdSY3H8p3ce205A==", "dev": true, + "peer": true, "engines": { "node": ">=14.17.6" } @@ -16762,18 +16521,16 @@ }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-instrument": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", @@ -16787,9 +16544,8 @@ }, "node_modules/istanbul-lib-report": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", @@ -16801,9 +16557,8 @@ }, "node_modules/istanbul-lib-report/node_modules/make-dir": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^7.5.3" }, @@ -16816,9 +16571,8 @@ }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", @@ -16830,18 +16584,16 @@ }, "node_modules/istanbul-lib-source-maps/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/istanbul-reports": { "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -16852,16 +16604,14 @@ }, "node_modules/iterare": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", - "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==", + "license": "ISC", "engines": { "node": ">=6" } }, "node_modules/jackspeak": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -16933,9 +16683,8 @@ }, "node_modules/jest": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -16959,9 +16708,8 @@ }, "node_modules/jest-changed-files": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, + "license": "MIT", "dependencies": { "execa": "^5.0.0", "jest-util": "^29.7.0", @@ -16973,9 +16721,8 @@ }, "node_modules/jest-circus": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -17002,28 +16749,10 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-circus/node_modules/babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, "node_modules/jest-circus/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -17035,29 +16764,10 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-circus/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/jest-circus/node_modules/dedent": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", "dev": true, + "license": "MIT", "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, @@ -17069,9 +16779,8 @@ }, "node_modules/jest-cli": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/core": "^29.7.0", "@jest/test-result": "^29.7.0", @@ -17102,9 +16811,8 @@ }, "node_modules/jest-cli/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -17118,9 +16826,8 @@ }, "node_modules/jest-config": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.7.0", @@ -17163,9 +16870,8 @@ }, "node_modules/jest-config/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -17179,9 +16885,8 @@ }, "node_modules/jest-diff": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", @@ -17194,9 +16899,8 @@ }, "node_modules/jest-diff/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -17210,9 +16914,8 @@ }, "node_modules/jest-docblock": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, + "license": "MIT", "dependencies": { "detect-newline": "^3.0.0" }, @@ -17222,9 +16925,8 @@ }, "node_modules/jest-each": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", @@ -17238,9 +16940,8 @@ }, "node_modules/jest-each/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -17254,9 +16955,8 @@ }, "node_modules/jest-environment-jsdom": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", - "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -17281,9 +16981,8 @@ }, "node_modules/jest-environment-node": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -17298,18 +16997,16 @@ }, "node_modules/jest-get-type": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-haste-map": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -17332,9 +17029,8 @@ }, "node_modules/jest-leak-detector": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, + "license": "MIT", "dependencies": { "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" @@ -17345,9 +17041,8 @@ }, "node_modules/jest-matcher-utils": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", @@ -17360,9 +17055,8 @@ }, "node_modules/jest-matcher-utils/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -17376,9 +17070,8 @@ }, "node_modules/jest-message-util": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -17396,9 +17089,8 @@ }, "node_modules/jest-message-util/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -17412,9 +17104,8 @@ }, "node_modules/jest-mock": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -17426,9 +17117,8 @@ }, "node_modules/jest-pnp-resolver": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -17443,9 +17133,8 @@ }, "node_modules/jest-preset-angular": { "version": "14.4.2", - "resolved": "https://registry.npmjs.org/jest-preset-angular/-/jest-preset-angular-14.4.2.tgz", - "integrity": "sha512-BYYv0FaTDfBNh8WyA9mpOV3krfw20kurBGK8INZUnv7KZDAWZuQtCET4TwTWxSNQ9jS1OX1+a5weCm/bTDDM1A==", "dev": true, + "license": "MIT", "dependencies": { "bs-logger": "^0.2.6", "esbuild-wasm": ">=0.15.13", @@ -17470,18 +17159,16 @@ }, "node_modules/jest-regex-util": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", @@ -17499,9 +17186,8 @@ }, "node_modules/jest-resolve-dependencies": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, + "license": "MIT", "dependencies": { "jest-regex-util": "^29.6.3", "jest-snapshot": "^29.7.0" @@ -17512,9 +17198,8 @@ }, "node_modules/jest-resolve/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -17526,20 +17211,10 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-resolve/node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/jest-runner": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/environment": "^29.7.0", @@ -17569,9 +17244,8 @@ }, "node_modules/jest-runner/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -17585,18 +17259,16 @@ }, "node_modules/jest-runner/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/jest-runner/node_modules/source-map-support": { "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -17604,9 +17276,8 @@ }, "node_modules/jest-runtime": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -17637,9 +17308,8 @@ }, "node_modules/jest-runtime/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -17653,9 +17323,8 @@ }, "node_modules/jest-snapshot": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", @@ -17684,9 +17353,8 @@ }, "node_modules/jest-snapshot/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -17700,9 +17368,8 @@ }, "node_modules/jest-util": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -17717,9 +17384,8 @@ }, "node_modules/jest-util/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -17733,9 +17399,8 @@ }, "node_modules/jest-util/node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -17745,9 +17410,8 @@ }, "node_modules/jest-validate": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -17762,9 +17426,8 @@ }, "node_modules/jest-validate/node_modules/camelcase": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -17774,9 +17437,8 @@ }, "node_modules/jest-validate/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -17790,9 +17452,8 @@ }, "node_modules/jest-watcher": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, + "license": "MIT", "dependencies": { "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", @@ -17809,9 +17470,8 @@ }, "node_modules/jest-watcher/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -17825,9 +17485,8 @@ }, "node_modules/jest-worker": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", @@ -17840,9 +17499,8 @@ }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -17855,28 +17513,24 @@ }, "node_modules/jiti": { "version": "1.21.3", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.3.tgz", - "integrity": "sha512-uy2bNX5zQ+tESe+TiC7ilGRz8AtRGmnJH55NC5S0nSUjvvvM2hJHmefHErugGXN4pNv4Qx7vLsnNw9qJ9mtIsw==", "dev": true, + "license": "MIT", "bin": { "jiti": "bin/jiti.js" } }, "node_modules/jju": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==" + "license": "MIT" }, "node_modules/js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -17886,15 +17540,13 @@ }, "node_modules/jsbn": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jsdom": { "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", - "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", "dev": true, + "license": "MIT", "dependencies": { "abab": "^2.0.6", "acorn": "^8.8.1", @@ -17937,9 +17589,8 @@ }, "node_modules/jsdom/node_modules/agent-base": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "4" }, @@ -17949,9 +17600,8 @@ }, "node_modules/jsdom/node_modules/https-proxy-agent": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "6", "debug": "4" @@ -17962,9 +17612,8 @@ }, "node_modules/jsdom/node_modules/parse5": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "dev": true, + "license": "MIT", "dependencies": { "entities": "^4.4.0" }, @@ -17974,9 +17623,8 @@ }, "node_modules/jsesc": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -17986,15 +17634,13 @@ }, "node_modules/json-buffer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", - "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==", "dev": true, + "license": "MIT", "engines": { "node": "^18.17.0 || >=20.5.0" } @@ -18007,14 +17653,12 @@ }, "node_modules/json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "license": "MIT" }, "node_modules/json-stable-stringify": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz", - "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "isarray": "^2.0.5", @@ -18030,9 +17674,8 @@ }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stringify-safe": { "version": "5.0.1", @@ -18042,8 +17685,7 @@ }, "node_modules/json5": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -18053,9 +17695,8 @@ }, "node_modules/jsonc-eslint-parser": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.0.tgz", - "integrity": "sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==", "dev": true, + "license": "MIT", "dependencies": { "acorn": "^8.5.0", "eslint-visitor-keys": "^3.0.0", @@ -18070,15 +17711,13 @@ } }, "node_modules/jsonc-parser": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", - "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", - "dev": true + "version": "3.3.1", + "dev": true, + "license": "MIT" }, "node_modules/jsonfile": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -18088,27 +17727,24 @@ }, "node_modules/jsonify": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", - "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", "dev": true, + "license": "Public Domain", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/jsonparse": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true, "engines": [ "node >= 0.2.0" - ] + ], + "license": "MIT" }, "node_modules/JSONStream": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "dev": true, + "license": "(MIT OR Apache-2.0)", "dependencies": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" @@ -18180,9 +17816,8 @@ }, "node_modules/karma-source-map-support": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", - "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", "dev": true, + "license": "MIT", "dependencies": { "source-map-support": "^0.5.5" } @@ -18201,27 +17836,24 @@ }, "node_modules/keyv": { "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } }, "node_modules/kind-of": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/kleur": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -18237,8 +17869,7 @@ }, "node_modules/knex": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/knex/-/knex-3.1.0.tgz", - "integrity": "sha512-GLoII6hR0c4ti243gMs5/1Rb3B+AjwMOfjYm97pu0FOQa7JH56hgBxYf5WK2525ceSbBY1cjeZ9yk99GPMB6Kw==", + "license": "MIT", "dependencies": { "colorette": "2.0.19", "commander": "^10.0.0", @@ -18287,9 +17918,8 @@ }, "node_modules/knex-pglite": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/knex-pglite/-/knex-pglite-0.11.0.tgz", - "integrity": "sha512-Z3v+vaF8C/VMJll7J2NHqFZo31ijLfYBsHMKU8jTnjfIF0edUonAB3sbAZYmUbSeJDDGfZdJPsvcB4ZyGBERcA==", "dev": true, + "license": "MIT", "dependencies": { "@electric-sql/pglite": "^0.2.14", "knex": "3.1.0" @@ -18297,29 +17927,26 @@ }, "node_modules/knex/node_modules/colorette": { "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" + "license": "MIT" }, "node_modules/knex/node_modules/commander": { "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "license": "MIT", "engines": { "node": ">=14" } }, "node_modules/knex/node_modules/interpret": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/koa": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.3.tgz", - "integrity": "sha512-j/8tY9j5t+GVMLeioLaxweJiKUayFhlGqNTzf2ZGwL0ZCQijd2RLHK0SLW5Tsko8YyyqCZC2cojIb0/s62qTAg==", + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.4.tgz", + "integrity": "sha512-7fNBIdrU2PEgLljXoPWoyY4r1e+ToWCmzS/wwMPbUNs7X+5MMET1ObhJBlUkF5uZG9B6QhM2zS1TsH6adegkiQ==", "dev": true, "dependencies": { "accepts": "^1.3.5", @@ -18369,6 +17996,15 @@ "node": ">= 10" } }, + "node_modules/koa/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/koa/node_modules/http-errors": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", @@ -18404,10 +18040,9 @@ } }, "node_modules/launch-editor": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz", - "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==", + "version": "2.10.0", "dev": true, + "license": "MIT", "dependencies": { "picocolors": "^1.0.0", "shell-quote": "^1.8.1" @@ -18415,9 +18050,8 @@ }, "node_modules/less": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", - "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "copy-anything": "^2.0.1", "parse-node-version": "^1.0.1", @@ -18461,9 +18095,8 @@ }, "node_modules/less/node_modules/make-dir": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "pify": "^4.0.1", @@ -18475,9 +18108,8 @@ }, "node_modules/less/node_modules/pify": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=6" @@ -18485,9 +18117,8 @@ }, "node_modules/less/node_modules/semver": { "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, + "license": "ISC", "optional": true, "bin": { "semver": "bin/semver" @@ -18495,9 +18126,8 @@ }, "node_modules/less/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "optional": true, "engines": { "node": ">=0.10.0" @@ -18505,18 +18135,16 @@ }, "node_modules/leven": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/levn": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -18527,14 +18155,12 @@ }, "node_modules/libphonenumber-js": { "version": "1.11.11", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.11.11.tgz", - "integrity": "sha512-mF3KaORjJQR6JBNcOkluDcJKhtoQT4VTLRMrX1v/wlBayL4M8ybwEDeryyPcrSEJmD0rVwHUbBarpZwN5NfPFQ==" + "license": "MIT" }, "node_modules/license-webpack-plugin": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", - "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", "dev": true, + "license": "ISC", "dependencies": { "webpack-sources": "^3.0.0" }, @@ -18570,9 +18196,8 @@ }, "node_modules/listr2": { "version": "8.2.5", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz", - "integrity": "sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==", "dev": true, + "license": "MIT", "dependencies": { "cli-truncate": "^4.0.0", "colorette": "^2.0.20", @@ -18587,9 +18212,8 @@ }, "node_modules/listr2/node_modules/ansi-regex": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -18599,9 +18223,8 @@ }, "node_modules/listr2/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -18611,21 +18234,18 @@ }, "node_modules/listr2/node_modules/emoji-regex": { "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/listr2/node_modules/eventemitter3": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/listr2/node_modules/string-width": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -18640,9 +18260,8 @@ }, "node_modules/listr2/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -18655,9 +18274,8 @@ }, "node_modules/listr2/node_modules/wrap-ansi": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", @@ -18671,9 +18289,9 @@ } }, "node_modules/lmdb": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.1.5.tgz", - "integrity": "sha512-46Mch5Drq+A93Ss3gtbg+Xuvf5BOgIuvhKDWoGa3HcPHI6BL2NCOkRdSx1D4VfzwrxhnsjbyIVsLRlQHu6URvw==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.2.6.tgz", + "integrity": "sha512-SuHqzPl7mYStna8WRotY8XX/EUZBjjv3QyKIByeCLFfC9uXT/OIHByEcA07PzbMfQAM0KYJtLgtpMRlIe5dErQ==", "dev": true, "hasInstallScript": true, "optional": true, @@ -18688,12 +18306,12 @@ "download-lmdb-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "3.1.5", - "@lmdb/lmdb-darwin-x64": "3.1.5", - "@lmdb/lmdb-linux-arm": "3.1.5", - "@lmdb/lmdb-linux-arm64": "3.1.5", - "@lmdb/lmdb-linux-x64": "3.1.5", - "@lmdb/lmdb-win32-x64": "3.1.5" + "@lmdb/lmdb-darwin-arm64": "3.2.6", + "@lmdb/lmdb-darwin-x64": "3.2.6", + "@lmdb/lmdb-linux-arm": "3.2.6", + "@lmdb/lmdb-linux-arm64": "3.2.6", + "@lmdb/lmdb-linux-x64": "3.2.6", + "@lmdb/lmdb-win32-x64": "3.2.6" } }, "node_modules/loader-runner": { @@ -18707,18 +18325,16 @@ }, "node_modules/loader-utils": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", - "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 12.13.0" } }, "node_modules/locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -18737,14 +18353,7 @@ }, "node_modules/lodash": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "dev": true + "license": "MIT" }, "node_modules/lodash.clonedeepwith": { "version": "4.5.0", @@ -18754,9 +18363,8 @@ }, "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 + "dev": true, + "license": "MIT" }, "node_modules/lodash.includes": { "version": "4.3.0", @@ -18796,15 +18404,13 @@ }, "node_modules/lodash.memoize": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.once": { "version": "4.1.1", @@ -18820,9 +18426,8 @@ }, "node_modules/log-symbols": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -18836,9 +18441,8 @@ }, "node_modules/log-symbols/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -18852,9 +18456,8 @@ }, "node_modules/log-update": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", - "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", "dev": true, + "license": "MIT", "dependencies": { "ansi-escapes": "^7.0.0", "cli-cursor": "^5.0.0", @@ -18871,9 +18474,8 @@ }, "node_modules/log-update/node_modules/ansi-escapes": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", - "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", "dev": true, + "license": "MIT", "dependencies": { "environment": "^1.0.0" }, @@ -18886,9 +18488,8 @@ }, "node_modules/log-update/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -18898,9 +18499,8 @@ }, "node_modules/log-update/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -18910,9 +18510,8 @@ }, "node_modules/log-update/node_modules/cli-cursor": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, + "license": "MIT", "dependencies": { "restore-cursor": "^5.0.0" }, @@ -18925,15 +18524,13 @@ }, "node_modules/log-update/node_modules/emoji-regex": { "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/log-update/node_modules/is-fullwidth-code-point": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", - "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", "dev": true, + "license": "MIT", "dependencies": { "get-east-asian-width": "^1.0.0" }, @@ -18946,9 +18543,8 @@ }, "node_modules/log-update/node_modules/onetime": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, + "license": "MIT", "dependencies": { "mimic-function": "^5.0.0" }, @@ -18961,9 +18557,8 @@ }, "node_modules/log-update/node_modules/restore-cursor": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, + "license": "MIT", "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" @@ -18977,9 +18572,8 @@ }, "node_modules/log-update/node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, + "license": "ISC", "engines": { "node": ">=14" }, @@ -18989,9 +18583,8 @@ }, "node_modules/log-update/node_modules/slice-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", - "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" @@ -19005,9 +18598,8 @@ }, "node_modules/log-update/node_modules/string-width": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -19022,9 +18614,8 @@ }, "node_modules/log-update/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -19037,9 +18628,8 @@ }, "node_modules/log-update/node_modules/wrap-ansi": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", @@ -19070,8 +18660,7 @@ }, "node_modules/long": { "version": "5.2.4", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.4.tgz", - "integrity": "sha512-qtzLbJE8hq7VabR3mISmVGtoXP8KGc2Z/AT8OuqlYD7JTR3oqrgwdjnk07wpj1twXxYmgDXgoKVWUG/fReSzHg==" + "license": "Apache-2.0" }, "node_modules/long-timeout": { "version": "0.1.1", @@ -19119,17 +18708,15 @@ }, "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/lru.min": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.1.tgz", - "integrity": "sha512-FbAj6lXil6t8z4z3j0E5mfRlPzxkySotzUHwRXjlpRh10vc6AI6WN62ehZj82VG7M20rqogJ0GLwar2Xa05a8Q==", + "license": "MIT", "engines": { "bun": ">=1.0.0", "deno": ">=1.30.0", @@ -19150,19 +18737,17 @@ } }, "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==", + "version": "0.30.17", "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", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -19175,24 +18760,21 @@ }, "node_modules/make-dir/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/make-error": { "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "devOptional": true + "devOptional": true, + "license": "ISC" }, "node_modules/make-fetch-happen": { "version": "14.0.3", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", - "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/agent": "^3.0.0", "cacache": "^19.0.1", @@ -19212,31 +18794,46 @@ }, "node_modules/make-fetch-happen/node_modules/negotiator": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/make-fetch-happen/node_modules/proc-log": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/makeerror": { "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "tmpl": "1.0.5" } }, + "node_modules/map-obj": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mdn-data": { "version": "2.0.30", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", @@ -19245,8 +18842,7 @@ }, "node_modules/media-typer": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -19263,37 +18859,122 @@ "node": ">= 4.0.0" } }, + "node_modules/meow": { + "version": "9.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/hosted-git-info": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/normalize-package-data": { + "version": "3.0.3", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/meow/node_modules/yargs-parser": { + "version": "20.2.9", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/methods": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/micromatch": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -19304,8 +18985,7 @@ }, "node_modules/micromatch/node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -19315,16 +18995,15 @@ }, "node_modules/mikro-orm": { "version": "6.4.3", - "resolved": "https://registry.npmjs.org/mikro-orm/-/mikro-orm-6.4.3.tgz", - "integrity": "sha512-xDNzmLiL4EUTMOu9CbZ2d0sNIaUdH4RzDv4oqw27+u0/FPfvZTIagd+luxx1lWWqe/vg/iNtvqr5OcNQIYYrtQ==", + "license": "MIT", "engines": { "node": ">= 18.12.0" } }, "node_modules/mime": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -19334,16 +19013,14 @@ }, "node_modules/mime-db": { "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -19353,18 +19030,16 @@ }, "node_modules/mimic-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/mimic-function": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -19372,11 +19047,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/min-indent": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/mini-css-extract-plugin": { "version": "2.9.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", - "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", "dev": true, + "license": "MIT", "dependencies": { "schema-utils": "^4.0.0", "tapable": "^2.2.1" @@ -19394,14 +19076,12 @@ }, "node_modules/minimalistic-assert": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/minimatch": { "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -19414,25 +19094,43 @@ }, "node_modules/minimist": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minimist-options": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minimist-options/node_modules/is-plain-obj": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/minipass": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/minipass-collect": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", - "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, @@ -19442,9 +19140,8 @@ }, "node_modules/minipass-fetch": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.0.tgz", - "integrity": "sha512-2v6aXUXwLP1Epd/gc32HAMIWoczx+fZwEPRHm/VwtrJzRGwR1qGZXEYV3Zp8ZjjbwaZhMrM6uHV4KVkk+XCc2w==", "dev": true, + "license": "MIT", "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^1.0.3", @@ -19459,9 +19156,8 @@ }, "node_modules/minipass-flush": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -19471,9 +19167,8 @@ }, "node_modules/minipass-flush/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -19483,15 +19178,13 @@ }, "node_modules/minipass-flush/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/minipass-pipeline": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -19501,9 +19194,8 @@ }, "node_modules/minipass-pipeline/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -19513,15 +19205,13 @@ }, "node_modules/minipass-pipeline/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/minipass-sized": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -19531,9 +19221,8 @@ }, "node_modules/minipass-sized/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -19543,15 +19232,13 @@ }, "node_modules/minipass-sized/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/minizlib": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", - "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", "dev": true, + "license": "MIT", "dependencies": { "minipass": "^7.0.4", "rimraf": "^5.0.5" @@ -19562,9 +19249,8 @@ }, "node_modules/minizlib/node_modules/glob": { "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -19582,9 +19268,8 @@ }, "node_modules/minizlib/node_modules/jackspeak": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -19597,9 +19282,8 @@ }, "node_modules/minizlib/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -19612,9 +19296,8 @@ }, "node_modules/minizlib/node_modules/rimraf": { "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", "dev": true, + "license": "ISC", "dependencies": { "glob": "^10.3.7" }, @@ -19627,8 +19310,7 @@ }, "node_modules/mkdirp": { "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", "dependencies": { "minimist": "^1.2.6" }, @@ -19638,23 +19320,21 @@ }, "node_modules/moment": { "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", "dev": true, + "license": "MIT", "engines": { "node": "*" } }, "node_modules/moo": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", - "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/mrmime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", - "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", "dev": true, "engines": { "node": ">=10" @@ -19662,8 +19342,7 @@ }, "node_modules/ms": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "license": "MIT" }, "node_modules/msgpackr": { "version": "1.11.2", @@ -19698,9 +19377,8 @@ } }, "node_modules/multer": { - "version": "1.4.4-lts.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4-lts.1.tgz", - "integrity": "sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==", + "version": "1.4.5-lts.1", + "license": "MIT", "dependencies": { "append-field": "^1.0.0", "busboy": "^1.0.0", @@ -19716,9 +19394,8 @@ }, "node_modules/multicast-dns": { "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", "dev": true, + "license": "MIT", "dependencies": { "dns-packet": "^5.2.2", "thunky": "^1.0.2" @@ -19729,81 +19406,15 @@ }, "node_modules/mute-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/mv": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", - "integrity": "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==", - "dev": true, - "dependencies": { - "mkdirp": "~0.5.1", - "ncp": "~2.0.0", - "rimraf": "~2.4.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/mv/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/mv/node_modules/glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", - "dev": true, - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mv/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/mv/node_modules/rimraf": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", - "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==", - "dev": true, - "dependencies": { - "glob": "^6.0.1" - }, - "bin": { - "rimraf": "bin.js" - } - }, "node_modules/mysql2": { "version": "3.12.0", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.12.0.tgz", - "integrity": "sha512-C8fWhVysZoH63tJbX8d10IAoYCyXy4fdRFz2Ihrt9jtPILYynFEKUUzpp1U7qxzDc3tMbotvaBH+sl6bFnGZiw==", + "license": "MIT", "dependencies": { "aws-ssl-profiles": "^1.1.1", "denque": "^2.1.0", @@ -19821,8 +19432,7 @@ }, "node_modules/mysql2/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -19832,8 +19442,7 @@ }, "node_modules/mz": { "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "license": "MIT", "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", @@ -19842,8 +19451,7 @@ }, "node_modules/named-placeholders": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", - "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", + "license": "MIT", "dependencies": { "lru-cache": "^7.14.1" }, @@ -19853,22 +19461,13 @@ }, "node_modules/named-placeholders/node_modules/lru-cache": { "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "license": "ISC", "engines": { "node": ">=12" } }, - "node_modules/nanoclone": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz", - "integrity": "sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==", - "dev": true - }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", "dev": true, "funding": [ { @@ -19876,6 +19475,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -19885,24 +19485,13 @@ }, "node_modules/natural-compare": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", "dev": true, - "bin": { - "ncp": "bin/ncp" - } + "license": "MIT" }, "node_modules/nearley": { "version": "2.20.1", - "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz", - "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==", "dev": true, + "license": "MIT", "dependencies": { "commander": "^2.19.0", "moo": "^0.5.0", @@ -19922,9 +19511,8 @@ }, "node_modules/needle": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", - "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "iconv-lite": "^0.6.3", @@ -19939,9 +19527,8 @@ }, "node_modules/needle/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -19952,35 +19539,32 @@ }, "node_modules/negotiator": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/neo-async": { "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/nestjs-pino": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/nestjs-pino/-/nestjs-pino-4.0.0.tgz", - "integrity": "sha512-XhCg/R+l3w0BFP6MHyR6lU/BHVEV0tV9z24G0vuA9FD3sv+TQNvnO9uVsF1l/oVspgGfQ9Qulmb2UbsfYlI0+g==", + "version": "4.3.0", "hasInstallScript": true, + "license": "MIT", "engines": { "node": ">= 14" }, "peerDependencies": { - "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", - "pino-http": "^6.4.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" + "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0", + "pino-http": "^6.4.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0" } }, "node_modules/ng-packagr": { - "version": "19.0.1", - "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-19.0.1.tgz", - "integrity": "sha512-PnXa/y3ce3v4bKJNtUBS7qcNoyv5g/tSthoMe23NyMV5kjNY4+hJT7h64zK+8tnJWTelCbIpoep7tmSPsOifBA==", + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-19.2.0.tgz", + "integrity": "sha512-bDyB9tmXMCL/4IhKcX84zGQlQrZhPhdCaomdJocz6EN57cZWdTP7SGhrswzpdGJY+y89855detet27oJLgR3IQ==", "dev": true, "dependencies": { "@rollup/plugin-json": "^6.1.0", @@ -19989,10 +19573,10 @@ "ansi-colors": "^4.1.3", "browserslist": "^4.22.1", "chokidar": "^4.0.1", - "commander": "^12.1.0", + "commander": "^13.0.0", "convert-source-map": "^2.0.0", "dependency-graph": "^1.0.0", - "esbuild": "^0.24.0", + "esbuild": "^0.25.0", "fast-glob": "^3.3.2", "find-cache-dir": "^3.3.2", "injection-js": "^2.4.0", @@ -20002,7 +19586,7 @@ "piscina": "^4.7.0", "postcss": "^8.4.47", "rxjs": "^7.8.1", - "sass": "^1.79.5" + "sass": "^1.81.0" }, "bin": { "ng-packagr": "cli/main.js" @@ -20014,10 +19598,10 @@ "rollup": "^4.24.0" }, "peerDependencies": { - "@angular/compiler-cli": "^19.0.0-next.0", - "tailwindcss": "^2.0.0 || ^3.0.0", + "@angular/compiler-cli": "^19.0.0 || ^19.1.0-next.0 || ^19.2.0-next.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", "tslib": "^2.3.0", - "typescript": ">=5.5 <5.7" + "typescript": ">=5.5 <5.9" }, "peerDependenciesMeta": { "tailwindcss": { @@ -20027,9 +19611,8 @@ }, "node_modules/ng-packagr/node_modules/ajv": { "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -20042,25 +19625,17 @@ } }, "node_modules/ng-packagr/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "version": "13.1.0", "dev": true, + "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/ng-packagr/node_modules/convert-source-map": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/ng-packagr/node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-abort-controller": { "version": "3.1.1", @@ -20079,6 +19654,7 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -20097,17 +19673,20 @@ "node_modules/node-fetch/node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true }, "node_modules/node-fetch/node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true }, "node_modules/node-fetch/node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -20115,18 +19694,16 @@ }, "node_modules/node-forge": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.13.0" } }, "node_modules/node-gyp": { "version": "11.0.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.0.0.tgz", - "integrity": "sha512-zQS+9MTTeCMgY0F3cWPyJyRFAkVltQ1uXm+xXu/ES6KFgC6Czo1Seb9vQW2wNxSX2OrDTiqL0ojtkFxBQ0ypIw==", "dev": true, + "license": "MIT", "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", @@ -20163,18 +19740,16 @@ }, "node_modules/node-gyp/node_modules/chownr": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, + "license": "BlueOak-1.0.0", "engines": { "node": ">=18" } }, "node_modules/node-gyp/node_modules/glob": { "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -20192,18 +19767,16 @@ }, "node_modules/node-gyp/node_modules/isexe": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=16" } }, "node_modules/node-gyp/node_modules/jackspeak": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -20216,9 +19789,8 @@ }, "node_modules/node-gyp/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -20231,9 +19803,8 @@ }, "node_modules/node-gyp/node_modules/mkdirp": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", "dev": true, + "license": "MIT", "bin": { "mkdirp": "dist/cjs/src/bin.js" }, @@ -20246,18 +19817,16 @@ }, "node_modules/node-gyp/node_modules/proc-log": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/node-gyp/node_modules/tar": { "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", "dev": true, + "license": "ISC", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -20272,9 +19841,8 @@ }, "node_modules/node-gyp/node_modules/which": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^3.1.1" }, @@ -20287,18 +19855,16 @@ }, "node_modules/node-gyp/node_modules/yallist": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, + "license": "BlueOak-1.0.0", "engines": { "node": ">=18" } }, "node_modules/node-int64": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-machine-id": { "version": "1.1.12", @@ -20307,9 +19873,9 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true }, "node_modules/node-schedule": { @@ -20328,9 +19894,8 @@ }, "node_modules/nopt": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.0.0.tgz", - "integrity": "sha512-1L/fTJ4UmV/lUxT2Uf006pfZKTvAgCF+chz+0OgBHO8u2Z67pE7AaAUUj7CJy0lXqHmymUvGFt6NE9R3HER0yw==", "dev": true, + "license": "ISC", "dependencies": { "abbrev": "^2.0.0" }, @@ -20343,9 +19908,8 @@ }, "node_modules/normalize-package-data": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-7.0.0.tgz", - "integrity": "sha512-k6U0gKRIuNCTkwHGZqblCfLfBRh+w1vI6tBo+IeJwq2M8FUiOqhX7GH+GArQGScA7azd1WfyRCvxoXDO3hQDIA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^8.0.0", "semver": "^7.3.5", @@ -20357,9 +19921,8 @@ }, "node_modules/normalize-package-data/node_modules/hosted-git-info": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.0.2.tgz", - "integrity": "sha512-sYKnA7eGln5ov8T8gnYlkSOxFJvywzEx9BueN6xo/GKO8PGiI6uK6xx+DIGe45T3bdVjLAQDQW1aicT8z8JwQg==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^10.0.1" }, @@ -20369,33 +19932,29 @@ }, "node_modules/normalize-package-data/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/normalize-range": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/npm-bundled": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz", - "integrity": "sha512-IxaQZDMsqfQ2Lz37VvyyEtKLe8FsRZuysmedy/N06TU1RyVppYKXrO4xIhR0F+7ubIBox6Q7nir6fQI3ej39iA==", "dev": true, + "license": "ISC", "dependencies": { "npm-normalize-package-bin": "^4.0.0" }, @@ -20405,9 +19964,8 @@ }, "node_modules/npm-install-checks": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-7.1.1.tgz", - "integrity": "sha512-u6DCwbow5ynAX5BdiHQ9qvexme4U3qHW3MWe5NqH+NeBm0LbiH6zvGjNNew1fY+AZZUtVHbOPF3j7mJxbUzpXg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "semver": "^7.1.1" }, @@ -20417,18 +19975,16 @@ }, "node_modules/npm-normalize-package-bin": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz", - "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm-package-arg": { "version": "11.0.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", - "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", "dev": true, + "license": "ISC", "dependencies": { "hosted-git-info": "^7.0.0", "proc-log": "^3.0.0", @@ -20441,9 +19997,8 @@ }, "node_modules/npm-packlist": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-9.0.0.tgz", - "integrity": "sha512-8qSayfmHJQTx3nJWYbbUmflpyarbLMBc6LCAjYsiGtXxDB68HaZpb8re6zeaLGxZzDuMdhsg70jryJe+RrItVQ==", "dev": true, + "license": "ISC", "dependencies": { "ignore-walk": "^7.0.0" }, @@ -20453,9 +20008,8 @@ }, "node_modules/npm-pick-manifest": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-10.0.0.tgz", - "integrity": "sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ==", "dev": true, + "license": "ISC", "dependencies": { "npm-install-checks": "^7.1.0", "npm-normalize-package-bin": "^4.0.0", @@ -20468,9 +20022,8 @@ }, "node_modules/npm-pick-manifest/node_modules/hosted-git-info": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.0.2.tgz", - "integrity": "sha512-sYKnA7eGln5ov8T8gnYlkSOxFJvywzEx9BueN6xo/GKO8PGiI6uK6xx+DIGe45T3bdVjLAQDQW1aicT8z8JwQg==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^10.0.1" }, @@ -20480,15 +20033,13 @@ }, "node_modules/npm-pick-manifest/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/npm-pick-manifest/node_modules/npm-package-arg": { "version": "12.0.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.0.tgz", - "integrity": "sha512-ZTE0hbwSdTNL+Stx2zxSqdu2KZfNDcrtrLdIk7XGnQFYBWYDho/ORvXtn5XEePcL3tFpGjHCV3X3xrtDh7eZ+A==", "dev": true, + "license": "ISC", "dependencies": { "hosted-git-info": "^8.0.0", "proc-log": "^5.0.0", @@ -20501,27 +20052,24 @@ }, "node_modules/npm-pick-manifest/node_modules/proc-log": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm-pick-manifest/node_modules/validate-npm-package-name": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.0.tgz", - "integrity": "sha512-d7KLgL1LD3U3fgnvWEY1cQXoO/q6EQ1BSz48Sa149V/5zVTAbgmZIpyI8TRi6U9/JNyeYLlTKsEMPtLC27RFUg==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm-registry-fetch": { "version": "18.0.2", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-18.0.2.tgz", - "integrity": "sha512-LeVMZBBVy+oQb5R6FDV9OlJCcWDU+al10oKpe+nsvcHnG24Z3uM3SvJYKfGJlfGjVU8v9liejCrUR/M5HO5NEQ==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/redact": "^3.0.0", "jsonparse": "^1.3.1", @@ -20538,9 +20086,8 @@ }, "node_modules/npm-registry-fetch/node_modules/hosted-git-info": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.0.2.tgz", - "integrity": "sha512-sYKnA7eGln5ov8T8gnYlkSOxFJvywzEx9BueN6xo/GKO8PGiI6uK6xx+DIGe45T3bdVjLAQDQW1aicT8z8JwQg==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^10.0.1" }, @@ -20550,15 +20097,13 @@ }, "node_modules/npm-registry-fetch/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/npm-registry-fetch/node_modules/npm-package-arg": { "version": "12.0.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.0.tgz", - "integrity": "sha512-ZTE0hbwSdTNL+Stx2zxSqdu2KZfNDcrtrLdIk7XGnQFYBWYDho/ORvXtn5XEePcL3tFpGjHCV3X3xrtDh7eZ+A==", "dev": true, + "license": "ISC", "dependencies": { "hosted-git-info": "^8.0.0", "proc-log": "^5.0.0", @@ -20571,27 +20116,24 @@ }, "node_modules/npm-registry-fetch/node_modules/proc-log": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm-registry-fetch/node_modules/validate-npm-package-name": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.0.tgz", - "integrity": "sha512-d7KLgL1LD3U3fgnvWEY1cQXoO/q6EQ1BSz48Sa149V/5zVTAbgmZIpyI8TRi6U9/JNyeYLlTKsEMPtLC27RFUg==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm-run-path": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -20613,14 +20155,13 @@ }, "node_modules/nwsapi": { "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/nx": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/nx/-/nx-20.2.1.tgz", - "integrity": "sha512-zUw1DT9BW2ajbDZgcUFKfysGqrbJwsMRjPxT6GthuqcLtDc2iJi3+/UBTLsITSeiw4Za4qPVxjaK4+yma9Ju5w==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/nx/-/nx-20.5.0.tgz", + "integrity": "sha512-KuAzhTj1NHu3iOVsTBrzu7cboO69UgwzUMoAb8KfszV5FwQD5dARrkR7Ew4NZzFdB+arUr2rvo1ik9f1O19keg==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -20648,6 +20189,7 @@ "npm-run-path": "^4.0.1", "open": "^8.4.0", "ora": "5.3.0", + "resolve.exports": "2.0.3", "semver": "^7.5.3", "string-width": "^4.2.3", "tar-stream": "~2.2.0", @@ -20663,16 +20205,16 @@ "nx-cloud": "bin/nx-cloud.js" }, "optionalDependencies": { - "@nx/nx-darwin-arm64": "20.2.1", - "@nx/nx-darwin-x64": "20.2.1", - "@nx/nx-freebsd-x64": "20.2.1", - "@nx/nx-linux-arm-gnueabihf": "20.2.1", - "@nx/nx-linux-arm64-gnu": "20.2.1", - "@nx/nx-linux-arm64-musl": "20.2.1", - "@nx/nx-linux-x64-gnu": "20.2.1", - "@nx/nx-linux-x64-musl": "20.2.1", - "@nx/nx-win32-arm64-msvc": "20.2.1", - "@nx/nx-win32-x64-msvc": "20.2.1" + "@nx/nx-darwin-arm64": "20.5.0", + "@nx/nx-darwin-x64": "20.5.0", + "@nx/nx-freebsd-x64": "20.5.0", + "@nx/nx-linux-arm-gnueabihf": "20.5.0", + "@nx/nx-linux-arm64-gnu": "20.5.0", + "@nx/nx-linux-arm64-musl": "20.5.0", + "@nx/nx-linux-x64-gnu": "20.5.0", + "@nx/nx-linux-x64-musl": "20.5.0", + "@nx/nx-win32-arm64-msvc": "20.5.0", + "@nx/nx-win32-x64-msvc": "20.5.0" }, "peerDependencies": { "@swc-node/register": "^1.8.0", @@ -20769,70 +20311,54 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/nx/node_modules/yaml": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", - "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", - "dev": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/object-hash": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.4", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-keys": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/obuf": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/on-exit-leak-free": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", - "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "license": "MIT", "engines": { "node": ">=14.0.0" } }, "node_modules/on-finished": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -20842,27 +20368,23 @@ }, "node_modules/on-headers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, + "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/onetime": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -20881,9 +20403,8 @@ }, "node_modules/open": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", - "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", "dev": true, + "license": "MIT", "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", @@ -20906,18 +20427,6 @@ "yaml": "^2.5.0" } }, - "node_modules/openapi3-ts/node_modules/yaml": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", - "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", - "peer": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/opener": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", @@ -20929,9 +20438,8 @@ }, "node_modules/optionator": { "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, + "license": "MIT", "dependencies": { "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", @@ -20946,9 +20454,8 @@ }, "node_modules/ora": { "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dev": true, + "license": "MIT", "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -20969,9 +20476,8 @@ }, "node_modules/ora/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -20999,11 +20505,32 @@ "node": ">=0.10.0" } }, + "node_modules/oxc-resolver": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/oxc-resolver/-/oxc-resolver-1.12.0.tgz", + "integrity": "sha512-YlaCIArvWNKCWZFRrMjhh2l5jK80eXnpYP+bhRc1J/7cW3TiyEY0ngJo73o/5n8hA3+4yLdTmXLNTQ3Ncz50LQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxc-resolver/binding-darwin-arm64": "1.12.0", + "@oxc-resolver/binding-darwin-x64": "1.12.0", + "@oxc-resolver/binding-freebsd-x64": "1.12.0", + "@oxc-resolver/binding-linux-arm-gnueabihf": "1.12.0", + "@oxc-resolver/binding-linux-arm64-gnu": "1.12.0", + "@oxc-resolver/binding-linux-arm64-musl": "1.12.0", + "@oxc-resolver/binding-linux-x64-gnu": "1.12.0", + "@oxc-resolver/binding-linux-x64-musl": "1.12.0", + "@oxc-resolver/binding-wasm32-wasi": "1.12.0", + "@oxc-resolver/binding-win32-arm64-msvc": "1.12.0", + "@oxc-resolver/binding-win32-x64-msvc": "1.12.0" + } + }, "node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -21016,9 +20543,8 @@ }, "node_modules/p-locate": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -21028,9 +20554,8 @@ }, "node_modules/p-locate/node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -21043,9 +20568,8 @@ }, "node_modules/p-map": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", - "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -21055,9 +20579,8 @@ }, "node_modules/p-retry": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", - "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/retry": "0.12.2", "is-network-error": "^1.0.0", @@ -21072,38 +20595,33 @@ }, "node_modules/p-retry/node_modules/retry": { "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/package-json-from-dist": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true + "dev": true, + "license": "BlueOak-1.0.0" }, "node_modules/packet-reader": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", - "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + "license": "MIT" }, "node_modules/pacote": { "version": "20.0.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-20.0.0.tgz", - "integrity": "sha512-pRjC5UFwZCgx9kUFDVM9YEahv4guZ1nSLqwmWiLUnDbGsjs+U5w7z6Uc8HNR1a6x8qnu5y9xtGE6D1uAuYz+0A==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/git": "^6.0.0", "@npmcli/installed-package-contents": "^3.0.0", @@ -21132,9 +20650,8 @@ }, "node_modules/pacote/node_modules/hosted-git-info": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.0.2.tgz", - "integrity": "sha512-sYKnA7eGln5ov8T8gnYlkSOxFJvywzEx9BueN6xo/GKO8PGiI6uK6xx+DIGe45T3bdVjLAQDQW1aicT8z8JwQg==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^10.0.1" }, @@ -21144,15 +20661,13 @@ }, "node_modules/pacote/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/pacote/node_modules/npm-package-arg": { "version": "12.0.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.0.tgz", - "integrity": "sha512-ZTE0hbwSdTNL+Stx2zxSqdu2KZfNDcrtrLdIk7XGnQFYBWYDho/ORvXtn5XEePcL3tFpGjHCV3X3xrtDh7eZ+A==", "dev": true, + "license": "ISC", "dependencies": { "hosted-git-info": "^8.0.0", "proc-log": "^5.0.0", @@ -21165,27 +20680,30 @@ }, "node_modules/pacote/node_modules/proc-log": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/pacote/node_modules/validate-npm-package-name": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.0.tgz", - "integrity": "sha512-d7KLgL1LD3U3fgnvWEY1cQXoO/q6EQ1BSz48Sa149V/5zVTAbgmZIpyI8TRi6U9/JNyeYLlTKsEMPtLC27RFUg==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "dev": true + }, "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -21195,17 +20713,14 @@ }, "node_modules/parent-require": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parent-require/-/parent-require-1.0.0.tgz", - "integrity": "sha512-2MXDNZC4aXdkkap+rBBMv0lUsfJqvX5/2FiYYnfCnorZt3Pk06/IOR5KeaoghgS2w07MLWgjbsnyaq6PdHn2LQ==", "engines": { "node": ">= 0.4.0" } }, "node_modules/parse-json": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -21221,21 +20736,18 @@ }, "node_modules/parse-json/node_modules/json-parse-even-better-errors": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/parse-json/node_modules/lines-and-columns": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/parse-node-version": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.10" } @@ -21283,16 +20795,14 @@ }, "node_modules/parse5-htmlparser2-tree-adapter": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "license": "MIT", "dependencies": { "parse5": "^6.0.1" } }, "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + "license": "MIT" }, "node_modules/parse5-sax-parser": { "version": "7.0.0", @@ -21320,47 +20830,41 @@ }, "node_modules/parseurl": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-parse": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "license": "MIT" }, "node_modules/path-scurry": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -21374,25 +20878,36 @@ }, "node_modules/path-scurry/node_modules/lru-cache": { "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "license": "ISC", "engines": { "node": "14 || >=16.14" } }, "node_modules/path-to-regexp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz", - "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==" + "version": "8.2.0", + "license": "MIT", + "engines": { + "node": ">=16" + } }, "node_modules/path-type": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/peek-stream": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.3.tgz", + "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "duplexify": "^3.5.0", + "through2": "^2.0.3" + } + }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -21401,8 +20916,7 @@ }, "node_modules/pg": { "version": "8.11.3", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.3.tgz", - "integrity": "sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==", + "license": "MIT", "dependencies": { "buffer-writer": "2.0.0", "packet-reader": "1.0.0", @@ -21429,28 +20943,24 @@ }, "node_modules/pg-cloudflare": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", - "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", + "license": "MIT", "optional": true }, "node_modules/pg-connection-string": { "version": "2.6.2", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", - "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==" + "license": "MIT" }, "node_modules/pg-int8": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "license": "ISC", "engines": { "node": ">=4.0.0" } }, "node_modules/pg-mem": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pg-mem/-/pg-mem-3.0.2.tgz", - "integrity": "sha512-fbf55spR1nNWfxBm28h9Cx6lC5VSubqBjbTMkCMORtGJPiBD3GTDyHAntUm3s5eSt4/ork7HvpNmeWgkgRmDWg==", "dev": true, + "license": "MIT", "dependencies": { "functional-red-black-tree": "^1.0.1", "immutable": "^4.3.4", @@ -21506,9 +21016,8 @@ }, "node_modules/pg-mem/node_modules/lru-cache": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -21518,334 +21027,574 @@ }, "node_modules/pg-mem/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/pg-pool": { "version": "3.7.0", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.7.0.tgz", - "integrity": "sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==", + "license": "MIT", "peerDependencies": { "pg": ">=8.0" } }, "node_modules/pg-protocol": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.7.0.tgz", - "integrity": "sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==" + "license": "MIT" }, "node_modules/pg-types": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "license": "MIT", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/pgsql-ast-parser": { + "version": "12.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "moo": "^0.5.1", + "nearley": "^2.19.5" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pino": { + "version": "9.6.0", + "license": "MIT", + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^2.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^4.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "split2": "^4.0.0" + } + }, + "node_modules/pino-http": { + "version": "10.4.0", + "license": "MIT", + "dependencies": { + "get-caller-file": "^2.0.5", + "pino": "^9.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^4.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "7.0.0", + "license": "MIT" + }, + "node_modules/pirates": { + "version": "4.0.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/piscina": { + "version": "4.8.0", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "@napi-rs/nice": "^1.0.1" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkginfo": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/plur": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "irregular-plurals": "^3.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pony-cause": { + "version": "2.1.11", + "license": "0BSD", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/portfinder": { + "version": "1.0.33", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.33.tgz", + "integrity": "sha512-+2jndHT63cL5MdQOwDm9OT2dIe11zVpjV+0GGRXdtO1wpPxv260NfVqoEXtYAi/shanmm3W4+yLduIe55ektTw==", + "dev": true, + "dependencies": { + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/postcss": { + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz", + "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", + "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-colormin": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", + "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-convert-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", + "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", + "dev": true, "dependencies": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=4" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/pgpass": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", - "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", - "dependencies": { - "split2": "^4.1.0" + "node_modules/postcss-discard-comments": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", + "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", + "dev": true, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/pgsql-ast-parser": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/pgsql-ast-parser/-/pgsql-ast-parser-12.0.1.tgz", - "integrity": "sha512-pe8C6Zh5MsS+o38WlSu18NhrTjAv1UNMeDTs2/Km2ZReZdYBYtwtbWGZKK2BM2izv5CrQpbmP0oI10wvHOwv4A==", + "node_modules/postcss-discard-duplicates": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", + "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", "dev": true, - "dependencies": { - "moo": "^0.5.1", - "nearley": "^2.19.5" + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true - }, - "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "node_modules/postcss-discard-empty": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", + "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", "dev": true, "engines": { - "node": ">=12" + "node": "^14 || ^16 || >=18.0" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "node_modules/postcss-discard-overridden": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", + "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/pino": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.19.0.tgz", - "integrity": "sha512-oswmokxkav9bADfJ2ifrvfHUwad6MLp73Uat0IkQWY3iAw5xTRoznXbXksZs8oaOUMpmhVWD+PZogNzllWpJaA==", + "node_modules/postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "dev": true, "dependencies": { - "atomic-sleep": "^1.0.0", - "fast-redact": "^3.1.1", - "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "v1.1.0", - "pino-std-serializers": "^6.0.0", - "process-warning": "^3.0.0", - "quick-format-unescaped": "^4.0.3", - "real-require": "^0.2.0", - "safe-stable-stringify": "^2.3.1", - "sonic-boom": "^3.7.0", - "thread-stream": "^2.0.0" + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" }, - "bin": { - "pino": "bin.js" + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" } }, - "node_modules/pino-abstract-transport": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.1.0.tgz", - "integrity": "sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==", + "node_modules/postcss-loader": { + "version": "8.1.1", + "dev": true, + "license": "MIT", "dependencies": { - "readable-stream": "^4.0.0", - "split2": "^4.0.0" - } - }, - "node_modules/pino-abstract-transport/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "cosmiconfig": "^9.0.0", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true }, - { - "type": "consulting", - "url": "https://feross.org/support" + "webpack": { + "optional": true } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" } }, - "node_modules/pino-abstract-transport/node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "node_modules/postcss-loader/node_modules/cosmiconfig": { + "version": "9.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/pino-abstract-transport/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/pino-http": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/pino-http/-/pino-http-9.0.0.tgz", - "integrity": "sha512-Q9QDNEz0vQmbJtMFjOVr2c9yL92vHudjmr3s3m6J1hbw3DBGFZJm3TIj9TWyynZ4GEsEA9SOtni4heRUr6lNOg==", - "dependencies": { - "get-caller-file": "^2.0.5", - "pino": "^8.17.1", - "pino-std-serializers": "^6.2.2", - "process-warning": "^3.0.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/pino-std-serializers": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", - "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "node_modules/postcss-merge-longhand": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", + "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^6.1.1" + }, "engines": { - "node": ">= 6" - } - }, - "node_modules/piscina": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.7.0.tgz", - "integrity": "sha512-b8hvkpp9zS0zsfa939b/jXbe64Z2gZv0Ha7FYPNUiDIB1y2AtxcOZdfP8xN8HFjUaqQiT9gRlfjAsoL8vdJ1Iw==", - "dev": true, - "optionalDependencies": { - "@napi-rs/nice": "^1.0.1" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "node_modules/postcss-merge-rules": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", + "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", "dev": true, "dependencies": { - "find-up": "^4.0.0" + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^4.0.2", + "postcss-selector-parser": "^6.0.16" }, "engines": { - "node": ">=8" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/pkginfo": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", - "integrity": "sha512-8xCNE/aT/EXKenuMDZ+xTVwkT8gsoHN2z/Q29l80u0ppGEXVvsKRzNMbtKhg8LS8k1tJLAHHylf6p4VFmP6XUQ==", + "node_modules/postcss-minify-font-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", + "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">= 0.4.0" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "node_modules/postcss-minify-gradients": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", + "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", "dev": true, + "dependencies": { + "colord": "^2.9.3", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">=4" - } - }, - "node_modules/pony-cause": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/pony-cause/-/pony-cause-2.1.11.tgz", - "integrity": "sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==", - "engines": { - "node": ">=12.0.0" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/portfinder": { - "version": "1.0.32", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", - "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", + "node_modules/postcss-minify-params": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", + "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", "dev": true, "dependencies": { - "async": "^2.6.4", - "debug": "^3.2.7", - "mkdirp": "^0.5.6" + "browserslist": "^4.23.0", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">= 0.12.0" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/portfinder/node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "node_modules/postcss-minify-selectors": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", + "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", "dev": true, "dependencies": { - "lodash": "^4.17.14" + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/portfinder/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", "dev": true, - "dependencies": { - "ms": "^2.1.1" + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.5", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/postcss-calc": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", - "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", + "node_modules/postcss-modules-scope": { + "version": "3.2.0", "dev": true, + "license": "ISC", "dependencies": { - "postcss-selector-parser": "^6.0.11", - "postcss-value-parser": "^4.2.0" + "postcss-selector-parser": "^6.0.4" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >= 14" }, "peerDependencies": { - "postcss": "^8.2.2" + "postcss": "^8.1.0" } }, - "node_modules/postcss-colormin": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", - "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", + "node_modules/postcss-modules-values": { + "version": "4.0.0", "dev": true, + "license": "ISC", "dependencies": { - "browserslist": "^4.23.0", - "caniuse-api": "^3.0.0", - "colord": "^2.9.3", - "postcss-value-parser": "^4.2.0" + "icss-utils": "^5.0.0" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >= 14" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.1.0" } }, - "node_modules/postcss-convert-values": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", - "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", + "node_modules/postcss-normalize-charset": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", + "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", "dev": true, - "dependencies": { - "browserslist": "^4.23.0", - "postcss-value-parser": "^4.2.0" - }, "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -21853,11 +21602,14 @@ "postcss": "^8.4.31" } }, - "node_modules/postcss-discard-comments": { + "node_modules/postcss-normalize-display-values": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", - "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", + "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -21865,11 +21617,14 @@ "postcss": "^8.4.31" } }, - "node_modules/postcss-discard-duplicates": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", - "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", + "node_modules/postcss-normalize-positions": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", + "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -21877,11 +21632,14 @@ "postcss": "^8.4.31" } }, - "node_modules/postcss-discard-empty": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", - "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", + "node_modules/postcss-normalize-repeat-style": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", + "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -21889,11 +21647,14 @@ "postcss": "^8.4.31" } }, - "node_modules/postcss-discard-overridden": { + "node_modules/postcss-normalize-string": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", - "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", + "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -21901,94 +21662,59 @@ "postcss": "^8.4.31" } }, - "node_modules/postcss-import": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", - "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "node_modules/postcss-normalize-timing-functions": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", + "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", "dev": true, "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=10.0.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.0.0" + "postcss": "^8.4.31" } }, - "node_modules/postcss-loader": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", - "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==", + "node_modules/postcss-normalize-unicode": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", + "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", "dev": true, "dependencies": { - "cosmiconfig": "^9.0.0", - "jiti": "^1.20.0", - "semver": "^7.5.4" + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } + "postcss": "^8.4.31" } }, - "node_modules/postcss-loader/node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "node_modules/postcss-normalize-url": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", + "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", "dev": true, "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "postcss": "^8.4.31" } }, - "node_modules/postcss-media-query-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", - "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", - "dev": true - }, - "node_modules/postcss-merge-longhand": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", - "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", + "node_modules/postcss-normalize-whitespace": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", + "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", "dev": true, "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^6.1.1" + "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^14 || ^16 || >=18.0" @@ -21997,16 +21723,14 @@ "postcss": "^8.4.31" } }, - "node_modules/postcss-merge-rules": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", - "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", + "node_modules/postcss-ordered-values": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", + "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", "dev": true, "dependencies": { - "browserslist": "^4.23.0", - "caniuse-api": "^3.0.0", "cssnano-utils": "^4.0.2", - "postcss-selector-parser": "^6.0.16" + "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^14 || ^16 || >=18.0" @@ -22015,13 +21739,14 @@ "postcss": "^8.4.31" } }, - "node_modules/postcss-minify-font-values": { + "node_modules/postcss-reduce-initial": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", - "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", + "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", "dev": true, "dependencies": { - "postcss-value-parser": "^4.2.0" + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0" }, "engines": { "node": "^14 || ^16 || >=18.0" @@ -22030,14 +21755,12 @@ "postcss": "^8.4.31" } }, - "node_modules/postcss-minify-gradients": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", - "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", + "node_modules/postcss-reduce-transforms": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", + "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", "dev": true, "dependencies": { - "colord": "^2.9.3", - "cssnano-utils": "^4.0.2", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -22047,27 +21770,38 @@ "postcss": "^8.4.31" } }, - "node_modules/postcss-minify-params": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", - "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", + "node_modules/postcss-selector-parser": { + "version": "6.1.2", "dev": true, + "license": "MIT", "dependencies": { - "browserslist": "^4.23.0", - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", + "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^3.2.0" + }, + "engines": { + "node": "^14 || ^16 || >= 18" }, "peerDependencies": { "postcss": "^8.4.31" } }, - "node_modules/postcss-minify-selectors": { + "node_modules/postcss-unique-selectors": { "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", - "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", + "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.16" @@ -22079,1152 +21813,1334 @@ "postcss": "^8.4.31" } }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "node_modules/postcss-url": { + "version": "10.1.3", "dev": true, + "license": "MIT", + "dependencies": { + "make-dir": "~3.1.0", + "mime": "~2.5.2", + "minimatch": "~3.0.4", + "xxhashjs": "~0.2.2" + }, "engines": { - "node": "^10 || ^12 || >= 14" + "node": ">=10" }, "peerDependencies": { - "postcss": "^8.1.0" + "postcss": "^8.0.0" } }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", - "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", + "node_modules/postcss-url/node_modules/brace-expansion": { + "version": "1.1.11", "dev": true, + "license": "MIT", "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/postcss-url/node_modules/mime": { + "version": "2.5.2", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" }, "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">=4.0.0" } }, - "node_modules/postcss-modules-scope": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", - "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", + "node_modules/postcss-url/node_modules/minimatch": { + "version": "3.0.8", "dev": true, + "license": "ISC", "dependencies": { - "postcss-selector-parser": "^6.0.4" + "brace-expansion": "^1.1.7" }, "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": "*" } }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "node_modules/postcss-value-parser": { + "version": "4.2.0", "dev": true, + "license": "MIT" + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "license": "MIT", "dependencies": { - "icss-utils": "^5.0.0" + "xtend": "^4.0.0" }, "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">=0.10.0" } }, - "node_modules/postcss-normalize-charset": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", - "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", + "node_modules/prelude-ls": { + "version": "1.2.1", "dev": true, + "license": "MIT", "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": ">= 0.8.0" } }, - "node_modules/postcss-normalize-display-values": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", - "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", + "node_modules/prettier": { + "version": "2.8.8", "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": ">=10.13.0" }, - "peerDependencies": { - "postcss": "^8.4.31" + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/postcss-normalize-positions": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", - "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", + "node_modules/pretty-format": { + "version": "29.7.0", "dev": true, + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/postcss-normalize-repeat-style": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", - "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, + "license": "MIT", "engines": { - "node": "^14 || ^16 || >=18.0" + "node": ">=10" }, - "peerDependencies": { - "postcss": "^8.4.31" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/postcss-normalize-string": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", - "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", + "node_modules/proc-log": { + "version": "3.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/process-warning": { + "version": "4.0.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/promise-retry": { + "version": "2.0.1", "dev": true, + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "err-code": "^2.0.2", + "retry": "^0.12.0" }, "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": ">=10" } }, - "node_modules/postcss-normalize-timing-functions": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", - "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", + "node_modules/prompts": { + "version": "2.4.2", "dev": true, + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" }, "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": ">= 6" } }, - "node_modules/postcss-normalize-unicode": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", - "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", - "dev": true, + "node_modules/proxy-addr": { + "version": "2.0.7", + "license": "MIT", "dependencies": { - "browserslist": "^4.23.0", - "postcss-value-parser": "^4.2.0" + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" }, "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": ">= 0.10" } }, - "node_modules/postcss-normalize-url": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", - "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", + "node_modules/proxy-from-env": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/prr": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/psl": { + "version": "1.9.0", + "dev": true, + "license": "MIT" + }, + "node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "dev": true, "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "node_modules/postcss-normalize-whitespace": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", - "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", "dev": true, "dependencies": { - "postcss-value-parser": "^4.2.0" - }, + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "license": "MIT", "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": ">=6" } }, - "node_modules/postcss-ordered-values": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", - "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", + "node_modules/pure-rand": { + "version": "6.0.4", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dependencies": { - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" + "side-channel": "^1.0.6" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": ">=0.6" }, - "peerDependencies": { - "postcss": "^8.4.31" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-reduce-initial": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", - "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", + "node_modules/querystringify": { + "version": "2.2.0", "dev": true, - "dependencies": { - "browserslist": "^4.23.0", - "caniuse-api": "^3.0.0" - }, + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "dev": true, + "license": "MIT", "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": ">=8" } }, - "node_modules/postcss-reduce-transforms": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", - "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", + "node_modules/railroad-diagrams": { + "version": "1.0.0", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/rambda": { + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/rambda/-/rambda-9.4.2.tgz", + "integrity": "sha512-++euMfxnl7OgaEKwXh9QqThOjMeta2HH001N1v4mYQzBjJBnmXBh2BCK6dZAbICFVXOFUVD3xFG0R3ZPU0mxXw==", + "dev": true + }, + "node_modules/randexp": { + "version": "0.4.6", "dev": true, + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "discontinuous-range": "1.0.0", + "ret": "~0.1.10" }, "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": ">=0.12" } }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "node_modules/randombytes": { + "version": "2.1.0", "dev": true, + "license": "MIT", "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 0.6" } }, - "node_modules/postcss-svgo": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", - "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^3.2.0" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, "engines": { - "node": "^14 || ^16 || >= 18" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": ">= 0.8" } }, - "node_modules/postcss-unique-selectors": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", - "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "dev": true, + "peer": true, "dependencies": { - "postcss-selector-parser": "^6.0.16" + "loose-envify": "^1.1.0" }, "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": ">=0.10.0" } }, - "node_modules/postcss-url": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-10.1.3.tgz", - "integrity": "sha512-FUzyxfI5l2tKmXdYc6VTu3TWZsInayEKPbiyW+P6vmmIrrb4I6CGX0BFoewgYHLK+oIL5FECEK02REYRpBvUCw==", + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "dev": true, + "peer": true, "dependencies": { - "make-dir": "~3.1.0", - "mime": "~2.5.2", - "minimatch": "~3.0.4", - "xxhashjs": "~0.2.2" - }, - "engines": { - "node": ">=10" + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" }, "peerDependencies": { - "postcss": "^8.0.0" + "react": "^18.3.1" } }, - "node_modules/postcss-url/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/react-is": { + "version": "18.2.0", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } + "license": "MIT" }, - "node_modules/postcss-url/node_modules/mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" + "dependencies": { + "pify": "^2.3.0" } }, - "node_modules/postcss-url/node_modules/minimatch": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", - "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "node_modules/read-pkg": { + "version": "5.2.0", "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/postgres-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "node_modules/read-pkg-up": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postgres-bytea": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", - "engines": { - "node": ">=0.10.0" - } + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "dev": true, + "license": "ISC" }, - "node_modules/postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "xtend": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", "dev": true, - "engines": { - "node": ">= 0.8.0" + "license": "ISC", + "bin": { + "semver": "bin/semver" } }, - "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "node": ">=8" } }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, + "node_modules/readable-stream": { + "version": "2.3.8", + "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "4.0.2", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 14.16.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", - "dev": true, + "node_modules/real-require": { + "version": "0.2.0", + "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 12.13.0" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "node_modules/rechoir": { + "version": "0.8.0", + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, "engines": { - "node": ">= 0.6.0" + "node": ">= 10.13.0" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/process-warning": { + "node_modules/redent": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", - "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==" - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, + "license": "MIT", "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "node_modules/reflect-metadata": { + "version": "0.1.14", + "license": "Apache-2.0" + }, + "node_modules/regenerate": { + "version": "1.4.2", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", "dev": true, + "license": "MIT", "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" + "regenerate": "^1.4.2" }, "engines": { - "node": ">= 6" + "node": ">=4" } }, - "node_modules/property-expr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz", - "integrity": "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==", - "dev": true + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "dev": true, + "license": "MIT" }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "node_modules/regenerator-transform": { + "version": "0.15.2", + "dev": true, + "license": "MIT", "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" + "@babel/runtime": "^7.8.4" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "node_modules/regex-parser": { + "version": "2.3.0", "dev": true, - "optional": true - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true + "license": "MIT" }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "node_modules/regexpu-core": { + "version": "6.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/pure-rand": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", - "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", + "node_modules/regjsgen": { + "version": "0.8.0", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ] + "license": "MIT" }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "node_modules/regjsparser": { + "version": "0.12.0", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" + "jsesc": "~3.0.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "regjsparser": "bin/parser" } }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true + "node_modules/repeat-string": { + "version": "1.6.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "node_modules/require-directory": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/quick-format-unescaped": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", - "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + "node_modules/require-from-string": { + "version": "2.0.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/railroad-diagrams": { + "node_modules/requires-port": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", - "integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==", - "dev": true + "dev": true, + "license": "MIT" }, - "node_modules/rambda": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/rambda/-/rambda-9.4.0.tgz", - "integrity": "sha512-B7y7goUd+g0hNl5ODGUejNNERQL5gD8uANJ5Y5aHly8v0jKesFlwIe7prPfuJxttDpe3otQzHJ4NXMpTmL9ELA==", - "dev": true + "node_modules/resolve": { + "version": "1.22.8", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/randexp": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", - "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", + "node_modules/resolve-cwd": { + "version": "3.0.0", "dev": true, + "license": "MIT", "dependencies": { - "discontinuous-range": "1.0.0", - "ret": "~0.1.10" + "resolve-from": "^5.0.0" }, "engines": { - "node": ">=0.12" + "node": ">=8" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", "dev": true, "dependencies": { - "safe-buffer": "^5.1.0" + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "node_modules/resolve-from": { + "version": "5.0.0", + "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "node_modules/resolve-url-loader": { + "version": "5.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" }, "engines": { - "node": ">= 0.8" + "node": ">=12" } }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "node_modules/resolve-url-loader/node_modules/loader-utils": { + "version": "2.0.4", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "node_modules/resolve.exports": { + "version": "2.0.3", "dev": true, - "peer": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "dev": true, + "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, - "peerDependencies": { - "react": "^18.3.1" + "engines": { + "node": ">=8" } }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "node_modules/ret": { + "version": "0.1.15", "dev": true, - "dependencies": { - "pify": "^2.3.0" + "license": "MIT", + "engines": { + "node": ">=0.12" } }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "node_modules/retry": { + "version": "0.12.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" } }, - "node_modules/readable-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "node_modules/reusify": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "node_modules/rfdc": { + "version": "1.4.1", + "dev": true, + "license": "MIT" }, - "node_modules/readdirp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", - "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "node_modules/rimraf": { + "version": "3.0.2", "dev": true, - "engines": { - "node": ">= 14.16.0" + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" }, "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/real-require": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", - "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "node_modules/rollup": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.8.tgz", + "integrity": "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, "engines": { - "node": ">= 12.13.0" + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.34.8", + "@rollup/rollup-android-arm64": "4.34.8", + "@rollup/rollup-darwin-arm64": "4.34.8", + "@rollup/rollup-darwin-x64": "4.34.8", + "@rollup/rollup-freebsd-arm64": "4.34.8", + "@rollup/rollup-freebsd-x64": "4.34.8", + "@rollup/rollup-linux-arm-gnueabihf": "4.34.8", + "@rollup/rollup-linux-arm-musleabihf": "4.34.8", + "@rollup/rollup-linux-arm64-gnu": "4.34.8", + "@rollup/rollup-linux-arm64-musl": "4.34.8", + "@rollup/rollup-linux-loongarch64-gnu": "4.34.8", + "@rollup/rollup-linux-powerpc64le-gnu": "4.34.8", + "@rollup/rollup-linux-riscv64-gnu": "4.34.8", + "@rollup/rollup-linux-s390x-gnu": "4.34.8", + "@rollup/rollup-linux-x64-gnu": "4.34.8", + "@rollup/rollup-linux-x64-musl": "4.34.8", + "@rollup/rollup-win32-arm64-msvc": "4.34.8", + "@rollup/rollup-win32-ia32-msvc": "4.34.8", + "@rollup/rollup-win32-x64-msvc": "4.34.8", + "fsevents": "~2.3.2" } }, - "node_modules/rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "node_modules/router": { + "version": "2.1.0", + "license": "MIT", "dependencies": { - "resolve": "^1.20.0" + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 18" } }, - "node_modules/reflect-metadata": { - "version": "0.1.14", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", - "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==" + "node_modules/router/node_modules/is-promise": { + "version": "4.0.0", + "license": "MIT" }, - "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 + "node_modules/run-applescript": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "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==", + "node_modules/run-parallel": { + "version": "1.2.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, "dependencies": { - "regenerate": "^1.4.2" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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 - }, - "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, - "dependencies": { - "@babel/runtime": "^7.8.4" + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "license": "MIT", + "engines": { + "node": ">=10" } }, - "node_modules/regex-parser": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", - "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==", - "dev": true + "node_modules/safer-buffer": { + "version": "2.1.2", + "license": "MIT" }, - "node_modules/regexpu-core": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", - "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "node_modules/sass": { + "version": "1.85.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.0.tgz", + "integrity": "sha512-3ToiC1xZ1Y8aU7+CkgCI/tqyuPXEmYGJXO7H4uqp0xkLXUqp88rQQ4j1HmP37xSJLbCJPaIiv+cT1y+grssrww==", "dev": true, "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.0", - "regjsgen": "^0.8.0", - "regjsparser": "^0.12.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" }, "engines": { - "node": ">=4" + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" } }, - "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 - }, - "node_modules/regjsparser": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", - "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "node_modules/sass-embedded": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.85.1.tgz", + "integrity": "sha512-0i+3h2Df/c71afluxC1SXqyyMmJlnKWfu9ZGdzwuKRM1OftEa2XM2myt5tR36CF3PanYrMjFKtRIj8PfSf838w==", "dev": true, "dependencies": { - "jsesc": "~3.0.2" + "@bufbuild/protobuf": "^2.0.0", + "buffer-builder": "^0.2.0", + "colorjs.io": "^0.5.0", + "immutable": "^5.0.2", + "rxjs": "^7.4.0", + "supports-color": "^8.1.1", + "sync-child-process": "^1.0.2", + "varint": "^6.0.0" }, "bin": { - "regjsparser": "bin/parser" + "sass": "dist/bin/sass.js" + }, + "engines": { + "node": ">=16.0.0" + }, + "optionalDependencies": { + "sass-embedded-android-arm": "1.85.1", + "sass-embedded-android-arm64": "1.85.1", + "sass-embedded-android-ia32": "1.85.1", + "sass-embedded-android-riscv64": "1.85.1", + "sass-embedded-android-x64": "1.85.1", + "sass-embedded-darwin-arm64": "1.85.1", + "sass-embedded-darwin-x64": "1.85.1", + "sass-embedded-linux-arm": "1.85.1", + "sass-embedded-linux-arm64": "1.85.1", + "sass-embedded-linux-ia32": "1.85.1", + "sass-embedded-linux-musl-arm": "1.85.1", + "sass-embedded-linux-musl-arm64": "1.85.1", + "sass-embedded-linux-musl-ia32": "1.85.1", + "sass-embedded-linux-musl-riscv64": "1.85.1", + "sass-embedded-linux-musl-x64": "1.85.1", + "sass-embedded-linux-riscv64": "1.85.1", + "sass-embedded-linux-x64": "1.85.1", + "sass-embedded-win32-arm64": "1.85.1", + "sass-embedded-win32-ia32": "1.85.1", + "sass-embedded-win32-x64": "1.85.1" + } + }, + "node_modules/sass-embedded-android-arm": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.85.1.tgz", + "integrity": "sha512-GkcgUGMZtEF9gheuE1dxCU0ZSAifuaFXi/aX7ZXvjtdwmTl9Zc/OHR9oiUJkc8IW9UI7H8TuwlTAA8+SwgwIeQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" } }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "node_modules/sass-embedded-android-arm64": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.85.1.tgz", + "integrity": "sha512-27oRheqNA3SJM2hAxpVbs7mCKUwKPWmEEhyiNFpBINb5ELVLg+Ck5RsGg+SJmo130ul5YX0vinmVB5uPWc8X5w==", + "cpu": [ + "arm64" + ], "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=0.10" + "node": ">=14.0.0" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "node_modules/sass-embedded-android-ia32": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.85.1.tgz", + "integrity": "sha512-f3x16NyRgtXFksIaO/xXKrUhttUBv8V0XsAR2Dhdb/yz4yrDrhzw9Wh8fmw7PlQqECcQvFaoDr3XIIM6lKzasw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=0.10.0" + "node": ">=14.0.0" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "node_modules/sass-embedded-android-riscv64": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.85.1.tgz", + "integrity": "sha512-IP6OijpJ8Mqo7XqCe0LsuZVbAxEFVboa0kXqqR5K55LebEplsTIA2GnmRyMay3Yr/2FVGsZbCb6Wlgkw23eCiA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=0.10.0" + "node": ">=14.0.0" } }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/sass-embedded-android-x64": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.85.1.tgz", + "integrity": "sha512-Mh7CA53wR3ADvXAYipFc/R3vV4PVOzoKwWzPxmq+7i8UZrtsVjKONxGtqWe9JG1mna0C9CRZAx0sv/BzbOJxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" } }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "node_modules/sass-embedded-darwin-arm64": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.85.1.tgz", + "integrity": "sha512-msWxzhvcP9hqGVegxVePVEfv9mVNTlUgGr6k7O7Ihji702mbtrH/lKwF4aRkkt4g1j7tv10+JtQXmTNi/pi9kA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=8" + "node": ">=14.0.0" } }, - "node_modules/resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "node_modules/sass-embedded-darwin-x64": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.85.1.tgz", + "integrity": "sha512-J4UFHUiyI9Z+mwYMwz11Ky9TYr3hY1fCxeQddjNGL/+ovldtb0yAIHvoVM0BGprQDm5JqhtUk8KyJ3RMJqpaAA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=0.10.0" + "node": ">=14.0.0" } }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/sass-embedded-linux-arm": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.85.1.tgz", + "integrity": "sha512-X0fDh95nNSw1wfRlnkE4oscoEA5Au4nnk785s9jghPFkTBg+A+5uB6trCjf0fM22+Iw6kiP4YYmDdw3BqxAKLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=14.0.0" } }, - "node_modules/resolve-url-loader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", - "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", + "node_modules/sass-embedded-linux-arm64": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.85.1.tgz", + "integrity": "sha512-jGadetB03BMFG2rq3OXub/uvC/lGpbQOiLGEz3NLb2nRZWyauRhzDtvZqkr6BEhxgIWtMtz2020yD8ZJSw/r2w==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "adjust-sourcemap-loader": "^4.0.0", - "convert-source-map": "^1.7.0", - "loader-utils": "^2.0.0", - "postcss": "^8.2.14", - "source-map": "0.6.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12" + "node": ">=14.0.0" } }, - "node_modules/resolve-url-loader/node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "node_modules/sass-embedded-linux-ia32": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.85.1.tgz", + "integrity": "sha512-7HlYY90d9mitDtNi5s+S+5wYZrTVbkBH2/kf7ixrzh2BFfT0YM81UHLJRnGX93y9aOMBL6DSZAIfkt1RsV9bkQ==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8.9.0" + "node": ">=14.0.0" } }, - "node_modules/resolve-url-loader/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/sass-embedded-linux-musl-arm": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.85.1.tgz", + "integrity": "sha512-5vcdEqE8QZnu6i6shZo7x2N36V7YUoFotWj2rGekII5ty7Nkaj+VtZhUEOp9tAzEOlaFuDp5CyO1kUCvweT64A==", + "cpu": [ + "arm" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.10.0" + "node": ">=14.0.0" } }, - "node_modules/resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "node_modules/sass-embedded-linux-musl-arm64": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.85.1.tgz", + "integrity": "sha512-FLkIT0p18XOkR6wryJ13LqGBDsrYev2dRk9dtiU18NCpNXruKsdBQ1ZnWHVKB3h1dA9lFyEEisC0sooKdNfeOQ==", + "cpu": [ + "arm64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" + "node": ">=14.0.0" } }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "node_modules/sass-embedded-linux-musl-ia32": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.85.1.tgz", + "integrity": "sha512-N1093T84zQJor1yyIAdYScB5eAuQarGK1tKgZ4uTnxVlgA7Xi1lXV8Eh7ox9sDqKCaWkVQ3MjqU26vYRBeRWyw==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=14.0.0" } }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "node_modules/sass-embedded-linux-musl-riscv64": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.85.1.tgz", + "integrity": "sha512-WRsZS/7qlfYXsa93FBpSruieuURIu7ySfFhzYfF1IbKrNAGwmbduutkHZh2ddm5/vQMvQ0Rdosgv+CslaQHMcw==", + "cpu": [ + "riscv64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.12" + "node": ">=14.0.0" } }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "node_modules/sass-embedded-linux-musl-x64": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.85.1.tgz", + "integrity": "sha512-+OlLIilA5TnP0YEqTQ8yZtkW+bJIQYvzoGoNLUEskeyeGuOiIyn2CwL6G4JQB4xZQFaxPHb7JD3EueFkQbH0Pw==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 4" + "node": ">=14.0.0" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "node_modules/sass-embedded-linux-riscv64": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.85.1.tgz", + "integrity": "sha512-mKKlOwMGLN7yP1p0gB5yG/HX4fYLnpWaqstNuOOXH+fOzTaNg0+1hALg0H0CDIqypPO74M5MS9T6FAJZGdT6dQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">=14.0.0" } }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/sass-embedded-linux-x64": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.85.1.tgz", + "integrity": "sha512-uKRTv0z8NgtHV7xSren78+yoWB79sNi7TMqI7Bxd8fcRNIgHQSA8QBdF8led2ETC004hr8h71BrY60RPO+SSvA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" } }, - "node_modules/rollup": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.26.0.tgz", - "integrity": "sha512-ilcl12hnWonG8f+NxU6BlgysVA0gvY2l8N0R84S1HcINbW20bvwuCngJkkInV6LXhwRpucsW5k1ovDwEdBVrNg==", + "node_modules/sass-embedded-win32-arm64": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.85.1.tgz", + "integrity": "sha512-/GMiZXBOc6AEMBC3g25Rp+x8fq9Z6Ql7037l5rajBPhZ+DdFwtdHY0Ou3oIU6XuWUwD06U3ii4XufXVFhsP6PA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@types/estree": "1.0.6" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.26.0", - "@rollup/rollup-android-arm64": "4.26.0", - "@rollup/rollup-darwin-arm64": "4.26.0", - "@rollup/rollup-darwin-x64": "4.26.0", - "@rollup/rollup-freebsd-arm64": "4.26.0", - "@rollup/rollup-freebsd-x64": "4.26.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.26.0", - "@rollup/rollup-linux-arm-musleabihf": "4.26.0", - "@rollup/rollup-linux-arm64-gnu": "4.26.0", - "@rollup/rollup-linux-arm64-musl": "4.26.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.26.0", - "@rollup/rollup-linux-riscv64-gnu": "4.26.0", - "@rollup/rollup-linux-s390x-gnu": "4.26.0", - "@rollup/rollup-linux-x64-gnu": "4.26.0", - "@rollup/rollup-linux-x64-musl": "4.26.0", - "@rollup/rollup-win32-arm64-msvc": "4.26.0", - "@rollup/rollup-win32-ia32-msvc": "4.26.0", - "@rollup/rollup-win32-x64-msvc": "4.26.0", - "fsevents": "~2.3.2" + "node": ">=14.0.0" } }, - "node_modules/run-applescript": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", - "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "node_modules/sass-embedded-win32-ia32": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.85.1.tgz", + "integrity": "sha512-L+4BWkKKBGFOKVQ2PQ5HwFfkM5FvTf1Xx2VSRvEWt9HxPXp6SPDho6zC8fqNQ3hSjoaoASEIJcSvgfdQYO0gdg==", + "cpu": [ + "ia32" + ], "dev": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=14.0.0" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } + "node_modules/sass-embedded-win32-x64": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.85.1.tgz", + "integrity": "sha512-/FO0AGKWxVfCk4GKsC0yXWBpUZdySe3YAAbQQL0lL6xUd1OiUY8Kow6g4Kc1TB/+z0iuQKKTqI/acJMEYl4iTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-stable-stringify": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", - "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", "engines": { - "node": ">=10" + "node": ">=14.0.0" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "node_modules/sass-embedded/node_modules/immutable": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", + "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", + "dev": true }, - "node_modules/sass": { - "version": "1.80.7", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.7.tgz", - "integrity": "sha512-MVWvN0u5meytrSjsU7AWsbhoXi1sc58zADXFllfZzbsBT1GHjjar6JwBINYPRrkx/zqnQ6uqbQuHgE95O+C+eQ==", + "node_modules/sass-embedded/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "dependencies": { - "chokidar": "^4.0.0", - "immutable": "^5.0.2", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=10" }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/sass-loader": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.3.tgz", - "integrity": "sha512-gosNorT1RCkuCMyihv6FBRR7BMV06oKRAs+l4UMp1mlcVg9rWN6KMmUj3igjQwmYys4mDP3etEYJgiHRbgHCHA==", + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.5.tgz", + "integrity": "sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==", "dev": true, "dependencies": { "neo-async": "^2.6.2" @@ -23263,21 +23179,18 @@ }, "node_modules/sass/node_modules/immutable": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", - "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/sax": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/saxes": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", "dev": true, + "license": "ISC", "dependencies": { "xmlchars": "^2.2.0" }, @@ -23296,9 +23209,9 @@ } }, "node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", @@ -23307,7 +23220,7 @@ "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", @@ -23322,15 +23235,13 @@ }, "node_modules/select-hose": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/selfsigned": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/node-forge": "^1.3.0", "node-forge": "^1" @@ -23341,9 +23252,8 @@ }, "node_modules/semver": { "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -23352,9 +23262,10 @@ } }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -23378,6 +23289,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "dependencies": { "ms": "2.0.0" } @@ -23385,32 +23297,39 @@ "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } }, "node_modules/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true }, "node_modules/seq-queue": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", - "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" + "version": "0.0.5" }, "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/serve-index": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.4", "batch": "0.6.1", @@ -23426,27 +23345,24 @@ }, "node_modules/serve-index/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/serve-index/node_modules/depd": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/serve-index/node_modules/http-errors": { "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "dev": true, + "license": "MIT", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -23459,40 +23375,37 @@ }, "node_modules/serve-index/node_modules/inherits": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/serve-index/node_modules/setprototypeof": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/serve-index/node_modules/statuses": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dev": true, "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" @@ -23500,8 +23413,8 @@ }, "node_modules/set-function-length": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", - "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.1.2", "es-errors": "^1.3.0", @@ -23516,13 +23429,11 @@ }, "node_modules/setprototypeof": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "license": "ISC" }, "node_modules/sha.js": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "license": "(MIT AND BSD-3-Clause)", "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -23533,9 +23444,8 @@ }, "node_modules/shallow-clone": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, + "license": "MIT", "dependencies": { "kind-of": "^6.0.2" }, @@ -23545,8 +23455,7 @@ }, "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -23556,17 +23465,62 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/shell-quote": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", - "dev": true, + "node_modules/shell-quote": { + "version": "1.8.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, "engines": { "node": ">= 0.4" }, @@ -23574,15 +23528,15 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -23593,15 +23547,13 @@ }, "node_modules/signal-exit": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/sigstore": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.0.0.tgz", - "integrity": "sha512-PHMifhh3EN4loMcHCz6l3v/luzgT3za+9f8subGgeMNjbJjzH4Ij/YoX3Gvu+kaouJRIlVdTHHCREADYf+ZteA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^3.0.0", "@sigstore/core": "^2.0.0", @@ -23616,23 +23568,20 @@ }, "node_modules/sisteransi": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/slash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/slice-ansi": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" @@ -23646,9 +23595,8 @@ }, "node_modules/slice-ansi/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -23658,9 +23606,8 @@ }, "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -23670,24 +23617,22 @@ }, "node_modules/smart-buffer": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" } }, "node_modules/socket.io": { - "version": "4.7.5", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", - "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", + "version": "4.8.1", + "license": "MIT", "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", "cors": "~2.8.5", "debug": "~4.3.2", - "engine.io": "~6.5.2", + "engine.io": "~6.6.0", "socket.io-adapter": "~2.5.2", "socket.io-parser": "~4.2.4" }, @@ -23696,24 +23641,22 @@ } }, "node_modules/socket.io-adapter": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz", - "integrity": "sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==", + "version": "2.5.5", + "license": "MIT", "dependencies": { "debug": "~4.3.4", - "ws": "~8.11.0" + "ws": "~8.17.1" } }, "node_modules/socket.io-adapter/node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "version": "8.17.1", + "license": "MIT", "engines": { "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -23726,8 +23669,7 @@ }, "node_modules/socket.io-client": { "version": "4.7.5", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.5.tgz", - "integrity": "sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==", + "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.2", @@ -23740,8 +23682,7 @@ }, "node_modules/socket.io-parser": { "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" @@ -23752,9 +23693,8 @@ }, "node_modules/sockjs": { "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, + "license": "MIT", "dependencies": { "faye-websocket": "^0.11.3", "uuid": "^8.3.2", @@ -23763,18 +23703,16 @@ }, "node_modules/sockjs/node_modules/uuid": { "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/socks": { "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", "dev": true, + "license": "MIT", "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" @@ -23786,9 +23724,8 @@ }, "node_modules/socks-proxy-agent": { "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", @@ -23799,9 +23736,8 @@ } }, "node_modules/sonic-boom": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.8.0.tgz", - "integrity": "sha512-ybz6OYOUjoQQCQ/i4LU8kaToD8ACtYP+Cj5qd2AO36bwbdewxWJ3ArmJ2cr6AvxlL2o0PqnCcPGUgkILbfkaCA==", + "version": "4.2.0", + "license": "MIT", "dependencies": { "atomic-sleep": "^1.0.0" } @@ -23814,27 +23750,24 @@ }, "node_modules/source-map": { "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">= 8" } }, "node_modules/source-map-js": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-loader": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-5.0.0.tgz", - "integrity": "sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==", "dev": true, + "license": "MIT", "dependencies": { "iconv-lite": "^0.6.3", "source-map-js": "^1.0.2" @@ -23852,9 +23785,8 @@ }, "node_modules/source-map-loader/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -23864,9 +23796,8 @@ }, "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" @@ -23874,18 +23805,16 @@ }, "node_modules/source-map-support/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/spdx-correct": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -23893,15 +23822,13 @@ }, "node_modules/spdx-exceptions": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true + "dev": true, + "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, + "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -23909,15 +23836,13 @@ }, "node_modules/spdx-license-ids": { "version": "3.0.20", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", - "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", - "dev": true + "dev": true, + "license": "CC0-1.0" }, "node_modules/spdy": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -23931,9 +23856,8 @@ }, "node_modules/spdy-transport": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -23945,9 +23869,8 @@ }, "node_modules/spdy-transport/node_modules/readable-stream": { "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -23959,22 +23882,19 @@ }, "node_modules/split2": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", "engines": { "node": ">= 10.x" } }, "node_modules/sprintf-js": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/sqlstring": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", - "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -24012,9 +23932,8 @@ }, "node_modules/ssri": { "version": "12.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", - "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, @@ -24024,9 +23943,8 @@ }, "node_modules/stack-utils": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -24036,17 +23954,15 @@ }, "node_modules/stack-utils/node_modules/escape-string-regexp": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/statuses": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -24114,38 +24030,45 @@ }, "node_modules/streamsearch": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", "engines": { "node": ">=10.0.0" } }, + "node_modules/streamx": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", + "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", + "dev": true, + "dependencies": { + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, "node_modules/string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "license": "MIT" }, "node_modules/string-argv": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "license": "MIT", "engines": { "node": ">=0.6.19" } }, "node_modules/string-length": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, + "license": "MIT", "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" @@ -24156,8 +24079,7 @@ }, "node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -24170,8 +24092,7 @@ "node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -24183,8 +24104,7 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -24195,8 +24115,7 @@ "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -24206,27 +24125,35 @@ }, "node_modules/strip-bom": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/strip-final-newline": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/strip-indent": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -24361,8 +24288,7 @@ }, "node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -24370,10 +24296,21 @@ "node": ">=8" } }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -24416,39 +24353,58 @@ } }, "node_modules/swagger-ui-dist": { - "version": "5.17.14", - "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.17.14.tgz", - "integrity": "sha512-CVbSfaLpstV65OnSjbXfVd6Sta3q3F7Cj/yYuvHMp1P90LztOLs6PfUnKEVAeiIVQt9u2SaPwv0LiH/OyMjHRw==" + "version": "5.19.0", + "license": "Apache-2.0", + "dependencies": { + "@scarf/scarf": "=1.4.0" + } }, "node_modules/symbol-observable": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", - "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10" } }, "node_modules/symbol-tree": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/sync-child-process": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz", + "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==", + "dev": true, + "dependencies": { + "sync-message-port": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/sync-message-port": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.1.3.tgz", + "integrity": "sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg==", + "dev": true, + "engines": { + "node": ">=16.0.0" + } }, "node_modules/tapable": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/tar": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dev": true, + "license": "ISC", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -24493,9 +24449,8 @@ }, "node_modules/tar/node_modules/fs-minipass": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -24505,9 +24460,8 @@ }, "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -24517,18 +24471,16 @@ }, "node_modules/tar/node_modules/minipass": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=8" } }, "node_modules/tar/node_modules/minizlib": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, + "license": "MIT", "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -24539,9 +24491,8 @@ }, "node_modules/tar/node_modules/minizlib/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -24551,9 +24502,8 @@ }, "node_modules/tar/node_modules/mkdirp": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, + "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -24563,22 +24513,20 @@ }, "node_modules/tar/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/tarn": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", - "integrity": "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==", + "license": "MIT", "engines": { "node": ">=8.0.0" } }, "node_modules/terser": { - "version": "5.36.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz", - "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", + "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -24594,16 +24542,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" }, "engines": { "node": ">= 10.13.0" @@ -24627,31 +24575,6 @@ } } }, - "node_modules/terser-webpack-plugin/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/terser-webpack-plugin/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, "node_modules/terser-webpack-plugin/node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -24666,30 +24589,6 @@ "node": ">= 10.13.0" } }, - "node_modules/terser-webpack-plugin/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/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/terser-webpack-plugin/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -24707,9 +24606,8 @@ }, "node_modules/test-exclude": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, + "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -24721,9 +24619,8 @@ }, "node_modules/test-exclude/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -24731,9 +24628,8 @@ }, "node_modules/test-exclude/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -24741,24 +24637,30 @@ "node": "*" } }, + "node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "dev": true, + "dependencies": { + "b4a": "^1.6.4" + } + }, "node_modules/text-table": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/thenify": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "license": "MIT", "dependencies": { "any-promise": "^1.0.0" } }, "node_modules/thenify-all": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "license": "MIT", "dependencies": { "thenify": ">= 3.1.0 < 4" }, @@ -24768,9 +24670,8 @@ }, "node_modules/thingies": { "version": "1.21.0", - "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", - "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", "dev": true, + "license": "Unlicense", "engines": { "node": ">=10.18" }, @@ -24779,33 +24680,72 @@ } }, "node_modules/thread-stream": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.4.1.tgz", - "integrity": "sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==", + "version": "3.1.0", + "license": "MIT", "dependencies": { "real-require": "^0.2.0" } }, "node_modules/through": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } }, "node_modules/thunky": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/tildify": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", - "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==", + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/tinyglobby": { + "version": "0.2.12", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.3", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tldts": { + "version": "6.1.83", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.83.tgz", + "integrity": "sha512-FHxxNJJ0WNsEBPHyC1oesQb3rRoxpuho/z2g3zIIAhw1WHJeQsUzK1jYK8TI1/iClaa4fS3Z2TCA9mtxXsENSg==", + "dev": true, + "dependencies": { + "tldts-core": "^6.1.83" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.83", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.83.tgz", + "integrity": "sha512-I2wb9OJc6rXyh9d4aInhSNWChNI+ra6qDnFEGEwe9OoA68lE4Temw29bOkf1Uvwt8VZS079t1BFZdXVBmmB4dw==", + "dev": true + }, "node_modules/tmp": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", @@ -24817,14 +24757,12 @@ }, "node_modules/tmpl": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -24834,23 +24772,15 @@ }, "node_modules/toidentifier": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", "engines": { "node": ">=0.6" } }, - "node_modules/toposort": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", - "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==", - "dev": true - }, "node_modules/tough-cookie": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -24863,18 +24793,16 @@ }, "node_modules/tough-cookie/node_modules/universalify": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.0.0" } }, "node_modules/tr46": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", "dev": true, + "license": "MIT", "dependencies": { "punycode": "^2.1.1" }, @@ -24884,9 +24812,8 @@ }, "node_modules/tree-dump": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz", - "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10.0" }, @@ -24900,18 +24827,24 @@ }, "node_modules/tree-kill": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true, + "license": "MIT", "bin": { "tree-kill": "cli.js" } }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/ts-api-utils": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=16" }, @@ -24921,17 +24854,15 @@ }, "node_modules/ts-deepmerge": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ts-deepmerge/-/ts-deepmerge-6.2.1.tgz", - "integrity": "sha512-8CYSLazCyj0DJDpPIxOFzJG46r93uh6EynYjuey+bxcLltBeqZL7DMfaE5ZPzZNFlav7wx+2TDa/mBl8gkTYzw==", + "license": "ISC", "engines": { "node": ">=14.13.1" } }, "node_modules/ts-jest": { "version": "29.1.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", - "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", "dev": true, + "license": "MIT", "dependencies": { "bs-logger": "0.x", "fast-json-stable-stringify": "2.x", @@ -24971,9 +24902,9 @@ } }, "node_modules/ts-loader": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", - "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.2.tgz", + "integrity": "sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -25008,9 +24939,8 @@ }, "node_modules/ts-node": { "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", "devOptional": true, + "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -25049,10 +24979,13 @@ } } }, + "node_modules/ts-toolbelt": { + "version": "9.6.0", + "license": "Apache-2.0" + }, "node_modules/tsconfig-paths": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "license": "MIT", "dependencies": { "json5": "^2.2.2", "minimist": "^1.2.6", @@ -25094,16 +25027,34 @@ }, "node_modules/tsconfig-paths/node_modules/strip-bom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "license": "MIT", "engines": { "node": ">=4" } }, + "node_modules/tsd": { + "version": "0.31.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@tsd/typescript": "~5.4.3", + "eslint-formatter-pretty": "^4.1.0", + "globby": "^11.0.1", + "jest-diff": "^29.0.3", + "meow": "^9.0.0", + "path-exists": "^4.0.0", + "read-pkg-up": "^7.0.0" + }, + "bin": { + "tsd": "dist/cli.js" + }, + "engines": { + "node": ">=14.16" + } + }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.1", + "license": "0BSD" }, "node_modules/tsscmp": { "version": "1.0.6", @@ -25116,9 +25067,8 @@ }, "node_modules/tuf-js": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-3.0.1.tgz", - "integrity": "sha512-+68OP1ZzSF84rTckf3FA95vJ1Zlx/uaXyiiKyPd1pA4rZNkpEvDAKmsu1xUSmbF/chCRYgZ6UZkDwC7PmzmAyA==", "dev": true, + "license": "MIT", "dependencies": { "@tufjs/models": "3.0.1", "debug": "^4.3.6", @@ -25130,9 +25080,8 @@ }, "node_modules/tuf-js/node_modules/debug": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -25147,9 +25096,8 @@ }, "node_modules/tuf-js/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/tunnel-agent": { "version": "0.6.0", @@ -25173,13 +25121,15 @@ "version": "3.14.0", "resolved": "https://registry.npmjs.org/typanion/-/typanion-3.14.0.tgz", "integrity": "sha512-ZW/lVMRabETuYCd9O9ZvMhAh8GslSqaUjxmK/JLPCh6l73CvLBiuXswj/+7LdnWOgYsQ130FqLzFz5aGT4I3Ug==", - "dev": true + "dev": true, + "workspaces": [ + "website" + ] }, "node_modules/type-check": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -25189,18 +25139,16 @@ }, "node_modules/type-detect": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/type-fest": { "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -25210,8 +25158,7 @@ }, "node_modules/type-is": { "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -25222,19 +25169,16 @@ }, "node_modules/typed-assert": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", - "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/typedarray": { "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + "license": "MIT" }, "node_modules/typeorm": { "version": "0.3.20", - "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.20.tgz", - "integrity": "sha512-sJ0T08dV5eoZroaq9uPKBoNcGslHBR4E4y+EBHs//SiGbblGe7IeduP/IH4ddCcj0qp3PHwDwGnuvqEAnKlq/Q==", + "license": "MIT", "dependencies": { "@sqltools/formatter": "^1.2.5", "app-root-path": "^3.1.0", @@ -25338,17 +25282,14 @@ }, "node_modules/typeorm-pglite": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/typeorm-pglite/-/typeorm-pglite-0.3.2.tgz", - "integrity": "sha512-/URkIx3MXaRqLKXjGfFY1uq8Fp6qSYTP09NjK6MAbsZhNwe7qAqnaWdTGtJ4aMr2e2TDPXT1rCt+w7xszMUzOg==", "dev": true, + "license": "MIT", "peerDependencies": { "@electric-sql/pglite": ">= 0.2.12" } }, "node_modules/typeorm/node_modules/buffer": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "funding": [ { "type": "github", @@ -25359,1113 +25300,730 @@ "url": "https://www.patreon.com/feross" }, { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/typeorm/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/typeorm/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/typeorm/node_modules/mkdirp": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", - "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/typeorm/node_modules/reflect-metadata": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==" - }, - "node_modules/typeorm/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", - "devOptional": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "dev": true, - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/uid": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.2.tgz", - "integrity": "sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==", - "dependencies": { - "@lukeed/csprng": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/umzug": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/umzug/-/umzug-3.8.2.tgz", - "integrity": "sha512-BEWEF8OJjTYVC56GjELeHl/1XjFejrD7aHzn+HldRJTx+pL1siBrKHZC8n4K/xL3bEzVA9o++qD1tK2CpZu4KA==", - "dependencies": { - "@rushstack/ts-command-line": "^4.12.2", - "emittery": "^0.13.0", - "fast-glob": "^3.3.2", - "pony-cause": "^2.1.4", - "type-fest": "^4.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/umzug/node_modules/type-fest": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.33.0.tgz", - "integrity": "sha512-s6zVrxuyKbbAsSAD5ZPTB77q4YIdRctkTbJ2/Dqlinwz+8ooH2gd+YA7VA6Pa93KML9GockVvoxjZ2vHP+mu8g==", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "engines": { - "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, - "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, - "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, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/union": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", - "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", - "dev": true, - "dependencies": { - "qs": "^6.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/unique-filename": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", - "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", - "dev": true, - "dependencies": { - "unique-slug": "^5.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/unique-slug": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", - "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unix-crypt-td-js": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/unix-crypt-td-js/-/unix-crypt-td-js-1.1.4.tgz", - "integrity": "sha512-8rMeVYWSIyccIJscb9NdCfZKSRBKYTeVnwmiRYT2ulE3qd1RaDQ0xQDP+rI3ccIWbhu/zuo5cgN8z73belNZgw==", - "dev": true - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/upath": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", - "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", - "dev": true, - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/update-browserslist-db": { - "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": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" + "type": "consulting", + "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "node_modules/typeorm/node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", "dependencies": { - "punycode": "^2.1.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, + "node_modules/typeorm/node_modules/glob": { + "version": "10.3.10", + "license": "ISC", "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "node_modules/typeorm/node_modules/mkdirp": { + "version": "2.1.6", + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, "engines": { - "node": ">= 0.4.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "node_modules/typeorm/node_modules/reflect-metadata": { + "version": "0.2.2", + "license": "Apache-2.0" + }, + "node_modules/typeorm/node_modules/uuid": { + "version": "9.0.1", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "devOptional": true - }, - "node_modules/v8-to-istanbul": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", - "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" + "node_modules/typescript": { + "version": "5.7.3", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "node": ">=14.17" } }, - "node_modules/validate-npm-package-name": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", - "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "node_modules/uglify-js": { + "version": "3.17.4", "dev": true, - "dependencies": { - "builtins": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/validator": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", - "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/verdaccio": { - "version": "5.29.2", - "resolved": "https://registry.npmjs.org/verdaccio/-/verdaccio-5.29.2.tgz", - "integrity": "sha512-Ra9Bv8mMsGaFnvFJl80gSNg6yhHRFUYATA03xpVrfqC1Z1IDZt/f0jZ94tPnfyaY1ljUS5jKsZsj6ihN/ZSVbQ==", - "dev": true, - "dependencies": { - "@cypress/request": "3.0.1", - "@verdaccio/config": "7.0.0-next-7.10", - "@verdaccio/core": "7.0.0-next-7.10", - "@verdaccio/local-storage": "10.3.3", - "@verdaccio/logger-7": "7.0.0-next-7.10", - "@verdaccio/middleware": "7.0.0-next-7.10", - "@verdaccio/search": "7.0.0-next.2", - "@verdaccio/signature": "7.0.0-next.3", - "@verdaccio/streams": "10.2.1", - "@verdaccio/tarball": "12.0.0-next-7.10", - "@verdaccio/ui-theme": "7.0.0-next-7.10", - "@verdaccio/url": "12.0.0-next-7.10", - "@verdaccio/utils": "7.0.0-next-7.10", - "async": "3.2.5", - "clipanion": "3.2.1", - "compression": "1.7.4", - "cookies": "0.9.1", - "cors": "2.8.5", - "debug": "^4.3.4", - "envinfo": "7.11.0", - "express": "4.18.2", - "express-rate-limit": "5.5.1", - "fast-safe-stringify": "2.1.1", - "handlebars": "4.7.8", - "js-yaml": "4.1.0", - "JSONStream": "1.3.5", - "jsonwebtoken": "9.0.2", - "kleur": "4.1.5", - "lodash": "4.17.21", - "lru-cache": "7.18.3", - "mime": "3.0.0", - "mkdirp": "1.0.4", - "mv": "2.1.1", - "pkginfo": "0.4.1", - "semver": "7.5.4", - "validator": "13.11.0", - "verdaccio-audit": "12.0.0-next-7.10", - "verdaccio-htpasswd": "12.0.0-next-7.10" - }, + "license": "BSD-2-Clause", + "optional": true, "bin": { - "verdaccio": "bin/verdaccio" + "uglifyjs": "bin/uglifyjs" }, "engines": { - "node": ">=12.18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/verdaccio" + "node": ">=0.8.0" } }, - "node_modules/verdaccio-audit": { - "version": "12.0.0-next-7.10", - "resolved": "https://registry.npmjs.org/verdaccio-audit/-/verdaccio-audit-12.0.0-next-7.10.tgz", - "integrity": "sha512-inL8J7c4y9BpFIkqLsw9yrdh8/CBKWbBrREiQHQ9ZnD7jLkHxTWsWW8jt4aUt9t2azc6eO5rUIqdo1W6VsYKeA==", - "dev": true, + "node_modules/uid": { + "version": "2.0.2", + "license": "MIT", "dependencies": { - "@verdaccio/config": "7.0.0-next-7.10", - "@verdaccio/core": "7.0.0-next-7.10", - "express": "4.18.2", - "https-proxy-agent": "5.0.1", - "node-fetch": "cjs" + "@lukeed/csprng": "^1.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/verdaccio" + "node": ">=8" } }, - "node_modules/verdaccio-audit/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, + "node_modules/umzug": { + "version": "3.8.2", + "license": "MIT", "dependencies": { - "debug": "4" + "@rushstack/ts-command-line": "^4.12.2", + "emittery": "^0.13.0", + "fast-glob": "^3.3.2", + "pony-cause": "^2.1.4", + "type-fest": "^4.0.0" }, "engines": { - "node": ">= 6.0.0" + "node": ">=12" } }, - "node_modules/verdaccio-audit/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" - }, + "node_modules/umzug/node_modules/type-fest": { + "version": "4.33.0", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">= 6" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/verdaccio-htpasswd": { - "version": "12.0.0-next-7.10", - "resolved": "https://registry.npmjs.org/verdaccio-htpasswd/-/verdaccio-htpasswd-12.0.0-next-7.10.tgz", - "integrity": "sha512-+P7kxWgWSxRyTlP+IFySwgvQjt529zXTetNmupUgYtu09qCZMffdZ74aGASuCvWa4Vcqavmytzg8McqCNheFiA==", + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", "dev": true, - "dependencies": { - "@verdaccio/core": "7.0.0-next-7.10", - "@verdaccio/file-locking": "12.0.0-next.1", - "apache-md5": "1.1.8", - "bcryptjs": "2.4.3", - "core-js": "3.35.0", - "debug": "4.3.4", - "http-errors": "2.0.0", - "unix-crypt-td-js": "1.1.4" - }, + "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/verdaccio" + "node": ">=4" } }, - "node_modules/verdaccio-htpasswd/node_modules/@verdaccio/file-locking": { - "version": "12.0.0-next.1", - "resolved": "https://registry.npmjs.org/@verdaccio/file-locking/-/file-locking-12.0.0-next.1.tgz", - "integrity": "sha512-Zb5G2HEhVRB0jCq4z7QA4dqTdRv/2kIsw2Nkm3j2HqC1OeJRxas3MJAF/OxzbAb1IN32lbg1zycMSk6NcbQkgQ==", + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", "dev": true, + "license": "MIT", "dependencies": { - "lockfile": "1.0.4" + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/verdaccio" + "node": ">=4" } }, - "node_modules/verdaccio/node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/verdaccio/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=4" } }, - "node_modules/verdaccio/node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "node_modules/unicorn-magic": { + "version": "0.1.0", "dev": true, - "bin": { - "mime": "cli.js" - }, + "license": "MIT", "engines": { - "node": ">=10.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/verdaccio/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "node_modules/union": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", + "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" + "dependencies": { + "qs": "^6.4.0" }, "engines": { - "node": ">=10" + "node": ">= 0.8.0" } }, - "node_modules/verdaccio/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "node_modules/unique-filename": { + "version": "4.0.0", "dev": true, + "license": "ISC", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "unique-slug": "^5.0.0" }, "engines": { - "node": ">=10" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/verdaccio/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/unique-slug": { + "version": "5.0.0", "dev": true, + "license": "ISC", "dependencies": { - "yallist": "^4.0.0" + "imurmurhash": "^0.1.4" }, "engines": { - "node": ">=10" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/verdaccio/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "node_modules/universalify": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unix-crypt-td-js": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/unix-crypt-td-js/-/unix-crypt-td-js-1.1.4.tgz", + "integrity": "sha512-8rMeVYWSIyccIJscb9NdCfZKSRBKYTeVnwmiRYT2ulE3qd1RaDQ0xQDP+rI3ccIWbhu/zuo5cgN8z73belNZgw==", "dev": true }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "node_modules/unpipe": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" } }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true + "node_modules/upath": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", + "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", + "dev": true, + "engines": { + "node": ">=4", + "yarn": "*" + } }, - "node_modules/vite": { - "version": "5.4.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", - "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", + "node_modules/update-browserslist-db": { + "version": "1.1.1", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" + "update-browserslist-db": "cli.js" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } + "browserslist": ">= 4.21.0" } }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" + "node_modules/uri-js": { + "version": "4.4.1", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" } }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true + }, + "node_modules/url-parse": { + "version": "1.5.10", "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" } }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], + "node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 0.4.0" } }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" + "node_modules/uuid": { + "version": "10.0.0", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" ], - "engines": { - "node": ">=12" + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "devOptional": true, + "license": "MIT" + }, + "node_modules/v8-to-istanbul": { + "version": "9.2.0", "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, "engines": { - "node": ">=12" + "node": ">=10.12.0" } }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "2.0.0", "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } + "license": "MIT" }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], + "node_modules/validate-npm-package-license": { + "version": "3.0.4", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], + "node_modules/validate-npm-package-name": { + "version": "5.0.0", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "license": "ISC", + "dependencies": { + "builtins": "^5.0.0" + }, "engines": { - "node": ">=12" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/validator": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", + "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==", "engines": { - "node": ">=12" + "node": ">= 0.10" } }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "dev": true + }, + "node_modules/vary": { + "version": "1.1.2", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 0.8" } }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/verdaccio": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/verdaccio/-/verdaccio-6.0.5.tgz", + "integrity": "sha512-hv+v4mtG/rcNidGUHXAtNuVySiPE3/PM+7dYye5jCDrhCUmRJYOtnvDe/Ym1ZE/twti39g6izVRxEkjnSp52gA==", + "dev": true, + "dependencies": { + "@cypress/request": "3.0.7", + "@verdaccio/auth": "8.0.0-next-8.7", + "@verdaccio/config": "8.0.0-next-8.7", + "@verdaccio/core": "8.0.0-next-8.7", + "@verdaccio/local-storage-legacy": "11.0.2", + "@verdaccio/logger": "8.0.0-next-8.7", + "@verdaccio/middleware": "8.0.0-next-8.7", + "@verdaccio/search-indexer": "8.0.0-next-8.2", + "@verdaccio/signature": "8.0.0-next-8.1", + "@verdaccio/streams": "10.2.1", + "@verdaccio/tarball": "13.0.0-next-8.7", + "@verdaccio/ui-theme": "8.0.0-next-8.7", + "@verdaccio/url": "13.0.0-next-8.7", + "@verdaccio/utils": "7.0.1-next-8.1", + "async": "3.2.6", + "clipanion": "4.0.0-rc.4", + "compression": "1.7.5", + "cors": "2.8.5", + "debug": "4.4.0", + "envinfo": "7.14.0", + "express": "4.21.2", + "express-rate-limit": "5.5.1", + "fast-safe-stringify": "2.1.1", + "handlebars": "4.7.8", + "js-yaml": "4.1.0", + "JSONStream": "1.3.5", + "jsonwebtoken": "9.0.2", + "kleur": "4.1.5", + "lodash": "4.17.21", + "lru-cache": "7.18.3", + "mime": "3.0.0", + "mkdirp": "1.0.4", + "pkginfo": "0.4.1", + "semver": "7.6.3", + "validator": "13.12.0", + "verdaccio-audit": "13.0.0-next-8.7", + "verdaccio-htpasswd": "13.0.0-next-8.7" + }, + "bin": { + "verdaccio": "bin/verdaccio" + }, "engines": { - "node": ">=12" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" } }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], + "node_modules/verdaccio-audit": { + "version": "13.0.0-next-8.7", + "resolved": "https://registry.npmjs.org/verdaccio-audit/-/verdaccio-audit-13.0.0-next-8.7.tgz", + "integrity": "sha512-kd6YdrDztkP1/GDZT7Ue2u41iGPvM9y+5aaUbIBUPvTY/YVv57K6MaCMfn9C/I+ZL4R7XOTSxTtWvz3JK4QrNg==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@verdaccio/config": "8.0.0-next-8.7", + "@verdaccio/core": "8.0.0-next-8.7", + "express": "4.21.2", + "https-proxy-agent": "5.0.1", + "node-fetch": "cjs" + }, "engines": { - "node": ">=12" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" } }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], + "node_modules/verdaccio-audit/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, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "debug": "4" + }, "engines": { - "node": ">=12" + "node": ">= 6.0.0" } }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], + "node_modules/verdaccio-audit/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, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "agent-base": "6", + "debug": "4" + }, "engines": { - "node": ">=12" + "node": ">= 6" } }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], + "node_modules/verdaccio-htpasswd": { + "version": "13.0.0-next-8.7", + "resolved": "https://registry.npmjs.org/verdaccio-htpasswd/-/verdaccio-htpasswd-13.0.0-next-8.7.tgz", + "integrity": "sha512-znyFnwt59mLKTAu6eHJrfWP07iaHUlYiQN7QoBo8KMAOT1AecUYreBqs93oKHdIOzjTI8j6tQLg57DpeVS5vgg==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@verdaccio/core": "8.0.0-next-8.7", + "@verdaccio/file-locking": "13.0.0-next-8.2", + "apache-md5": "1.1.8", + "bcryptjs": "2.4.3", + "core-js": "3.37.1", + "debug": "4.4.0", + "http-errors": "2.0.0", + "unix-crypt-td-js": "1.1.4" + }, "engines": { - "node": ">=12" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" } }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], + "node_modules/verdaccio-htpasswd/node_modules/@verdaccio/file-locking": { + "version": "13.0.0-next-8.2", + "resolved": "https://registry.npmjs.org/@verdaccio/file-locking/-/file-locking-13.0.0-next-8.2.tgz", + "integrity": "sha512-TcHgN3I/N28WBSvtukpGrJhBljl4jyIXq0vEv94vXAG6nUE3saK+vtgo8PfYA3Ueo88v/1zyAbiZM4uxwojCmQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "lockfile": "1.0.4" + }, "engines": { - "node": ">=12" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" } }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], + "node_modules/verdaccio-htpasswd/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "ms": "^2.1.3" + }, "engines": { - "node": ">=12" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], + "node_modules/verdaccio-htpasswd/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/verdaccio/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, - "optional": true, - "os": [ - "netbsd" - ], + "dependencies": { + "ms": "^2.1.3" + }, "engines": { - "node": ">=12" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], + "node_modules/verdaccio/node_modules/kleur": { + "version": "4.1.5", "dev": true, - "optional": true, - "os": [ - "openbsd" - ], + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], + "node_modules/verdaccio/node_modules/lru-cache": { + "version": "7.18.3", "dev": true, - "optional": true, - "os": [ - "sunos" - ], + "license": "ISC", "engines": { "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], + "node_modules/verdaccio/node_modules/mime": { + "version": "3.0.0", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "license": "MIT", + "bin": { + "mime": "cli.js" + }, "engines": { - "node": ">=12" + "node": ">=10.0.0" } }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], + "node_modules/verdaccio/node_modules/mkdirp": { + "version": "1.0.4", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, "engines": { - "node": ">=12" + "node": ">=10" } }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], + "node_modules/verdaccio/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "dev": true, - "optional": true, - "os": [ - "win32" + "engines": [ + "node >=0.6.0" ], - "engines": { - "node": ">=12" + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" } }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "node_modules/vite": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.0.tgz", + "integrity": "sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==", "dev": true, - "hasInstallScript": true, + "dependencies": { + "esbuild": "^0.25.0", + "postcss": "^8.5.3", + "rollup": "^4.30.1" + }, "bin": { - "esbuild": "bin/esbuild" + "vite": "bin/vite.js" }, "engines": { - "node": ">=12" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" } }, "node_modules/w3c-xmlserializer": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", "dev": true, + "license": "MIT", "dependencies": { "xml-name-validator": "^4.0.0" }, @@ -26475,9 +26033,8 @@ }, "node_modules/walker": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "makeerror": "1.0.12" } @@ -26497,18 +26054,16 @@ }, "node_modules/wbuf": { "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "dev": true, + "license": "MIT", "dependencies": { "minimalistic-assert": "^1.0.0" } }, "node_modules/wcwidth": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, + "license": "MIT", "dependencies": { "defaults": "^1.0.3" } @@ -26522,24 +26077,23 @@ }, "node_modules/webidl-conversions": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=12" } }, "node_modules/webpack": { - "version": "5.96.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz", - "integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==", + "version": "5.98.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz", + "integrity": "sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.14.0", "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", @@ -26553,9 +26107,9 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", + "schema-utils": "^4.3.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", + "terser-webpack-plugin": "^5.3.11", "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, @@ -26577,9 +26131,8 @@ }, "node_modules/webpack-cli": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", - "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "dev": true, + "license": "MIT", "dependencies": { "@discoveryjs/json-ext": "^0.5.0", "@webpack-cli/configtest": "^2.1.1", @@ -26622,18 +26175,16 @@ }, "node_modules/webpack-cli/node_modules/commander": { "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, + "license": "MIT", "engines": { "node": ">=14" } }, "node_modules/webpack-dev-middleware": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", - "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", "dev": true, + "license": "MIT", "dependencies": { "colorette": "^2.0.10", "memfs": "^4.6.0", @@ -26660,9 +26211,8 @@ }, "node_modules/webpack-dev-middleware/node_modules/memfs": { "version": "4.14.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.14.1.tgz", - "integrity": "sha512-Fq5CMEth+2iprLJ5mNizRcWuiwRZYjNkUD0zKk224jZunE9CRacTRDK8QLALbMBlNX2y3nY6lKZbesCwDwacig==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/json-pack": "^1.0.3", "@jsonjoy.com/util": "^1.3.0", @@ -26678,10 +26228,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.1.0.tgz", - "integrity": "sha512-aQpaN81X6tXie1FoOB7xlMfCsN19pSvRAeYUHOdFWOlhpQ/LlbfTqYwwmEDFV0h8GGuqmCmKmT+pxcUV/Nt2gQ==", + "version": "5.2.0", "dev": true, + "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.13", "@types/connect-history-api-fallback": "^1.5.4", @@ -26696,188 +26245,70 @@ "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^2.0.0", - "express": "^4.19.2", + "express": "^4.21.2", "graceful-fs": "^4.2.6", - "html-entities": "^2.4.0", - "http-proxy-middleware": "^2.0.3", + "http-proxy-middleware": "^2.0.7", "ipaddr.js": "^2.1.0", "launch-editor": "^2.6.1", - "open": "^10.0.3", - "p-retry": "^6.2.0", - "schema-utils": "^4.2.0", - "selfsigned": "^2.4.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^7.4.2", - "ws": "^8.18.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/webpack-dev-server/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/webpack-dev-server/node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-server/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/webpack-dev-server/node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/webpack-dev-server/node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", - "dev": true, - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "open": "^10.0.3", + "p-retry": "^6.2.0", + "schema-utils": "^4.2.0", + "selfsigned": "^2.4.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" }, "engines": { - "node": ">= 0.10.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } } }, - "node_modules/webpack-dev-server/node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "3.6.0", "dev": true, + "license": "MIT", "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, "node_modules/webpack-dev-server/node_modules/http-proxy-middleware": { "version": "2.0.7", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", - "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", "dev": true, + "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -26899,39 +26330,16 @@ }, "node_modules/webpack-dev-server/node_modules/ipaddr.js": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", - "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10" } }, - "node_modules/webpack-dev-server/node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/webpack-dev-server/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/webpack-dev-server/node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "dev": true - }, "node_modules/webpack-dev-server/node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -26939,26 +26347,10 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/webpack-dev-server/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/webpack-dev-server/node_modules/readdirp": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, + "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -26966,86 +26358,10 @@ "node": ">=8.10.0" } }, - "node_modules/webpack-dev-server/node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/webpack-dev-server/node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/webpack-dev-server/node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/webpack-dev-server/node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dev": true, - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/webpack-merge": { "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", "dev": true, + "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", "flat": "^5.0.2", @@ -27066,18 +26382,16 @@ }, "node_modules/webpack-sources": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.13.0" } }, "node_modules/webpack-subresource-integrity": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", - "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", "dev": true, + "license": "MIT", "dependencies": { "typed-assert": "^1.0.8" }, @@ -27094,31 +26408,6 @@ } } }, - "node_modules/webpack/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/webpack/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, "node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -27147,35 +26436,10 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, - "node_modules/webpack/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/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/websocket-driver": { "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", @@ -27187,18 +26451,16 @@ }, "node_modules/websocket-extensions": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=0.8.0" } }, "node_modules/whatwg-encoding": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", "dev": true, + "license": "MIT", "dependencies": { "iconv-lite": "0.6.3" }, @@ -27208,9 +26470,8 @@ }, "node_modules/whatwg-encoding/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -27220,18 +26481,16 @@ }, "node_modules/whatwg-mimetype": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" } }, "node_modules/whatwg-url": { "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", "dev": true, + "license": "MIT", "dependencies": { "tr46": "^3.0.0", "webidl-conversions": "^7.0.0" @@ -27242,8 +26501,7 @@ }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -27256,21 +26514,18 @@ }, "node_modules/wildcard": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/wordwrap": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/wrap-ansi": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -27283,8 +26538,7 @@ "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -27299,15 +26553,12 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "license": "ISC" }, "node_modules/write-file-atomic": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -27317,9 +26568,8 @@ } }, "node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.18.0", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -27338,71 +26588,64 @@ }, "node_modules/xml-name-validator": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12" } }, "node_modules/xmlchars": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/xmlhttprequest-ssl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", - "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", "engines": { "node": ">=0.4.0" } }, "node_modules/xtend": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", "engines": { "node": ">=0.4" } }, "node_modules/xxhashjs": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", - "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", "dev": true, + "license": "MIT", "dependencies": { "cuint": "^0.2.2" } }, "node_modules/y18n": { "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", + "bin": { + "yaml": "bin.mjs" + }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/yargs": { "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -27418,8 +26661,7 @@ }, "node_modules/yargs-parser": { "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", "engines": { "node": ">=12" } @@ -27435,18 +26677,16 @@ }, "node_modules/yn": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/yocto-queue": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -27456,9 +26696,8 @@ }, "node_modules/yoctocolors-cjs": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", - "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -27466,36 +26705,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yup": { - "version": "0.32.11", - "resolved": "https://registry.npmjs.org/yup/-/yup-0.32.11.tgz", - "integrity": "sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.15.4", - "@types/lodash": "^4.14.175", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "nanoclone": "^0.2.1", - "property-expr": "^2.0.4", - "toposort": "^2.0.2" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/zod": { "version": "3.24.1", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz", - "integrity": "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } }, "node_modules/zod-validation-error": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-3.4.0.tgz", - "integrity": "sha512-ZOPR9SVY6Pb2qqO5XHt+MkkTRxGXb4EVtnjc9JpXUOtUB1T9Ru7mZOT361AN3MsetVe7R0a1KZshJDZdgp9miQ==", + "license": "MIT", "engines": { "node": ">=18.0.0" }, @@ -27505,8 +26724,7 @@ }, "node_modules/zone.js": { "version": "0.15.0", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.0.tgz", - "integrity": "sha512-9oxn0IIjbCZkJ67L+LkhYWRyAy7axphb3VgE2MBDlOqnmHMPWGYMxJxBYFueFq/JGY2GMwS0rU+UCLunEmy5UA==" + "license": "MIT" } } } diff --git a/package.json b/package.json index 4d3bccfd..0c9d183c 100644 --- a/package.json +++ b/package.json @@ -2,51 +2,70 @@ "name": "@nestjs-json-api/source", "version": "0.0.0", "license": "MIT", + "contributors": [ + { + "email": "klerick666@gmain.com", + "name": "Aleksandr Kharkovey" + } + ], + "repository": { + "type": "git", + "url": "https://github.com/klerick/nestjs-json-api.git" + }, + "engines": { + "node": ">= 20.0.0" + }, + "private": false, + "files": [ + "**/*" + ], "scripts": { "typeorm": "ts-node -r tsconfig-paths/register -r dotenv/config --project libs/typeorm-database/tsconfig.lib.json ./node_modules/typeorm/cli.js -d libs/typeorm-database/src/lib/config-cli.ts", "typeorm:run": "npm run typeorm migration:run", "typeorm:revert": "npm run typeorm migration:revert", + "typeorm:generate": "npm run typeorm migration:generate", "seed:run": "ts-node -r tsconfig-paths/register -r dotenv/config --project libs/typeorm-database/tsconfig.lib.json ./node_modules/@jorgebodega/typeorm-seeding/dist/cli.js -d libs/typeorm-database/src/lib/config-cli.ts seed libs/typeorm-database/src/lib/seeders/root.seeder.ts", "microorm": "ts-node -r tsconfig-paths/register -r dotenv/config -P ./libs/microorm-database/tsconfig.lib.json ./node_modules/@mikro-orm/cli/cli.js", "microorm:up": "npm run microorm migration:up", "demo:json-api": "nx run json-api-server:serve:development", "demo:json-api-front": "nx run json-api-front:serve:development" }, - "private": true, "dependencies": { "@anatine/zod-openapi": "^2.2.3", - "@angular/animations": "19.0.3", - "@angular/common": "19.0.3", - "@angular/compiler": "19.0.3", - "@angular/core": "19.0.3", - "@angular/forms": "19.0.3", - "@angular/platform-browser": "19.0.3", - "@angular/platform-browser-dynamic": "19.0.3", - "@angular/router": "19.0.3", + "@angular/animations": "^19.2.1", + "@angular/common": "^19.2.1", + "@angular/compiler": "^19.2.1", + "@angular/core": "^19.2.1", + "@angular/forms": "^19.2.1", + "@angular/platform-browser": "^19.2.1", + "@angular/platform-browser-dynamic": "^19.2.1", + "@angular/router": "^19.2.1", "@mikro-orm/cli": "^6.4.3", "@mikro-orm/core": "^6.4.3", "@mikro-orm/migrations": "^6.4.3", "@mikro-orm/mysql": "^6.4.3", - "@mikro-orm/nestjs": "^6.0.2", + "@mikro-orm/nestjs": "^6.1.1", "@mikro-orm/postgresql": "^6.4.3", "@mikro-orm/sql-highlighter": "^1.0.1", - "@nestjs/common": "^10.3.0", - "@nestjs/core": "^10.3.0", - "@nestjs/platform-express": "10.3.3", - "@nestjs/platform-socket.io": "^10.3.7", - "@nestjs/platform-ws": "^10.3.7", - "@nestjs/swagger": "^7.3.0", - "@nestjs/typeorm": "^10.0.2", - "@nestjs/websockets": "^10.3.7", + "@nestjs/common": "^11.0.10", + "@nestjs/core": "^11.0.10", + "@nestjs/platform-express": "11.0.10", + "@nestjs/platform-socket.io": "^11.0.10", + "@nestjs/platform-ws": "^11.0.10", + "@nestjs/swagger": "^11.0.4", + "@nestjs/typeorm": "^11.0.0", + "@nestjs/websockets": "^11.0.10", "axios": "^1.6.0", + "change-case-commonjs": "^5.4.4", "class-transformer": "^0.5.1", "class-validator": "^0.14.1", - "nestjs-pino": "4.0.0", + "nestjs-pino": "4.3.0", "pg": "8.11.3", - "pino-http": "9.0.0", + "pino-http": "10.4.0", "reflect-metadata": "^0.1.13", "rxjs": "^7.8.0", "socket.io-client": "^4.7.5", + "ts-toolbelt": "^9.6.0", "tslib": "^2.3.0", "typeorm": "^0.3.20", "uuid": "^10.0.0", @@ -55,35 +74,35 @@ "zone.js": "0.15.0" }, "devDependencies": { - "@angular-devkit/build-angular": "19.0.4", - "@angular-devkit/core": "19.0.4", - "@angular-devkit/schematics": "19.0.4", - "@angular-eslint/eslint-plugin": "19.0.1", - "@angular-eslint/eslint-plugin-template": "19.0.1", - "@angular-eslint/template-parser": "19.0.1", - "@angular/cli": "~19.0.0", - "@angular/compiler-cli": "19.0.3", - "@angular/language-service": "19.0.3", + "@angular-devkit/build-angular": "19.2.1", + "@angular-devkit/core": "19.2.1", + "@angular-devkit/schematics": "19.2.1", + "@angular-eslint/eslint-plugin": "19.2.0", + "@angular-eslint/eslint-plugin-template": "19.2.0", + "@angular-eslint/template-parser": "19.2.0", + "@angular/cli": "~19.2.0", + "@angular/compiler-cli": "19.2.1", + "@angular/language-service": "19.2.1", "@electric-sql/pglite": "^0.2.16", "@faker-js/faker": "^8.4.1", "@jorgebodega/typeorm-factory": "^1.4.0", "@jorgebodega/typeorm-seeding": "^6.0.1", - "@nestjs/schematics": "^10.0.1", - "@nestjs/testing": "^10.0.2", - "@nx/angular": "20.2.1", - "@nx/eslint": "20.2.1", - "@nx/eslint-plugin": "20.2.1", - "@nx/jest": "20.2.1", - "@nx/js": "20.2.1", - "@nx/nest": "20.2.1", - "@nx/node": "20.2.1", - "@nx/web": "20.2.1", - "@nx/webpack": "20.2.1", - "@nx/workspace": "20.2.1", - "@schematics/angular": "19.0.4", - "@swc-node/register": "1.9.2", - "@swc/core": "1.5.7", - "@swc/helpers": "0.5.11", + "@nestjs/schematics": "^11.0.1", + "@nestjs/testing": "^11.0.10", + "@nx/angular": "20.5.0", + "@nx/eslint": "20.5.0", + "@nx/eslint-plugin": "20.5.0", + "@nx/jest": "20.5.0", + "@nx/js": "20.5.0", + "@nx/nest": "20.5.0", + "@nx/node": "20.5.0", + "@nx/web": "20.5.0", + "@nx/webpack": "20.5.0", + "@nx/workspace": "20.5.0", + "@schematics/angular": "19.2.1", + "@swc-node/register": "1.10.9", + "@swc/core": "1.11.7", + "@swc/helpers": "0.5.15", "@types/jest": "29.5.12", "@types/node": "~18.16.9", "@types/uuid": "^9.0.8", @@ -99,17 +118,18 @@ "jest-preset-angular": "14.4.2", "jsonc-eslint-parser": "^2.1.0", "knex-pglite": "^0.11.0", - "ng-packagr": "19.0.1", - "nx": "20.2.1", + "ng-packagr": "19.2.0", + "nx": "20.5.0", "pg-mem": "^3.0.2", "postcss": "^8.4.5", "postcss-url": "~10.1.3", "prettier": "^2.6.2", "ts-jest": "^29.1.0", "ts-node": "10.9.1", + "tsd": "^0.31.2", "typeorm-pglite": "^0.3.2", - "typescript": "5.6.3", - "verdaccio": "^5.0.4", + "typescript": "5.7.3", + "verdaccio": "6.0.5", "webpack-cli": "^5.1.4" }, "nx": { diff --git a/tools/scripts/publish.mjs b/tools/scripts/publish.mjs index 4d6b50a6..819695d0 100644 --- a/tools/scripts/publish.mjs +++ b/tools/scripts/publish.mjs @@ -8,10 +8,11 @@ */ import { execSync } from 'child_process'; -import { readFileSync, writeFileSync } from 'fs'; +import { readFileSync, writeFileSync, existsSync, unlinkSync } from 'fs'; +import { join } from 'path'; import devkit from '@nx/devkit'; -const { readCachedProjectGraph } = devkit; +const { readCachedProjectGraph, workspaceRoot } = devkit; function invariant(condition, message) { if (!condition) { @@ -46,15 +47,59 @@ invariant( ); process.chdir(outputPath); +const sharedProperty = [ + 'license', + 'contributors', + 'repository', + 'engines', + 'private', + 'files', +]; // Updating the version in "package.json" before publishing try { + const mainJson = JSON.parse( + readFileSync(join(workspaceRoot, 'package.json')).toString() + ); const json = JSON.parse(readFileSync(`package.json`).toString()); json.version = version; + + for (const props of sharedProperty) { + if (!mainJson[props] || json[props]) continue; + json[props] = mainJson[props]; + } + removeDepFromOtherLib(graph, name, json); writeFileSync(`package.json`, JSON.stringify(json, null, 2)); } catch (e) { + console.log(e); console.error(`Error reading package.json file from library build output.`); } +if (existsSync(join(workspaceRoot, outputPath, 'cjs', 'package.json'))) { + unlinkSync(join(workspaceRoot, outputPath, 'cjs', 'package.json')); +} + +if (existsSync(join(workspaceRoot, outputPath, 'mjs', 'package.json'))) { + unlinkSync(join(workspaceRoot, outputPath, 'mjs', 'package.json')); +} + // Execute "npm publish" to publish execSync(`npm publish --access public --tag ${tag}`); + +function removeDepFromOtherLib(graph, name, json) { + const libsName = Object.values(graph.nodes) + .filter((i) => i.data.tags.includes('type:publish')) + .map((i) => i.data.metadata.js.packageName); + + if (!('peerDependencies' in json)) return; + + json['peerDependencies'] = Object.entries(json['peerDependencies']).reduce( + (acum, [name, value]) => { + if (libsName.includes(name)) { + acum[name] = `^${value}`; + } + return acum; + }, + {} + ); +} diff --git a/tsconfig.base.json b/tsconfig.base.json index b4cd5ce3..a1a3c886 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -15,17 +15,12 @@ "skipDefaultLibCheck": true, "baseUrl": ".", "paths": { - "@klerick/json-api-nestjs": [ - "libs/json-api/json-api-nestjs/src/index.ts" + "@klerick/json-api-nestjs": ["dist/libs/json-api/json-api-nestjs"], + "@klerick/json-api-nestjs-microorm": [ + "dist/libs/json-api/json-api-nestjs-microorm" ], - "@klerick/json-api-nestjs-sdk": [ - "libs/json-api/json-api-nestjs-sdk/src/index.ts" - ], - "@klerick/json-api-nestjs-sdk/ngModule": [ - "libs/json-api/json-api-nestjs-sdk/src/ngModule.ts" - ], - "@klerick/json-api-nestjs-shared": [ - "libs/json-api/json-api-nestjs-shared/src/index.ts" + "@klerick/json-api-nestjs-typeorm": [ + "dist/libs/json-api/json-api-nestjs-typeorm" ], "@klerick/nestjs-json-rpc": [ "libs/json-rpc/nestjs-json-rpc/src/index.ts" @@ -45,5 +40,5 @@ ] } }, - "exclude": ["node_modules", "tmp"] + "exclude": ["node_modules", "tmp", "**/___test___/**"] }