diff --git a/.changeset/config.json b/.changeset/config.json new file mode 100644 index 0000000..375aca9 --- /dev/null +++ b/.changeset/config.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@3.0.0/schema.json", + "changelog": "@changesets/cli/changelog", + "commit": false, + "fixed": [], + "linked": [], + "access": "public", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "ignore": [], + "privatePackages": { + "version": true, + "tag": true + } +} \ No newline at end of file diff --git a/.changeset/initial-changesets-setup.md b/.changeset/initial-changesets-setup.md new file mode 100644 index 0000000..69982a7 --- /dev/null +++ b/.changeset/initial-changesets-setup.md @@ -0,0 +1,10 @@ +--- +"vue-pivottable": patch +--- + +chore: implement Changesets for monorepo release management + +- Replace semantic-release with Changesets for better monorepo support +- Add GitHub App integration for automated releases +- Simplify release workflow to avoid circular PR issues +- Add manual release options for individual packages \ No newline at end of file diff --git a/.github/workflows/create-release-pr.yml b/.github/workflows/create-release-pr.yml deleted file mode 100644 index b87d21b..0000000 --- a/.github/workflows/create-release-pr.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: Create Release PR - -on: - push: - branches: - - main - -jobs: - create-release-pr: - runs-on: ubuntu-latest - permissions: - contents: write - pull-requests: write - - steps: - - uses: actions/checkout@v4 - with: - ref: release - - - name: Reset main branch - run: | - git fetch origin main:main - git reset --hard main - - - name: Create Pull Request - uses: peter-evans/create-pull-request@v7 - with: - branch: main-to-release - commit-message: 'chore: sync main to release [skip ci]' - title: 'chore: sync main to release' - body: | - 이 PR은 main 브랜치의 변경사항을 release 브랜치로 동기화합니다. - - 이 PR이 머지되면 release 워크플로우가 자동으로 트리거됩니다. diff --git a/.github/workflows/release-dashboard.yml b/.github/workflows/release-dashboard.yml new file mode 100644 index 0000000..f353415 --- /dev/null +++ b/.github/workflows/release-dashboard.yml @@ -0,0 +1,105 @@ +name: Release Dashboard + +on: + pull_request: + types: [opened, synchronize, labeled, unlabeled] + branches: [main] + +jobs: + check-release: + runs-on: ubuntu-latest + permissions: + pull-requests: write + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Check Changed Packages + id: changed + run: | + # Get changed files + CHANGED_FILES=$(git diff --name-only origin/main...HEAD) + + # Check each package + MAIN_CHANGED=false + LAZY_CHANGED=false + PLOTLY_CHANGED=false + + if echo "$CHANGED_FILES" | grep -E "^src/|^package\.json$" | grep -v "^packages/"; then + MAIN_CHANGED=true + fi + + if echo "$CHANGED_FILES" | grep -E "^packages/lazy-table-renderer/"; then + LAZY_CHANGED=true + fi + + if echo "$CHANGED_FILES" | grep -E "^packages/plotly-renderer/"; then + PLOTLY_CHANGED=true + fi + + echo "main_changed=$MAIN_CHANGED" >> $GITHUB_OUTPUT + echo "lazy_changed=$LAZY_CHANGED" >> $GITHUB_OUTPUT + echo "plotly_changed=$PLOTLY_CHANGED" >> $GITHUB_OUTPUT + + - name: Update PR Comment + uses: actions/github-script@v7 + with: + script: | + const { main_changed, lazy_changed, plotly_changed } = ${{ toJson(steps.changed.outputs) }}; + + let packages = []; + if (main_changed === 'true') packages.push('vue-pivottable'); + if (lazy_changed === 'true') packages.push('@vue-pivottable/lazy-table-renderer'); + if (plotly_changed === 'true') packages.push('@vue-pivottable/plotly-renderer'); + + const hasReleaseLabel = context.payload.pull_request.labels.some( + label => label.name === 'release' + ); + + const body = `## 📦 Release Status + + **Packages with changes:** + ${packages.length > 0 ? packages.map(p => `- ${p}`).join('\n') : '- No package changes detected'} + + **Release label:** ${hasReleaseLabel ? '✅ Applied' : '❌ Not applied'} + + ${hasReleaseLabel && packages.length > 0 ? + '🚀 **This PR will trigger releases for the changed packages when merged.**' : + packages.length > 0 ? + '⚠️ **Add the `release` label to trigger releases when merged.**' : + 'ℹ️ **No package changes to release.**' + } + + --- + To release specific packages manually, use the [Manual Package Release](https://github.com/${{ github.repository }}/actions/workflows/release-manual.yml) workflow.`; + + // Find existing comment + const { data: comments } = await github.rest.issues.listComments({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + }); + + const botComment = comments.find(comment => + comment.user.type === 'Bot' && + comment.body.includes('## 📦 Release Status') + ); + + if (botComment) { + await github.rest.issues.updateComment({ + owner: context.repo.owner, + repo: context.repo.repo, + comment_id: botComment.id, + body: body + }); + } else { + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + body: body + }); + } \ No newline at end of file diff --git a/.github/workflows/release-lazy-table-renderer.yml b/.github/workflows/release-lazy-table-renderer.yml.bak similarity index 100% rename from .github/workflows/release-lazy-table-renderer.yml rename to .github/workflows/release-lazy-table-renderer.yml.bak diff --git a/.github/workflows/release-manual.yml b/.github/workflows/release-manual.yml new file mode 100644 index 0000000..6a22353 --- /dev/null +++ b/.github/workflows/release-manual.yml @@ -0,0 +1,101 @@ +name: Manual Package Release + +on: + workflow_dispatch: + inputs: + package: + description: 'Package to release' + required: true + type: choice + options: + - vue-pivottable + - lazy-table-renderer + - plotly-renderer + - all + release-type: + description: 'Release type' + required: true + type: choice + options: + - patch + - minor + - major + - auto + +jobs: + release: + runs-on: ubuntu-latest + permissions: + contents: write + packages: write + id-token: write + + steps: + - name: Generate GitHub App Token + id: app-token + uses: tibdex/github-app-token@v1 + with: + app_id: ${{ secrets.APP_ID }} + private_key: ${{ secrets.APP_PRIVATE_KEY }} + installation_id: ${{ secrets.APP_INSTALLATION_ID }} + + - name: Checkout + uses: actions/checkout@v4 + with: + token: ${{ steps.app-token.outputs.token }} + fetch-depth: 0 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '22.10.0' + registry-url: 'https://registry.npmjs.org/' + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + + - name: Install dependencies + run: pnpm install + + - name: Configure Git + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + - name: Build Package(s) + run: | + if [ "${{ inputs.package }}" = "all" ]; then + pnpm build:all + elif [ "${{ inputs.package }}" = "vue-pivottable" ]; then + pnpm build + else + pnpm --filter @vue-pivottable/${{ inputs.package }} build + fi + + - name: Version and Release + env: + GITHUB_TOKEN: ${{ steps.app-token.outputs.token }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + NPM_TOKEN_SUMIN: ${{ secrets.NPM_TOKEN_SUMIN }} + run: | + if [ "${{ inputs.release-type }}" != "auto" ]; then + VERSION_ARG="--release-as ${{ inputs.release-type }}" + else + VERSION_ARG="" + fi + + if [ "${{ inputs.package }}" = "all" ]; then + # Release all packages + pnpm dlx semantic-release $VERSION_ARG + cd packages/lazy-table-renderer && pnpm dlx semantic-release $VERSION_ARG && cd ../.. + cd packages/plotly-renderer && NPM_TOKEN=$NPM_TOKEN_SUMIN pnpm dlx semantic-release $VERSION_ARG && cd ../.. + elif [ "${{ inputs.package }}" = "vue-pivottable" ]; then + pnpm dlx semantic-release $VERSION_ARG + else + cd packages/${{ inputs.package }} + if [ "${{ inputs.package }}" = "plotly-renderer" ]; then + NPM_TOKEN=$NPM_TOKEN_SUMIN pnpm dlx semantic-release $VERSION_ARG + else + pnpm dlx semantic-release $VERSION_ARG + fi + fi \ No newline at end of file diff --git a/.github/workflows/release-plotly-renderer.yml b/.github/workflows/release-plotly-renderer.yml.bak similarity index 100% rename from .github/workflows/release-plotly-renderer.yml rename to .github/workflows/release-plotly-renderer.yml.bak diff --git a/.github/workflows/release-vue-pivottable.yml b/.github/workflows/release.yml similarity index 50% rename from .github/workflows/release-vue-pivottable.yml rename to .github/workflows/release.yml index c9c9347..e58207a 100644 --- a/.github/workflows/release-vue-pivottable.yml +++ b/.github/workflows/release.yml @@ -1,9 +1,12 @@ -name: Release vue-pivottable +name: Release on: push: branches: - - release + - main + +concurrency: ${{ github.workflow }}-${{ github.ref }} + jobs: release: name: Release @@ -14,13 +17,22 @@ jobs: pull-requests: write id-token: write steps: + - name: Generate GitHub App Token + id: generate-token + uses: tibdex/github-app-token@v1 + with: + app_id: ${{ secrets.APP_ID }} + private_key: ${{ secrets.APP_PRIVATE_KEY }} + installation_id: ${{ secrets.APP_INSTALLATION_ID }} + - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 + token: ${{ steps.generate-token.outputs.token }} - name: Setup Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: '22.10.0' registry-url: 'https://registry.npmjs.org/' @@ -33,41 +45,26 @@ jobs: - name: Install dependencies run: pnpm install - - name: Build - run: pnpm build - - name: Generate GitHub App Token - id: generate-token - uses: tibdex/github-app-token@v1 + - name: Create Release Pull Request or Publish + id: changesets + uses: changesets/action@v1 with: - app_id: ${{ secrets.APP_ID }} - private_key: ${{ secrets.APP_PRIVATE_KEY }} - installation_id: ${{ secrets.APP_INSTALLATION_ID }} - - name: Release + # This will create a PR with version bumps and changelog updates + # When the PR is merged, it will publish to npm + publish: pnpm release:packages + version: pnpm changeset version + commit: "chore: release packages" + title: "chore: release packages" + createGithubReleases: true env: GITHUB_TOKEN: ${{ steps.generate-token.outputs.token }} - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - run: | - pnpm dlx semantic-release - - - uses: actions/checkout@v4 - with: - ref: main - - - name: Reset release branch - run: | - git fetch origin release:release - git reset --hard release - - name: Create Pull Request - uses: peter-evans/create-pull-request@v5 - with: - branch: release-to-main - commit-message: 'chore: update version to latest release [skip ci]' - title: 'chore: update version to latest release [skip ci]' - body: | - 이 PR은 release 브랜치의 최신 버전 정보로 main 브랜치를 업데이트합니다. - - - package.json 버전 업데이트 - - CHANGELOG.md 업데이트 + NPM_TOKEN_SUMIN: ${{ secrets.NPM_TOKEN_SUMIN }} - 이 PR은 release 워크플로우에 의해 자동으로 생성되었습니다. + # Alternative: Use semantic-release with GitHub App token + # - name: Release + # env: + # GITHUB_TOKEN: ${{ steps.generate-token.outputs.token }} + # NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + # run: | + # pnpm dlx semantic-release \ No newline at end of file diff --git a/package.json b/package.json index 2793b34..6fdc79a 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,11 @@ "preview": "vite preview", "lint": "eslint", "build:all": "pnpm clean && pnpm build && pnpm -r --filter './packages/*' build", - "dev:all": "concurrently \"pnpm dev\" \"pnpm -r --parallel run dev\"" + "dev:all": "concurrently \"pnpm dev\" \"pnpm -r --parallel run dev\"", + "changeset": "changeset", + "version-packages": "changeset version", + "release": "pnpm build:all && changeset publish", + "release:packages": "node scripts/release-packages.js" }, "peerDependencies": { "vue": "^3.2.0" @@ -64,13 +68,17 @@ "vue-draggable-next": "^2.2.1" }, "devDependencies": { + "@changesets/cli": "^2.29.4", "@semantic-release/changelog": "^6.0.3", "@semantic-release/git": "^10.0.1", "@semantic-release/github": "^11.0.2", "@semantic-release/npm": "^12.0.1", "@seungwoo321/eslint-plugin-standard-js": "^1.0.1", "@seungwoo321/prettier-config": "^1.0.1", + "@types/node": "^22.15.21", + "@types/papaparse": "^5.3.16", "@vitejs/plugin-vue": "^5.2.1", + "@vue/tsconfig": "^0.7.0", "@vue-pivottable/lazy-table-renderer": "workspace:*", "@vue-pivottable/plotly-renderer": "workspace:*", "concurrently": "^9.1.2", @@ -82,10 +90,13 @@ "papaparse": "^5.5.2", "rimraf": "^6.0.1", "semantic-release": "^24.2.3", + "typescript": "^5.8.3", + "typescript-eslint": "^8.33.1", "vite": "^6.3.4", "vite-plugin-dts": "^4.5.3", "vite-plugin-static-copy": "^2.3.1", - "vue": "^3.2.0" + "vue": "^3.2.0", + "vue-tsc": "^2.2.10" }, "packageManager": "pnpm@9.12.2" } diff --git a/packages/lazy-table-renderer/.releaserc.json b/packages/lazy-table-renderer/.releaserc.json deleted file mode 100644 index a30b5f4..0000000 --- a/packages/lazy-table-renderer/.releaserc.json +++ /dev/null @@ -1,99 +0,0 @@ -{ - "branches": ["release"], - "tagFormat": "@vue-pivottable/lazy-table-renderer@${version}", - "plugins": [ - [ - "@semantic-release/commit-analyzer", - { - "preset": "angular", - "parserOpts": { - "headerPattern": "^(\\w*)\\(([\\w\\-]+)\\):\\s(.*)$", - "headerCorrespondence": ["type", "scope", "subject"] - }, - "releaseRules": [ - { - "type": "feat", - "scope": "lazy-table-renderer", - "release": "minor" - }, - { "type": "fix", "scope": "lazy-table-renderer", "release": "patch" }, - { - "type": "docs", - "scope": "lazy-table-renderer", - "release": "patch" - }, - { - "type": "style", - "scope": "lazy-table-renderer", - "release": "patch" - }, - { - "type": "refactor", - "scope": "lazy-table-renderer", - "release": "patch" - }, - { - "type": "perf", - "scope": "lazy-table-renderer", - "release": "patch" - }, - { - "type": "test", - "scope": "lazy-table-renderer", - "release": "patch" - }, - { - "type": "build", - "scope": "lazy-table-renderer", - "release": "patch" - }, - { "type": "ci", "scope": "lazy-table-renderer", "release": "patch" }, - { - "type": "chore", - "scope": "lazy-table-renderer", - "release": "patch" - } - ] - } - ], - [ - "@semantic-release/release-notes-generator", - { - "preset": "angular", - "parserOpts": { - "headerPattern": "^(\\w*)\\(([\\w\\-]+)\\):\\s(.*)$", - "headerCorrespondence": ["type", "scope", "subject"] - }, - "writerOpts": { - "commitsSort": ["scope", "subject"] - } - } - ], - [ - "@semantic-release/changelog", - { - "changelogFile": "CHANGELOG.md" - } - ], - [ - "@semantic-release/npm", - { - "pkgRoot": "." - } - ], - [ - "@semantic-release/git", - { - "assets": ["package.json", "CHANGELOG.md"], - "message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}" - } - ], - [ - "@semantic-release/github", - { - "successComment": "🎉 이 PR은 [${nextRelease.version}](https://github.com/vue-pivottable/vue3-pivottable/releases/tag/@vue-pivottable/lazy-table-renderer@${nextRelease.version})에 포함되었습니다.", - "failTitle": "semantic-release 실패" - } - ] - ] -} diff --git a/packages/lazy-table-renderer/CHANGELOG.md b/packages/lazy-table-renderer/CHANGELOG.md index eb135cb..0a52a7c 100644 --- a/packages/lazy-table-renderer/CHANGELOG.md +++ b/packages/lazy-table-renderer/CHANGELOG.md @@ -1,57 +1,26 @@ -# [1.1.0](https://github.com/vue-pivottable/vue3-pivottable/compare/@vue-pivottable/lazy-table-renderer@1.0.13...@vue-pivottable/lazy-table-renderer@1.1.0) (2025-06-18) - - -### Bug Fixes - -* **aggregators:** 집계 함수 null/undefined 체크 strictNullChecks 대응 ([1f681b6](https://github.com/vue-pivottable/vue3-pivottable/commit/1f681b6954e39ef5fa09faaf53d3874fdec06cb8)), closes [#132](https://github.com/vue-pivottable/vue3-pivottable/issues/132) -* **composables:** helper import 경로 @ alias로 복구 (PivotData) ([7f3b396](https://github.com/vue-pivottable/vue3-pivottable/commit/7f3b396ccdc56364ebde86f1480eae1ab22fb839)) -* **composables:** helper import 경로 @ alias로 복구 (PivotData) ([49a5905](https://github.com/vue-pivottable/vue3-pivottable/commit/49a59052529ce5abdb86716f5f9463587f8cf61a)) -* **composables:** import 경로 및 타입 선언 오류 수정 (빌드 경고/에러 해결) ([c403cfa](https://github.com/vue-pivottable/vue3-pivottable/commit/c403cfaef33816448ca1deb8254710fcb1b908ee)) -* **composables:** import 경로를 상대경로로 수정하여 빌드 경고 해결 (PivotData) ([deb6bb1](https://github.com/vue-pivottable/vue3-pivottable/commit/deb6bb11ebaf4558c109b6537582ef73d9ff9083)) -* **helper:** sum(attrs)() 패턴 제거 및 타입 일관성 개선 ([e93aecf](https://github.com/vue-pivottable/vue3-pivottable/commit/e93aecf1f7b944895c68f0c4ac26949094691b9b)), closes [#130](https://github.com/vue-pivottable/vue3-pivottable/issues/130) [#130](https://github.com/vue-pivottable/vue3-pivottable/issues/130) +# @vue-pivottable/lazy-table-renderer +## [1.1.0](https://github.com/vue-pivottable/vue3-pivottable/compare/@vue-pivottable/lazy-table-renderer@1.0.13...@vue-pivottable/lazy-table-renderer@1.1.0) (2025-06-18) ### Features -* **composables:** useMaterializeInput TypeScript 변환 ([868f275](https://github.com/vue-pivottable/vue3-pivottable/commit/868f27537d9d43d15649d5e61118bc46a477dc3f)) -* **composables:** usePropsState TypeScript 변환 ([b1b833b](https://github.com/vue-pivottable/vue3-pivottable/commit/b1b833bb59a797ea5208e45e82bf3931ae8b2c73)) -* **composables:** useProvidePivotData TypeScript 변환 ([c6a33d9](https://github.com/vue-pivottable/vue3-pivottable/commit/c6a33d9ef6077f5c5714902dd2fc6e9c0ead885e)) -* **helper:** utilities.js를 TypeScript로 마이그레이션 ([1f882f3](https://github.com/vue-pivottable/vue3-pivottable/commit/1f882f3b24637c69f411be3ffc639fc408529cc1)) - -## [1.0.13](https://github.com/vue-pivottable/vue3-pivottable/compare/@vue-pivottable/lazy-table-renderer@1.0.12...@vue-pivottable/lazy-table-renderer@1.0.13) (2025-05-07) - -## [1.0.12](https://github.com/vue-pivottable/vue3-pivottable/compare/@vue-pivottable/lazy-table-renderer@1.0.11...@vue-pivottable/lazy-table-renderer@1.0.12) (2025-05-07) - -## [1.0.11](https://github.com/vue-pivottable/vue3-pivottable/compare/@vue-pivottable/lazy-table-renderer@1.0.10...@vue-pivottable/lazy-table-renderer@1.0.11) (2025-05-07) - -## [1.0.10](https://github.com/vue-pivottable/vue3-pivottable/compare/@vue-pivottable/lazy-table-renderer@1.0.9...@vue-pivottable/lazy-table-renderer@1.0.10) (2025-05-07) +* TypeScript migration attempt (later reverted) ## [1.0.9](https://github.com/vue-pivottable/vue3-pivottable/compare/@vue-pivottable/lazy-table-renderer@1.0.8...@vue-pivottable/lazy-table-renderer@1.0.9) (2025-05-07) - ### Bug Fixes * **lazy-table-renderer:** fix build script ([4b9dc1b](https://github.com/vue-pivottable/vue3-pivottable/commit/4b9dc1bbccff292d69d0152a43f5bcd7cc66b5b2)) -## [1.0.8](https://github.com/vue-pivottable/vue3-pivottable/compare/@vue-pivottable/lazy-table-renderer@1.0.7...@vue-pivottable/lazy-table-renderer@1.0.8) (2025-05-07) - -## [1.0.7](https://github.com/vue-pivottable/vue3-pivottable/compare/@vue-pivottable/lazy-table-renderer@1.0.6...@vue-pivottable/lazy-table-renderer@1.0.7) (2025-05-07) - -## [1.0.6](https://github.com/vue-pivottable/vue3-pivottable/compare/@vue-pivottable/lazy-table-renderer@1.0.5...@vue-pivottable/lazy-table-renderer@1.0.6) (2025-05-07) - -## [1.0.5](https://github.com/vue-pivottable/vue3-pivottable/compare/@vue-pivottable/lazy-table-renderer@1.0.4...@vue-pivottable/lazy-table-renderer@1.0.5) (2025-05-07) +## 1.0.0 (2025-05-07) -## [1.0.4](https://github.com/vue-pivottable/vue3-pivottable/compare/@vue-pivottable/lazy-table-renderer@1.0.3...@vue-pivottable/lazy-table-renderer@1.0.4) (2025-05-07) - -## [1.0.3](https://github.com/vue-pivottable/vue3-pivottable/compare/@vue-pivottable/lazy-table-renderer@1.0.2...@vue-pivottable/lazy-table-renderer@1.0.3) (2025-05-07) - -## [1.0.2](https://github.com/vue-pivottable/vue3-pivottable/compare/@vue-pivottable/lazy-table-renderer@1.0.1...@vue-pivottable/lazy-table-renderer@1.0.2) (2025-05-07) - -## [1.0.1](https://github.com/vue-pivottable/vue3-pivottable/compare/@vue-pivottable/lazy-table-renderer@1.0.0...@vue-pivottable/lazy-table-renderer@1.0.1) (2025-05-07) +### Features -# 1.0.0 (2025-05-07) +* Initial release of lazy-table-renderer package +* Lazy loading implementation for large pivot tables +* Performance optimization for rendering large datasets ### Bug Fixes -- **lazy-table-renderer:** fix lint ([39f597c](https://github.com/vue-pivottable/vue3-pivottable/commit/39f597c081e885b7668fdaeec4ef38f2cb43b41c)) -- **slot:** pvtAttr scoped slot 버그 수정 ([#68](https://github.com/vue-pivottable/vue3-pivottable/issues/68)) ([e2986ac](https://github.com/vue-pivottable/vue3-pivottable/commit/e2986acaf5e247551d499de9a70b7a5e17b85087)) +* **lazy-table-renderer:** fix lint ([39f597c](https://github.com/vue-pivottable/vue3-pivottable/commit/39f597c081e885b7668fdaeec4ef38f2cb43b41c)) +* **slot:** pvtAttr scoped slot 버그 수정 ([#68](https://github.com/vue-pivottable/vue3-pivottable/issues/68)) ([e2986ac](https://github.com/vue-pivottable/vue3-pivottable/commit/e2986acaf5e247551d499de9a70b7a5e17b85087)) \ No newline at end of file diff --git a/packages/plotly-renderer/.releaserc.json b/packages/plotly-renderer/.releaserc.json deleted file mode 100644 index c1cafbf..0000000 --- a/packages/plotly-renderer/.releaserc.json +++ /dev/null @@ -1,99 +0,0 @@ -{ - "branches": ["main"], - "tagFormat": "@vue-pivottable/plotly-renderer@${version}", - "plugins": [ - [ - "@semantic-release/commit-analyzer", - { - "preset": "angular", - "parserOpts": { - "headerPattern": "^(\\w*)\\(([\\w\\-]+)\\):\\s(.*)$", - "headerCorrespondence": ["type", "scope", "subject"] - }, - "releaseRules": [ - { - "type": "feat", - "scope": "plotly-renderer", - "release": "minor" - }, - { "type": "fix", "scope": "plotly-renderer", "release": "patch" }, - { - "type": "docs", - "scope": "plotly-renderer", - "release": "patch" - }, - { - "type": "style", - "scope": "plotly-renderer", - "release": "patch" - }, - { - "type": "refactor", - "scope": "plotly-renderer", - "release": "patch" - }, - { - "type": "perf", - "scope": "plotly-renderer", - "release": "patch" - }, - { - "type": "test", - "scope": "plotly-renderer", - "release": "patch" - }, - { - "type": "build", - "scope": "plotly-renderer", - "release": "patch" - }, - { "type": "ci", "scope": "plotly-renderer", "release": "patch" }, - { - "type": "chore", - "scope": "plotly-renderer", - "release": "patch" - } - ] - } - ], - [ - "@semantic-release/release-notes-generator", - { - "preset": "angular", - "parserOpts": { - "headerPattern": "^(\\w*)\\(([\\w\\-]+)\\):\\s(.*)$", - "headerCorrespondence": ["type", "scope", "subject"] - }, - "writerOpts": { - "commitsSort": ["scope", "subject"] - } - } - ], - [ - "@semantic-release/changelog", - { - "changelogFile": "CHANGELOG.md" - } - ], - [ - "@semantic-release/npm", - { - "pkgRoot": "." - } - ], - [ - "@semantic-release/git", - { - "assets": ["package.json", "CHANGELOG.md"], - "message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}" - } - ], - [ - "@semantic-release/github", - { - "successComment": "🎉 이 PR은 [${nextRelease.version}](https://github.com/vue-pivottable/vue3-pivottable/releases/tag/@vue-pivottable/plotly-renderer@${nextRelease.version})에 포함되었습니다.", - "failTitle": "semantic-release 실패" - } - ] - ] -} diff --git a/packages/plotly-renderer/CHANGELOG.md b/packages/plotly-renderer/CHANGELOG.md new file mode 100644 index 0000000..e6d0f78 --- /dev/null +++ b/packages/plotly-renderer/CHANGELOG.md @@ -0,0 +1,8 @@ +# @vue-pivottable/plotly-renderer + +## 2.0.1 + +### Patch Changes + +- Initial changelog entry for Changesets migration +- Previous versions were managed by semantic-release \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4d42efd..f11c64d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,35 +10,47 @@ importers: dependencies: vue-draggable-next: specifier: ^2.2.1 - version: 2.2.1(sortablejs@1.15.6)(vue@3.5.13(typescript@5.8.2)) + version: 2.2.1(sortablejs@1.15.6)(vue@3.5.15(typescript@5.8.3)) devDependencies: + '@changesets/cli': + specifier: ^2.29.4 + version: 2.29.4 '@semantic-release/changelog': specifier: ^6.0.3 - version: 6.0.3(semantic-release@24.2.3(typescript@5.8.2)) + version: 6.0.3(semantic-release@24.2.5(typescript@5.8.3)) '@semantic-release/git': specifier: ^10.0.1 - version: 10.0.1(semantic-release@24.2.3(typescript@5.8.2)) + version: 10.0.1(semantic-release@24.2.5(typescript@5.8.3)) '@semantic-release/github': specifier: ^11.0.2 - version: 11.0.2(semantic-release@24.2.3(typescript@5.8.2)) + version: 11.0.3(semantic-release@24.2.5(typescript@5.8.3)) '@semantic-release/npm': specifier: ^12.0.1 - version: 12.0.1(semantic-release@24.2.3(typescript@5.8.2)) + version: 12.0.1(semantic-release@24.2.5(typescript@5.8.3)) '@seungwoo321/eslint-plugin-standard-js': specifier: ^1.0.1 - version: 1.0.1(@typescript-eslint/parser@8.32.0(eslint@9.26.0)(typescript@5.8.2))(eslint@9.26.0)(typescript@5.8.2) + version: 1.0.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0)(typescript@5.8.3))(eslint@9.27.0)(typescript@5.8.3) '@seungwoo321/prettier-config': specifier: ^1.0.1 version: 1.0.1(prettier@3.5.3) + '@types/node': + specifier: ^22.15.21 + version: 22.15.21 + '@types/papaparse': + specifier: ^5.3.16 + version: 5.3.16 '@vitejs/plugin-vue': specifier: ^5.2.1 - version: 5.2.3(vite@6.3.5)(vue@3.5.13(typescript@5.8.2)) + version: 5.2.4(vite@6.3.5(@types/node@22.15.21))(vue@3.5.15(typescript@5.8.3)) '@vue-pivottable/lazy-table-renderer': specifier: workspace:* version: link:packages/lazy-table-renderer '@vue-pivottable/plotly-renderer': specifier: workspace:* version: link:packages/plotly-renderer + '@vue/tsconfig': + specifier: ^0.7.0 + version: 0.7.0(typescript@5.8.3)(vue@3.5.15(typescript@5.8.3)) concurrently: specifier: ^9.1.2 version: 9.1.2 @@ -50,72 +62,99 @@ importers: version: 5.0.0(conventional-commits-filter@5.0.0) eslint: specifier: ^9.21.0 - version: 9.26.0 + version: 9.27.0 eslint-plugin-vue: specifier: ^9.32.0 - version: 9.33.0(eslint@9.26.0) + version: 9.33.0(eslint@9.27.0) globals: specifier: ^16.0.0 - version: 16.0.0 + version: 16.2.0 papaparse: specifier: ^5.5.2 - version: 5.5.2 + version: 5.5.3 rimraf: specifier: ^6.0.1 version: 6.0.1 semantic-release: specifier: ^24.2.3 - version: 24.2.3(typescript@5.8.2) + version: 24.2.5(typescript@5.8.3) + typescript: + specifier: ^5.8.3 + version: 5.8.3 + typescript-eslint: + specifier: ^8.33.1 + version: 8.33.1(eslint@9.27.0)(typescript@5.8.3) vite: specifier: ^6.3.4 - version: 6.3.5 + version: 6.3.5(@types/node@22.15.21) vite-plugin-dts: specifier: ^4.5.3 - version: 4.5.3(rollup@4.40.2)(typescript@5.8.2)(vite@6.3.5) + version: 4.5.4(@types/node@22.15.21)(rollup@4.41.1)(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.21)) vite-plugin-static-copy: specifier: ^2.3.1 - version: 2.3.1(vite@6.3.5) + version: 2.3.1(vite@6.3.5(@types/node@22.15.21)) vue: specifier: ^3.2.0 - version: 3.5.13(typescript@5.8.2) + version: 3.5.15(typescript@5.8.3) + vue-tsc: + specifier: ^2.2.10 + version: 2.2.10(typescript@5.8.3) packages/lazy-table-renderer: dependencies: vue: specifier: ^3.2.0 - version: 3.5.13(typescript@5.8.2) + version: 3.5.15(typescript@5.8.3) vue-pivottable: specifier: latest - version: 1.0.3(sortablejs@1.15.6)(vue@3.5.13(typescript@5.8.2)) + version: 1.0.15(sortablejs@1.15.6)(vue@3.5.15(typescript@5.8.3)) devDependencies: '@vitejs/plugin-vue': specifier: ^5.2.1 - version: 5.2.3(vite@6.3.5)(vue@3.5.13(typescript@5.8.2)) + version: 5.2.4(vite@6.3.5(@types/node@22.15.21))(vue@3.5.15(typescript@5.8.3)) + '@vue/tsconfig': + specifier: ^0.7.0 + version: 0.7.0(typescript@5.8.3)(vue@3.5.15(typescript@5.8.3)) + typescript: + specifier: ^5.8.3 + version: 5.8.3 vite: specifier: ^6.3.4 - version: 6.3.5 + version: 6.3.5(@types/node@22.15.21) + vue-tsc: + specifier: ^2.2.10 + version: 2.2.10(typescript@5.8.3) packages/plotly-renderer: dependencies: '@clalarco/vue3-plotly': specifier: ^0.1.5 - version: 0.1.5(vue@3.5.13(typescript@5.8.2)) + version: 0.1.5(vue@3.5.15(typescript@5.8.3)) plotly.js-basic-dist: specifier: ^3.0.1 version: 3.0.1 vue: specifier: ^3.2.0 - version: 3.5.13(typescript@5.8.2) + version: 3.5.15(typescript@5.8.3) vue-pivottable: specifier: 1.0.1 - version: 1.0.1(sortablejs@1.15.6)(vue@3.5.13(typescript@5.8.2)) + version: 1.0.1(sortablejs@1.15.6)(vue@3.5.15(typescript@5.8.3)) devDependencies: '@vitejs/plugin-vue': specifier: ^5.2.1 - version: 5.2.3(vite@6.3.5)(vue@3.5.13(typescript@5.8.2)) + version: 5.2.4(vite@6.3.5(@types/node@22.15.21))(vue@3.5.15(typescript@5.8.3)) + '@vue/tsconfig': + specifier: ^0.7.0 + version: 0.7.0(typescript@5.8.3)(vue@3.5.15(typescript@5.8.3)) + typescript: + specifier: ^5.8.3 + version: 5.8.3 vite: specifier: ^6.3.4 - version: 6.3.5 + version: 6.3.5(@types/node@22.15.21) + vue-tsc: + specifier: ^2.2.10 + version: 2.2.10(typescript@5.8.3) packages: @@ -136,10 +175,69 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/runtime@7.27.6': + resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} + engines: {node: '>=6.9.0'} + '@babel/types@7.27.1': resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==} engines: {node: '>=6.9.0'} + '@changesets/apply-release-plan@7.0.12': + resolution: {integrity: sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==} + + '@changesets/assemble-release-plan@6.0.8': + resolution: {integrity: sha512-y8+8LvZCkKJdbUlpXFuqcavpzJR80PN0OIfn8HZdwK7Sh6MgLXm4hKY5vu6/NDoKp8lAlM4ERZCqRMLxP4m+MQ==} + + '@changesets/changelog-git@0.2.1': + resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} + + '@changesets/cli@2.29.4': + resolution: {integrity: sha512-VW30x9oiFp/un/80+5jLeWgEU6Btj8IqOgI+X/zAYu4usVOWXjPIK5jSSlt5jsCU7/6Z7AxEkarxBxGUqkAmNg==} + hasBin: true + + '@changesets/config@3.1.1': + resolution: {integrity: sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==} + + '@changesets/errors@0.2.0': + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + + '@changesets/get-dependents-graph@2.1.3': + resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} + + '@changesets/get-release-plan@4.0.12': + resolution: {integrity: sha512-KukdEgaafnyGryUwpHG2kZ7xJquOmWWWk5mmoeQaSvZTWH1DC5D/Sw6ClgGFYtQnOMSQhgoEbDxAbpIIayKH1g==} + + '@changesets/get-version-range-type@0.4.0': + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} + + '@changesets/git@3.0.4': + resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} + + '@changesets/logger@0.1.1': + resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} + + '@changesets/parse@0.4.1': + resolution: {integrity: sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==} + + '@changesets/pre@2.0.2': + resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} + + '@changesets/read@0.6.5': + resolution: {integrity: sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==} + + '@changesets/should-skip-package@0.1.2': + resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} + + '@changesets/types@4.1.0': + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + + '@changesets/types@6.1.0': + resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} + + '@changesets/write@0.4.0': + resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} + '@clalarco/vue3-plotly@0.1.5': resolution: {integrity: sha512-t/+VBGj78ST/5SiRbfdpkkjYWBcRWJVQ6TPfexEQySuWDD3g/KhLL0eTDxI1qMp6IIynWKupjJvzIp3AI6QvgA==} peerDependencies: @@ -161,152 +259,152 @@ packages: conventional-commits-parser: optional: true - '@esbuild/aix-ppc64@0.25.4': - resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} + '@esbuild/aix-ppc64@0.25.5': + resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.4': - resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} + '@esbuild/android-arm64@0.25.5': + resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.4': - resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} + '@esbuild/android-arm@0.25.5': + resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.4': - resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} + '@esbuild/android-x64@0.25.5': + resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.4': - resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} + '@esbuild/darwin-arm64@0.25.5': + resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.4': - resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} + '@esbuild/darwin-x64@0.25.5': + resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.4': - resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} + '@esbuild/freebsd-arm64@0.25.5': + resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.4': - resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} + '@esbuild/freebsd-x64@0.25.5': + resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.4': - resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} + '@esbuild/linux-arm64@0.25.5': + resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.4': - resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} + '@esbuild/linux-arm@0.25.5': + resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.4': - resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} + '@esbuild/linux-ia32@0.25.5': + resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.4': - resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} + '@esbuild/linux-loong64@0.25.5': + resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.4': - resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} + '@esbuild/linux-mips64el@0.25.5': + resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.4': - resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} + '@esbuild/linux-ppc64@0.25.5': + resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.4': - resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} + '@esbuild/linux-riscv64@0.25.5': + resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.4': - resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} + '@esbuild/linux-s390x@0.25.5': + resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.4': - resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} + '@esbuild/linux-x64@0.25.5': + resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.4': - resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} + '@esbuild/netbsd-arm64@0.25.5': + resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.4': - resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} + '@esbuild/netbsd-x64@0.25.5': + resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.4': - resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} + '@esbuild/openbsd-arm64@0.25.5': + resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.4': - resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} + '@esbuild/openbsd-x64@0.25.5': + resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.25.4': - resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} + '@esbuild/sunos-x64@0.25.5': + resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.4': - resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} + '@esbuild/win32-arm64@0.25.5': + resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.4': - resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} + '@esbuild/win32-ia32@0.25.5': + resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.4': - resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} + '@esbuild/win32-x64@0.25.5': + resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -329,24 +427,24 @@ packages: resolution: {integrity: sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.13.0': - resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} + '@eslint/core@0.14.0': + resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.3.1': resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.26.0': - resolution: {integrity: sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ==} + '@eslint/js@9.27.0': + resolution: {integrity: sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.8': - resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} + '@eslint/plugin-kit@0.3.1': + resolution: {integrity: sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@humanfs/core@0.19.1': @@ -365,8 +463,8 @@ packages: resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.2': - resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} '@hutson/parse-repository-url@5.0.0': @@ -380,11 +478,17 @@ packages: '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@manypkg/find-root@1.1.0': + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + + '@manypkg/get-packages@1.1.3': + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + '@microsoft/api-extractor-model@7.30.6': resolution: {integrity: sha512-znmFn69wf/AIrwHya3fxX6uB5etSIn6vg4Q4RB/tb5VDDs1rqREc+AvMC/p19MUN13CZ7+V/8pkYPTj7q8tftg==} - '@microsoft/api-extractor@7.52.7': - resolution: {integrity: sha512-YLdPS644MfbLJt4hArP1WcldcaEUBh9wnFjcLEcQnVG0AMznbLh2sdE0F5Wr+w6+Lyp5/XUPvRAg3sYGSP3GCw==} + '@microsoft/api-extractor@7.52.8': + resolution: {integrity: sha512-cszYIcjiNscDoMB1CIKZ3My61+JOhpERGlGr54i6bocvGLrcL/wo9o+RNXMBrb7XgLtKaizZWUpqRduQuHQLdg==} hasBin: true '@microsoft/tsdoc-config@0.17.1': @@ -393,10 +497,6 @@ packages: '@microsoft/tsdoc@0.15.1': resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} - '@modelcontextprotocol/sdk@1.11.0': - resolution: {integrity: sha512-k/1pb70eD638anoi0e8wUGAlbMJXyvdV4p62Ko+EZ7eBe1xMx8Uhak1R5DgfoofsK5IBBnRwsYGTaLZl+6/+RQ==} - engines: {node: '>=18'} - '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -409,53 +509,53 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@octokit/auth-token@5.1.2': - resolution: {integrity: sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==} - engines: {node: '>= 18'} + '@octokit/auth-token@6.0.0': + resolution: {integrity: sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==} + engines: {node: '>= 20'} - '@octokit/core@6.1.5': - resolution: {integrity: sha512-vvmsN0r7rguA+FySiCsbaTTobSftpIDIpPW81trAmsv9TGxg3YCujAxRYp/Uy8xmDgYCzzgulG62H7KYUFmeIg==} - engines: {node: '>= 18'} + '@octokit/core@7.0.2': + resolution: {integrity: sha512-ODsoD39Lq6vR6aBgvjTnA3nZGliknKboc9Gtxr7E4WDNqY24MxANKcuDQSF0jzapvGb3KWOEDrKfve4HoWGK+g==} + engines: {node: '>= 20'} - '@octokit/endpoint@10.1.4': - resolution: {integrity: sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==} - engines: {node: '>= 18'} + '@octokit/endpoint@11.0.0': + resolution: {integrity: sha512-hoYicJZaqISMAI3JfaDr1qMNi48OctWuOih1m80bkYow/ayPw6Jj52tqWJ6GEoFTk1gBqfanSoI1iY99Z5+ekQ==} + engines: {node: '>= 20'} - '@octokit/graphql@8.2.2': - resolution: {integrity: sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==} - engines: {node: '>= 18'} + '@octokit/graphql@9.0.1': + resolution: {integrity: sha512-j1nQNU1ZxNFx2ZtKmL4sMrs4egy5h65OMDmSbVyuCzjOcwsHq6EaYjOTGXPQxgfiN8dJ4CriYHk6zF050WEULg==} + engines: {node: '>= 20'} - '@octokit/openapi-types@25.0.0': - resolution: {integrity: sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==} + '@octokit/openapi-types@25.1.0': + resolution: {integrity: sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==} - '@octokit/plugin-paginate-rest@12.0.0': - resolution: {integrity: sha512-MPd6WK1VtZ52lFrgZ0R2FlaoiWllzgqFHaSZxvp72NmoDeZ0m8GeJdg4oB6ctqMTYyrnDYp592Xma21mrgiyDA==} - engines: {node: '>= 18'} + '@octokit/plugin-paginate-rest@13.0.1': + resolution: {integrity: sha512-m1KvHlueScy4mQJWvFDCxFBTIdXS0K1SgFGLmqHyX90mZdCIv6gWBbKRhatxRjhGlONuTK/hztYdaqrTXcFZdQ==} + engines: {node: '>= 20'} peerDependencies: '@octokit/core': '>=6' - '@octokit/plugin-retry@7.2.1': - resolution: {integrity: sha512-wUc3gv0D6vNHpGxSaR3FlqJpTXGWgqmk607N9L3LvPL4QjaxDgX/1nY2mGpT37Khn+nlIXdljczkRnNdTTV3/A==} - engines: {node: '>= 18'} + '@octokit/plugin-retry@8.0.1': + resolution: {integrity: sha512-KUoYR77BjF5O3zcwDQHRRZsUvJwepobeqiSSdCJ8lWt27FZExzb0GgVxrhhfuyF6z2B2zpO0hN5pteni1sqWiw==} + engines: {node: '>= 20'} peerDependencies: - '@octokit/core': '>=6' + '@octokit/core': '>=7' - '@octokit/plugin-throttling@10.0.0': - resolution: {integrity: sha512-Kuq5/qs0DVYTHZuBAzCZStCzo2nKvVRo/TDNhCcpC2TKiOGz/DisXMCvjt3/b5kr6SCI1Y8eeeJTHBxxpFvZEg==} - engines: {node: '>= 18'} + '@octokit/plugin-throttling@11.0.1': + resolution: {integrity: sha512-S+EVhy52D/272L7up58dr3FNSMXWuNZolkL4zMJBNIfIxyZuUcczsQAU4b5w6dewJXnKYVgSHSV5wxitMSW1kw==} + engines: {node: '>= 20'} peerDependencies: - '@octokit/core': ^6.1.3 + '@octokit/core': ^7.0.0 - '@octokit/request-error@6.1.8': - resolution: {integrity: sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==} - engines: {node: '>= 18'} + '@octokit/request-error@7.0.0': + resolution: {integrity: sha512-KRA7VTGdVyJlh0cP5Tf94hTiYVVqmt2f3I6mnimmaVz4UG3gQV/k4mDJlJv3X67iX6rmN7gSHCF8ssqeMnmhZg==} + engines: {node: '>= 20'} - '@octokit/request@9.2.3': - resolution: {integrity: sha512-Ma+pZU8PXLOEYzsWf0cn/gY+ME57Wq8f49WTXA8FMHp2Ps9djKw//xYJ1je8Hm0pR2lU9FUGeJRWOtxq6olt4w==} - engines: {node: '>= 18'} + '@octokit/request@10.0.2': + resolution: {integrity: sha512-iYj4SJG/2bbhh+iIpFmG5u49DtJ4lipQ+aPakjL9OKpsGY93wM8w06gvFbEQxcMsZcCvk5th5KkIm2m8o14aWA==} + engines: {node: '>= 20'} - '@octokit/types@14.0.0': - resolution: {integrity: sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==} + '@octokit/types@14.1.0': + resolution: {integrity: sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==} '@pnpm/config.env-replace@1.1.0': resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} @@ -478,103 +578,103 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.40.2': - resolution: {integrity: sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==} + '@rollup/rollup-android-arm-eabi@4.41.1': + resolution: {integrity: sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.40.2': - resolution: {integrity: sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==} + '@rollup/rollup-android-arm64@4.41.1': + resolution: {integrity: sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.40.2': - resolution: {integrity: sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==} + '@rollup/rollup-darwin-arm64@4.41.1': + resolution: {integrity: sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.40.2': - resolution: {integrity: sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==} + '@rollup/rollup-darwin-x64@4.41.1': + resolution: {integrity: sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.40.2': - resolution: {integrity: sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==} + '@rollup/rollup-freebsd-arm64@4.41.1': + resolution: {integrity: sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.40.2': - resolution: {integrity: sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==} + '@rollup/rollup-freebsd-x64@4.41.1': + resolution: {integrity: sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.40.2': - resolution: {integrity: sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==} + '@rollup/rollup-linux-arm-gnueabihf@4.41.1': + resolution: {integrity: sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.40.2': - resolution: {integrity: sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==} + '@rollup/rollup-linux-arm-musleabihf@4.41.1': + resolution: {integrity: sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.40.2': - resolution: {integrity: sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==} + '@rollup/rollup-linux-arm64-gnu@4.41.1': + resolution: {integrity: sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.40.2': - resolution: {integrity: sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==} + '@rollup/rollup-linux-arm64-musl@4.41.1': + resolution: {integrity: sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.40.2': - resolution: {integrity: sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==} + '@rollup/rollup-linux-loongarch64-gnu@4.41.1': + resolution: {integrity: sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.40.2': - resolution: {integrity: sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==} + '@rollup/rollup-linux-powerpc64le-gnu@4.41.1': + resolution: {integrity: sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.40.2': - resolution: {integrity: sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==} + '@rollup/rollup-linux-riscv64-gnu@4.41.1': + resolution: {integrity: sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.40.2': - resolution: {integrity: sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==} + '@rollup/rollup-linux-riscv64-musl@4.41.1': + resolution: {integrity: sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.40.2': - resolution: {integrity: sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==} + '@rollup/rollup-linux-s390x-gnu@4.41.1': + resolution: {integrity: sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.40.2': - resolution: {integrity: sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==} + '@rollup/rollup-linux-x64-gnu@4.41.1': + resolution: {integrity: sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.40.2': - resolution: {integrity: sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==} + '@rollup/rollup-linux-x64-musl@4.41.1': + resolution: {integrity: sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.40.2': - resolution: {integrity: sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==} + '@rollup/rollup-win32-arm64-msvc@4.41.1': + resolution: {integrity: sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.40.2': - resolution: {integrity: sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==} + '@rollup/rollup-win32-ia32-msvc@4.41.1': + resolution: {integrity: sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.40.2': - resolution: {integrity: sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==} + '@rollup/rollup-win32-x64-msvc@4.41.1': + resolution: {integrity: sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw==} cpu: [x64] os: [win32] @@ -632,8 +732,8 @@ packages: peerDependencies: semantic-release: '>=18.0.0' - '@semantic-release/github@11.0.2': - resolution: {integrity: sha512-EhHimj3/eOSPu0OflgDzwgrawoGJIn8XLOkNS6WzwuTr8ebxyX976Y4mCqJ8MlkdQpV5+8T+49sy8xXlcm6uCg==} + '@semantic-release/github@11.0.3': + resolution: {integrity: sha512-T2fKUyFkHHkUNa5XNmcsEcDPuG23hwBKptfUVcFXDVG2cSjXXZYDOfVYwfouqbWo/8UefotLaoGfQeK+k3ep6A==} engines: {node: '>=20.8.1'} peerDependencies: semantic-release: '>=24.1.0' @@ -674,8 +774,8 @@ packages: resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} - '@stylistic/eslint-plugin@4.2.0': - resolution: {integrity: sha512-8hXezgz7jexGHdo5WN6JBEIPHCSFyyU4vgbxevu4YLVS5vl+sxqAAGyXSzfNDyR6xMNSH5H1x67nsXcYMOHtZA==} + '@stylistic/eslint-plugin@4.4.0': + resolution: {integrity: sha512-bIh/d9X+OQLCAMdhHtps+frvyjvAM4B1YlSJzcEEhl7wXLIqPar3ngn9DrHhkBOrTA/z9J0bUMtctAspe0dxdQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=9.0.0' @@ -692,86 +792,132 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + + '@types/node@22.15.21': + resolution: {integrity: sha512-EV/37Td6c+MgKAbkcLG6vqZ2zEYHD7bvSrzqqs2RIhbA6w3x+Dqz8MZM3sP6kGTeLrdoOgKZe+Xja7tUB2DNkQ==} + '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/papaparse@5.3.16': + resolution: {integrity: sha512-T3VuKMC2H0lgsjI9buTB3uuKj3EMD2eap1MOuEQuBQ44EnDx/IkGhU6EwiTf9zG3za4SKlmwKAImdDKdNnCsXg==} + '@types/semver@7.7.0': resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} - '@typescript-eslint/eslint-plugin@8.32.0': - resolution: {integrity: sha512-/jU9ettcntkBFmWUzzGgsClEi2ZFiikMX5eEQsmxIAWMOn4H3D4rvHssstmAHGVvrYnaMqdWWWg0b5M6IN/MTQ==} + '@typescript-eslint/eslint-plugin@8.33.1': + resolution: {integrity: sha512-TDCXj+YxLgtvxvFlAvpoRv9MAncDLBV2oT9Bd7YBGC/b/sEURoOYuIwLI99rjWOfY3QtDzO+mk0n4AmdFExW8A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + '@typescript-eslint/parser': ^8.33.1 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@8.32.0': - resolution: {integrity: sha512-B2MdzyWxCE2+SqiZHAjPphft+/2x2FlO9YBx7eKE1BCb+rqBlQdhtAEhzIEdozHd55DXPmxBdpMygFJjfjjA9A==} + '@typescript-eslint/parser@8.33.1': + resolution: {integrity: sha512-qwxv6dq682yVvgKKp2qWwLgRbscDAYktPptK4JPojCwwi3R9cwrvIxS4lvBpzmcqzR4bdn54Z0IG1uHFskW4dA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/scope-manager@8.32.0': - resolution: {integrity: sha512-jc/4IxGNedXkmG4mx4nJTILb6TMjL66D41vyeaPWvDUmeYQzF3lKtN15WsAeTr65ce4mPxwopPSo1yUUAWw0hQ==} + '@typescript-eslint/project-service@8.33.1': + resolution: {integrity: sha512-DZR0efeNklDIHHGRpMpR5gJITQpu6tLr9lDJnKdONTC7vvzOlLAG/wcfxcdxEWrbiZApcoBCzXqU/Z458Za5Iw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/type-utils@8.32.0': - resolution: {integrity: sha512-t2vouuYQKEKSLtJaa5bB4jHeha2HJczQ6E5IXPDPgIty9EqcJxpr1QHQ86YyIPwDwxvUmLfP2YADQ5ZY4qddZg==} + '@typescript-eslint/scope-manager@8.32.1': + resolution: {integrity: sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/scope-manager@8.33.1': + resolution: {integrity: sha512-dM4UBtgmzHR9bS0Rv09JST0RcHYearoEoo3pG5B6GoTR9XcyeqX87FEhPo+5kTvVfKCvfHaHrcgeJQc6mrDKrA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.33.1': + resolution: {integrity: sha512-STAQsGYbHCF0/e+ShUQ4EatXQ7ceh3fBCXkNU7/MZVKulrlq1usH7t2FhxvCpuCi5O5oi1vmVaAjrGeL71OK1g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/type-utils@8.33.1': + resolution: {integrity: sha512-1cG37d9xOkhlykom55WVwG2QRNC7YXlxMaMzqw2uPeJixBFfKWZgaP/hjAObqMN/u3fr5BrTwTnc31/L9jQ2ww==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/types@8.32.0': - resolution: {integrity: sha512-O5Id6tGadAZEMThM6L9HmVf5hQUXNSxLVKeGJYWNhhVseps/0LddMkp7//VDkzwJ69lPL0UmZdcZwggj9akJaA==} + '@typescript-eslint/types@8.32.1': + resolution: {integrity: sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/types@8.33.1': + resolution: {integrity: sha512-xid1WfizGhy/TKMTwhtVOgalHwPtV8T32MS9MaH50Cwvz6x6YqRIPdD2WvW0XaqOzTV9p5xdLY0h/ZusU5Lokg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.32.0': - resolution: {integrity: sha512-pU9VD7anSCOIoBFnhTGfOzlVFQIA1XXiQpH/CezqOBaDppRwTglJzCC6fUQGpfwey4T183NKhF1/mfatYmjRqQ==} + '@typescript-eslint/typescript-estree@8.32.1': + resolution: {integrity: sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/typescript-estree@8.33.1': + resolution: {integrity: sha512-+s9LYcT8LWjdYWu7IWs7FvUxpQ/DGkdjZeE/GGulHvv8rvYwQvVaUZ6DE+j5x/prADUgSbbCWZ2nPI3usuVeOA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.32.0': - resolution: {integrity: sha512-8S9hXau6nQ/sYVtC3D6ISIDoJzS1NsCK+gluVhLN2YkBPX+/1wkwyUiDKnxRh15579WoOIyVWnoyIf3yGI9REw==} + '@typescript-eslint/utils@8.32.1': + resolution: {integrity: sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/visitor-keys@8.32.0': - resolution: {integrity: sha512-1rYQTCLFFzOI5Nl0c8LUpJT8HxpwVRn9E4CkMsYfuN6ctmQqExjSTzzSk0Tz2apmXy7WU6/6fyaZVVA/thPN+w==} + '@typescript-eslint/utils@8.33.1': + resolution: {integrity: sha512-52HaBiEQUaRYqAXpfzWSR2U3gxk92Kw006+xZpElaPMg3C4PgM+A5LqwoQI1f9E5aZ/qlxAZxzm42WX+vn92SQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/visitor-keys@8.32.1': + resolution: {integrity: sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/visitor-keys@8.33.1': + resolution: {integrity: sha512-3i8NrFcZeeDHJ+7ZUuDkGT+UHq+XoFGsymNK2jZCOHcfEzRQ0BdpRtdpSx/Iyf3MHLWIcLS0COuOPibKQboIiQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vitejs/plugin-vue@5.2.3': - resolution: {integrity: sha512-IYSLEQj4LgZZuoVpdSUCw3dIynTWQgPlaRP6iAvMle4My0HdYwr5g5wQAfwOeHQBmYwEkqF70nRpSilr6PoUDg==} + '@vitejs/plugin-vue@5.2.4': + resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: vite: ^5.0.0 || ^6.0.0 vue: ^3.2.25 - '@volar/language-core@2.4.13': - resolution: {integrity: sha512-MnQJ7eKchJx5Oz+YdbqyFUk8BN6jasdJv31n/7r6/WwlOOv7qzvot6B66887l2ST3bUW4Mewml54euzpJWA6bg==} + '@volar/language-core@2.4.14': + resolution: {integrity: sha512-X6beusV0DvuVseaOEy7GoagS4rYHgDHnTrdOj5jeUb49fW5ceQyP9Ej5rBhqgz2wJggl+2fDbbojq1XKaxDi6w==} - '@volar/source-map@2.4.13': - resolution: {integrity: sha512-l/EBcc2FkvHgz2ZxV+OZK3kMSroMr7nN3sZLF2/f6kWW66q8+tEL4giiYyFjt0BcubqJhBt6soYIrAPhg/Yr+Q==} + '@volar/source-map@2.4.14': + resolution: {integrity: sha512-5TeKKMh7Sfxo8021cJfmBzcjfY1SsXsPMMjMvjY7ivesdnybqqS+GxGAoXHAOUawQTwtdUxgP65Im+dEmvWtYQ==} - '@volar/typescript@2.4.13': - resolution: {integrity: sha512-Ukz4xv84swJPupZeoFsQoeJEOm7U9pqsEnaGGgt5ni3SCTa22m8oJP5Nng3Wed7Uw5RBELdLxxORX8YhJPyOgQ==} + '@volar/typescript@2.4.14': + resolution: {integrity: sha512-p8Z6f/bZM3/HyCdRNFZOEEzts51uV8WHeN8Tnfnm2EBv6FDB2TQLzfVx7aJvnl8ofKAOnS64B2O8bImBFaauRw==} - '@vue/compiler-core@3.5.13': - resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} + '@vue/compiler-core@3.5.15': + resolution: {integrity: sha512-nGRc6YJg/kxNqbv/7Tg4juirPnjHvuVdhcmDvQWVZXlLHjouq7VsKmV1hIxM/8yKM0VUfwT/Uzc0lO510ltZqw==} - '@vue/compiler-dom@3.5.13': - resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} + '@vue/compiler-dom@3.5.15': + resolution: {integrity: sha512-ZelQd9n+O/UCBdL00rlwCrsArSak+YLZpBVuNDio1hN3+wrCshYZEDUO3khSLAzPbF1oQS2duEoMDUHScUlYjA==} - '@vue/compiler-sfc@3.5.13': - resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} + '@vue/compiler-sfc@3.5.15': + resolution: {integrity: sha512-3zndKbxMsOU6afQWer75Zot/aydjtxNj0T2KLg033rAFaQUn2PGuE32ZRe4iMhflbTcAxL0yEYsRWFxtPro8RQ==} - '@vue/compiler-ssr@3.5.13': - resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} + '@vue/compiler-ssr@3.5.15': + resolution: {integrity: sha512-gShn8zRREZbrXqTtmLSCffgZXDWv8nHc/GhsW+mbwBfNZL5pI96e7IWcIq8XGQe1TLtVbu7EV9gFIVSmfyarPg==} '@vue/compiler-vue2@2.7.16': resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} @@ -784,26 +930,41 @@ packages: typescript: optional: true - '@vue/reactivity@3.5.13': - resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} + '@vue/language-core@2.2.10': + resolution: {integrity: sha512-+yNoYx6XIKuAO8Mqh1vGytu8jkFEOH5C8iOv3i8Z/65A7x9iAOXA97Q+PqZ3nlm2lxf5rOJuIGI/wDtx/riNYw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - '@vue/runtime-core@3.5.13': - resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} + '@vue/reactivity@3.5.15': + resolution: {integrity: sha512-GaA5VUm30YWobCwpvcs9nvFKf27EdSLKDo2jA0IXzGS344oNpFNbEQ9z+Pp5ESDaxyS8FcH0vFN/XSe95BZtHQ==} - '@vue/runtime-dom@3.5.13': - resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} + '@vue/runtime-core@3.5.15': + resolution: {integrity: sha512-CZAlIOQ93nj0OPpWWOx4+QDLCMzBNY85IQR4Voe6vIID149yF8g9WQaWnw042f/6JfvLttK7dnyWlC1EVCRK8Q==} - '@vue/server-renderer@3.5.13': - resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} + '@vue/runtime-dom@3.5.15': + resolution: {integrity: sha512-wFplHKzKO/v998up2iCW3RN9TNUeDMhdBcNYZgs5LOokHntrB48dyuZHspcahKZczKKh3v6i164gapMPxBTKNw==} + + '@vue/server-renderer@3.5.15': + resolution: {integrity: sha512-Gehc693kVTYkLt6QSYEjGvqvdK2zZ/gf/D5zkgmvBdeB30dNnVZS8yY7+IlBmHRd1rR/zwaqeu06Ij04ZxBscg==} peerDependencies: - vue: 3.5.13 + vue: 3.5.15 - '@vue/shared@3.5.13': - resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + '@vue/shared@3.5.15': + resolution: {integrity: sha512-bKvgFJJL1ZX9KxMCTQY6xD9Dhe3nusd1OhyOb1cJYGqvAr0Vg8FIjHPMOEVbJ9GDT9HG+Bjdn4oS8ohKP8EvoA==} - accepts@2.0.0: - resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} - engines: {node: '>= 0.6'} + '@vue/tsconfig@0.7.0': + resolution: {integrity: sha512-ku2uNz5MaZ9IerPPUyOHzyjhXoX2kVJaVf7hL315DC17vS6IiZRmmCPfggNbU16QTvM80+uYYy3eYJB59WCtvg==} + peerDependencies: + typescript: 5.x + vue: ^3.4.0 + peerDependenciesMeta: + typescript: + optional: true + vue: + optional: true acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -858,6 +1019,13 @@ packages: alien-signals@0.4.14: resolution: {integrity: sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==} + alien-signals@1.0.13: + resolution: {integrity: sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + ansi-escapes@7.0.0: resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} engines: {node: '>=18'} @@ -909,6 +1077,10 @@ packages: resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'} + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + array.prototype.findlastindex@1.2.6: resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} engines: {node: '>= 0.4'} @@ -936,17 +1108,17 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - before-after-hook@3.0.2: - resolution: {integrity: sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==} + before-after-hook@4.0.0: + resolution: {integrity: sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==} + + better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - body-parser@2.2.0: - resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} - engines: {node: '>=18'} - boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -963,10 +1135,6 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -999,10 +1167,17 @@ packages: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} @@ -1063,14 +1238,6 @@ packages: config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} - content-disposition@1.0.0: - resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} - engines: {node: '>= 0.6'} - - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - conventional-changelog-angular@8.0.0: resolution: {integrity: sha512-CLf+zr6St0wIxos4bmaKHRXWAcsCXrJU6F4VdNDrGRK3B8LDLKoX3zuMV5GhtbGkVR/LohZ6MT6im43vZLSjmA==} engines: {node: '>=18'} @@ -1120,8 +1287,8 @@ packages: resolution: {integrity: sha512-SetDSntXLk8Jh1NOAl1Gu5uLiCNSYenB5tm0YVeZKePRIgDW9lQImromTwLa3c/Gae298tsgOM+/CYT9XAl0NA==} engines: {node: '>=18'} - conventional-changelog-writer@8.0.1: - resolution: {integrity: sha512-hlqcy3xHred2gyYg/zXSMXraY2mjAYYo0msUCpK+BGyaVJMFCKWVXPIHiaacGO2GGp13kvHWXFhYmxT4QQqW3Q==} + conventional-changelog-writer@8.1.0: + resolution: {integrity: sha512-dpC440QnORNCO81XYuRRFOLCsjKj4W7tMkUIn3lR6F/FAaJcWLi7iCj6IcEvSQY2zw6VUgwUKd5DEHKEWrpmEQ==} engines: {node: '>=18'} hasBin: true @@ -1142,21 +1309,9 @@ packages: resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} engines: {node: '>=12'} - cookie-signature@1.2.2: - resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} - engines: {node: '>=6.6.0'} - - cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} - core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - cors@2.8.5: - resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} - engines: {node: '>= 0.10'} - cosmiconfig@9.0.0: resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} engines: {node: '>=14'} @@ -1205,8 +1360,8 @@ packages: supports-color: optional: true - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1229,9 +1384,9 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} @@ -1255,9 +1410,6 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1267,20 +1419,20 @@ packages: emojilib@2.4.0: resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} - encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} - enhanced-resolve@5.18.1: resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} engines: {node: '>=10.13.0'} + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - env-ci@11.1.0: - resolution: {integrity: sha512-Z8dnwSDbV1XYM9SBF2J0GcNVvmfmfh3a49qddGIROhBoVro6MZVTji15z/sJbQ2ko2ei8n988EU1wzoLU/tF+g==} + env-ci@11.1.1: + resolution: {integrity: sha512-mT3ks8F0kwpo7SYNds6nWj0PaRh+qJxIeBVBXAKTN9hphAzZv7s0QAZQbqnB1fAv/r4pJUGE15BV9UrS31FP2w==} engines: {node: ^18.17 || >=20.6.1} env-paths@2.2.1: @@ -1294,8 +1446,8 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-abstract@1.23.9: - resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} + es-abstract@1.23.10: + resolution: {integrity: sha512-MtUbM072wlJNyeYAe0mhzrD+M6DIJa96CZAOBBrhDbgKnB4MApIKefcyAB1eOdYn8cUNZgvwBvEzdoAYsxgEIw==} engines: {node: '>= 0.4'} es-define-property@1.0.1: @@ -1322,8 +1474,8 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - esbuild@0.25.4: - resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} + esbuild@0.25.5: + resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} engines: {node: '>=18'} hasBin: true @@ -1331,9 +1483,6 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -1392,8 +1541,8 @@ packages: '@typescript-eslint/parser': optional: true - eslint-plugin-n@17.17.0: - resolution: {integrity: sha512-2VvPK7Mo73z1rDFb6pTvkH6kFibAmnTubFq5l83vePxu0WiY1s0LOtj2WHb6Sa40R3w4mnh8GFYbHBQyMlotKw==} + eslint-plugin-n@17.18.0: + resolution: {integrity: sha512-hvZ/HusueqTJ7VDLoCpjN0hx4N4+jHIWTXD4TMLHy9F23XkDagR9v+xQWRWR57yY55GPF8NnD4ox9iGTxirY8A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.23.0' @@ -1426,8 +1575,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.26.0: - resolution: {integrity: sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ==} + eslint@9.27.0: + resolution: {integrity: sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -1444,6 +1593,11 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + esquery@1.6.0: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} @@ -1463,18 +1617,6 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - - eventsource-parser@3.0.1: - resolution: {integrity: sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==} - engines: {node: '>=18.0.0'} - - eventsource@3.0.6: - resolution: {integrity: sha512-l19WpE2m9hSuyP06+FbuUUf1G+R0SFLrtQfbRb9PRr+oimOfxQhgGCbVaXg5IvZyyTThJsxh6L/srkMiCeBPDA==} - engines: {node: '>=18.0.0'} - execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -1483,25 +1625,22 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} - execa@9.5.2: - resolution: {integrity: sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==} + execa@9.6.0: + resolution: {integrity: sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw==} engines: {node: ^18.19.0 || >=20.5.0} - express-rate-limit@7.5.0: - resolution: {integrity: sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==} - engines: {node: '>= 16'} - peerDependencies: - express: ^4.11 || 5 || ^5.0.0-beta.1 - - express@5.1.0: - resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} - engines: {node: '>= 18'} - exsolve@1.0.5: resolution: {integrity: sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==} - fast-content-type-parse@2.0.1: - resolution: {integrity: sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==} + extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + fast-content-type-parse@3.0.0: + resolution: {integrity: sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -1543,10 +1682,6 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - finalhandler@2.1.0: - resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} - engines: {node: '>= 0.8'} - find-up-simple@1.0.1: resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} engines: {node: '>=18'} @@ -1555,6 +1690,10 @@ packages: resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} engines: {node: '>=4'} + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -1578,14 +1717,6 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - - fresh@2.0.0: - resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} - engines: {node: '>= 0.8'} - from2@2.3.0: resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} @@ -1593,6 +1724,14 @@ packages: resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} engines: {node: '>=14.14'} + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1644,8 +1783,8 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-tsconfig@4.10.0: - resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + get-tsconfig@4.10.1: + resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} git-log-parser@1.2.1: resolution: {integrity: sha512-PI+sPDvHXNPl5WNOErAK05s3j0lgwUzMN6o8cyQrDaKfT3qd7TmNJKeXX+SknI5I0QhG5fVPAEwSY4tRGDtYoQ==} @@ -1685,14 +1824,18 @@ packages: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} - globals@16.0.0: - resolution: {integrity: sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==} + globals@16.2.0: + resolution: {integrity: sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==} engines: {node: '>=18'} globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + globby@14.1.0: resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} engines: {node: '>=18'} @@ -1765,10 +1908,6 @@ packages: resolution: {integrity: sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==} engines: {node: ^18.17.0 || >=20.5.0} - http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} @@ -1777,6 +1916,10 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} + human-id@4.1.1: + resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} + hasBin: true + human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -1789,8 +1932,8 @@ packages: resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} engines: {node: '>=18.18.0'} - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} ignore@5.3.2: @@ -1846,10 +1989,6 @@ packages: resolution: {integrity: sha512-2dYz766i9HprMBasCMvHMuazJ7u4WzhJwo5kb3iPSiW/iRYV6uPari3zHoqZlnuaR7V1bEiNMxikhp37rdBXbw==} engines: {node: '>=12'} - ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} @@ -1929,9 +2068,6 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - is-promise@4.0.0: - resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} - is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -1960,6 +2096,10 @@ packages: resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} + is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + is-symbol@1.1.1: resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} engines: {node: '>= 0.4'} @@ -1984,6 +2124,10 @@ packages: resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} @@ -1997,8 +2141,8 @@ packages: resolution: {integrity: sha512-3YZcUUR2Wt1WsapF+S/WiA2WmlW0cWAoPccMqne7AxEBhCdFeTPjfv/Axb8V2gyCgY3nRw+ksZ3xSUX+R47iAg==} engines: {node: ^18.17 || >=20.6.1} - jackspeak@4.1.0: - resolution: {integrity: sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==} + jackspeak@4.1.1: + resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} engines: {node: 20 || >=22} java-properties@1.0.2: @@ -2011,6 +2155,10 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -2037,6 +2185,9 @@ packages: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} @@ -2065,6 +2216,10 @@ packages: resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} engines: {node: '>=4'} + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -2087,6 +2242,9 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + lodash.uniqby@4.7.0: resolution: {integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==} @@ -2113,8 +2271,8 @@ packages: peerDependencies: marked: '>=1 <16' - marked@12.0.2: - resolution: {integrity: sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==} + marked@15.0.12: + resolution: {integrity: sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==} engines: {node: '>= 18'} hasBin: true @@ -2122,18 +2280,10 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} - media-typer@1.1.0: - resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} - engines: {node: '>= 0.8'} - meow@13.2.0: resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} engines: {node: '>=18'} - merge-descriptors@2.0.0: - resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} - engines: {node: '>=18'} - merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -2145,14 +2295,6 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - mime-db@1.54.0: - resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} - engines: {node: '>= 0.6'} - - mime-types@3.0.1: - resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} - engines: {node: '>= 0.6'} - mime@4.0.7: resolution: {integrity: sha512-2OfDPL+e03E0LrXaGYOtTFIYhiuzep94NSsuhrNULq+stylcJedcHdzHtz0atMUuGwJfFYs0YL5xeC/Ca2x0eQ==} engines: {node: '>=16'} @@ -2190,6 +2332,10 @@ packages: mlly@1.7.4: resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -2207,10 +2353,6 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - negotiator@1.0.0: - resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} - engines: {node: '>= 0.6'} - neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} @@ -2350,13 +2492,6 @@ packages: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} @@ -2369,6 +2504,13 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + own-keys@1.0.1: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} @@ -2377,6 +2519,10 @@ packages: resolution: {integrity: sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==} engines: {node: '>=12'} + p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + p-filter@4.1.0: resolution: {integrity: sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw==} engines: {node: '>=18'} @@ -2389,6 +2535,10 @@ packages: resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} engines: {node: '>=4'} + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -2397,10 +2547,18 @@ packages: resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} engines: {node: '>=4'} + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + p-map@7.0.3: resolution: {integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==} engines: {node: '>=18'} @@ -2417,11 +2575,18 @@ packages: resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} engines: {node: '>=4'} + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - papaparse@5.5.2: - resolution: {integrity: sha512-PZXg8UuAc4PcVwLosEEDYjPyfWnTEhOrUfdv+3Bx+NuAb+5NhDmXzg5fHWmdCh1mP5p7JAZfFr3IMQfcntNAdA==} + package-manager-detector@0.2.11: + resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} + + papaparse@5.5.3: + resolution: {integrity: sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==} parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} @@ -2452,10 +2617,6 @@ packages: parse5@6.0.1: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} @@ -2482,10 +2643,6 @@ packages: resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} engines: {node: 20 || >=22} - path-to-regexp@8.2.0: - resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} - engines: {node: '>=16'} - path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -2512,9 +2669,9 @@ packages: resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} - pkce-challenge@5.0.0: - resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} - engines: {node: '>=16.20.0'} + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} pkg-conf@2.1.0: resolution: {integrity: sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==} @@ -2548,6 +2705,11 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + prettier@3.5.3: resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} engines: {node: '>=14'} @@ -2563,32 +2725,16 @@ packages: proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - qs@6.14.0: - resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} - engines: {node: '>=0.6'} - quansync@0.2.10: resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - - raw-body@3.0.0: - resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} - engines: {node: '>= 0.8'} - rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -2601,6 +2747,10 @@ packages: resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==} engines: {node: '>=18'} + read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} + readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -2653,15 +2803,11 @@ packages: engines: {node: 20 || >=22} hasBin: true - rollup@4.40.2: - resolution: {integrity: sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==} + rollup@4.41.1: + resolution: {integrity: sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - router@2.2.0: - resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} - engines: {node: '>= 18'} - run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -2675,9 +2821,6 @@ packages: safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-push-apply@1.0.0: resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} engines: {node: '>= 0.4'} @@ -2689,8 +2832,8 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - semantic-release@24.2.3: - resolution: {integrity: sha512-KRhQG9cUazPavJiJEFIJ3XAMjgfd0fcK3B+T26qOl8L0UG5aZUjeRfREO0KM5InGtYwxqiiytkJrbcYoLDEv0A==} + semantic-release@24.2.5: + resolution: {integrity: sha512-9xV49HNY8C0/WmPWxTlaNleiXhWb//qfMzG2c5X8/k7tuWcu8RssbuS+sujb/h7PiWSXv53mrQvV9hrO9b7vuQ==} engines: {node: '>=20.8.1'} hasBin: true @@ -2711,19 +2854,11 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.7.1: - resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} engines: {node: '>=10'} hasBin: true - send@1.2.0: - resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} - engines: {node: '>= 18'} - - serve-static@2.2.0: - resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} - engines: {node: '>= 18'} - set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -2736,9 +2871,6 @@ packages: resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} engines: {node: '>= 0.4'} - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -2782,6 +2914,10 @@ packages: resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} engines: {node: '>=8'} + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + slash@5.1.0: resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} engines: {node: '>=14.16'} @@ -2800,6 +2936,9 @@ packages: spawn-error-forwarder@1.0.0: resolution: {integrity: sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==} + spawndamnit@3.0.1: + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} + spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} @@ -2818,10 +2957,6 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - stream-combiner2@1.1.1: resolution: {integrity: sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==} @@ -2908,8 +3043,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + tapable@2.2.2: + resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} engines: {node: '>=6'} temp-dir@3.0.0: @@ -2924,6 +3059,10 @@ packages: resolution: {integrity: sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==} engines: {node: '>=14.16'} + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -2938,18 +3077,18 @@ packages: resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} engines: {node: '>=12'} - tinyglobby@0.2.13: - resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - traverse@0.6.8: resolution: {integrity: sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==} engines: {node: '>= 0.4'} @@ -2990,10 +3129,6 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} - type-is@2.0.1: - resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} - engines: {node: '>= 0.6'} - typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} @@ -3010,8 +3145,8 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript-eslint@8.32.0: - resolution: {integrity: sha512-UMq2kxdXCzinFFPsXc9o2ozIpYCCOiEC46MG3yEh5Vipq6BO27otTtEBZA1fQ66DulEUgE97ucQ/3YY66CPg0A==} + typescript-eslint@8.33.1: + resolution: {integrity: sha512-AgRnV4sKkWOiZ0Kjbnf5ytTJXMUZQ0qhSVdQtDNYLPLnjsATEYhaO94GlRQwi4t4gO8FfjM6NnikHeKjUm8D7A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3022,6 +3157,11 @@ packages: engines: {node: '>=14.17'} hasBin: true + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} + hasBin: true + ufo@1.6.1: resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} @@ -3034,6 +3174,9 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + unicode-emoji-modifier-base@1.0.0: resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} engines: {node: '>=4'} @@ -3050,17 +3193,17 @@ packages: resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} engines: {node: '>=12'} - universal-user-agent@7.0.2: - resolution: {integrity: sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==} + universal-user-agent@7.0.3: + resolution: {integrity: sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} - unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -3074,12 +3217,8 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - - vite-plugin-dts@4.5.3: - resolution: {integrity: sha512-P64VnD00dR+e8S26ESoFELqc17+w7pKkwlBpgXteOljFyT0zDwD8hH4zXp49M/kciy//7ZbVXIwQCekBJjfWzA==} + vite-plugin-dts@4.5.4: + resolution: {integrity: sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==} peerDependencies: typescript: '*' vite: '*' @@ -3153,13 +3292,19 @@ packages: peerDependencies: vue: ^3.2.0 - vue-pivottable@1.0.3: - resolution: {integrity: sha512-0gBrxoCHEAg0wEMaw9lAi+cVA3IUl5zv7L5y3LgY49DYQeNDjTH8iINOmxJdtoQijMbzOyios+9cYn6EDZ0Nrg==} + vue-pivottable@1.0.15: + resolution: {integrity: sha512-OSZK1/Xm11BQjLK7I1ZDi5oiaGfHyB+iqOhLCsIdcMveno5xmcilvZOv5lHQRZ+RmeNyvCEp8jfy4Pui6MeWOw==} peerDependencies: vue: ^3.2.0 - vue@3.5.13: - resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} + vue-tsc@2.2.10: + resolution: {integrity: sha512-jWZ1xSaNbabEV3whpIDMbjVSVawjAyW+x1n3JeGQo7S0uv2n9F/JMgWW90tGWNFRKya4YwKMZgCtr0vRAM7DeQ==} + hasBin: true + peerDependencies: + typescript: '>=5.0.0' + + vue@3.5.15: + resolution: {integrity: sha512-aD9zK4rB43JAMK/5BmS4LdPiEp8Fdh8P1Ve/XNuMF5YRf78fCyPE6FUbQwcaWQ5oZ1R2CD9NKE0FFOVpMR7gEQ==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -3202,9 +3347,6 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - xml-name-validator@4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} @@ -3244,14 +3386,6 @@ packages: resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} engines: {node: '>=18'} - zod-to-json-schema@3.24.5: - resolution: {integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==} - peerDependencies: - zod: ^3.24.1 - - zod@3.24.4: - resolution: {integrity: sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==} - snapshots: '@babel/code-frame@7.27.1': @@ -3268,15 +3402,159 @@ snapshots: dependencies: '@babel/types': 7.27.1 + '@babel/runtime@7.27.6': {} + '@babel/types@7.27.1': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@clalarco/vue3-plotly@0.1.5(vue@3.5.13(typescript@5.8.2))': + '@changesets/apply-release-plan@7.0.12': + dependencies: + '@changesets/config': 3.1.1 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + detect-indent: 6.1.0 + fs-extra: 7.0.1 + lodash.startcase: 4.4.0 + outdent: 0.5.0 + prettier: 2.8.8 + resolve-from: 5.0.0 + semver: 7.7.2 + + '@changesets/assemble-release-plan@6.0.8': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + semver: 7.7.2 + + '@changesets/changelog-git@0.2.1': + dependencies: + '@changesets/types': 6.1.0 + + '@changesets/cli@2.29.4': + dependencies: + '@changesets/apply-release-plan': 7.0.12 + '@changesets/assemble-release-plan': 6.0.8 + '@changesets/changelog-git': 0.2.1 + '@changesets/config': 3.1.1 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/get-release-plan': 4.0.12 + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.5 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@changesets/write': 0.4.0 + '@manypkg/get-packages': 1.1.3 + ansi-colors: 4.1.3 + ci-info: 3.9.0 + enquirer: 2.4.1 + external-editor: 3.1.0 + fs-extra: 7.0.1 + mri: 1.2.0 + p-limit: 2.3.0 + package-manager-detector: 0.2.11 + picocolors: 1.1.1 + resolve-from: 5.0.0 + semver: 7.7.2 + spawndamnit: 3.0.1 + term-size: 2.2.1 + + '@changesets/config@3.1.1': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/logger': 0.1.1 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.8 + + '@changesets/errors@0.2.0': + dependencies: + extendable-error: 0.1.7 + + '@changesets/get-dependents-graph@2.1.3': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + picocolors: 1.1.1 + semver: 7.7.2 + + '@changesets/get-release-plan@4.0.12': + dependencies: + '@changesets/assemble-release-plan': 6.0.8 + '@changesets/config': 3.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.5 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/get-version-range-type@0.4.0': {} + + '@changesets/git@3.0.4': + dependencies: + '@changesets/errors': 0.2.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.8 + spawndamnit: 3.0.1 + + '@changesets/logger@0.1.1': + dependencies: + picocolors: 1.1.1 + + '@changesets/parse@0.4.1': + dependencies: + '@changesets/types': 6.1.0 + js-yaml: 3.14.1 + + '@changesets/pre@2.0.2': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + + '@changesets/read@0.6.5': + dependencies: + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.1 + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + p-filter: 2.1.0 + picocolors: 1.1.1 + + '@changesets/should-skip-package@0.1.2': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/types@4.1.0': {} + + '@changesets/types@6.1.0': {} + + '@changesets/write@0.4.0': + dependencies: + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + human-id: 4.1.1 + prettier: 2.8.8 + + '@clalarco/vue3-plotly@0.1.5(vue@3.5.15(typescript@5.8.3))': dependencies: plotly.js-dist: 2.35.3 - vue: 3.5.13(typescript@5.8.2) + vue: 3.5.15(typescript@5.8.3) '@colors/colors@1.5.0': optional: true @@ -3284,89 +3562,89 @@ snapshots: '@conventional-changelog/git-client@1.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.1.0)': dependencies: '@types/semver': 7.7.0 - semver: 7.7.1 + semver: 7.7.2 optionalDependencies: conventional-commits-filter: 5.0.0 conventional-commits-parser: 6.1.0 - '@esbuild/aix-ppc64@0.25.4': + '@esbuild/aix-ppc64@0.25.5': optional: true - '@esbuild/android-arm64@0.25.4': + '@esbuild/android-arm64@0.25.5': optional: true - '@esbuild/android-arm@0.25.4': + '@esbuild/android-arm@0.25.5': optional: true - '@esbuild/android-x64@0.25.4': + '@esbuild/android-x64@0.25.5': optional: true - '@esbuild/darwin-arm64@0.25.4': + '@esbuild/darwin-arm64@0.25.5': optional: true - '@esbuild/darwin-x64@0.25.4': + '@esbuild/darwin-x64@0.25.5': optional: true - '@esbuild/freebsd-arm64@0.25.4': + '@esbuild/freebsd-arm64@0.25.5': optional: true - '@esbuild/freebsd-x64@0.25.4': + '@esbuild/freebsd-x64@0.25.5': optional: true - '@esbuild/linux-arm64@0.25.4': + '@esbuild/linux-arm64@0.25.5': optional: true - '@esbuild/linux-arm@0.25.4': + '@esbuild/linux-arm@0.25.5': optional: true - '@esbuild/linux-ia32@0.25.4': + '@esbuild/linux-ia32@0.25.5': optional: true - '@esbuild/linux-loong64@0.25.4': + '@esbuild/linux-loong64@0.25.5': optional: true - '@esbuild/linux-mips64el@0.25.4': + '@esbuild/linux-mips64el@0.25.5': optional: true - '@esbuild/linux-ppc64@0.25.4': + '@esbuild/linux-ppc64@0.25.5': optional: true - '@esbuild/linux-riscv64@0.25.4': + '@esbuild/linux-riscv64@0.25.5': optional: true - '@esbuild/linux-s390x@0.25.4': + '@esbuild/linux-s390x@0.25.5': optional: true - '@esbuild/linux-x64@0.25.4': + '@esbuild/linux-x64@0.25.5': optional: true - '@esbuild/netbsd-arm64@0.25.4': + '@esbuild/netbsd-arm64@0.25.5': optional: true - '@esbuild/netbsd-x64@0.25.4': + '@esbuild/netbsd-x64@0.25.5': optional: true - '@esbuild/openbsd-arm64@0.25.4': + '@esbuild/openbsd-arm64@0.25.5': optional: true - '@esbuild/openbsd-x64@0.25.4': + '@esbuild/openbsd-x64@0.25.5': optional: true - '@esbuild/sunos-x64@0.25.4': + '@esbuild/sunos-x64@0.25.5': optional: true - '@esbuild/win32-arm64@0.25.4': + '@esbuild/win32-arm64@0.25.5': optional: true - '@esbuild/win32-ia32@0.25.4': + '@esbuild/win32-ia32@0.25.5': optional: true - '@esbuild/win32-x64@0.25.4': + '@esbuild/win32-x64@0.25.5': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@9.26.0)': + '@eslint-community/eslint-utils@4.7.0(eslint@9.27.0)': dependencies: - eslint: 9.26.0 + eslint: 9.27.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -3374,21 +3652,21 @@ snapshots: '@eslint/config-array@0.20.0': dependencies: '@eslint/object-schema': 2.1.6 - debug: 4.4.0 + debug: 4.4.1 minimatch: 3.1.2 transitivePeerDependencies: - supports-color '@eslint/config-helpers@0.2.2': {} - '@eslint/core@0.13.0': + '@eslint/core@0.14.0': dependencies: '@types/json-schema': 7.0.15 '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.0 + debug: 4.4.1 espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 @@ -3399,13 +3677,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.26.0': {} + '@eslint/js@9.27.0': {} '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.2.8': + '@eslint/plugin-kit@0.3.1': dependencies: - '@eslint/core': 0.13.0 + '@eslint/core': 0.14.0 levn: 0.4.1 '@humanfs/core@0.19.1': {} @@ -3419,7 +3697,7 @@ snapshots: '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.2': {} + '@humanwhocodes/retry@0.4.3': {} '@hutson/parse-repository-url@5.0.0': {} @@ -3434,23 +3712,39 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.0': {} - '@microsoft/api-extractor-model@7.30.6': + '@manypkg/find-root@1.1.0': + dependencies: + '@babel/runtime': 7.27.6 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 + + '@manypkg/get-packages@1.1.3': + dependencies: + '@babel/runtime': 7.27.6 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 + + '@microsoft/api-extractor-model@7.30.6(@types/node@22.15.21)': dependencies: '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.13.1 + '@rushstack/node-core-library': 5.13.1(@types/node@22.15.21) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.52.7': + '@microsoft/api-extractor@7.52.8(@types/node@22.15.21)': dependencies: - '@microsoft/api-extractor-model': 7.30.6 + '@microsoft/api-extractor-model': 7.30.6(@types/node@22.15.21) '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.13.1 + '@rushstack/node-core-library': 5.13.1(@types/node@22.15.21) '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.15.3 - '@rushstack/ts-command-line': 5.0.1 + '@rushstack/terminal': 0.15.3(@types/node@22.15.21) + '@rushstack/ts-command-line': 5.0.1(@types/node@22.15.21) lodash: 4.17.21 minimatch: 3.0.8 resolve: 1.22.10 @@ -3469,21 +3763,6 @@ snapshots: '@microsoft/tsdoc@0.15.1': {} - '@modelcontextprotocol/sdk@1.11.0': - dependencies: - content-type: 1.0.5 - cors: 2.8.5 - cross-spawn: 7.0.6 - eventsource: 3.0.6 - express: 5.1.0 - express-rate-limit: 7.5.0(express@5.1.0) - pkce-challenge: 5.0.0 - raw-body: 3.0.0 - zod: 3.24.4 - zod-to-json-schema: 3.24.5(zod@3.24.4) - transitivePeerDependencies: - - supports-color - '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -3496,64 +3775,64 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@octokit/auth-token@5.1.2': {} + '@octokit/auth-token@6.0.0': {} - '@octokit/core@6.1.5': + '@octokit/core@7.0.2': dependencies: - '@octokit/auth-token': 5.1.2 - '@octokit/graphql': 8.2.2 - '@octokit/request': 9.2.3 - '@octokit/request-error': 6.1.8 - '@octokit/types': 14.0.0 - before-after-hook: 3.0.2 - universal-user-agent: 7.0.2 + '@octokit/auth-token': 6.0.0 + '@octokit/graphql': 9.0.1 + '@octokit/request': 10.0.2 + '@octokit/request-error': 7.0.0 + '@octokit/types': 14.1.0 + before-after-hook: 4.0.0 + universal-user-agent: 7.0.3 - '@octokit/endpoint@10.1.4': + '@octokit/endpoint@11.0.0': dependencies: - '@octokit/types': 14.0.0 - universal-user-agent: 7.0.2 + '@octokit/types': 14.1.0 + universal-user-agent: 7.0.3 - '@octokit/graphql@8.2.2': + '@octokit/graphql@9.0.1': dependencies: - '@octokit/request': 9.2.3 - '@octokit/types': 14.0.0 - universal-user-agent: 7.0.2 + '@octokit/request': 10.0.2 + '@octokit/types': 14.1.0 + universal-user-agent: 7.0.3 - '@octokit/openapi-types@25.0.0': {} + '@octokit/openapi-types@25.1.0': {} - '@octokit/plugin-paginate-rest@12.0.0(@octokit/core@6.1.5)': + '@octokit/plugin-paginate-rest@13.0.1(@octokit/core@7.0.2)': dependencies: - '@octokit/core': 6.1.5 - '@octokit/types': 14.0.0 + '@octokit/core': 7.0.2 + '@octokit/types': 14.1.0 - '@octokit/plugin-retry@7.2.1(@octokit/core@6.1.5)': + '@octokit/plugin-retry@8.0.1(@octokit/core@7.0.2)': dependencies: - '@octokit/core': 6.1.5 - '@octokit/request-error': 6.1.8 - '@octokit/types': 14.0.0 + '@octokit/core': 7.0.2 + '@octokit/request-error': 7.0.0 + '@octokit/types': 14.1.0 bottleneck: 2.19.5 - '@octokit/plugin-throttling@10.0.0(@octokit/core@6.1.5)': + '@octokit/plugin-throttling@11.0.1(@octokit/core@7.0.2)': dependencies: - '@octokit/core': 6.1.5 - '@octokit/types': 14.0.0 + '@octokit/core': 7.0.2 + '@octokit/types': 14.1.0 bottleneck: 2.19.5 - '@octokit/request-error@6.1.8': + '@octokit/request-error@7.0.0': dependencies: - '@octokit/types': 14.0.0 + '@octokit/types': 14.1.0 - '@octokit/request@9.2.3': + '@octokit/request@10.0.2': dependencies: - '@octokit/endpoint': 10.1.4 - '@octokit/request-error': 6.1.8 - '@octokit/types': 14.0.0 - fast-content-type-parse: 2.0.1 - universal-user-agent: 7.0.2 + '@octokit/endpoint': 11.0.0 + '@octokit/request-error': 7.0.0 + '@octokit/types': 14.1.0 + fast-content-type-parse: 3.0.0 + universal-user-agent: 7.0.3 - '@octokit/types@14.0.0': + '@octokit/types@14.1.0': dependencies: - '@octokit/openapi-types': 25.0.0 + '@octokit/openapi-types': 25.1.0 '@pnpm/config.env-replace@1.1.0': {} @@ -3567,77 +3846,77 @@ snapshots: '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 - '@rollup/pluginutils@5.1.4(rollup@4.40.2)': + '@rollup/pluginutils@5.1.4(rollup@4.41.1)': dependencies: '@types/estree': 1.0.7 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: - rollup: 4.40.2 + rollup: 4.41.1 - '@rollup/rollup-android-arm-eabi@4.40.2': + '@rollup/rollup-android-arm-eabi@4.41.1': optional: true - '@rollup/rollup-android-arm64@4.40.2': + '@rollup/rollup-android-arm64@4.41.1': optional: true - '@rollup/rollup-darwin-arm64@4.40.2': + '@rollup/rollup-darwin-arm64@4.41.1': optional: true - '@rollup/rollup-darwin-x64@4.40.2': + '@rollup/rollup-darwin-x64@4.41.1': optional: true - '@rollup/rollup-freebsd-arm64@4.40.2': + '@rollup/rollup-freebsd-arm64@4.41.1': optional: true - '@rollup/rollup-freebsd-x64@4.40.2': + '@rollup/rollup-freebsd-x64@4.41.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.40.2': + '@rollup/rollup-linux-arm-gnueabihf@4.41.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.40.2': + '@rollup/rollup-linux-arm-musleabihf@4.41.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.40.2': + '@rollup/rollup-linux-arm64-gnu@4.41.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.40.2': + '@rollup/rollup-linux-arm64-musl@4.41.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.40.2': + '@rollup/rollup-linux-loongarch64-gnu@4.41.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.40.2': + '@rollup/rollup-linux-powerpc64le-gnu@4.41.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.40.2': + '@rollup/rollup-linux-riscv64-gnu@4.41.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.40.2': + '@rollup/rollup-linux-riscv64-musl@4.41.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.40.2': + '@rollup/rollup-linux-s390x-gnu@4.41.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.40.2': + '@rollup/rollup-linux-x64-gnu@4.41.1': optional: true - '@rollup/rollup-linux-x64-musl@4.40.2': + '@rollup/rollup-linux-x64-musl@4.41.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.40.2': + '@rollup/rollup-win32-arm64-msvc@4.41.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.40.2': + '@rollup/rollup-win32-ia32-msvc@4.41.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.40.2': + '@rollup/rollup-win32-x64-msvc@4.41.1': optional: true '@rtsao/scc@1.1.0': {} - '@rushstack/node-core-library@5.13.1': + '@rushstack/node-core-library@5.13.1(@types/node@22.15.21)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -3647,20 +3926,24 @@ snapshots: jju: 1.4.0 resolve: 1.22.10 semver: 7.5.4 + optionalDependencies: + '@types/node': 22.15.21 '@rushstack/rig-package@0.5.3': dependencies: resolve: 1.22.10 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.15.3': + '@rushstack/terminal@0.15.3(@types/node@22.15.21)': dependencies: - '@rushstack/node-core-library': 5.13.1 + '@rushstack/node-core-library': 5.13.1(@types/node@22.15.21) supports-color: 8.1.1 + optionalDependencies: + '@types/node': 22.15.21 - '@rushstack/ts-command-line@5.0.1': + '@rushstack/ts-command-line@5.0.1(@types/node@22.15.21)': dependencies: - '@rushstack/terminal': 0.15.3 + '@rushstack/terminal': 0.15.3(@types/node@22.15.21) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -3669,25 +3952,25 @@ snapshots: '@sec-ant/readable-stream@0.4.1': {} - '@semantic-release/changelog@6.0.3(semantic-release@24.2.3(typescript@5.8.2))': + '@semantic-release/changelog@6.0.3(semantic-release@24.2.5(typescript@5.8.3))': dependencies: '@semantic-release/error': 3.0.0 aggregate-error: 3.1.0 fs-extra: 11.3.0 lodash: 4.17.21 - semantic-release: 24.2.3(typescript@5.8.2) + semantic-release: 24.2.5(typescript@5.8.3) - '@semantic-release/commit-analyzer@13.0.1(semantic-release@24.2.3(typescript@5.8.2))': + '@semantic-release/commit-analyzer@13.0.1(semantic-release@24.2.5(typescript@5.8.3))': dependencies: conventional-changelog-angular: 8.0.0 - conventional-changelog-writer: 8.0.1 + conventional-changelog-writer: 8.1.0 conventional-commits-filter: 5.0.0 conventional-commits-parser: 6.1.0 - debug: 4.4.0 + debug: 4.4.1 import-from-esm: 2.0.0 lodash-es: 4.17.21 micromatch: 4.0.8 - semantic-release: 24.2.3(typescript@5.8.2) + semantic-release: 24.2.5(typescript@5.8.3) transitivePeerDependencies: - supports-color @@ -3695,29 +3978,29 @@ snapshots: '@semantic-release/error@4.0.0': {} - '@semantic-release/git@10.0.1(semantic-release@24.2.3(typescript@5.8.2))': + '@semantic-release/git@10.0.1(semantic-release@24.2.5(typescript@5.8.3))': dependencies: '@semantic-release/error': 3.0.0 aggregate-error: 3.1.0 - debug: 4.4.0 + debug: 4.4.1 dir-glob: 3.0.1 execa: 5.1.1 lodash: 4.17.21 micromatch: 4.0.8 p-reduce: 2.1.0 - semantic-release: 24.2.3(typescript@5.8.2) + semantic-release: 24.2.5(typescript@5.8.3) transitivePeerDependencies: - supports-color - '@semantic-release/github@11.0.2(semantic-release@24.2.3(typescript@5.8.2))': + '@semantic-release/github@11.0.3(semantic-release@24.2.5(typescript@5.8.3))': dependencies: - '@octokit/core': 6.1.5 - '@octokit/plugin-paginate-rest': 12.0.0(@octokit/core@6.1.5) - '@octokit/plugin-retry': 7.2.1(@octokit/core@6.1.5) - '@octokit/plugin-throttling': 10.0.0(@octokit/core@6.1.5) + '@octokit/core': 7.0.2 + '@octokit/plugin-paginate-rest': 13.0.1(@octokit/core@7.0.2) + '@octokit/plugin-retry': 8.0.1(@octokit/core@7.0.2) + '@octokit/plugin-throttling': 11.0.1(@octokit/core@7.0.2) '@semantic-release/error': 4.0.0 aggregate-error: 5.0.0 - debug: 4.4.0 + debug: 4.4.1 dir-glob: 3.0.1 globby: 14.1.0 http-proxy-agent: 7.0.2 @@ -3726,16 +4009,16 @@ snapshots: lodash-es: 4.17.21 mime: 4.0.7 p-filter: 4.1.0 - semantic-release: 24.2.3(typescript@5.8.2) + semantic-release: 24.2.5(typescript@5.8.3) url-join: 5.0.0 transitivePeerDependencies: - supports-color - '@semantic-release/npm@12.0.1(semantic-release@24.2.3(typescript@5.8.2))': + '@semantic-release/npm@12.0.1(semantic-release@24.2.5(typescript@5.8.3))': dependencies: '@semantic-release/error': 4.0.0 aggregate-error: 5.0.0 - execa: 9.5.2 + execa: 9.6.0 fs-extra: 11.3.0 lodash-es: 4.17.21 nerf-dart: 1.0.0 @@ -3744,36 +4027,36 @@ snapshots: rc: 1.2.8 read-pkg: 9.0.1 registry-auth-token: 5.1.0 - semantic-release: 24.2.3(typescript@5.8.2) - semver: 7.7.1 + semantic-release: 24.2.5(typescript@5.8.3) + semver: 7.7.2 tempy: 3.1.0 - '@semantic-release/release-notes-generator@14.0.3(semantic-release@24.2.3(typescript@5.8.2))': + '@semantic-release/release-notes-generator@14.0.3(semantic-release@24.2.5(typescript@5.8.3))': dependencies: conventional-changelog-angular: 8.0.0 - conventional-changelog-writer: 8.0.1 + conventional-changelog-writer: 8.1.0 conventional-commits-filter: 5.0.0 conventional-commits-parser: 6.1.0 - debug: 4.4.0 + debug: 4.4.1 get-stream: 7.0.1 import-from-esm: 2.0.0 into-stream: 7.0.0 lodash-es: 4.17.21 read-package-up: 11.0.0 - semantic-release: 24.2.3(typescript@5.8.2) + semantic-release: 24.2.5(typescript@5.8.3) transitivePeerDependencies: - supports-color - '@seungwoo321/eslint-plugin-standard-js@1.0.1(@typescript-eslint/parser@8.32.0(eslint@9.26.0)(typescript@5.8.2))(eslint@9.26.0)(typescript@5.8.2)': + '@seungwoo321/eslint-plugin-standard-js@1.0.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0)(typescript@5.8.3))(eslint@9.27.0)(typescript@5.8.3)': dependencies: - '@stylistic/eslint-plugin': 4.2.0(eslint@9.26.0)(typescript@5.8.2) - '@typescript-eslint/utils': 8.32.0(eslint@9.26.0)(typescript@5.8.2) - eslint: 9.26.0 - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0)(typescript@5.8.2))(eslint@9.26.0) - eslint-plugin-n: 17.17.0(eslint@9.26.0) - eslint-plugin-promise: 7.2.1(eslint@9.26.0) - globals: 16.0.0 - typescript-eslint: 8.32.0(eslint@9.26.0)(typescript@5.8.2) + '@stylistic/eslint-plugin': 4.4.0(eslint@9.27.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.1(eslint@9.27.0)(typescript@5.8.3) + eslint: 9.27.0 + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.33.1(eslint@9.27.0)(typescript@5.8.3))(eslint@9.27.0) + eslint-plugin-n: 17.18.0(eslint@9.27.0) + eslint-plugin-promise: 7.2.1(eslint@9.27.0) + globals: 16.2.0 + typescript-eslint: 8.33.1(eslint@9.27.0)(typescript@5.8.3) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-typescript @@ -3791,10 +4074,10 @@ snapshots: '@sindresorhus/merge-streams@4.0.0': {} - '@stylistic/eslint-plugin@4.2.0(eslint@9.26.0)(typescript@5.8.2)': + '@stylistic/eslint-plugin@4.4.0(eslint@9.27.0)(typescript@5.8.3)': dependencies: - '@typescript-eslint/utils': 8.32.0(eslint@9.26.0)(typescript@5.8.2) - eslint: 9.26.0 + '@typescript-eslint/utils': 8.32.1(eslint@9.27.0)(typescript@5.8.3) + eslint: 9.27.0 eslint-visitor-keys: 4.2.0 espree: 10.3.0 estraverse: 5.3.0 @@ -3811,180 +4094,255 @@ snapshots: '@types/json5@0.0.29': {} + '@types/node@12.20.55': {} + + '@types/node@22.15.21': + dependencies: + undici-types: 6.21.0 + '@types/normalize-package-data@2.4.4': {} + '@types/papaparse@5.3.16': + dependencies: + '@types/node': 22.15.21 + '@types/semver@7.7.0': {} - '@typescript-eslint/eslint-plugin@8.32.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0)(typescript@5.8.2))(eslint@9.26.0)(typescript@5.8.2)': + '@typescript-eslint/eslint-plugin@8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0)(typescript@5.8.3))(eslint@9.27.0)(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.32.0(eslint@9.26.0)(typescript@5.8.2) - '@typescript-eslint/scope-manager': 8.32.0 - '@typescript-eslint/type-utils': 8.32.0(eslint@9.26.0)(typescript@5.8.2) - '@typescript-eslint/utils': 8.32.0(eslint@9.26.0)(typescript@5.8.2) - '@typescript-eslint/visitor-keys': 8.32.0 - eslint: 9.26.0 + '@typescript-eslint/parser': 8.33.1(eslint@9.27.0)(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.33.1 + '@typescript-eslint/type-utils': 8.33.1(eslint@9.27.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.33.1(eslint@9.27.0)(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.33.1 + eslint: 9.27.0 graphemer: 1.4.0 - ignore: 5.3.2 + ignore: 7.0.4 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.8.2) - typescript: 5.8.2 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.32.0(eslint@9.26.0)(typescript@5.8.2)': + '@typescript-eslint/parser@8.33.1(eslint@9.27.0)(typescript@5.8.3)': dependencies: - '@typescript-eslint/scope-manager': 8.32.0 - '@typescript-eslint/types': 8.32.0 - '@typescript-eslint/typescript-estree': 8.32.0(typescript@5.8.2) - '@typescript-eslint/visitor-keys': 8.32.0 - debug: 4.4.0 - eslint: 9.26.0 - typescript: 5.8.2 + '@typescript-eslint/scope-manager': 8.33.1 + '@typescript-eslint/types': 8.33.1 + '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.33.1 + debug: 4.4.1 + eslint: 9.27.0 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.33.1(typescript@5.8.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.33.1(typescript@5.8.3) + '@typescript-eslint/types': 8.33.1 + debug: 4.4.1 + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.32.0': + '@typescript-eslint/scope-manager@8.32.1': dependencies: - '@typescript-eslint/types': 8.32.0 - '@typescript-eslint/visitor-keys': 8.32.0 + '@typescript-eslint/types': 8.32.1 + '@typescript-eslint/visitor-keys': 8.32.1 - '@typescript-eslint/type-utils@8.32.0(eslint@9.26.0)(typescript@5.8.2)': + '@typescript-eslint/scope-manager@8.33.1': dependencies: - '@typescript-eslint/typescript-estree': 8.32.0(typescript@5.8.2) - '@typescript-eslint/utils': 8.32.0(eslint@9.26.0)(typescript@5.8.2) - debug: 4.4.0 - eslint: 9.26.0 - ts-api-utils: 2.1.0(typescript@5.8.2) - typescript: 5.8.2 + '@typescript-eslint/types': 8.33.1 + '@typescript-eslint/visitor-keys': 8.33.1 + + '@typescript-eslint/tsconfig-utils@8.33.1(typescript@5.8.3)': + dependencies: + typescript: 5.8.3 + + '@typescript-eslint/type-utils@8.33.1(eslint@9.27.0)(typescript@5.8.3)': + dependencies: + '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) + '@typescript-eslint/utils': 8.33.1(eslint@9.27.0)(typescript@5.8.3) + debug: 4.4.1 + eslint: 9.27.0 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.32.0': {} + '@typescript-eslint/types@8.32.1': {} - '@typescript-eslint/typescript-estree@8.32.0(typescript@5.8.2)': + '@typescript-eslint/types@8.33.1': {} + + '@typescript-eslint/typescript-estree@8.32.1(typescript@5.8.3)': dependencies: - '@typescript-eslint/types': 8.32.0 - '@typescript-eslint/visitor-keys': 8.32.0 - debug: 4.4.0 + '@typescript-eslint/types': 8.32.1 + '@typescript-eslint/visitor-keys': 8.32.1 + debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.1 - ts-api-utils: 2.1.0(typescript@5.8.2) - typescript: 5.8.2 + semver: 7.7.2 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.32.0(eslint@9.26.0)(typescript@5.8.2)': + '@typescript-eslint/typescript-estree@8.33.1(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0) - '@typescript-eslint/scope-manager': 8.32.0 - '@typescript-eslint/types': 8.32.0 - '@typescript-eslint/typescript-estree': 8.32.0(typescript@5.8.2) - eslint: 9.26.0 - typescript: 5.8.2 + '@typescript-eslint/project-service': 8.33.1(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.33.1(typescript@5.8.3) + '@typescript-eslint/types': 8.33.1 + '@typescript-eslint/visitor-keys': 8.33.1 + debug: 4.4.1 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.2 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.32.1(eslint@9.27.0)(typescript@5.8.3)': + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0) + '@typescript-eslint/scope-manager': 8.32.1 + '@typescript-eslint/types': 8.32.1 + '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) + eslint: 9.27.0 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.33.1(eslint@9.27.0)(typescript@5.8.3)': + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0) + '@typescript-eslint/scope-manager': 8.33.1 + '@typescript-eslint/types': 8.33.1 + '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) + eslint: 9.27.0 + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.32.0': + '@typescript-eslint/visitor-keys@8.32.1': dependencies: - '@typescript-eslint/types': 8.32.0 + '@typescript-eslint/types': 8.32.1 eslint-visitor-keys: 4.2.0 - '@vitejs/plugin-vue@5.2.3(vite@6.3.5)(vue@3.5.13(typescript@5.8.2))': + '@typescript-eslint/visitor-keys@8.33.1': dependencies: - vite: 6.3.5 - vue: 3.5.13(typescript@5.8.2) + '@typescript-eslint/types': 8.33.1 + eslint-visitor-keys: 4.2.0 + + '@vitejs/plugin-vue@5.2.4(vite@6.3.5(@types/node@22.15.21))(vue@3.5.15(typescript@5.8.3))': + dependencies: + vite: 6.3.5(@types/node@22.15.21) + vue: 3.5.15(typescript@5.8.3) - '@volar/language-core@2.4.13': + '@volar/language-core@2.4.14': dependencies: - '@volar/source-map': 2.4.13 + '@volar/source-map': 2.4.14 - '@volar/source-map@2.4.13': {} + '@volar/source-map@2.4.14': {} - '@volar/typescript@2.4.13': + '@volar/typescript@2.4.14': dependencies: - '@volar/language-core': 2.4.13 + '@volar/language-core': 2.4.14 path-browserify: 1.0.1 vscode-uri: 3.1.0 - '@vue/compiler-core@3.5.13': + '@vue/compiler-core@3.5.15': dependencies: '@babel/parser': 7.27.2 - '@vue/shared': 3.5.13 + '@vue/shared': 3.5.15 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.5.13': + '@vue/compiler-dom@3.5.15': dependencies: - '@vue/compiler-core': 3.5.13 - '@vue/shared': 3.5.13 + '@vue/compiler-core': 3.5.15 + '@vue/shared': 3.5.15 - '@vue/compiler-sfc@3.5.13': + '@vue/compiler-sfc@3.5.15': dependencies: '@babel/parser': 7.27.2 - '@vue/compiler-core': 3.5.13 - '@vue/compiler-dom': 3.5.13 - '@vue/compiler-ssr': 3.5.13 - '@vue/shared': 3.5.13 + '@vue/compiler-core': 3.5.15 + '@vue/compiler-dom': 3.5.15 + '@vue/compiler-ssr': 3.5.15 + '@vue/shared': 3.5.15 estree-walker: 2.0.2 magic-string: 0.30.17 postcss: 8.5.3 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.13': + '@vue/compiler-ssr@3.5.15': dependencies: - '@vue/compiler-dom': 3.5.13 - '@vue/shared': 3.5.13 + '@vue/compiler-dom': 3.5.15 + '@vue/shared': 3.5.15 '@vue/compiler-vue2@2.7.16': dependencies: de-indent: 1.0.2 he: 1.2.0 - '@vue/language-core@2.2.0(typescript@5.8.2)': + '@vue/language-core@2.2.0(typescript@5.8.3)': dependencies: - '@volar/language-core': 2.4.13 - '@vue/compiler-dom': 3.5.13 + '@volar/language-core': 2.4.14 + '@vue/compiler-dom': 3.5.15 '@vue/compiler-vue2': 2.7.16 - '@vue/shared': 3.5.13 + '@vue/shared': 3.5.15 alien-signals: 0.4.14 minimatch: 9.0.5 muggle-string: 0.4.1 path-browserify: 1.0.1 optionalDependencies: - typescript: 5.8.2 + typescript: 5.8.3 - '@vue/reactivity@3.5.13': + '@vue/language-core@2.2.10(typescript@5.8.3)': dependencies: - '@vue/shared': 3.5.13 + '@volar/language-core': 2.4.14 + '@vue/compiler-dom': 3.5.15 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.15 + alien-signals: 1.0.13 + minimatch: 9.0.5 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + optionalDependencies: + typescript: 5.8.3 + + '@vue/reactivity@3.5.15': + dependencies: + '@vue/shared': 3.5.15 - '@vue/runtime-core@3.5.13': + '@vue/runtime-core@3.5.15': dependencies: - '@vue/reactivity': 3.5.13 - '@vue/shared': 3.5.13 + '@vue/reactivity': 3.5.15 + '@vue/shared': 3.5.15 - '@vue/runtime-dom@3.5.13': + '@vue/runtime-dom@3.5.15': dependencies: - '@vue/reactivity': 3.5.13 - '@vue/runtime-core': 3.5.13 - '@vue/shared': 3.5.13 + '@vue/reactivity': 3.5.15 + '@vue/runtime-core': 3.5.15 + '@vue/shared': 3.5.15 csstype: 3.1.3 - '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.8.2))': + '@vue/server-renderer@3.5.15(vue@3.5.15(typescript@5.8.3))': dependencies: - '@vue/compiler-ssr': 3.5.13 - '@vue/shared': 3.5.13 - vue: 3.5.13(typescript@5.8.2) + '@vue/compiler-ssr': 3.5.15 + '@vue/shared': 3.5.15 + vue: 3.5.15(typescript@5.8.3) - '@vue/shared@3.5.13': {} + '@vue/shared@3.5.15': {} - accepts@2.0.0: - dependencies: - mime-types: 3.0.1 - negotiator: 1.0.0 + '@vue/tsconfig@0.7.0(typescript@5.8.3)(vue@3.5.15(typescript@5.8.3))': + optionalDependencies: + typescript: 5.8.3 + vue: 3.5.15(typescript@5.8.3) acorn-jsx@5.3.2(acorn@8.14.1): dependencies: @@ -4037,6 +4395,10 @@ snapshots: alien-signals@0.4.14: {} + alien-signals@1.0.13: {} + + ansi-colors@4.1.3: {} + ansi-escapes@7.0.0: dependencies: environment: 1.1.0 @@ -4081,17 +4443,19 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.23.10 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 is-string: 1.1.1 + array-union@2.1.0: {} + array.prototype.findlastindex@1.2.6: dependencies: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.23.10 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 @@ -4100,14 +4464,14 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.23.10 es-shim-unscopables: 1.1.0 array.prototype.flatmap@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.23.10 es-shim-unscopables: 1.1.0 arraybuffer.prototype.slice@1.0.4: @@ -4115,7 +4479,7 @@ snapshots: array-buffer-byte-length: 1.0.2 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.23.10 es-errors: 1.3.0 get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 @@ -4128,23 +4492,13 @@ snapshots: balanced-match@1.0.2: {} - before-after-hook@3.0.2: {} + before-after-hook@4.0.0: {} - binary-extensions@2.3.0: {} + better-path-resolve@1.0.0: + dependencies: + is-windows: 1.0.2 - body-parser@2.2.0: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 4.4.0 - http-errors: 2.0.0 - iconv-lite: 0.6.3 - on-finished: 2.4.1 - qs: 6.14.0 - raw-body: 3.0.0 - type-is: 2.0.1 - transitivePeerDependencies: - - supports-color + binary-extensions@2.3.0: {} boolbase@1.0.0: {} @@ -4163,8 +4517,6 @@ snapshots: dependencies: fill-range: 7.1.1 - bytes@3.1.2: {} - call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -4199,6 +4551,8 @@ snapshots: char-regex@1.0.2: {} + chardet@0.7.0: {} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -4211,6 +4565,8 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + ci-info@3.9.0: {} + clean-stack@2.2.0: {} clean-stack@5.2.0: @@ -4284,12 +4640,6 @@ snapshots: ini: 1.3.8 proto-list: 1.2.4 - content-disposition@1.0.0: - dependencies: - safe-buffer: 5.2.1 - - content-type@1.0.5: {} - conventional-changelog-angular@8.0.0: dependencies: compare-func: 2.0.0 @@ -4315,7 +4665,7 @@ snapshots: dependencies: '@hutson/parse-repository-url': 5.0.0 add-stream: 1.0.0 - conventional-changelog-writer: 8.0.1 + conventional-changelog-writer: 8.1.0 conventional-commits-parser: 6.1.0 git-raw-commits: 5.0.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.1.0) git-semver-tags: 8.0.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.1.0) @@ -4340,12 +4690,12 @@ snapshots: conventional-changelog-preset-loader@5.0.0: {} - conventional-changelog-writer@8.0.1: + conventional-changelog-writer@8.1.0: dependencies: conventional-commits-filter: 5.0.0 handlebars: 4.7.8 meow: 13.2.0 - semver: 7.7.1 + semver: 7.7.2 conventional-changelog@6.0.0(conventional-commits-filter@5.0.0): dependencies: @@ -4371,25 +4721,16 @@ snapshots: convert-hrtime@5.0.0: {} - cookie-signature@1.2.2: {} - - cookie@0.7.2: {} - core-util-is@1.0.3: {} - cors@2.8.5: - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 - - cosmiconfig@9.0.0(typescript@5.8.2): + cosmiconfig@9.0.0(typescript@5.8.3): dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: - typescript: 5.8.2 + typescript: 5.8.3 cross-spawn@7.0.6: dependencies: @@ -4429,7 +4770,7 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.4.0: + debug@4.4.1: dependencies: ms: 2.1.3 @@ -4449,7 +4790,7 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 - depd@2.0.0: {} + detect-indent@6.1.0: {} dir-glob@3.0.1: dependencies: @@ -4475,24 +4816,25 @@ snapshots: eastasianwidth@0.2.0: {} - ee-first@1.1.1: {} - emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} emojilib@2.4.0: {} - encodeurl@2.0.0: {} - enhanced-resolve@5.18.1: dependencies: graceful-fs: 4.2.11 - tapable: 2.2.1 + tapable: 2.2.2 + + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 entities@4.5.0: {} - env-ci@11.1.0: + env-ci@11.1.1: dependencies: execa: 8.0.1 java-properties: 1.0.2 @@ -4505,7 +4847,7 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-abstract@1.23.9: + es-abstract@1.23.10: dependencies: array-buffer-byte-length: 1.0.2 arraybuffer.prototype.slice: 1.0.4 @@ -4584,48 +4926,46 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild@0.25.4: + esbuild@0.25.5: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.4 - '@esbuild/android-arm': 0.25.4 - '@esbuild/android-arm64': 0.25.4 - '@esbuild/android-x64': 0.25.4 - '@esbuild/darwin-arm64': 0.25.4 - '@esbuild/darwin-x64': 0.25.4 - '@esbuild/freebsd-arm64': 0.25.4 - '@esbuild/freebsd-x64': 0.25.4 - '@esbuild/linux-arm': 0.25.4 - '@esbuild/linux-arm64': 0.25.4 - '@esbuild/linux-ia32': 0.25.4 - '@esbuild/linux-loong64': 0.25.4 - '@esbuild/linux-mips64el': 0.25.4 - '@esbuild/linux-ppc64': 0.25.4 - '@esbuild/linux-riscv64': 0.25.4 - '@esbuild/linux-s390x': 0.25.4 - '@esbuild/linux-x64': 0.25.4 - '@esbuild/netbsd-arm64': 0.25.4 - '@esbuild/netbsd-x64': 0.25.4 - '@esbuild/openbsd-arm64': 0.25.4 - '@esbuild/openbsd-x64': 0.25.4 - '@esbuild/sunos-x64': 0.25.4 - '@esbuild/win32-arm64': 0.25.4 - '@esbuild/win32-ia32': 0.25.4 - '@esbuild/win32-x64': 0.25.4 + '@esbuild/aix-ppc64': 0.25.5 + '@esbuild/android-arm': 0.25.5 + '@esbuild/android-arm64': 0.25.5 + '@esbuild/android-x64': 0.25.5 + '@esbuild/darwin-arm64': 0.25.5 + '@esbuild/darwin-x64': 0.25.5 + '@esbuild/freebsd-arm64': 0.25.5 + '@esbuild/freebsd-x64': 0.25.5 + '@esbuild/linux-arm': 0.25.5 + '@esbuild/linux-arm64': 0.25.5 + '@esbuild/linux-ia32': 0.25.5 + '@esbuild/linux-loong64': 0.25.5 + '@esbuild/linux-mips64el': 0.25.5 + '@esbuild/linux-ppc64': 0.25.5 + '@esbuild/linux-riscv64': 0.25.5 + '@esbuild/linux-s390x': 0.25.5 + '@esbuild/linux-x64': 0.25.5 + '@esbuild/netbsd-arm64': 0.25.5 + '@esbuild/netbsd-x64': 0.25.5 + '@esbuild/openbsd-arm64': 0.25.5 + '@esbuild/openbsd-x64': 0.25.5 + '@esbuild/sunos-x64': 0.25.5 + '@esbuild/win32-arm64': 0.25.5 + '@esbuild/win32-ia32': 0.25.5 + '@esbuild/win32-x64': 0.25.5 escalade@3.2.0: {} - escape-html@1.0.3: {} - escape-string-regexp@1.0.5: {} escape-string-regexp@4.0.0: {} escape-string-regexp@5.0.0: {} - eslint-compat-utils@0.5.1(eslint@9.26.0): + eslint-compat-utils@0.5.1(eslint@9.27.0): dependencies: - eslint: 9.26.0 - semver: 7.7.1 + eslint: 9.27.0 + semver: 7.7.2 eslint-import-resolver-node@0.3.9: dependencies: @@ -4635,24 +4975,24 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint@9.26.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.33.1(eslint@9.27.0)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.27.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.32.0(eslint@9.26.0)(typescript@5.8.2) - eslint: 9.26.0 + '@typescript-eslint/parser': 8.33.1(eslint@9.27.0)(typescript@5.8.3) + eslint: 9.27.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-es-x@7.8.0(eslint@9.26.0): + eslint-plugin-es-x@7.8.0(eslint@9.27.0): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0) '@eslint-community/regexpp': 4.12.1 - eslint: 9.26.0 - eslint-compat-utils: 0.5.1(eslint@9.26.0) + eslint: 9.27.0 + eslint-compat-utils: 0.5.1(eslint@9.27.0) - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0)(typescript@5.8.2))(eslint@9.26.0): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.33.1(eslint@9.27.0)(typescript@5.8.3))(eslint@9.27.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -4661,9 +5001,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.26.0 + eslint: 9.27.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint@9.26.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.33.1(eslint@9.27.0)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.27.0) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -4675,39 +5015,39 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.32.0(eslint@9.26.0)(typescript@5.8.2) + '@typescript-eslint/parser': 8.33.1(eslint@9.27.0)(typescript@5.8.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-n@17.17.0(eslint@9.26.0): + eslint-plugin-n@17.18.0(eslint@9.27.0): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0) enhanced-resolve: 5.18.1 - eslint: 9.26.0 - eslint-plugin-es-x: 7.8.0(eslint@9.26.0) - get-tsconfig: 4.10.0 + eslint: 9.27.0 + eslint-plugin-es-x: 7.8.0(eslint@9.27.0) + get-tsconfig: 4.10.1 globals: 15.15.0 ignore: 5.3.2 minimatch: 9.0.5 - semver: 7.7.1 + semver: 7.7.2 - eslint-plugin-promise@7.2.1(eslint@9.26.0): + eslint-plugin-promise@7.2.1(eslint@9.27.0): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0) - eslint: 9.26.0 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0) + eslint: 9.27.0 - eslint-plugin-vue@9.33.0(eslint@9.26.0): + eslint-plugin-vue@9.33.0(eslint@9.27.0): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0) - eslint: 9.26.0 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0) + eslint: 9.27.0 globals: 13.24.0 natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.1.2 - semver: 7.7.1 - vue-eslint-parser: 9.4.3(eslint@9.26.0) + semver: 7.7.2 + vue-eslint-parser: 9.4.3(eslint@9.27.0) xml-name-validator: 4.0.0 transitivePeerDependencies: - supports-color @@ -4726,26 +5066,25 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.26.0: + eslint@9.27.0: dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.20.0 '@eslint/config-helpers': 0.2.2 - '@eslint/core': 0.13.0 + '@eslint/core': 0.14.0 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.26.0 - '@eslint/plugin-kit': 0.2.8 + '@eslint/js': 9.27.0 + '@eslint/plugin-kit': 0.3.1 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.2 - '@modelcontextprotocol/sdk': 1.11.0 + '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.7 '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0 + debug: 4.4.1 escape-string-regexp: 4.0.0 eslint-scope: 8.3.0 eslint-visitor-keys: 4.2.0 @@ -4764,7 +5103,6 @@ snapshots: minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 - zod: 3.24.4 transitivePeerDependencies: - supports-color @@ -4780,6 +5118,8 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.14.1) eslint-visitor-keys: 3.4.3 + esprima@4.0.1: {} + esquery@1.6.0: dependencies: estraverse: 5.3.0 @@ -4794,14 +5134,6 @@ snapshots: esutils@2.0.3: {} - etag@1.8.1: {} - - eventsource-parser@3.0.1: {} - - eventsource@3.0.6: - dependencies: - eventsource-parser: 3.0.1 - execa@5.1.1: dependencies: cross-spawn: 7.0.6 @@ -4826,7 +5158,7 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 - execa@9.5.2: + execa@9.6.0: dependencies: '@sindresorhus/merge-streams': 4.0.0 cross-spawn: 7.0.6 @@ -4841,45 +5173,17 @@ snapshots: strip-final-newline: 4.0.0 yoctocolors: 2.1.1 - express-rate-limit@7.5.0(express@5.1.0): - dependencies: - express: 5.1.0 - - express@5.1.0: - dependencies: - accepts: 2.0.0 - body-parser: 2.2.0 - content-disposition: 1.0.0 - content-type: 1.0.5 - cookie: 0.7.2 - cookie-signature: 1.2.2 - debug: 4.4.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 2.1.0 - fresh: 2.0.0 - http-errors: 2.0.0 - merge-descriptors: 2.0.0 - mime-types: 3.0.1 - on-finished: 2.4.1 - once: 1.4.0 - parseurl: 1.3.3 - proxy-addr: 2.0.7 - qs: 6.14.0 - range-parser: 1.2.1 - router: 2.2.0 - send: 1.2.0 - serve-static: 2.2.0 - statuses: 2.0.1 - type-is: 2.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - exsolve@1.0.5: {} - fast-content-type-parse@2.0.1: {} + extendable-error@0.1.7: {} + + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + + fast-content-type-parse@3.0.0: {} fast-deep-equal@3.1.3: {} @@ -4919,23 +5223,17 @@ snapshots: dependencies: to-regex-range: 5.0.1 - finalhandler@2.1.0: - dependencies: - debug: 4.4.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - find-up-simple@1.0.1: {} find-up@2.1.0: dependencies: locate-path: 2.0.0 + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + find-up@5.0.0: dependencies: locate-path: 6.0.0 @@ -4962,10 +5260,6 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - forwarded@0.2.0: {} - - fresh@2.0.0: {} - from2@2.3.0: dependencies: inherits: 2.0.4 @@ -4977,6 +5271,18 @@ snapshots: jsonfile: 6.1.0 universalify: 2.0.1 + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + fsevents@2.3.3: optional: true @@ -5032,7 +5338,7 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 - get-tsconfig@4.10.0: + get-tsconfig@4.10.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -5072,7 +5378,7 @@ snapshots: glob@11.0.2: dependencies: foreground-child: 3.3.1 - jackspeak: 4.1.0 + jackspeak: 4.1.1 minimatch: 10.0.1 minipass: 7.1.2 package-json-from-dist: 1.0.1 @@ -5086,13 +5392,22 @@ snapshots: globals@15.15.0: {} - globals@16.0.0: {} + globals@16.2.0: {} globalthis@1.0.4: dependencies: define-properties: 1.2.1 gopd: 1.2.0 + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + globby@14.1.0: dependencies: '@sindresorhus/merge-streams': 2.3.0 @@ -5157,35 +5472,29 @@ snapshots: dependencies: lru-cache: 10.4.3 - http-errors@2.0.0: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color + human-id@4.1.1: {} + human-signals@2.1.0: {} human-signals@5.0.0: {} human-signals@8.0.1: {} - iconv-lite@0.6.3: + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -5200,7 +5509,7 @@ snapshots: import-from-esm@2.0.0: dependencies: - debug: 4.4.0 + debug: 4.4.1 import-meta-resolve: 4.1.0 transitivePeerDependencies: - supports-color @@ -5232,8 +5541,6 @@ snapshots: from2: 2.3.0 p-is-promise: 3.0.0 - ipaddr.js@1.9.1: {} - is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 @@ -5312,8 +5619,6 @@ snapshots: is-plain-obj@4.1.0: {} - is-promise@4.0.0: {} - is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -5338,6 +5643,10 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 + is-subdir@1.2.0: + dependencies: + better-path-resolve: 1.0.0 + is-symbol@1.1.1: dependencies: call-bound: 1.0.4 @@ -5361,6 +5670,8 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 + is-windows@1.0.2: {} + isarray@1.0.0: {} isarray@2.0.5: {} @@ -5375,7 +5686,7 @@ snapshots: lodash.isstring: 4.0.1 lodash.uniqby: 4.7.0 - jackspeak@4.1.0: + jackspeak@4.1.1: dependencies: '@isaacs/cliui': 8.0.2 @@ -5385,6 +5696,11 @@ snapshots: js-tokens@4.0.0: {} + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + js-yaml@4.1.0: dependencies: argparse: 2.0.1 @@ -5405,6 +5721,10 @@ snapshots: dependencies: minimist: 1.2.8 + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + jsonfile@6.1.0: dependencies: universalify: 2.0.1 @@ -5442,6 +5762,10 @@ snapshots: p-locate: 2.0.0 path-exists: 3.0.0 + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -5458,6 +5782,8 @@ snapshots: lodash.merge@4.6.2: {} + lodash.startcase@4.4.0: {} + lodash.uniqby@4.7.0: {} lodash@4.17.21: {} @@ -5474,27 +5800,23 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - marked-terminal@7.3.0(marked@12.0.2): + marked-terminal@7.3.0(marked@15.0.12): dependencies: ansi-escapes: 7.0.0 ansi-regex: 6.1.0 chalk: 5.4.1 cli-highlight: 2.1.11 cli-table3: 0.6.5 - marked: 12.0.2 + marked: 15.0.12 node-emoji: 2.2.0 supports-hyperlinks: 3.2.0 - marked@12.0.2: {} + marked@15.0.12: {} math-intrinsics@1.1.0: {} - media-typer@1.1.0: {} - meow@13.2.0: {} - merge-descriptors@2.0.0: {} - merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -5504,12 +5826,6 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - mime-db@1.54.0: {} - - mime-types@3.0.1: - dependencies: - mime-db: 1.54.0 - mime@4.0.7: {} mimic-fn@2.1.0: {} @@ -5543,6 +5859,8 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.1 + mri@1.2.0: {} + ms@2.1.3: {} muggle-string@0.4.1: {} @@ -5557,8 +5875,6 @@ snapshots: natural-compare@1.4.0: {} - negotiator@1.0.0: {} - neo-async@2.6.2: {} nerf-dart@1.0.0: {} @@ -5573,7 +5889,7 @@ snapshots: normalize-package-data@6.0.2: dependencies: hosted-git-info: 7.0.2 - semver: 7.7.1 + semver: 7.7.2 validate-npm-package-license: 3.0.4 normalize-path@3.0.0: {} @@ -5618,14 +5934,14 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.23.10 es-object-atoms: 1.1.1 object.groupby@1.0.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.23.10 object.values@1.2.1: dependencies: @@ -5634,14 +5950,6 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - onetime@5.1.2: dependencies: mimic-fn: 2.1.0 @@ -5659,6 +5967,10 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + os-tmpdir@1.0.2: {} + + outdent@0.5.0: {} + own-keys@1.0.1: dependencies: get-intrinsic: 1.3.0 @@ -5667,6 +5979,10 @@ snapshots: p-each-series@3.0.0: {} + p-filter@2.1.0: + dependencies: + p-map: 2.1.0 + p-filter@4.1.0: dependencies: p-map: 7.0.3 @@ -5677,6 +5993,10 @@ snapshots: dependencies: p-try: 1.0.0 + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -5685,10 +6005,16 @@ snapshots: dependencies: p-limit: 1.3.0 + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + p-locate@5.0.0: dependencies: p-limit: 3.1.0 + p-map@2.1.0: {} + p-map@7.0.3: {} p-reduce@2.1.0: {} @@ -5697,9 +6023,15 @@ snapshots: p-try@1.0.0: {} + p-try@2.2.0: {} + package-json-from-dist@1.0.1: {} - papaparse@5.5.2: {} + package-manager-detector@0.2.11: + dependencies: + quansync: 0.2.10 + + papaparse@5.5.3: {} parent-module@1.0.1: dependencies: @@ -5733,8 +6065,6 @@ snapshots: parse5@6.0.1: {} - parseurl@1.3.3: {} - path-browserify@1.0.1: {} path-exists@3.0.0: {} @@ -5752,8 +6082,6 @@ snapshots: lru-cache: 11.1.0 minipass: 7.1.2 - path-to-regexp@8.2.0: {} - path-type@4.0.0: {} path-type@6.0.0: {} @@ -5768,7 +6096,7 @@ snapshots: pify@3.0.0: {} - pkce-challenge@5.0.0: {} + pify@4.0.1: {} pkg-conf@2.1.0: dependencies: @@ -5806,6 +6134,8 @@ snapshots: prelude-ls@1.2.1: {} + prettier@2.8.8: {} + prettier@3.5.3: {} pretty-ms@9.2.0: @@ -5816,30 +6146,12 @@ snapshots: proto-list@1.2.4: {} - proxy-addr@2.0.7: - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - punycode@2.3.1: {} - qs@6.14.0: - dependencies: - side-channel: 1.1.0 - quansync@0.2.10: {} queue-microtask@1.2.3: {} - range-parser@1.2.1: {} - - raw-body@3.0.0: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.6.3 - unpipe: 1.0.0 - rc@1.2.8: dependencies: deep-extend: 0.6.0 @@ -5861,6 +6173,13 @@ snapshots: type-fest: 4.41.0 unicorn-magic: 0.1.0 + read-yaml-file@1.1.0: + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 @@ -5879,7 +6198,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.23.10 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -5922,42 +6241,32 @@ snapshots: glob: 11.0.2 package-json-from-dist: 1.0.1 - rollup@4.40.2: + rollup@4.41.1: dependencies: '@types/estree': 1.0.7 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.40.2 - '@rollup/rollup-android-arm64': 4.40.2 - '@rollup/rollup-darwin-arm64': 4.40.2 - '@rollup/rollup-darwin-x64': 4.40.2 - '@rollup/rollup-freebsd-arm64': 4.40.2 - '@rollup/rollup-freebsd-x64': 4.40.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.40.2 - '@rollup/rollup-linux-arm-musleabihf': 4.40.2 - '@rollup/rollup-linux-arm64-gnu': 4.40.2 - '@rollup/rollup-linux-arm64-musl': 4.40.2 - '@rollup/rollup-linux-loongarch64-gnu': 4.40.2 - '@rollup/rollup-linux-powerpc64le-gnu': 4.40.2 - '@rollup/rollup-linux-riscv64-gnu': 4.40.2 - '@rollup/rollup-linux-riscv64-musl': 4.40.2 - '@rollup/rollup-linux-s390x-gnu': 4.40.2 - '@rollup/rollup-linux-x64-gnu': 4.40.2 - '@rollup/rollup-linux-x64-musl': 4.40.2 - '@rollup/rollup-win32-arm64-msvc': 4.40.2 - '@rollup/rollup-win32-ia32-msvc': 4.40.2 - '@rollup/rollup-win32-x64-msvc': 4.40.2 + '@rollup/rollup-android-arm-eabi': 4.41.1 + '@rollup/rollup-android-arm64': 4.41.1 + '@rollup/rollup-darwin-arm64': 4.41.1 + '@rollup/rollup-darwin-x64': 4.41.1 + '@rollup/rollup-freebsd-arm64': 4.41.1 + '@rollup/rollup-freebsd-x64': 4.41.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.41.1 + '@rollup/rollup-linux-arm-musleabihf': 4.41.1 + '@rollup/rollup-linux-arm64-gnu': 4.41.1 + '@rollup/rollup-linux-arm64-musl': 4.41.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.41.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.41.1 + '@rollup/rollup-linux-riscv64-gnu': 4.41.1 + '@rollup/rollup-linux-riscv64-musl': 4.41.1 + '@rollup/rollup-linux-s390x-gnu': 4.41.1 + '@rollup/rollup-linux-x64-gnu': 4.41.1 + '@rollup/rollup-linux-x64-musl': 4.41.1 + '@rollup/rollup-win32-arm64-msvc': 4.41.1 + '@rollup/rollup-win32-ia32-msvc': 4.41.1 + '@rollup/rollup-win32-x64-msvc': 4.41.1 fsevents: 2.3.3 - router@2.2.0: - dependencies: - debug: 4.4.0 - depd: 2.0.0 - is-promise: 4.0.0 - parseurl: 1.3.3 - path-to-regexp: 8.2.0 - transitivePeerDependencies: - - supports-color - run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -5976,8 +6285,6 @@ snapshots: safe-buffer@5.1.2: {} - safe-buffer@5.2.1: {} - safe-push-apply@1.0.0: dependencies: es-errors: 1.3.0 @@ -5991,18 +6298,18 @@ snapshots: safer-buffer@2.1.2: {} - semantic-release@24.2.3(typescript@5.8.2): + semantic-release@24.2.5(typescript@5.8.3): dependencies: - '@semantic-release/commit-analyzer': 13.0.1(semantic-release@24.2.3(typescript@5.8.2)) + '@semantic-release/commit-analyzer': 13.0.1(semantic-release@24.2.5(typescript@5.8.3)) '@semantic-release/error': 4.0.0 - '@semantic-release/github': 11.0.2(semantic-release@24.2.3(typescript@5.8.2)) - '@semantic-release/npm': 12.0.1(semantic-release@24.2.3(typescript@5.8.2)) - '@semantic-release/release-notes-generator': 14.0.3(semantic-release@24.2.3(typescript@5.8.2)) + '@semantic-release/github': 11.0.3(semantic-release@24.2.5(typescript@5.8.3)) + '@semantic-release/npm': 12.0.1(semantic-release@24.2.5(typescript@5.8.3)) + '@semantic-release/release-notes-generator': 14.0.3(semantic-release@24.2.5(typescript@5.8.3)) aggregate-error: 5.0.0 - cosmiconfig: 9.0.0(typescript@5.8.2) - debug: 4.4.0 - env-ci: 11.1.0 - execa: 9.5.2 + cosmiconfig: 9.0.0(typescript@5.8.3) + debug: 4.4.1 + env-ci: 11.1.1 + execa: 9.6.0 figures: 6.1.0 find-versions: 6.0.0 get-stream: 6.0.1 @@ -6011,14 +6318,14 @@ snapshots: hosted-git-info: 8.1.0 import-from-esm: 2.0.0 lodash-es: 4.17.21 - marked: 12.0.2 - marked-terminal: 7.3.0(marked@12.0.2) + marked: 15.0.12 + marked-terminal: 7.3.0(marked@15.0.12) micromatch: 4.0.8 p-each-series: 3.0.0 p-reduce: 3.0.0 read-package-up: 11.0.0 resolve-from: 5.0.0 - semver: 7.7.1 + semver: 7.7.2 semver-diff: 4.0.0 signale: 1.4.0 yargs: 17.7.2 @@ -6028,7 +6335,7 @@ snapshots: semver-diff@4.0.0: dependencies: - semver: 7.7.1 + semver: 7.7.2 semver-regex@4.0.5: {} @@ -6038,32 +6345,7 @@ snapshots: dependencies: lru-cache: 6.0.0 - semver@7.7.1: {} - - send@1.2.0: - dependencies: - debug: 4.4.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 2.0.0 - http-errors: 2.0.0 - mime-types: 3.0.1 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - - serve-static@2.2.0: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 1.2.0 - transitivePeerDependencies: - - supports-color + semver@7.7.2: {} set-function-length@1.2.2: dependencies: @@ -6087,8 +6369,6 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.1 - setprototypeof@1.2.0: {} - shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -6139,6 +6419,8 @@ snapshots: dependencies: unicode-emoji-modifier-base: 1.0.0 + slash@3.0.0: {} + slash@5.1.0: {} sortablejs@1.15.6: {} @@ -6149,6 +6431,11 @@ snapshots: spawn-error-forwarder@1.0.0: {} + spawndamnit@3.0.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 @@ -6169,8 +6456,6 @@ snapshots: sprintf-js@1.0.3: {} - statuses@2.0.1: {} - stream-combiner2@1.1.1: dependencies: duplexer2: 0.1.4 @@ -6196,7 +6481,7 @@ snapshots: call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.23.10 es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 @@ -6261,7 +6546,7 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - tapable@2.2.1: {} + tapable@2.2.2: {} temp-dir@3.0.0: {} @@ -6276,6 +6561,8 @@ snapshots: type-fest: 2.19.0 unique-string: 3.0.0 + term-size@2.2.1: {} + thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -6293,24 +6580,26 @@ snapshots: dependencies: convert-hrtime: 5.0.0 - tinyglobby@0.2.13: + tinyglobby@0.2.14: dependencies: fdir: 6.4.4(picomatch@4.0.2) picomatch: 4.0.2 + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - toidentifier@1.0.1: {} - traverse@0.6.8: {} tree-kill@1.2.2: {} - ts-api-utils@2.1.0(typescript@5.8.2): + ts-api-utils@2.1.0(typescript@5.8.3): dependencies: - typescript: 5.8.2 + typescript: 5.8.3 tsconfig-paths@3.15.0: dependencies: @@ -6333,12 +6622,6 @@ snapshots: type-fest@4.41.0: {} - type-is@2.0.1: - dependencies: - content-type: 1.0.5 - media-typer: 1.1.0 - mime-types: 3.0.1 - typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 @@ -6372,18 +6655,20 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.32.0(eslint@9.26.0)(typescript@5.8.2): + typescript-eslint@8.33.1(eslint@9.27.0)(typescript@5.8.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.32.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0)(typescript@5.8.2))(eslint@9.26.0)(typescript@5.8.2) - '@typescript-eslint/parser': 8.32.0(eslint@9.26.0)(typescript@5.8.2) - '@typescript-eslint/utils': 8.32.0(eslint@9.26.0)(typescript@5.8.2) - eslint: 9.26.0 - typescript: 5.8.2 + '@typescript-eslint/eslint-plugin': 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0)(typescript@5.8.3))(eslint@9.27.0)(typescript@5.8.3) + '@typescript-eslint/parser': 8.33.1(eslint@9.27.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.33.1(eslint@9.27.0)(typescript@5.8.3) + eslint: 9.27.0 + typescript: 5.8.3 transitivePeerDependencies: - supports-color typescript@5.8.2: {} + typescript@5.8.3: {} + ufo@1.6.1: {} uglify-js@3.19.3: @@ -6396,6 +6681,8 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 + undici-types@6.21.0: {} + unicode-emoji-modifier-base@1.0.0: {} unicorn-magic@0.1.0: {} @@ -6406,11 +6693,11 @@ snapshots: dependencies: crypto-random-string: 4.0.0 - universal-user-agent@7.0.2: {} + universal-user-agent@7.0.3: {} - universalify@2.0.1: {} + universalify@0.1.2: {} - unpipe@1.0.0: {} + universalify@2.0.1: {} uri-js@4.4.1: dependencies: @@ -6425,90 +6712,95 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - vary@1.1.2: {} - - vite-plugin-dts@4.5.3(rollup@4.40.2)(typescript@5.8.2)(vite@6.3.5): + vite-plugin-dts@4.5.4(@types/node@22.15.21)(rollup@4.41.1)(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.21)): dependencies: - '@microsoft/api-extractor': 7.52.7 - '@rollup/pluginutils': 5.1.4(rollup@4.40.2) - '@volar/typescript': 2.4.13 - '@vue/language-core': 2.2.0(typescript@5.8.2) + '@microsoft/api-extractor': 7.52.8(@types/node@22.15.21) + '@rollup/pluginutils': 5.1.4(rollup@4.41.1) + '@volar/typescript': 2.4.14 + '@vue/language-core': 2.2.0(typescript@5.8.3) compare-versions: 6.1.1 - debug: 4.4.0 + debug: 4.4.1 kolorist: 1.8.0 local-pkg: 1.1.1 magic-string: 0.30.17 - typescript: 5.8.2 + typescript: 5.8.3 optionalDependencies: - vite: 6.3.5 + vite: 6.3.5(@types/node@22.15.21) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-static-copy@2.3.1(vite@6.3.5): + vite-plugin-static-copy@2.3.1(vite@6.3.5(@types/node@22.15.21)): dependencies: chokidar: 3.6.0 fast-glob: 3.3.3 fs-extra: 11.3.0 p-map: 7.0.3 picocolors: 1.1.1 - vite: 6.3.5 + vite: 6.3.5(@types/node@22.15.21) - vite@6.3.5: + vite@6.3.5(@types/node@22.15.21): dependencies: - esbuild: 0.25.4 + esbuild: 0.25.5 fdir: 6.4.4(picomatch@4.0.2) picomatch: 4.0.2 postcss: 8.5.3 - rollup: 4.40.2 - tinyglobby: 0.2.13 + rollup: 4.41.1 + tinyglobby: 0.2.14 optionalDependencies: + '@types/node': 22.15.21 fsevents: 2.3.3 vscode-uri@3.1.0: {} - vue-draggable-next@2.2.1(sortablejs@1.15.6)(vue@3.5.13(typescript@5.8.2)): + vue-draggable-next@2.2.1(sortablejs@1.15.6)(vue@3.5.15(typescript@5.8.3)): dependencies: sortablejs: 1.15.6 - vue: 3.5.13(typescript@5.8.2) + vue: 3.5.15(typescript@5.8.3) - vue-eslint-parser@9.4.3(eslint@9.26.0): + vue-eslint-parser@9.4.3(eslint@9.27.0): dependencies: - debug: 4.4.0 - eslint: 9.26.0 + debug: 4.4.1 + eslint: 9.27.0 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 esquery: 1.6.0 lodash: 4.17.21 - semver: 7.7.1 + semver: 7.7.2 transitivePeerDependencies: - supports-color - vue-pivottable@1.0.1(sortablejs@1.15.6)(vue@3.5.13(typescript@5.8.2)): + vue-pivottable@1.0.1(sortablejs@1.15.6)(vue@3.5.15(typescript@5.8.3)): dependencies: - vue: 3.5.13(typescript@5.8.2) - vue-draggable-next: 2.2.1(sortablejs@1.15.6)(vue@3.5.13(typescript@5.8.2)) + vue: 3.5.15(typescript@5.8.3) + vue-draggable-next: 2.2.1(sortablejs@1.15.6)(vue@3.5.15(typescript@5.8.3)) transitivePeerDependencies: - sortablejs - vue-pivottable@1.0.3(sortablejs@1.15.6)(vue@3.5.13(typescript@5.8.2)): + vue-pivottable@1.0.15(sortablejs@1.15.6)(vue@3.5.15(typescript@5.8.3)): dependencies: - vue: 3.5.13(typescript@5.8.2) - vue-draggable-next: 2.2.1(sortablejs@1.15.6)(vue@3.5.13(typescript@5.8.2)) + vue: 3.5.15(typescript@5.8.3) + vue-draggable-next: 2.2.1(sortablejs@1.15.6)(vue@3.5.15(typescript@5.8.3)) transitivePeerDependencies: - sortablejs - vue@3.5.13(typescript@5.8.2): + vue-tsc@2.2.10(typescript@5.8.3): dependencies: - '@vue/compiler-dom': 3.5.13 - '@vue/compiler-sfc': 3.5.13 - '@vue/runtime-dom': 3.5.13 - '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.8.2)) - '@vue/shared': 3.5.13 + '@volar/typescript': 2.4.14 + '@vue/language-core': 2.2.10(typescript@5.8.3) + typescript: 5.8.3 + + vue@3.5.15(typescript@5.8.3): + dependencies: + '@vue/compiler-dom': 3.5.15 + '@vue/compiler-sfc': 3.5.15 + '@vue/runtime-dom': 3.5.15 + '@vue/server-renderer': 3.5.15(vue@3.5.15(typescript@5.8.3)) + '@vue/shared': 3.5.15 optionalDependencies: - typescript: 5.8.2 + typescript: 5.8.3 which-boxed-primitive@1.1.1: dependencies: @@ -6571,8 +6863,6 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.0 - wrappy@1.0.2: {} - xml-name-validator@4.0.0: {} xtend@4.0.2: {} @@ -6608,9 +6898,3 @@ snapshots: yocto-queue@0.1.0: {} yoctocolors@2.1.1: {} - - zod-to-json-schema@3.24.5(zod@3.24.4): - dependencies: - zod: 3.24.4 - - zod@3.24.4: {} diff --git a/reference/2025-05-27-ts-vue-architecture-design.md b/reference/2025-05-27-ts-vue-architecture-design.md new file mode 100644 index 0000000..684f872 --- /dev/null +++ b/reference/2025-05-27-ts-vue-architecture-design.md @@ -0,0 +1,272 @@ +--- +title: Vue 3 + TypeScript 아키텍처 패턴 가이드 +date: "2025-05-27" +tags: ["vue", "typescript"] +categories: TypeScript +permalink: /blog/:year/:month/:day/:title/ +last_modified_at: "2025-05-27" +--- + + +Vue 3 프로젝트에서 TypeScript를 활용할 때 선택할 수 있는 다양한 아키텍처 패턴을 시각화와 함께 정리한 가이드입니다. 각 패턴은 프로젝트 규모와 팀 구성에 따라 선택적으로 적용할 수 있습니다. + + + +--- + +## 아키텍처 패턴 개요 + +| 패턴 | 장점 | 단점 | 적용 규모 | +| --------------- | ------------------- | ---------------- | --------- | +| 분리형 타입 관리 | 재사용성 우수, 유지보수 편리 | 디렉토리 복잡도 증가 | 중대형 프로젝트 | +| 인라인 타입 정의 | 빠른 개발, 컴포넌트 구조 명확 | 재사용 불가, 중복 증가 | 소형 프로젝트 | +| 전역 선언 타입 | 어디서든 타입 사용 가능 | 네이밍 충돌, 전역 오염 위험 | 공통 타입 정의 | +| 유틸/헬퍼 모듈화 | 테스트 용이, 책임 분리 | 의존성/폴더 구조 관리 필요 | 로직 집약 프로젝트 | +| 명시적 Props/Emits | IDE 지원 뛰어남, API 명확화 | 복잡한 타입은 외부 분리 필요 | 모든 규모 | + +--- + +## 1. 분리형 타입 관리 아키텍처 + +타입을 별도 디렉토리에서 관리하며, 각 컴포넌트에서 필요시 import하여 사용하는 패턴입니다. + +```mermaid +graph TD + A[project-root] --> B[src/] + B --> C[components/] + B --> D[types/] + B --> E[utils/] + C --> C1[UserCard.vue] + C --> C2[DataTable.vue] + D --> D1[user.ts] + D --> D2[common.ts] + E --> E1[validators.ts] + + C1 -->|import types| D1 + C2 -->|import types| D1 + C1 -->|import utils| E1 + + style D1 fill:#ccf,stroke:#333,stroke-width:2px + style D2 fill:#ccf,stroke:#333,stroke-width:2px + style C1 fill:#bbf,stroke:#333,stroke-width:2px + style C2 fill:#bbf,stroke:#333,stroke-width:2px +``` + +**특징** + +- 타입 재사용성이 높음 +- 유지보수와 협업에 유리 +- 구조가 커져 복잡도 증가 + +--- + +## 2. 인라인 타입 정의 아키텍처 + +모든 타입을 각 컴포넌트 파일 내에서 직접 정의하고 관리하는 패턴입니다. + +```mermaid +graph TD + A[project-root] --> B[src/] + B --> C[components/] + C --> C1[ProfileCard.vue] + C --> C2[ContactForm.vue] + C1 --> C1A[props & emits 정의] + C1 --> C1B[로컬 함수 타입 정의] + C2 --> C2A[props & emits 정의] + C2 --> C2B[로컬 함수 타입 정의] + + style C1 fill:#def,stroke:#333,stroke-width:2px + style C2 fill:#def,stroke:#333,stroke-width:2px +``` + +**특징** + +- 빠른 개발 가능 +- 파일 하나로 구조 이해 용이 +- 재사용성 낮음, 중복 증가 + +--- + +## 3. 전역 선언 타입 아키텍처 + +`.d.ts` 파일에 전역 타입을 선언하여 어디서든 사용하는 패턴입니다. 두 가지 방식으로 구현할 수 있습니다. + +```mermaid +graph TD + A[project-root] --> B[src/] + A --> C[global.d.ts] + A --> D[env.d.ts] + B --> E[components/] + E --> E1[OrderItem.vue] + E --> E2[ProductList.vue] + E1 -->|전역 타입 사용| C + E2 -->|전역 타입 사용| C + + style C fill:#fdd,stroke:#333,stroke-width:2px + style D fill:#fdd,stroke:#333,stroke-width:2px +``` + +**특징** + +- 반복되는 타입 정의 최소화 +- 어디서든 접근 가능 +- 전역 오염 위험, 충돌 가능성 + +**구현 방식 구분** + +- **진짜 전역 타입**: `declare global` 블록 사용, import 불필요 +- **Ambient 모듈**: 일반 `.d.ts` 파일, import 필요 + +**파일 확장자 구분:** + +- `.d.ts`: 타입 선언만 포함 (전역 타입, 라이브러리 타입) +- `.ts`: 타입 정의 + 실제 코드 (일반적인 타입 파일) + +--- + +## 4. 유틸/헬퍼 모듈화 아키텍처 + +비즈니스 로직을 utils 디렉토리에 모듈화하고 타입도 함수별로 분리하여 작성하는 패턴입니다. + +```mermaid +graph TD + A[project-root] --> B[src/] + B --> C[utils/] + B --> D[components/] + C --> C1[mathUtils.ts] + C --> C2[validators.ts] + C --> C3[dateUtils.ts] + D --> D1[Calculator.vue] + D --> D2[FormComponent.vue] + D1 -->|import| C1 + D2 -->|import| C2 + D2 -->|import| C3 + + style C1 fill:#bfb,stroke:#333,stroke-width:2px + style C2 fill:#bfb,stroke:#333,stroke-width:2px + style C3 fill:#bfb,stroke:#333,stroke-width:2px + style D1 fill:#cfc,stroke:#333,stroke-width:2px + style D2 fill:#cfc,stroke:#333,stroke-width:2px +``` + +**특징** + +- 코드 테스트 쉬움 +- 함수 책임 분리 용이 +- 디렉토리 및 의존성 관리 필요 + +--- + +## 5. 명시적 Props/Emits 아키텍처 + +Vue 3 ` +``` + +- 모든 props는 필수입니다. +- ? 없이 타입이 선언되면 TypeScript 및 Vue 모두 해당 prop이 반드시 상위에서 전달돼야 함을 요구합니다. +- ❌ withDefaults는 사용할 필요도, 의미도 없습니다. + +#### 1.1.2 선택적 Props 정의 – withDefaults로 기본값 제공 + +```vue + + +``` + +- prop이 생략될 수도 있고, 그 경우 default 값이 사용됩니다. +- ?로 타입이 optional로 설정되어 있어야 TypeScript가 이 구조를 허용합니다. + +### 1.2 Emits 정의 + +```vue + + +``` + +### 1.3 Reactive 상태 관리 + +```vue + + +``` + +```typescript +// usePivotUiState.js → TypeScript 변환 +import { reactive } from 'vue' + +// ✅ 복잡한 객체는 reactive + interface +export interface PivotUiState { + unusedOrder: string[] + zIndices: Record + maxZIndex: number + openStatus: Record +} + +export function usePivotUiState() { + const pivotUiState = reactive({ + unusedOrder: [], + zIndices: {}, + maxZIndex: 1000, + openStatus: {} + }) +} +``` + +```vue + + +``` + +### 1.4 템플릿 참조 (Template Refs) + +```vue + + + +``` + +--- + +## 2. 중급 패턴 (Intermediate Patterns) + +### 2.1 Composables 패턴 + +```typescript +// usePivotUiState.js → TypeScript 변환 +import { reactive } from 'vue' + +export interface PivotUiState { + unusedOrder: string[] + zIndices: Record + maxZIndex: number + openStatus: Record +} + +export function usePivotUiState() { + const pivotUiState = reactive({ + unusedOrder: [], + zIndices: {}, + maxZIndex: 1000, + openStatus: {} + }) + + const onMoveFilterBoxToTop = (attributeName: string) => { + pivotUiState.maxZIndex++ + pivotUiState.zIndices[attributeName] = pivotUiState.maxZIndex + } + + return { + state: pivotUiState, + onMoveFilterBoxToTop, + onUpdateOpenStatus, + onUpdateUnusedOrder + } +} +``` + +### 2.2 provide/inject 타입 안전하게 + +```typescript +// useProvidePivotData.js → TypeScript 변환 + +// ✅ 타입 안전한 Injection Key +export interface PivotDataContext { + pivotData: ComputedRef + rowKeys: ComputedRef + colKeys: ComputedRef + getAggregator: (rowKey: PivotKey, colKey: PivotKey) => AggregatorInstance + spanSize: (arr: PivotKey[], i: number, j: number) => number +} + +const PIVOT_DATA_KEY: InjectionKey = Symbol('pivotData') + +// Provider +export function providePivotData(props: BasePivotProps): PivotDataContext { + const pivotData = computed(() => { + try { + return new PivotData(props) + } catch (err) { + console.error(err instanceof Error ? err.stack : err) + return null + } + }) + + const context: PivotDataContext = { + pivotData, + rowKeys: computed(() => pivotData.value?.getRowKeys() || []), + colKeys: computed(() => pivotData.value?.getColKeys() || []), + getAggregator: (rowKey, colKey) => pivotData.value?.getAggregator(rowKey, colKey), + spanSize: (arr, i, j) => { + // spanSize 로직... + return calculateSpan(arr, i, j) + } + } + + provide(PIVOT_DATA_KEY, context) + return context +} + +// Consumer +export function useProvidePivotData(): PivotDataContext { + const context = inject(PIVOT_DATA_KEY) + if (!context) { + throw new Error('useProvidePivotData must be used within a provider') + } + return context +} +``` + +### 2.3 동적 컴포넌트와 타입 + +```vue + + + + +``` + +### 2.4 Slots 타입 정의 + +```typescript +// ✅ Slot Props 타입 정의 +interface PvtAttrSlotProps { + attrName: string + filtered: boolean + restricted: boolean +} + +interface OutputSlotProps { + pivotData: PivotDataInstance + error: string | null +} + +// 슬롯 타입 정의 +interface VPivottableSlots { + pvtAttr(props: PvtAttrSlotProps): any + output(props: OutputSlotProps): any + rendererCell(): any + aggregatorCell(): any +} +``` + +--- + +## 3. 고급 패턴 (Advanced Patterns) + +### 3.1 고급 제네릭 컴포저블 + +```typescript +// composables/useAsyncData.ts +import { ref, type Ref } from 'vue' + +export interface AsyncDataOptions { + immediate?: boolean + onSuccess?: (data: T) => void + onError?: (error: Error) => void + transform?: (raw: any) => T +} + +export interface AsyncDataReturn { + data: Ref + error: Ref + isLoading: Ref + execute: () => Promise + refresh: () => Promise +} + +export function useAsyncData( + fetcher: () => Promise, + options: AsyncDataOptions = {} +): AsyncDataReturn { + const { immediate = true, onSuccess, onError, transform } = options + + const data = ref(null) as Ref + const error = ref(null) + const isLoading = ref(false) + + const execute = async () => { + try { + isLoading.value = true + error.value = null + + const result = await fetcher() + const transformedData = transform ? transform(result) : result + + data.value = transformedData + onSuccess?.(transformedData) + } catch (err) { + const errorObj = err instanceof Error ? err : new Error(String(err)) + error.value = errorObj + onError?.(errorObj) + } finally { + isLoading.value = false + } + } + + const refresh = () => execute() + + if (immediate) { + execute() + } + + return { + data, + error, + isLoading, + execute, + refresh + } +} + +// 사용 예시 +interface User { + id: number + name: string + email: string +} + +interface ApiResponse { + data: T + status: string +} + +// ✅ 제네릭 타입 추론 +const { data: user, isLoading, error } = useAsyncData( + () => fetch('/api/user').then(res => res.json()), + { + transform: (raw: ApiResponse) => raw.data, + onSuccess: (user) => { + console.log('User loaded:', user.name) // 타입 안전 + } + } +) +``` + +### 3.2 조건부 타입과 유틸리티 타입 + +```typescript +// types/utils.ts + +// ✅ 조건부 Props 타입 +export type ConditionalProps< + T extends 'button' | 'link', + Base = {} +> = Base & ( + T extends 'button' + ? { onClick: () => void; disabled?: boolean } + : T extends 'link' + ? { href: string; target?: string } + : never +) + +// ✅ 깊은 부분 선택 타입 +export type DeepPartial = { + [P in keyof T]?: T[P] extends object ? DeepPartial : T[P] +} + +// ✅ 함수 오버로드 타입 +export interface QueryBuilder { + (field: T): QueryBuilder + (field: T, value: V): QueryBuilder + >(conditions: T): QueryBuilder +} + +// ✅ 이벤트 핸들러 타입 추출 +export type EventHandlers = { + [K in keyof T as K extends `on${string}` ? K : never]: T[K] +} + +// 사용 예시 +interface ComponentProps { + title: string + onClick: () => void + onSubmit: (data: any) => void + onError: (error: Error) => void + disabled: boolean +} + +type Handlers = EventHandlers +// 결과: { onClick: () => void; onSubmit: (data: any) => void; onError: (error: Error) => void } +``` + +### 3.3 고급 컴포넌트 패턴 + +```vue + + + + +``` + +--- + +## 4. 성능 최적화 패턴 + +### 4.1 계산 비용이 큰 computed 최적화 + +```vue + +``` + +### 4.2 동적 Import와 코드 분할 + +```vue + +``` + +### 4.3 메모리 누수 방지 패턴 + +```vue + +``` + +--- + +## 5. 실무 베스트 프랙티스 + +### 5.1 에러 핸들링 패턴 + +```vue + +``` + +### 5.2 타입 가드와 검증 + +```typescript +// utils/typeGuards.ts + +// ✅ 기본 타입 가드 +export const isString = (value: unknown): value is string => + typeof value === 'string' + +export const isNumber = (value: unknown): value is number => + typeof value === 'number' && !isNaN(value) + +export const isObject = (value: unknown): value is Record => + typeof value === 'object' && value !== null && !Array.isArray(value) + +// ✅ 복합 타입 가드 +export interface User { + id: number + name: string + email: string + isActive?: boolean +} + +export const isUser = (value: unknown): value is User => { + return isObject(value) && + isNumber(value.id) && + isString(value.name) && + isString(value.email) && + (value.isActive === undefined || typeof value.isActive === 'boolean') +} + +// ✅ 배열 타입 가드 +export const isUserArray = (value: unknown): value is User[] => + Array.isArray(value) && value.every(isUser) + +// ✅ API 응답 검증 +export interface ApiResponse { + data: T + status: 'success' | 'error' + message?: string +} + +export const isApiResponse = ( + value: unknown, + dataGuard: (data: unknown) => data is T +): value is ApiResponse => { + return isObject(value) && + dataGuard(value.data) && + (value.status === 'success' || value.status === 'error') && + (value.message === undefined || isString(value.message)) +} + +// 사용 예시 +const fetchUser = async (id: number): Promise => { + try { + const response = await fetch(`/api/users/${id}`) + const data = await response.json() + + if (isApiResponse(data, isUser) && data.status === 'success') { + return data.data + } + + return null + } catch { + return null + } +} +``` + +### 5.3 테스트 가능한 컴포넌트 설계 + +```vue + + + + +``` + +### 5.4 성능 모니터링 + +```typescript +// composables/usePerformanceMonitor.ts +import { ref, onMounted, onUnmounted } from 'vue' + +export interface PerformanceMetrics { + renderTime: number + componentCount: number + memoryUsage: number + updateCount: number +} + +export function usePerformanceMonitor(componentName: string) { + const metrics = ref({ + renderTime: 0, + componentCount: 0, + memoryUsage: 0, + updateCount: 0 + }) + + const startTime = performance.now() + let updateCount = 0 + + const measureRenderTime = () => { + metrics.value.renderTime = performance.now() - startTime + } + + const measureMemoryUsage = () => { + if ('memory' in performance) { + metrics.value.memoryUsage = (performance as any).memory.usedJSHeapSize + } + } + + const incrementUpdateCount = () => { + updateCount++ + metrics.value.updateCount = updateCount + } + + // 개발 모드에서만 성능 측정 + if (process.env.NODE_ENV === 'development') { + onMounted(() => { + measureRenderTime() + measureMemoryUsage() + + console.group(`Performance Metrics - ${componentName}`) + console.log('Render Time:', metrics.value.renderTime.toFixed(2), 'ms') + console.log('Memory Usage:', (metrics.value.memoryUsage / 1024 / 1024).toFixed(2), 'MB') + console.groupEnd() + }) + + const observer = new PerformanceObserver((list) => { + for (const entry of list.getEntries()) { + if (entry.name.includes(componentName)) { + console.log(`${componentName} Performance:`, entry) + } + } + }) + + observer.observe({ entryTypes: ['measure', 'navigation'] }) + + onUnmounted(() => { + observer.disconnect() + }) + } + + return { + metrics, + measureRenderTime, + measureMemoryUsage, + incrementUpdateCount + } +} +``` + +--- + +## 🚀 실무 적용 체크리스트 + +### ✅ 기본 준비사항 + +- [ ] TypeScript 5.0+ 설정 완료 +- [ ] Vue 3.3+ 사용 (최신 TypeScript 지원) +- [ ] Vite/Webpack TypeScript 설정 최적화 +- [ ] ESLint + TypeScript 규칙 설정 + +### ✅ 컴포넌트 설계 + +- [ ] Props interface 명확히 정의 +- [ ] Emits 타입 안전하게 정의 +- [ ] Slots 타입 정의 (필요시) +- [ ] 복잡한 상태는 composable로 분리 + +### ✅ 타입 시스템 + +- [ ] 전역 타입 정의 (types/ 폴더) +- [ ] API 응답 타입 정의 +- [ ] 이벤트 핸들러 타입 정의 +- [ ] 유틸리티 타입 활용 + +### ✅ 성능 최적화 + +- [ ] 큰 객체는 shallowRef 사용 +- [ ] 무거운 컴포넌트는 defineAsyncComponent +- [ ] 메모리 누수 방지 패턴 적용 +- [ ] 불필요한 re-render 방지 + +### ✅ 에러 핸들링 & 테스트 + +- [ ] 컴포넌트 레벨 에러 처리 +- [ ] 타입 가드로 런타임 검증 +- [ ] 테스트 가능한 구조 설계 +- [ ] 성능 모니터링 (개발 환경) + +--- + +이 가이드는 **실무에서 바로 사용할 수 있는** 패턴들로 구성했습니다. diff --git a/reference/2025-05-28-ts-migration-tutorial.md b/reference/2025-05-28-ts-migration-tutorial.md new file mode 100644 index 0000000..781160c --- /dev/null +++ b/reference/2025-05-28-ts-migration-tutorial.md @@ -0,0 +1,941 @@ +--- +title: VDropdown.vue TypeScript 변환 완전 가이드 +date: "2025-05-28" +tags: [vue3, typescript] +categories: TypeScript +permalink: /blog/:year/:month/:day/:title/ +last_modified_at: "2025-05-28" +--- + +## 📋 왜 VDropdown부터 시작할까요? + +- ✅ **단순한 구조**: Props 2개, Event 1개 +- ✅ **명확한 역할**: 드롭다운 선택 UI +- ✅ **타입 정의 연습하기 좋음**: 기본적인 패턴들 학습 가능 +- ✅ **의존성 적음**: 다른 복잡한 컴포저블에 의존하지 않음 + +## 🔍 현재 VDropdown.vue 분석 + +### 코드 구조 파악 + +```vue + + + +``` + +### 🤔 분석 질문들 + +#### 1. Props 타입: `options`는 정확히 어떤 타입의 배열일까요? + +
+💡 답변 보기 +
+ +**답변**: `string[]` 타입입니다. + +템플릿을 보면 `v-for="(text, key) in options"`에서 각 항목이 `text`로 사용되고, `option`의 `value`와 내용으로 직접 사용됩니다. 이는 `options` 배열의 각 요소가 문자열임을 의미합니다. + +```typescript +// 올바른 타입 정의 +interface DropdownProps { + options: string[] // 문자열 배열 + value: string +} +``` + +
+
+ +#### 2. Value 타입: `value`는 항상 문자열일까요? + +
+💡 답변 보기 +
+ +**답변**: 네, 현재 구현에서는 항상 `string` 타입입니다. + +JavaScript 코드에서 `type: String`으로 정의되어 있고, HTML `select` 요소의 `value`는 항상 문자열로 처리됩니다. 따라서 TypeScript에서도 `string` 타입으로 정의하는 것이 맞습니다. + +만약 숫자나 다른 타입도 지원하려면 제네릭을 사용해야 합니다. + +
+
+ +#### 3. 이벤트 페이로드: `update:value`에는 어떤 타입이 전달될까요? + +
+💡 답변 보기 +
+ +**답변**: `string` 타입이 전달됩니다. + +`emit('update:value', newVal)`에서 `newVal`은 `valueModel`의 값이고, 이는 `select` 요소의 선택된 값이므로 문자열입니다. + +```typescript +interface DropdownEmits { + 'update:value': [value: string] // 튜플 형태로 정의 +} +``` + +
+
+ +#### 4. 내부 상태: `valueModel`의 타입은 무엇일까요? + +
+💡 답변 보기 +
+ +**답변**: `Ref` 타입입니다. + +`ref(props.value || props.options[0])`에서 두 값 모두 문자열이므로, Vue의 타입 추론에 의해 `Ref`으로 추론됩니다. + +```typescript +// 명시적 타입 지정 +const valueModel = ref(props.value || props.options[0] || '') +``` + +
+
+ +## 🛠️ TypeScript 변환 실습 + +### 직접 해보기 (TODO 형태) + +```vue + +``` + +## 🎯 도전 과제들 + +TypeScript 변환에 필요한 핵심 패턴들을 단계별로 연습해봅시다! + +### 도전 1: Default Values 처리 + +
+🤔 생각해보기 +
+ +**문제**: 기존 JavaScript에서는 `default: () => []`로 기본값을 설정했는데, TypeScript에서는 어떻게 처리할까요? + +```javascript +// 기존 JavaScript 방식 +const props = defineProps({ + options: { + type: Array, + default: () => [] // 이 부분을 TypeScript로? + }, + value: { + type: String, + default: '' + } +}) +``` + +**힌트**: `withDefaults()` 함수를 사용해보세요. + +
+
+ +
+💡 해답 +
+ +**방법 1: withDefaults 사용** + +```typescript +interface DropdownProps { + options: string[] + value: string +} + +const props = withDefaults(defineProps(), { + options: () => [], // 배열은 함수 형태로 + value: '' // 원시값은 직접 +}) +``` + +**방법 2: 인터페이스에서 옵셔널로 정의** + +```typescript +interface DropdownProps { + options?: string[] // 옵셔널로 정의 + value?: string +} + +const props = defineProps() +// 사용시: props.options || [] +``` + +**차이점**: + +- `withDefaults`: Vue가 기본값을 자동 할당 +- 옵셔널: 코드에서 직접 fallback 처리 + +
+
+ +### 도전 2: 이벤트 타입 안전성 + +
+🤔 생각해보기 +
+ +**문제**: emit 이벤트의 타입을 어떻게 정의해야 할까요? + +현재는 `defineEmits(['update:value'])`로 되어 있는데, 이것만으로는 타입 검증이 안됩니다. + +- 잘못된 페이로드 타입을 보내도 에러가 안남 +- 존재하지 않는 이벤트명을 사용해도 에러가 안남 + +더 엄격한 타입 정의 방법이 있을까요? + +**힌트**: + +- 이벤트 이름과 페이로드 타입을 함께 정의할 수 있습니다 +- Props의 value 타입과 일치해야 합니다 + +
+
+ +
+💡 해답 +
+ +**방법 1: 객체 형태로 정의 (좋음)** + +```typescript +const emit = defineEmits<{ + 'update:value': [value: string] // 튜플로 페이로드 타입 정의 +}>() +``` + +**방법 2: 인터페이스로 분리 (베스트)** + +```typescript +interface DropdownEmits { + 'update:value': [value: string] +} + +const emit = defineEmits() +``` + +**방법 3: Props와 연결된 타입 (고급)** + +```typescript +interface DropdownProps { + options: string[] + value: string +} + +interface DropdownEmits { + 'update:value': [value: DropdownProps['value']] // Props 타입 재사용 +} +``` + +**장점들**: + +- 잘못된 타입 전달시 컴파일 에러 +- 존재하지 않는 이벤트 사용시 컴파일 에러 +- IDE에서 자동완성 및 타입 힌트 제공 + +
+
+ +### 도전 3: ref 타입 추론 + +
+🤔 생각해보기 +
+ +**문제**: `ref`의 타입을 어떻게 정의해야 할까요? + +```typescript +const props = defineProps<{ options: string[], value: string }>() + +// 방법 1: 자동 추론에 맡기기 +const valueModel = ref(props.value) + +// 방법 2: 명시적 타입 지정 +const valueModel = ref(props.value) + +// 방법 3: 초기값이 복잡한 경우 +const valueModel = ref(props.value || props.options[0]) +``` + +**고민해볼 점들**: + +- 타입 추론이 항상 정확할까요? +- 초기값이 `undefined`일 수 있다면? +- 가독성 vs 간결성 중 무엇이 더 중요할까요? + +
+
+ +
+💡 해답 +
+ +**추천: 명시적 타입 지정** + +```typescript +const valueModel = ref(props.value || props.options[0] || '') +``` + +**이유들**: + +**1. 타입 안전성** + +```typescript +// 자동 추론의 문제점 +const valueModel = ref(props.value || props.options[0]) +// 만약 둘 다 undefined라면? ref가 될 수 있음 + +// 명시적 지정으로 해결 +const valueModel = ref(props.value || props.options[0] || '') +// 항상 string 타입 보장 +``` + +**2. IDE 지원** + +```typescript +// 명시적 타입 지정시 +valueModel.value. // ← string 메서드들 자동완성 + +// 자동 추론시 불확실한 경우 +valueModel.value. // ← 타입이 애매하면 자동완성 부정확 +``` + +**3. 복잡한 초기값 처리** + +```typescript +// 안전한 초기값 설정 패턴 +const getInitialValue = (): string => { + if (props.value) return props.value + if (props.options.length > 0) return props.options[0] + return '' +} + +const valueModel = ref(getInitialValue()) +``` + +
+
+ +### 도전 4: 조건부 타입으로 옵션 검증 + +
+🤔 생각해보기 +
+ +**문제**: `options` 배열이 비어있을 때만 `value`를 옵셔널로 만들고, 옵션이 있을 때는 필수로 만들려면? + +실제 사용 시나리오: + +```typescript +// options가 비어있으면 value 불필요 + + +// options가 있으면 value 필수 + +``` + +**힌트**: 조건부 타입과 `keyof`를 활용해보세요. + +
+
+ +
+💡 해답 +
+ +```typescript +type DropdownProps = T extends readonly [] + ? { + options: T + value?: never // value 속성 자체를 금지 + } + : { + options: T + value: T[number] // 배열 요소의 유니온 타입 + } + +// 사용 예시 +const emptyProps: DropdownProps<[]> = { + options: [] + // value: 'anything' // ← 에러! value 불가 +} + +const withOptionsProps: DropdownProps<['A', 'B']> = { + options: ['A', 'B'], + value: 'A' // ← 'A' | 'B'만 허용 +} +``` + +**더 실용적인 버전**: + +```typescript +// 헬퍼 타입 +type NonEmptyArray = [T, ...T[]] + +interface EmptyDropdownProps { + options: [] + value?: never +} + +interface PopulatedDropdownProps { + options: NonEmptyArray + value: T[number] +} + +type SafeDropdownProps = + T extends [] ? EmptyDropdownProps : PopulatedDropdownProps +``` + +
+
+ +### 도전 5: 브랜드 타입으로 선택값 보장 + +
+🤔 생각해보기 +
+ +**문제**: `value`가 반드시 `options` 배열에 포함된 값이어야 한다는 것을 타입 레벨에서 보장하려면? + +현재 문제: + +```typescript +const props = { options: ['A', 'B'], value: 'C' } // 'C'는 options에 없음! +``` + +런타임 검증은 가능하지만, 컴파일 타임에 잡을 수 있다면? + +**힌트**: 브랜드 타입과 타입 가드를 조합해보세요. + +
+
+ +
+💡 해답 +
+ +**🚨 중요한 오해 해결: 브랜드 타입의 실제 동작** + +```typescript +// 1. 브랜드 타입 정의 +type ValidOption = T[number] & { + readonly __brand: unique symbol +} + +// 2. 실제 테스트해보기 +const options = ['A', 'B', 'C'] as const +const value = 'A' // 일반 문자열 + +// 브랜드 타입으로 캐스팅 +const brandedValue = value as ValidOption + +console.log(value) // 결과: "A" +console.log(brandedValue) // 결과: "A" (똑같음!) + +console.log('__brand' in brandedValue) // 결과: false (키가 없음!) +console.log(Object.keys(brandedValue)) // 결과: [] (일반 문자열과 동일) + +// 🎯 핵심: __brand 속성은 실제로 존재하지 않습니다! +``` + +**❓ 그럼 `__brand`는 뭔가요?** + +**답**: `__brand`는 **TypeScript 컴파일러만 알고 있는 가상의 표시**입니다! + +```typescript +type ValidOption = T[number] & { __brand: unique symbol } +// ^^^^^^^^^^^^^^^^^^^^^^^^ +// 이 부분은 "타입 레벨"에서만 존재 +// 런타임에는 아무것도 없음! +``` + +**📊 타입 레벨 vs 런타임 레벨 비교** + +| 구분 | 타입 레벨 (컴파일 시간) | 런타임 레벨 (실행 시간) | +|------|----------------------|----------------------| +| **일반 문자열** | `string` | `"A"` | +| **브랜드 타입** | `string & { __brand: symbol }` | `"A"` (똑같음!) | +| **TypeScript가 보는 것** | 서로 다른 타입으로 인식 | 실제 값은 동일 | + +**🔍 더 명확한 예시** + +```typescript +type UserId = string & { __brand: 'UserId' } +type ProductId = string & { __brand: 'ProductId' } + +const userId: UserId = 'user123' as UserId +const productId: ProductId = 'prod456' as ProductId + +// 런타임에서는... +console.log(userId) // "user123" (일반 문자열) +console.log(productId) // "prod456" (일반 문자열) + +// 하지만 TypeScript는 다르게 인식! +function getUser(id: UserId) { ... } + +getUser(userId) // ✅ 정상 (UserId 타입) +getUser(productId) // ❌ 에러! (ProductId ≠ UserId) +getUser('user123') // ❌ 에러! (string ≠ UserId) + +// 런타임에서는 모두 동일한 문자열인데도 불구하고! +``` + +**🎭 브랜드 타입 = "가면"의 비유** + +``` +실제 값: "A" +브랜드 타입: "A" + 가상의_라벨 + ↑ + TypeScript만 볼 수 있는 라벨 + 실제로는 존재하지 않음 +``` + +**⚙️ 그럼 어떻게 타입 안전성이 보장되나요?** + +```typescript +// TypeScript 컴파일러의 타입 체킹 +function selectOption(option: ValidOption<['A', 'B']>) { + console.log(option) // 실제로는 그냥 문자열 받음 +} + +// 컴파일 시점에 타입 체크 +selectOption('A') // ❌ 컴파일 에러 +selectOption('A' as ValidOption) // ✅ 컴파일 통과 + +// 컴파일 후 JavaScript 코드 +function selectOption(option) { // 타입 정보 모두 사라짐 + console.log(option) +} +selectOption('A') // 실제로는 이렇게 실행됨 +``` + +**📋 정리** + +1. `__brand: unique symbol` → **타입 정보일 뿐, 실제 속성 아님** +2. `value as ValidOption` → **런타임에는 값 변화 없음, 컴파일러에게만 "이건 특별한 타입이야" 라고 알려줌** +3. 브랜드 타입 = **컴파일 시간의 타입 안전성**, **런타임 성능 오버헤드 없음** + +따라서 `'A'`가 `ValidOption`로 캐스팅되어도 여전히 그냥 `'A'` 문자열입니다! 🎯 + +**실용적인 Vue 컴포넌트 버전**: + +```typescript +interface StrictDropdownProps { + options: T + value: T[number] +} + +// Props 검증 함수 +function validateDropdownProps( + props: { options: T; value: string } +): props is StrictDropdownProps { + return props.options.includes(props.value as T[number]) +} + +// 컴포넌트에서 사용 +const props = defineProps<{ options: string[]; value: string }>() + +// 검증 후 사용 +if (validateDropdownProps(props)) { + // 이 블록 안에서는 props.value가 안전하게 보장됨 + console.log('Valid selection:', props.value) +} +``` + +
+
+ +### 도전 6: 고차 컴포넌트 타입 래퍼 + +
+🤔 생각해보기 +
+ +**문제**: 애플리케이션에서 여러 도메인의 드롭다운이 필요한데, 각각 다른 옵션 타입을 가지면서도 공통 인터페이스를 유지하려면? + +예시 시나리오: + +```typescript +// 국가 선택 드롭다운 +const countryOptions = ['US', 'KR', 'JP'] as const + +// 언어 선택 드롭다운 +const languageOptions = ['en', 'ko', 'ja'] as const + +// 테마 선택 드롭다운 +const themeOptions = ['light', 'dark'] as const +``` + +각각의 타입 안전성을 보장하면서 공통 로직을 재사용하려면? + +**힌트**: 고차 타입과 팩토리 패턴을 활용해보세요. + +
+
+ +
+💡 해답 +
+ +**도메인별 타입 시스템**: + +```typescript +// 1. 기본 드롭다운 인터페이스 +interface BaseDropdown { + options: readonly T[] + value: T + onChange: (value: T) => void + placeholder?: string +} + +// 2. 도메인 스키마 정의 +type AppDomains = { + country: ['US', 'KR', 'JP'] + language: ['en', 'ko', 'ja'] + theme: ['light', 'dark'] + priority: ['low', 'medium', 'high'] +} + +// 3. 도메인별 드롭다운 타입 생성 +type DomainDropdowns = { + [K in keyof AppDomains]: BaseDropdown +} + +// 4. 타입 안전한 팩토리 함수 +function createDomainDropdown( + domain: K, + options: AppDomains[K], + initialValue: AppDomains[K][number] +): DomainDropdowns[K] { + return { + options, + value: initialValue, + onChange: (value) => { + console.log(`${domain} changed to:`, value) + // 도메인별 특별한 로직 처리 가능 + } + } +} + +// 5. 사용 예시 +const countryDropdown = createDomainDropdown( + 'country', + ['US', 'KR', 'JP'], + 'KR' // 타입 안전: 'US' | 'KR' | 'JP'만 허용 +) + +countryDropdown.onChange('JP') // ✅ 안전 +// countryDropdown.onChange('FR') // ❌ 타입 에러 + +const themeDropdown = createDomainDropdown( + 'theme', + ['light', 'dark'], + 'dark' // 'light' | 'dark'만 허용 +) +``` + +**Vue 컴포넌트와 통합**: + +```typescript +// 제네릭 Vue 컴포넌트 +interface GenericDropdownProps { + options: readonly T[] + modelValue: T + placeholder?: string +} + +interface GenericDropdownEmits { + 'update:modelValue': [value: T] +} + +// 도메인별 컴포넌트 생성 +type CountryDropdown = GenericDropdownProps +type LanguageDropdown = GenericDropdownProps + +// 실제 컴포넌트에서 사용 +const countryProps = defineProps() +const countryEmit = defineEmits>() +``` + +
+
+ +## 📚 단계별 완성 가이드 + +### Step 1: 기본 변환 + +```vue + +``` + +### Step 2: 제네릭 사용 (고급) + +```vue + +``` + +### Step 3: 타입 분리 (파일 구조화) + +**`src/types/components.ts`** + +```typescript +export type DropdownOption = T + +export interface DropdownProps { + options: DropdownOption[] + value: T +} + +export interface DropdownEmits { + 'update:value': [value: T] +} +``` + +**`VDropdown.vue`** + +```vue + +``` + +## ⚠️ 제네릭 사용 시 주의사항 + +### generic 문법 호환성 + +
+⚠️ 중요한 호환성 이슈 +
+ +**주의**: `generic="T extends string"` 문법은 Vue 3.4 이상에서만 지원됩니다. +일부 환경(IDE, 테스트, ESLint 등)에서는 오류가 발생할 수 있습니다. + +
+
+ +### 안전한 대안들 + +**방법 1: 안전한 초기값 분기 처리** + +```typescript +const props = withDefaults(defineProps(), { + options: () => [] as T[], + value: undefined as unknown as T +}) + +const getDefaultValue = (): T => { + if (props.options.length > 0) return props.options[0] + return (typeof props.value === 'string' ? '' : 0) as T +} + +const valueModel = ref(props.value ?? getDefaultValue()) +``` + +**방법 2: value를 필수 prop으로 만들기** + +```typescript +interface DropdownProps { + options: DropdownOption[] + value: T // 필수, 기본값 없음 +} + +const props = defineProps>() // withDefaults 제거 +``` + +## 🧪 테스트 방법 + +### 1. 타입 체크 테스트 + +```bash +npm run type-check +# 또는 +npx vue-tsc --noEmit +``` + +### 2. 의도적 타입 에러 만들기 (학습용) + +```typescript +// 이런 코드들을 시도해보세요 +const props = defineProps<{ + options: string[] + value: number // 의도적으로 잘못된 타입 +}>() + +// 어떤 에러가 발생하나요? +``` + +### 3. IDE 타입 힌트 확인 + +- `props.` 입력 시 자동완성이 나타나는지 +- `emit('update:value', )` 에서 타입 힌트가 나타나는지 + +## 📝 변환 완료 체크리스트 + +- [ ] ` diff --git a/src/components/pivottable-ui/VFilterBox.vue b/src/components/pivottable-ui/VFilterBox.vue index 9ed7fb8..a42d3c5 100644 --- a/src/components/pivottable-ui/VFilterBox.vue +++ b/src/components/pivottable-ui/VFilterBox.vue @@ -62,85 +62,96 @@ - diff --git a/src/components/pivottable/VPivottable.vue b/src/components/pivottable/VPivottable.vue index 7f1c6fe..8370858 100644 --- a/src/components/pivottable/VPivottable.vue +++ b/src/components/pivottable/VPivottable.vue @@ -5,13 +5,12 @@ /> - diff --git a/src/components/pivottable/VPivottableHeaderColumns.vue b/src/components/pivottable/VPivottableHeaderColumns.vue index cde5525..0e4de8b 100644 --- a/src/components/pivottable/VPivottableHeaderColumns.vue +++ b/src/components/pivottable/VPivottableHeaderColumns.vue @@ -14,27 +14,16 @@ - diff --git a/src/components/pivottable/VPivottableHeaderRows.vue b/src/components/pivottable/VPivottableHeaderRows.vue index 3a75650..d359ff7 100644 --- a/src/components/pivottable/VPivottableHeaderRows.vue +++ b/src/components/pivottable/VPivottableHeaderRows.vue @@ -9,30 +9,23 @@ - {{ colAttrsLength === 0 && rowTotal ? localeStrings.totals : null }} + {{ colAttrsLength === 0 && showRowTotal ? languagePack?.totals : null }} - diff --git a/src/components/pivottable/VPivottableHeaderRowsTotal.vue b/src/components/pivottable/VPivottableHeaderRowsTotal.vue index cf11427..309b55a 100644 --- a/src/components/pivottable/VPivottableHeaderRowsTotal.vue +++ b/src/components/pivottable/VPivottableHeaderRowsTotal.vue @@ -3,23 +3,20 @@ class="pvtTotalLabel" :rowSpan="colAttrsLength + (rowAttrsLength === 0 ? 0 : 1)" > - {{ localeStrings.totals }} + {{ languagePack?.totals }} - diff --git a/src/components/pivottable/renderer/TSVExportRenderers.vue b/src/components/pivottable/renderer/TSVExportRenderers.vue index 90f876a..c6e66a4 100644 --- a/src/components/pivottable/renderer/TSVExportRenderers.vue +++ b/src/components/pivottable/renderer/TSVExportRenderers.vue @@ -6,22 +6,13 @@ /> - diff --git a/src/components/pivottable/renderer/index.ts b/src/components/pivottable/renderer/index.ts new file mode 100644 index 0000000..3ab53e9 --- /dev/null +++ b/src/components/pivottable/renderer/index.ts @@ -0,0 +1,53 @@ +import { h, markRaw } from 'vue' +import { RendererProps } from '@/types' +import TableRenderer from './TableRenderer.vue' +import TSVExportRenderers from './TSVExportRenderers.vue' + +const tableComponents = markRaw({ + 'Table': { + name: 'VueTable', + setup (props: RendererProps) { + return () => + h(TableRenderer, props) + } + }, + 'Table Heatmap': { + name: 'VueTableHeatmap', + setup (props: RendererProps) { + return () => + h(TableRenderer, { + ...props, + heatmapMode: 'full' + }) + } + }, + 'Table Col Heatmap': { + name: 'VueTableColHeatmap', + setup (props: RendererProps) { + return () => + h(TableRenderer, { + ...props, + heatmapMode: 'col' + }) + } + }, + 'Table Row Heatmap': { + name: 'VueTableRowHeatmap', + setup (props: RendererProps) { + return () => + h(TableRenderer, { + ...props, + heatmapMode: 'row' + }) + } + }, + 'Export Table TSV': { + name: 'TsvExportRenderers', + setup (props: RendererProps) { + return () => + h(TSVExportRenderers, props) + } + } +}) + +export default tableComponents diff --git a/src/composables/index.ts b/src/composables/index.ts new file mode 100644 index 0000000..7232b5b --- /dev/null +++ b/src/composables/index.ts @@ -0,0 +1,6 @@ +export { useProvidePivotData, providePivotData } from './useProvidePivotData' +export { useProvideFilterBox, provideFilterBox } from './useProvideFilterbox' +export { useMaterializeInput } from './useMaterializeInput' +export { usePropsState } from './usePropsState' +export { usePivotUiState } from './usePivotUiState' +export { usePivotData } from './usePivotData' \ No newline at end of file diff --git a/src/composables/useMaterializeInput.ts b/src/composables/useMaterializeInput.ts new file mode 100644 index 0000000..618f4e7 --- /dev/null +++ b/src/composables/useMaterializeInput.ts @@ -0,0 +1,83 @@ +import { Ref, ref, watch } from 'vue' +import { PivotData } from '@/helper' + +export interface UseMaterializeInputOptions { + derivedAttributes: Ref) => any>> +} + +export interface UseMaterializeInputReturn { + rawData: Ref + allFilters: Ref>> + materializedInput: Ref + processData: (data: any) => { AllFilters: Record>; materializedInput: any[] } | void +} + +export function useMaterializeInput ( + dataSource: Ref, + options: UseMaterializeInputOptions +): UseMaterializeInputReturn { + const rawData = ref(null) + const allFilters = ref>>({}) + const materializedInput = ref([]) + + function processData (data: any) { + if (!data || rawData.value === data) return + + rawData.value = data + const newAllFilters: Record> = {} + const newMaterializedInput: any[] = [] + + let recordsProcessed = 0 + + PivotData.forEachRecord( + data, + options.derivedAttributes.value, + function (record: Record) { + newMaterializedInput.push(record) + + for (const attr of Object.keys(record)) { + if (!(attr in newAllFilters)) { + newAllFilters[attr] = {} + if (recordsProcessed > 0) { + newAllFilters[attr].null = recordsProcessed + } + } + } + + for (const attr in newAllFilters) { + const value = attr in record ? record[attr] : 'null' + if (!(value in newAllFilters[attr])) { + newAllFilters[attr][value] = 0 + } + newAllFilters[attr][value]++ + } + + recordsProcessed++ + } + ) + + allFilters.value = newAllFilters + materializedInput.value = newMaterializedInput + + return { + AllFilters: newAllFilters, + materializedInput: newMaterializedInput + } + } + + watch(() => dataSource.value, processData, { immediate: true }) + + watch( + () => options.derivedAttributes.value, + () => { + processData(dataSource.value) + } + ) + + return { + rawData, + allFilters, + materializedInput, + processData + } +} \ No newline at end of file diff --git a/src/composables/usePivotData.ts b/src/composables/usePivotData.ts new file mode 100644 index 0000000..114c7b9 --- /dev/null +++ b/src/composables/usePivotData.ts @@ -0,0 +1,18 @@ +import { computed, ref } from 'vue' +import { PivotData } from '@/helper' + +export interface ProvidePivotDataProps { [key: string]: any } + +export function usePivotData (props: ProvidePivotDataProps) { + const error = ref(null) + const pivotData = computed(() => { + try { + return new PivotData(props) + } catch (err) { + console.error(err.stack) + error.value = 'An error occurred computing the PivotTable results.' + return null + } + }) + return { pivotData, error } +} diff --git a/src/composables/usePivotUiState.ts b/src/composables/usePivotUiState.ts new file mode 100644 index 0000000..03d4f2e --- /dev/null +++ b/src/composables/usePivotUiState.ts @@ -0,0 +1,43 @@ +import { reactive } from 'vue' + +type PivotUiState = { + unusedOrder: string[] + zIndices: Record + maxZIndex: number + openStatus: Record +} + +export function usePivotUiState () { + const pivotUiState = reactive({ + unusedOrder: [], + zIndices: {}, + maxZIndex: 1000, + openStatus: {} + }) + + const onMoveFilterBoxToTop = (attributeName: string) => { + pivotUiState.maxZIndex++ + pivotUiState.zIndices[attributeName] = pivotUiState.maxZIndex + } + + const onUpdateOpenStatus = ({ + key, + value + }: { + key: string + value: boolean + }) => { + pivotUiState.openStatus[key] = value + } + + const onUpdateUnusedOrder = (newOrder: string[]) => { + pivotUiState.unusedOrder = newOrder + } + + return { + state: pivotUiState, + onMoveFilterBoxToTop, + onUpdateOpenStatus, + onUpdateUnusedOrder + } +} diff --git a/src/composables/usePropsState.ts b/src/composables/usePropsState.ts new file mode 100644 index 0000000..f6bb10f --- /dev/null +++ b/src/composables/usePropsState.ts @@ -0,0 +1,95 @@ +import { DefaultPropsType } from '@/types' +import { computed, reactive, ComputedRef, UnwrapRef } from 'vue' +import { locales, LocaleStrings } from '@/helper' +export type UsePropsStateProps = Pick + +export interface UsePropsStateReturn { + state: UnwrapRef + localeStrings: ComputedRef | LocaleStrings> + updateState: (key: keyof T, value: any) => void + updateMultiple: (updates: Partial & { allFilters?: any, materializedInput?: any }) => void + onUpdateValueFilter: (payload: { key: string; value: any }) => void + onUpdateRendererName: (rendererName: string) => void + onUpdateAggregatorName: (aggregatorName: string) => void + onUpdateRowOrder: (rowOrder: string) => void + onUpdateColOrder: (colOrder: string) => void + onUpdateVals: (vals: any[]) => void + onDraggedAttribute: (payload: { key: keyof T; value: any }) => void +} + +export function usePropsState ( + initialProps: T +): UsePropsStateReturn { + const state = reactive({ + ...initialProps + }) as UnwrapRef + + const localeStrings = computed( + () => initialProps?.languagePack?.[initialProps?.locale || 'en'].localeStrings ?? locales['en'].localeStrings + ) + + const updateState = (key: keyof T, value: any) => { + if (key in state) { + (state as any)[key] = value + } + } + + const updateMultiple = (updates: Partial) => { + Object.entries(updates).forEach(([key, value]) => { + if (key in state) { + (state as any)[key] = value + } + }) + } + + const onUpdateValueFilter = ({ key, value }: { key: string; value: any }) => { + updateState('valueFilter' as keyof T, { + ...(state.valueFilter || {}), + [key]: value + }) + } + + const onUpdateRendererName = (rendererName: string) => { + updateState('rendererName' as keyof T, rendererName) + if (rendererName === 'Table Heatmap') { + updateState('heatmapMode' as keyof T, 'full') + } else if (rendererName === 'Table Row Heatmap') { + updateState('heatmapMode' as keyof T, 'row') + } else if (rendererName === 'Table Col Heatmap') { + updateState('heatmapMode' as keyof T, 'col') + } else { + updateState('heatmapMode' as keyof T, '') + } + } + + const onUpdateAggregatorName = (aggregatorName: string) => { + updateState('aggregatorName' as keyof T, aggregatorName) + } + const onUpdateRowOrder = (rowOrder: string) => { + updateState('rowOrder' as keyof T, rowOrder) + } + const onUpdateColOrder = (colOrder: string) => { + updateState('colOrder' as keyof T, colOrder) + } + const onUpdateVals = (vals: any[]) => { + updateState('vals' as keyof T, vals) + } + const onDraggedAttribute = ({ key, value }: { key: keyof T; value: any }) => { + updateState(key, value) + } + + return { + state, + localeStrings, + updateState, + updateMultiple, + onUpdateValueFilter, + onUpdateRendererName, + onUpdateAggregatorName, + onUpdateRowOrder, + onUpdateColOrder, + onUpdateVals, + onDraggedAttribute + } +} \ No newline at end of file diff --git a/src/composables/useProvideFilterbox.ts b/src/composables/useProvideFilterbox.ts new file mode 100644 index 0000000..812e1be --- /dev/null +++ b/src/composables/useProvideFilterbox.ts @@ -0,0 +1,36 @@ +import { computed, ComputedRef, inject, provide, InjectionKey } from 'vue' +import { getSort } from '@/helper' +import { DefaultPropsType } from '@/types' +import { Locale } from '@/helper' + +type ProvideFilterBoxProps = Pick & { + menuLimit: number + languagePack: Record + locale: string +} + +interface FilterBoxContext { + localeStrings: ComputedRef + sorter: (x: string) => any + menuLimit: ComputedRef +} + +const filterBoxKey = Symbol('filterBox') as InjectionKey + +export function provideFilterBox(props: ProvideFilterBoxProps) { + const localeStrings = computed( + () => props.languagePack[props.locale].localeStrings + ) + const sorters = computed(() => props.sorters) + const sorter = (x: string) => getSort(sorters.value, x) + const menuLimit = computed(() => props.menuLimit) + provide(filterBoxKey, { + localeStrings, + sorter, + menuLimit + }) +} + +export function useProvideFilterBox() { + return inject(filterBoxKey) +} diff --git a/src/composables/useProvidePivotData.ts b/src/composables/useProvidePivotData.ts new file mode 100644 index 0000000..80e30da --- /dev/null +++ b/src/composables/useProvidePivotData.ts @@ -0,0 +1,147 @@ +import { Ref, provide, inject, computed, ComputedRef, InjectionKey } from 'vue' +import { PivotData } from '@/helper' +import { usePivotData } from './' +import type { ProvidePivotDataProps } from './usePivotData' + + + +export interface PivotDataContext { + pivotData: ComputedRef + rowKeys: ComputedRef + colKeys: ComputedRef + colAttrs: ComputedRef + rowAttrs: ComputedRef + getAggregator: (rowKey: any[], colKey: any[]) => any + grandTotalAggregator: ComputedRef + spanSize: (arr: any[][], i: number, j: number) => number + valueCellColors: (rowKey: any[], colKey: any[], value: any) => any + rowTotalColors: (value: any) => any + colTotalColors: (value: any) => any + error: Ref +} + +const PIVOT_DATA_KEY = Symbol('pivotData') as InjectionKey + + +export function providePivotData (props: ProvidePivotDataProps): PivotDataContext { + const { pivotData, error } = usePivotData(props) + const rowKeys = computed(() => pivotData.value?.getRowKeys() || []) + const colKeys = computed(() => pivotData.value?.getColKeys() || []) + const colAttrs = computed(() => pivotData.value?.props.cols || []) + const rowAttrs = computed(() => pivotData.value?.props.rows || []) + const colorScaleGenerator = props.tableColorScaleGenerator + const getAggregator = (rowKey: any[], colKey: any[]) => + pivotData.value?.getAggregator(rowKey, colKey) || { + value: () => null, + format: () => '' + } + + const grandTotalAggregator = computed(() => { + return pivotData.value + ? getAggregator([], []) + : { + value: () => null, + format: () => '' + } + }) + + const allColorScales = computed(() => { + const values = rowKeys.value.reduce((acc: any[], r: any[]) => acc.concat(colKeys.value.map((c: any[]) => getAggregator(r, c).value())), []) + return colorScaleGenerator(values) + }) + const rowColorScales = computed(() => + rowKeys.value.reduce((scales: Record, r: any[]) => { + const key = JSON.stringify(r) + scales[key] = colorScaleGenerator( + colKeys.value.map((x: any[]) => getAggregator(r, x).value()) + ) + return scales + }, {} as Record) + ) + const colColorScales = computed(() => + colKeys.value.reduce((scales: Record, c: any[]) => { + const key = JSON.stringify(c) + scales[key] = colorScaleGenerator( + rowKeys.value.map((x: any[]) => getAggregator(x, c).value()) + ) + return scales + }, {} as Record) + ) + + const valueCellColors = (rowKey: any[], colKey: any[], value: any) => { + if (props.heatmapMode === 'full') { + return allColorScales.value(value) + } else if (props.heatmapMode === 'row') { + return rowColorScales.value[JSON.stringify(rowKey)]?.(value) + } else if (props.heatmapMode === 'col') { + return colColorScales.value[JSON.stringify(colKey)]?.(value) + } + return {} + } + const rowTotalValues = computed(() => colKeys.value.map((x: any[]) => getAggregator([], x).value())) + const rowTotalColors = (value: any) => { + if (!props.heatmapMode) return {} + return colorScaleGenerator(rowTotalValues.value)(value) + } + const colTotalValues = computed(() => rowKeys.value.map((x: any[]) => getAggregator(x, []).value())) + const colTotalColors = (value: any) => { + if (!props.heatmapMode) return {} + return colorScaleGenerator(colTotalValues.value)(value) + } + + const spanSize = (arr: any[][], i: number, j: number): number => { + let x + if (i !== 0) { + let noDraw = true + for (x = 0; x <= j; x++) { + if (arr[i - 1][x] !== arr[i][x]) { + noDraw = false + } + } + if (noDraw) { + return -1 + } + } + + let len = 0 + while (i + len < arr.length) { + let stop = false + for (x = 0; x <= j; x++) { + if (arr[i][x] !== arr[i + len][x]) { + stop = true + } + } + if (stop) { + break + } + len++ + } + return len + } + + const pivotDataContext: PivotDataContext = { + pivotData, + rowKeys, + colKeys, + colAttrs, + rowAttrs, + getAggregator, + grandTotalAggregator, + spanSize, + valueCellColors, + rowTotalColors, + colTotalColors, + error + } + + provide(PIVOT_DATA_KEY, pivotDataContext) + return pivotDataContext +} + +export function useProvidePivotData (): PivotDataContext { + const context = inject(PIVOT_DATA_KEY) + if (!context) { + throw new Error('useProvidePivotData must be used within a provider') + } + return context +} \ No newline at end of file diff --git a/src/helper/defaultProps.ts b/src/helper/defaultProps.ts new file mode 100644 index 0000000..e0be8fe --- /dev/null +++ b/src/helper/defaultProps.ts @@ -0,0 +1,96 @@ +import { aggregators, locales, redColorScaleGenerator } from './' +import type { AggregatorTemplate } from './' +import type { PropType } from 'vue' + +export default { + data: { + type: [Array, Object, Function] as PropType, + required: true + }, + aggregators: { + type: Object as PropType>, + default: () => aggregators + }, + aggregatorName: { + type: String, + default: 'Count' + }, + heatmapMode: String as PropType<'full' | 'col' | 'row' | ''>, + tableColorScaleGenerator: { + type: Function, + default: (value: number[]) => redColorScaleGenerator(value), + }, + tableOptions: { + type: Object as PropType>, + default: () => ({}) + }, + renderers: { + type: Object as PropType>, + default: () => ({}) + }, + rendererName: { + type: String, + default: 'Table' + }, + locale: { + type: String, + default: 'en' + }, + languagePack: { + type: Object as PropType>, + default: () => locales + }, + showRowTotal: { + type: Boolean as PropType, + default: true + }, + showColTotal: { + type: Boolean as PropType, + default: true + }, + cols: { + type: Array as PropType, + default: () => [] + }, + rows: { + type: Array as PropType, + default: () => [] + }, + vals: { + type: Array as PropType, + default: () => [] + }, + attributes: { + type: Array as PropType, + default: () => [] + }, + valueFilter: { + type: Object as PropType>, + default: () => ({}) + }, + sorters: { + type: [Function, Object] as PropType, + default: () => ({}) + }, + derivedAttributes: { + type: [Function, Object] as PropType, + default: () => ({}) + }, + rowOrder: { + type: String as PropType<'key_a_to_z' | 'value_a_to_z' | 'value_z_to_a'>, + default: 'key_a_to_z', + validator: (value: string) => + ['key_a_to_z', 'value_a_to_z', 'value_z_to_a'].indexOf(value) !== -1 + }, + colOrder: { + type: String as PropType<'key_a_to_z' | 'value_a_to_z' | 'value_z_to_a'>, + default: 'key_a_to_z', + validator: (value: string) => + ['key_a_to_z', 'value_a_to_z', 'value_z_to_a'].indexOf(value) !== -1 + }, + tableMaxWidth: { + type: Number, + default: 0, + validator: (value: number) => value >= 0 + } +} \ No newline at end of file diff --git a/src/helper/index.ts b/src/helper/index.ts new file mode 100644 index 0000000..2521a50 --- /dev/null +++ b/src/helper/index.ts @@ -0,0 +1,3 @@ +export * from './utilities' +export { default as defaultProps } from './defaultProps' +export { redColorScaleGenerator } from './redColorScaleGenerator' diff --git a/src/helper/redColorScaleGenerator.ts b/src/helper/redColorScaleGenerator.ts new file mode 100644 index 0000000..9889547 --- /dev/null +++ b/src/helper/redColorScaleGenerator.ts @@ -0,0 +1,8 @@ +export function redColorScaleGenerator(values: number[]) { + const min = Math.min(...values) + const max = Math.max(...values) + return (x: number) => { + const nonRed = 255 - Math.round((255 * (x - min)) / (max - min)) + return { backgroundColor: `rgb(255,${nonRed},${nonRed})` } + } +} diff --git a/src/helper/utilities.ts b/src/helper/utilities.ts new file mode 100644 index 0000000..f0ebb9a --- /dev/null +++ b/src/helper/utilities.ts @@ -0,0 +1,1001 @@ +// TypeScript 변환된 Utilities 모듈 +// 원본: utilities.js → TypeScript: utilities.ts + +// ==================== 브랜드 타입 정의 ==================== +type AttributeName = string & { readonly __brand: unique symbol } +type FlatKey = string & { readonly __brand: unique symbol } +type NumericValue = number & { readonly __brand: unique symbol } + +// ==================== 기본 타입 정의 ==================== +interface NumberFormatOptions { + digitsAfterDecimal?: number + scaler?: number + thousandsSep?: string + decimalSep?: string + prefix?: string + suffix?: string +} + +type Formatter = (value: number) => string +type SortFunction = (a: any, b: any) => number +type RecordValue = string | number +type DataRecord = Record + +// ==================== Aggregator 관련 타입 ==================== +interface AggregatorInstance { + count?: number + sum?: number + vals?: number[] + uniq?: any[] + val?: any + sorter?: SortFunction + n?: number + m?: number + s?: number + sumNum?: number + sumDenom?: number + selector?: [any[], any[]] + inner?: AggregatorInstance + push: (record: DataRecord) => void + value: () => any + format?: Formatter | ((x: any) => string) + numInputs?: number +} +interface PivotDataContext { + getAggregator: (rowKey: any[], colKey: any[]) => AggregatorInstance +} +type AggregatorFunction = (data?: PivotDataContext, rowKey?: any[], colKey?: any[]) => AggregatorInstance +type AggregatorTemplate = (...args: any[]) => AggregatorFunction + +interface AggregatorTemplates { + count: (formatter?: Formatter) => AggregatorTemplate + uniques: (fn: (uniq: any[]) => any, formatter?: Formatter) => AggregatorTemplate + sum: (formatter?: Formatter) => AggregatorTemplate + extremes: (mode: 'min' | 'max' | 'first' | 'last', formatter?: Formatter) => AggregatorTemplate + quantile: (q: number, formatter?: Formatter) => AggregatorTemplate + runningStat: (mode: 'mean' | 'var' | 'stdev', ddof?: number, formatter?: Formatter) => AggregatorTemplate + sumOverSum: (formatter?: Formatter) => AggregatorTemplate + fractionOf: (wrapped: AggregatorTemplate, type?: 'total' | 'row' | 'col', formatter?: Formatter) => AggregatorTemplate + countUnique: (formatter?: Formatter) => AggregatorTemplate + listUnique: (separator: string) => AggregatorTemplate + max: (formatter?: Formatter) => AggregatorTemplate + min: (formatter?: Formatter) => AggregatorTemplate + first: (formatter?: Formatter) => AggregatorTemplate + last: (formatter?: Formatter) => AggregatorTemplate + median: (formatter?: Formatter) => AggregatorTemplate + average: (formatter?: Formatter) => AggregatorTemplate + var: (ddof: number, formatter?: Formatter) => AggregatorTemplate + stdev: (ddof: number, formatter?: Formatter) => AggregatorTemplate +} + +// ==================== PivotData 관련 타입 ==================== +interface PivotDataProps { + data: DataRecord[] | DataRecord[][] | ((callback: (record: DataRecord) => void) => void) + aggregators?: Record + cols?: string[] + rows?: string[] + vals?: string[] + aggregatorName?: string + sorters?: Record | ((attr: string) => SortFunction) + valueFilter?: Record> + rowOrder?: 'key_a_to_z' | 'key_z_to_a' | 'value_a_to_z' | 'value_z_to_a' + colOrder?: 'key_a_to_z' | 'key_z_to_a' | 'value_a_to_z' | 'value_z_to_a' + derivedAttributes?: Record RecordValue> +} + +// ==================== Locale 관련 타입 ==================== +interface LocaleStrings { + renderError: string + computeError: string + uiRenderError: string + selectAll: string + selectNone: string + tooMany: string + filterResults: string + totals: string + vs: string + by: string + cancel: string + only: string + apply?: string +} + +interface Locale { + aggregators?: Record + frAggregators?: Record + localeStrings: LocaleStrings +} + +// ==================== Derivers 타입 ==================== +interface Derivers { + bin: (col: string, binWidth: number) => (record: DataRecord) => number + dateFormat: ( + col: string, + formatString: string, + utcOutput?: boolean, + mthNames?: string[], + dayNames?: string[] + ) => (record: DataRecord) => string +} + +// ==================== 유틸리티 함수들 ==================== + +const addSeparators = (nStr: string | number, thousandsSep: string, decimalSep: string): string => { + const x = String(nStr).split('.') + let x1 = x[0] + const x2 = x.length > 1 ? decimalSep + x[1] : '' + const rgx = /(\d+)(\d{3})/ + while (rgx.test(x1)) { + x1 = x1.replace(rgx, `$1${thousandsSep}$2`) + } + return x1 + x2 +} + +const numberFormat = (optsIn?: NumberFormatOptions): Formatter => { + const defaults: Required = { + digitsAfterDecimal: 2, + scaler: 1, + thousandsSep: ',', + decimalSep: '.', + prefix: '', + suffix: '' + } + const opts = Object.assign({}, defaults, optsIn) + + return (x: number): string => { + if (isNaN(x) || !isFinite(x)) { + return '' + } + const result = addSeparators( + (opts.scaler * x).toFixed(opts.digitsAfterDecimal), + opts.thousandsSep, + opts.decimalSep + ) + return `${opts.prefix}${result}${opts.suffix}` + } +} + +// 정규식 패턴들 +const rx = /(\d+)|(\D+)/g +const rd = /\d/ +const rz = /^0/ + +const naturalSort: SortFunction = (as: any, bs: any): number => { + // nulls first + if (bs !== null && as === null) { + return -1 + } + if (as !== null && bs === null) { + return 1 + } + + // then raw NaNs + if (typeof as === 'number' && isNaN(as)) { + return -1 + } + if (typeof bs === 'number' && isNaN(bs)) { + return 1 + } + + // numbers and numbery strings group together + const nas = Number(as) + const nbs = Number(bs) + if (nas < nbs) { + return -1 + } + if (nas > nbs) { + return 1 + } + + // within that, true numbers before numbery strings + if (typeof as === 'number' && typeof bs !== 'number') { + return -1 + } + if (typeof bs === 'number' && typeof as !== 'number') { + return 1 + } + if (typeof as === 'number' && typeof bs === 'number') { + return 0 + } + + // 'Infinity' is a textual number, so less than 'A' + if (isNaN(nbs) && !isNaN(nas)) { + return -1 + } + if (isNaN(nas) && !isNaN(nbs)) { + return 1 + } + + // finally, "smart" string sorting + const a = String(as) + const b = String(bs) + if (a === b) { + return 0 + } + if (!rd.test(a) || !rd.test(b)) { + return a > b ? 1 : -1 + } + + // special treatment for strings containing digits + const aMatches = a.match(rx) + const bMatches = b.match(rx) + + if (!aMatches || !bMatches) { + return a > b ? 1 : -1 + } + + while (aMatches.length && bMatches.length) { + const a1 = aMatches.shift()! + const b1 = bMatches.shift()! + if (a1 !== b1) { + if (rd.test(a1) && rd.test(b1)) { + const numDiff = parseFloat(a1.replace(rz, '.0')) - parseFloat(b1.replace(rz, '.0')) + return numDiff !== 0 ? numDiff : a1.length - b1.length + } + return a1 > b1 ? 1 : -1 + } + } + return aMatches.length - bMatches.length +} + +const sortAs = (order: any[]): SortFunction => { + const mapping: Record = {} + const lMapping: Record = {} + + for (const i in order) { + const x = order[i] + mapping[x] = parseInt(i) + if (typeof x === 'string') { + lMapping[x.toLowerCase()] = parseInt(i) + } + } + + return (a: any, b: any): number => { + if (a in mapping && b in mapping) { + return mapping[a] - mapping[b] + } else if (a in mapping) { + return -1 + } else if (b in mapping) { + return 1 + } else if (a in lMapping && b in lMapping) { + return lMapping[a] - lMapping[b] + } else if (a in lMapping) { + return -1 + } else if (b in lMapping) { + return 1 + } + return naturalSort(a, b) + } +} + +const getSort = (sorters: Record | ((attr: string) => SortFunction) | null, attr: string): SortFunction => { + if (sorters) { + if (typeof sorters === 'function') { + const sort = sorters(attr) + if (typeof sort === 'function') { + return sort + } + } else if (attr in sorters) { + return sorters[attr] + } + } + return naturalSort +} + +// 기본 포매터들 +const usFmt = numberFormat() +const usFmtInt = numberFormat({ digitsAfterDecimal: 0 }) +const usFmtPct = numberFormat({ + digitsAfterDecimal: 1, + scaler: 100, + suffix: '%' +}) + +// ==================== Aggregator Templates ==================== + +const aggregatorTemplates: AggregatorTemplates = { + count (formatter: Formatter = usFmtInt): AggregatorTemplate { + return () => () => ({ + count: 0, + push () { + this.count++ + }, + value () { + return this.count + }, + format: formatter + }) + }, + + uniques (fn: (uniq: any[]) => any, formatter: Formatter = usFmtInt): AggregatorTemplate { + return ([attr]: [string]) => () => ({ + uniq: [] as any[], + push (record: DataRecord) { + const value = record?.[attr] + if (!this.uniq.includes(value)) { + this.uniq.push(value) + } + }, + value () { + return fn(this.uniq) + }, + format: formatter, + numInputs: typeof attr !== 'undefined' ? 0 : 1 + }) + }, + + sum (formatter: Formatter = usFmt): AggregatorTemplate { + return ([attr]: [string]) => () => ({ + sum: 0, + push (record: DataRecord) { + const raw = record?.[attr] + const val = raw != null ? parseFloat(String(raw)) : NaN + if (!isNaN(val)) { + this.sum += val + } + }, + value () { + return this.sum + }, + format: formatter, + numInputs: typeof attr !== 'undefined' ? 0 : 1 + }) + }, + + extremes (mode: 'min' | 'max' | 'first' | 'last', formatter: Formatter = usFmt): AggregatorTemplate { + return ([attr]: [string]) => (data?: PivotDataContext) => ({ + val: null as any, + sorter: getSort( + typeof data !== 'undefined' ? (data as any).sorters : null, + attr + ), + push (record: DataRecord) { + const raw = record?.[attr] + const x = raw + if (['min', 'max'].includes(mode)) { + const numX = x != null ? parseFloat(String(x)) : NaN + if (!isNaN(numX)) { + this.val = Math[mode as 'min' | 'max'](numX, this.val !== null ? this.val : numX) + } + } + if ( + mode === 'first' && + this.sorter(x, this.val !== null ? this.val : x) <= 0 + ) { + this.val = x + } + if ( + mode === 'last' && + this.sorter(x, this.val !== null ? this.val : x) >= 0 + ) { + this.val = x + } + }, + value () { + return this.val + }, + format (x: any) { + if (isNaN(x)) { + return x + } + return formatter(x) + }, + numInputs: typeof attr !== 'undefined' ? 0 : 1 + }) + }, + + quantile (q: number, formatter: Formatter = usFmt): AggregatorTemplate { + return ([attr]: [string]) => () => ({ + vals: [] as number[], + push (record: DataRecord) { + const raw = record?.[attr] + const x = raw != null ? parseFloat(String(raw)) : NaN + if (!isNaN(x)) { + this.vals.push(x) + } + }, + value (): number | null { + if (this.vals.length === 0) { + return null + } + this.vals.sort((a: number, b: number) => a - b) + const i = (this.vals.length - 1) * q + return (this.vals[Math.floor(i)] + this.vals[Math.ceil(i)]) / 2.0 + }, + format: formatter, + numInputs: typeof attr !== 'undefined' ? 0 : 1 + }) + }, + + runningStat (mode: 'mean' | 'var' | 'stdev' = 'mean', ddof: number = 1, formatter: Formatter = usFmt): AggregatorTemplate { + return ([attr]: [string]) => () => ({ + n: 0.0, + m: 0.0, + s: 0.0, + push (record: DataRecord) { + const raw = record?.[attr] + const x = raw != null ? parseFloat(String(raw)) : NaN + if (isNaN(x)) { + return + } + this.n += 1.0 + if (this.n === 1.0) { + this.m = x + } + const mNew = this.m + (x - this.m) / this.n + this.s = this.s + (x - this.m) * (x - mNew) + this.m = mNew + }, + value () { + if (mode === 'mean') { + if (this.n === 0) { + return NaN + } + return this.m + } + if (this.n <= ddof) { + return 0 + } + switch (mode) { + case 'var': + return this.s / (this.n - ddof) + case 'stdev': + return Math.sqrt(this.s / (this.n - ddof)) + default: + throw new Error('unknown mode for runningStat') + } + }, + format: formatter, + numInputs: typeof attr !== 'undefined' ? 0 : 1 + }) + }, + + sumOverSum (formatter: Formatter = usFmt): AggregatorTemplate { + return ([num, denom]: [string, string]) => () => ({ + sumNum: 0, + sumDenom: 0, + push (record: DataRecord) { + const rawNum = record?.[num] + const rawDenom = record?.[denom] + const numVal = rawNum != null ? parseFloat(String(rawNum)) : NaN + const denomVal = rawDenom != null ? parseFloat(String(rawDenom)) : NaN + if (!isNaN(numVal)) { + this.sumNum += numVal + } + if (!isNaN(denomVal)) { + this.sumDenom += denomVal + } + }, + value () { + return this.sumNum / this.sumDenom + }, + format: formatter, + numInputs: + typeof num !== 'undefined' && typeof denom !== 'undefined' ? 0 : 2 + }) + }, + + fractionOf (wrapped: AggregatorTemplate, type: 'total' | 'row' | 'col' = 'total', formatter: Formatter = usFmtPct): AggregatorTemplate { + return (...x: any[]) => + (data: PivotDataContext, rowKey: any[], colKey: any[]): AggregatorInstance => ({ + selector: { total: [[], []], row: [rowKey, []], col: [[], colKey] }[type] as [any[], any[]], + inner: wrapped(...Array.from(x || []))(data, rowKey, colKey), + push (record: DataRecord) { + this.inner.push(record) + }, + format: formatter, + value () { + return ( + this.inner.value() / + (data as any) + .getAggregator(...Array.from(this.selector || [])) + .inner.value() + ) + }, + numInputs: wrapped(...Array.from(x || []))().numInputs + }) + }, + + // 편의 함수들 + countUnique (f?: Formatter): AggregatorTemplate { + return this.uniques((x: any[]) => x.length, f) + }, + + listUnique (s: string): AggregatorTemplate { + return this.uniques( + (x: any[]) => x.join(s), + (x: any) => x + ) + }, + + max (f?: Formatter): AggregatorTemplate { + return this.extremes('max', f) + }, + + min (f?: Formatter): AggregatorTemplate { + return this.extremes('min', f) + }, + + first (f?: Formatter): AggregatorTemplate { + return this.extremes('first', f) + }, + + last (f?: Formatter): AggregatorTemplate { + return this.extremes('last', f) + }, + + median (f?: Formatter): AggregatorTemplate { + return this.quantile(0.5, f) + }, + + average (f?: Formatter): AggregatorTemplate { + return this.runningStat('mean', 1, f) + }, + + var (ddof: number, f?: Formatter): AggregatorTemplate { + return this.runningStat('var', ddof, f) + }, + + stdev (ddof: number, f?: Formatter): AggregatorTemplate { + return this.runningStat('stdev', ddof, f) + } +} + +// ==================== 기본 Aggregators ==================== + +const aggregators: Record = { + 'Count': aggregatorTemplates.count(usFmtInt), + 'Count Unique Values': aggregatorTemplates.countUnique(usFmtInt), + 'List Unique Values': aggregatorTemplates.listUnique(', '), + 'Sum': aggregatorTemplates.sum(usFmt), + 'Integer Sum': aggregatorTemplates.sum(usFmtInt), + 'Average': aggregatorTemplates.average(usFmt), + 'Median': aggregatorTemplates.median(usFmt), + 'Sample Variance': aggregatorTemplates.var(1, usFmt), + 'Sample Standard Deviation': aggregatorTemplates.stdev(1, usFmt), + 'Minimum': aggregatorTemplates.min(usFmt), + 'Maximum': aggregatorTemplates.max(usFmt), + 'First': aggregatorTemplates.first(usFmt), + 'Last': aggregatorTemplates.last(usFmt), + 'Sum over Sum': aggregatorTemplates.sumOverSum(usFmt), + 'Sum as Fraction of Total': aggregatorTemplates.fractionOf(aggregatorTemplates.sum(), 'total', usFmtPct), + 'Sum as Fraction of Rows': aggregatorTemplates.fractionOf(aggregatorTemplates.sum(), 'row', usFmtPct), + 'Sum as Fraction of Columns': aggregatorTemplates.fractionOf(aggregatorTemplates.sum(), 'col', usFmtPct), + 'Count as Fraction of Total': aggregatorTemplates.fractionOf(aggregatorTemplates.count(), 'total', usFmtPct), + 'Count as Fraction of Rows': aggregatorTemplates.fractionOf(aggregatorTemplates.count(), 'row', usFmtPct), + 'Count as Fraction of Columns': aggregatorTemplates.fractionOf(aggregatorTemplates.count(), 'col', usFmtPct) +} + +// ==================== 프랑스어 Aggregators ==================== + +const frAggregators: Record = { + 'Compte': aggregatorTemplates.count(usFmtInt), + 'Compter les valeurs uniques': aggregatorTemplates.countUnique(usFmtInt), + 'Liste des valeurs uniques': aggregatorTemplates.listUnique(', '), + 'Somme': aggregatorTemplates.sum(usFmt), + 'Somme de nombres entiers': aggregatorTemplates.sum(usFmtInt), + 'Moyenne': aggregatorTemplates.average(usFmt), + 'Médiane': aggregatorTemplates.median(usFmt), + "Variance de l'échantillon": aggregatorTemplates.var(1, usFmt), + "Écart-type de l'échantillon": aggregatorTemplates.stdev(1, usFmt), + 'Minimum': aggregatorTemplates.min(usFmt), + 'Maximum': aggregatorTemplates.max(usFmt), + 'Premier': aggregatorTemplates.first(usFmt), + 'Dernier': aggregatorTemplates.last(usFmt), + 'Somme Total': aggregatorTemplates.sumOverSum(usFmt) +} + +// ==================== Locales ==================== + +const locales: Record = { + en: { + aggregators, + localeStrings: { + renderError: 'An error occurred rendering the PivotTable results.', + computeError: 'An error occurred computing the PivotTable results.', + uiRenderError: 'An error occurred rendering the PivotTable UI.', + selectAll: 'Select All', + selectNone: 'Select None', + tooMany: '(too many to list)', + filterResults: 'Filter values', + totals: 'Totals', + vs: 'vs', + by: 'by', + cancel: 'Cancel', + only: 'only' + } + }, + fr: { + frAggregators, + localeStrings: { + renderError: 'Une erreur est survenue en dessinant le tableau croisé.', + computeError: 'Une erreur est survenue en calculant le tableau croisé.', + uiRenderError: + "Une erreur est survenue en dessinant l'interface du tableau croisé dynamique.", + selectAll: 'Sélectionner tout', + selectNone: 'Ne rien sélectionner', + tooMany: '(trop de valeurs à afficher)', + filterResults: 'Filtrer les valeurs', + totals: 'Totaux', + vs: 'sur', + by: 'par', + apply: 'Appliquer', + cancel: 'Annuler', + only: 'seul' + } + } +} + +// ==================== Date 관련 상수들 ==================== + +const mthNamesEn: readonly string[] = [ + 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', + 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' +] as const + +const dayNamesEn: readonly string[] = [ + 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' +] as const + +const zeroPad = (number: number): string => `0${number}`.substr(-2, 2) + +// ==================== Derivers ==================== + +const derivers: Derivers = { + bin (col: string, binWidth: number) { + return (record: DataRecord): number => { + const value = Number(record[col]) + return value - (value % binWidth) + } + }, + + dateFormat ( + col: string, + formatString: string, + utcOutput: boolean = false, + mthNames: string[] = [...mthNamesEn], + dayNames: string[] = [...dayNamesEn] + ) { + const utc = utcOutput ? 'UTC' : '' + + return (record: DataRecord): string => { + const date = new Date(Date.parse(String(record[col]))) + if (isNaN(date.getTime())) { + return '' + } + + return formatString.replace(/%(.)/g, (_: string, p: string): string => { + switch (p) { + case 'y': + return String((date as any)[`get${utc}FullYear`]()) + case 'm': + return zeroPad((date as any)[`get${utc}Month`]() + 1) + case 'n': + return mthNames[(date as any)[`get${utc}Month`]()] + case 'd': + return zeroPad((date as any)[`get${utc}Date`]()) + case 'w': + return dayNames[(date as any)[`get${utc}Day`]()] + case 'x': + return String((date as any)[`get${utc}Day`]()) + case 'H': + return zeroPad((date as any)[`get${utc}Hours`]()) + case 'M': + return zeroPad((date as any)[`get${utc}Minutes`]()) + case 'S': + return zeroPad((date as any)[`get${utc}Seconds`]()) + default: + return `%${p}` + } + }) + } + } +} + +// ==================== PivotData 클래스 ==================== + +class PivotData { + public static defaultProps: Required = { + aggregators, + cols: [], + rows: [], + vals: [], + aggregatorName: 'Count', + sorters: {}, + valueFilter: {}, + rowOrder: 'key_a_to_z', + colOrder: 'key_a_to_z', + derivedAttributes: {}, + data: [] + } + + public props: Required + public aggregator: AggregatorFunction + public tree: Record> + public rowKeys: any[][] + public colKeys: any[][] + public rowTotals: Record + public colTotals: Record + public allTotal: AggregatorInstance + public sorted: boolean + public filteredData: DataRecord[] + + constructor(inputProps: Partial = {}) { + this.props = Object.assign({}, PivotData.defaultProps, inputProps) + this.aggregator = this.props.aggregators[this.props.aggregatorName]!(this.props.vals) + this.tree = {} + this.rowKeys = [] + this.colKeys = [] + this.rowTotals = {} + this.colTotals = {} + this.allTotal = this.aggregator(this, [], []) + this.sorted = false + this.filteredData = [] + + // 입력 데이터 순회하면서 셀 데이터 누적 + PivotData.forEachRecord( + this.props.data, + this.props.derivedAttributes, + (record: DataRecord) => { + if (this.filter(record)) { + this.filteredData.push(record) + this.processRecord(record) + } + } + ) + } + + filter (record: DataRecord): boolean { + const allSelector = '*' + for (const k in this.props.valueFilter) { + if (k !== allSelector) { + const valueFilterItem = this.props.valueFilter[k] + if (valueFilterItem) { + if (record[k] in valueFilterItem) { + const existingKey = valueFilterItem[String(record[k])] + if (existingKey === true) { + return false + } + } else if (valueFilterItem[allSelector] === true) { + return false + } + } + } + } + return true + } + + forEachMatchingRecord (criteria: Record, callback: (record: DataRecord) => void): void { + PivotData.forEachRecord( + this.props.data, + this.props.derivedAttributes, + (record: DataRecord) => { + if (!this.filter(record)) { + return + } + for (const k in criteria) { + const v = criteria[k] + if (v !== (k in record ? record[k] : 'null')) { + return + } + } + callback(record) + } + ) + } + + arrSort (attrs: string[]): SortFunction { + const sortersArr: SortFunction[] = attrs.map(a => getSort(this.props.sorters, a)) + + return (a: any[], b: any[]): number => { + for (const i of Object.keys(sortersArr)) { + const sorter = sortersArr[parseInt(i)] + const comparison = sorter(a[parseInt(i)], b[parseInt(i)]) + if (comparison !== 0) { + return comparison + } + } + return 0 + } + } + + sortKeys (): void { + if (!this.sorted) { + this.sorted = true + const v = (r: any[], c: any[]) => this.getAggregator(r, c).value() + + switch (this.props.rowOrder) { + case 'value_a_to_z': + this.rowKeys.sort((a, b) => naturalSort(v(a, []), v(b, []))) + break + case 'value_z_to_a': + this.rowKeys.sort((a, b) => -naturalSort(v(a, []), v(b, []))) + break + default: + this.rowKeys.sort(this.arrSort(this.props.rows)) + } + + switch (this.props.colOrder) { + case 'value_a_to_z': + this.colKeys.sort((a, b) => naturalSort(v([], a), v([], b))) + break + case 'value_z_to_a': + this.colKeys.sort((a, b) => -naturalSort(v([], a), v([], b))) + break + default: + this.colKeys.sort(this.arrSort(this.props.cols)) + } + } + } + + getFilteredData (): DataRecord[] { + return this.filteredData + } + + getColKeys (): any[][] { + this.sortKeys() + return this.colKeys + } + + getRowKeys (): any[][] { + this.sortKeys() + return this.rowKeys + } + + processRecord (record: DataRecord): void { + // 이 코드는 타이트한 루프에서 호출됨 + const colKey: any[] = [] + const rowKey: any[] = [] + + for (const x of this.props.cols) { + colKey.push(x in record ? record[x] : 'null') + } + for (const x of this.props.rows) { + rowKey.push(x in record ? record[x] : 'null') + } + + const flatRowKey = rowKey.join(String.fromCharCode(0)) as FlatKey + const flatColKey = colKey.join(String.fromCharCode(0)) as FlatKey + + this.allTotal.push(record) + + if (rowKey.length !== 0) { + if (!this.rowTotals[flatRowKey]) { + this.rowKeys.push(rowKey) + this.rowTotals[flatRowKey] = this.aggregator(this, rowKey, []) + } + this.rowTotals[flatRowKey].push(record) + } + + if (colKey.length !== 0) { + if (!this.colTotals[flatColKey]) { + this.colKeys.push(colKey) + this.colTotals[flatColKey] = this.aggregator(this, [], colKey) + } + this.colTotals[flatColKey].push(record) + } + + if (colKey.length !== 0 && rowKey.length !== 0) { + if (!this.tree[flatRowKey]) { + this.tree[flatRowKey] = {} + } + if (!this.tree[flatRowKey][flatColKey]) { + this.tree[flatRowKey][flatColKey] = this.aggregator( + this, + rowKey, + colKey + ) + } + this.tree[flatRowKey][flatColKey].push(record) + } + } + + getAggregator (rowKey: any[], colKey: any[]): AggregatorInstance { + const flatRowKey = rowKey.join(String.fromCharCode(0)) as FlatKey + const flatColKey = colKey.join(String.fromCharCode(0)) as FlatKey + + let agg: AggregatorInstance | undefined + + if (rowKey.length === 0 && colKey.length === 0) { + agg = this.allTotal + } else if (rowKey.length === 0) { + agg = this.colTotals[flatColKey] + } else if (colKey.length === 0) { + agg = this.rowTotals[flatRowKey] + } else { + agg = this.tree[flatRowKey]?.[flatColKey] + } + + return agg || { + value: () => null, + format: () => '', + push: () => { } + } + } + + // Static method for processing records + static forEachRecord ( + input: DataRecord[] | DataRecord[][] | ((callback: (record: DataRecord) => void) => void), + derivedAttributes: Record RecordValue>, + f: (record: DataRecord) => void + ): void { + let addRecord: (record: DataRecord) => void + + if (derivedAttributes && Object.getOwnPropertyNames(derivedAttributes).length === 0) { + addRecord = f + } else { + addRecord = (record: DataRecord) => { + for (const k in derivedAttributes) { + const derived = derivedAttributes[k](record) + if (derived !== null) { + record[k] = derived + } + } + return f(record) + } + } + + // 함수인 경우, 콜백으로 호출 + if (typeof input === 'function') { + return input(addRecord) + } else if (Array.isArray(input)) { + if (input.length > 0 && Array.isArray(input[0])) { + // 배열의 배열 - 첫 번째 행이 헤더인 경우 + const firstRow = input[0] as unknown as any[] + for (let i = 1; i < input.length; i++) { + const compactRecord = input[i] as any[] + const record: DataRecord = {} + for (let j = 0; j < firstRow.length; j++) { + const k = String(firstRow[j] || `col_${j}`) + record[k] = compactRecord[j] + } + addRecord(record) + } + return + } + + // 객체의 배열 - 타입 가드로 안전하게 처리 + const dataArray = input as DataRecord[] + for (const record of dataArray) { + addRecord(record) + } + return + } + + throw new Error('unknown input format') + } +} + +// ==================== Export ==================== + +export { + // 타입들 + type NumberFormatOptions, + type Formatter, + type SortFunction, + type RecordValue, + type DataRecord, + type AggregatorInstance, + type AggregatorFunction, + type AggregatorTemplate, + type AggregatorTemplates, + type PivotDataProps, + type PivotDataContext, + type LocaleStrings, + type Locale, + type Derivers, + type AttributeName, + type FlatKey, + type NumericValue, + + // 함수들과 객체들 + aggregatorTemplates, + aggregators, + derivers, + locales, + naturalSort, + numberFormat, + getSort, + sortAs, + PivotData +} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..98f226e --- /dev/null +++ b/src/index.ts @@ -0,0 +1,12 @@ +import { VuePivottable, VuePivottableUi } from './components' +import * as PivotUtilities from './helper' +import TableRenderer from './components/pivottable/renderer' +import type { Component } from 'vue' +export * from './composables' + +const Renderer: Record = { + ...TableRenderer +} + +export { VuePivottable, VuePivottableUi, PivotUtilities, Renderer } +export default { VuePivottable, VuePivottableUi, PivotUtilities, Renderer } diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..98e2da2 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,10 @@ +import { createApp } from 'vue' + +import App from './App.vue' +// import VuePivottable from '@/' + +const app = createApp(App) + +// app.component('VuePivottableUi', VuePivottableUi) + +app.mount('#app') diff --git a/src/types/index.ts b/src/types/index.ts new file mode 100644 index 0000000..c3c7bb3 --- /dev/null +++ b/src/types/index.ts @@ -0,0 +1,36 @@ +import type { AggregatorTemplate } from '@/helper' +import { VNode } from 'vue' +import { Locale } from '@/helper' + +export interface DefaultPropsType { + data: any + aggregators?: Record + aggregatorName: string + heatmapMode?: 'full' | 'col' | 'row' | '' + tableColorScaleGenerator?: (...args: any[]) => any + tableOptions?: Record + renderers: Record + rendererName: string + locale?: string + languagePack?: Record + showRowTotal?: boolean + showColTotal?: boolean + cols: string[] + rows: string[] + vals?: string[] + attributes?: string[] + valueFilter?: Record + sorters?: any + derivedAttributes?: any + rowOrder?: 'key_a_to_z' | 'value_a_to_z' | 'value_z_to_a' + colOrder?: 'key_a_to_z' | 'value_a_to_z' | 'value_z_to_a' + tableMaxWidth?: number +} + +export type RendererProps = DefaultPropsType & Record + +export interface RendererDefinition { + name: string + props?: Record + setup: (props: any) => () => VNode +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..c856c15 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,43 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "preserve", + + /* Linting */ + "strict": false, + "strictNullChecks": true, + "strictBindCallApply": true, + "strictPropertyInitialization": true, + "noImplicitAny": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + + /* Vue specific */ + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + }, + "types": ["vite/client"], + "allowJs": true, + "checkJs": false + }, + "include": [ + "src/**/*.ts", + "src/**/*.d.ts", + "src/**/*.tsx", + "src/**/*.vue", + "src/**/*.js" + ], + "exclude": ["node_modules", "dist"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..e2e4509 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,55 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import { resolve } from 'path' +import dts from 'vite-plugin-dts' +import { viteStaticCopy } from 'vite-plugin-static-copy' + +export default defineConfig({ + plugins: [ + vue(), + viteStaticCopy({ + targets: [ + { + src: 'src/assets/vue-pivottable.css', + dest: '.' + } + ] + }), + dts({ + include: [ + 'src', + ], + outDir: 'dist/types', + staticImport: true, + insertTypesEntry: true, + rollupTypes: true, + tsconfigPath: './tsconfig.json' + }) + ], + build: { + lib: { + entry: resolve(__dirname, 'src/index.ts'), + name: 'VuePivottable', + fileName: (format) => `vue-pivottable.${format}.js`, + formats: ['es', 'umd'] + }, + rollupOptions: { + external: ['vue', 'vue-draggable-next', 'papaparse'], + output: { + exports: 'named', + globals: { + 'vue': 'Vue', + 'vue-draggable-next': 'VueDraggableNext', + 'papaparse': 'Papa' + } + } + }, + sourcemap: true, + target: 'es2015' + }, + resolve: { + alias: { + '@': resolve(__dirname, 'src') + } + } +})