From a1c4fb6d8d7bd6103d7a0112771eb811e9f8e9bd Mon Sep 17 00:00:00 2001 From: Seungwoo Lee <13829929+Seungwoo321@users.noreply.github.com> Date: Wed, 18 Jun 2025 16:10:06 +0900 Subject: [PATCH] Revert "chore: sync main to release" --- .gitignore | 3 +- eslint.config.js | 34 +- package.json | 11 +- packages/lazy-table-renderer/package.json | 8 +- .../src/{index.ts => index.js} | 2 +- packages/lazy-table-renderer/tsconfig.json | 12 - .../{vite.config.ts => vite.config.js} | 11 +- packages/plotly-renderer/package.json | 7 +- .../src/{index.ts => index.js} | 0 packages/plotly-renderer/tsconfig.json | 12 - .../{vite.config.ts => vite.config.js} | 16 +- pnpm-lock.yaml | 1971 +++++++++-------- src/App.vue | 2 +- src/components/{index.ts => index.js} | 0 .../pivottable-ui/VAggregatorCell.vue | 106 +- .../pivottable-ui/VDragAndDropCell.vue | 100 +- .../pivottable-ui/VDraggableAttribute.vue | 71 +- src/components/pivottable-ui/VDropdown.vue | 36 +- src/components/pivottable-ui/VFilterBox.vue | 95 +- .../pivottable-ui/VPivottableUi.vue | 74 +- .../pivottable-ui/VRendererCell.vue | 40 +- src/components/pivottable/VPivottable.vue | 9 +- src/components/pivottable/VPivottableBody.vue | 41 +- .../pivottable/VPivottableBodyRows.vue | 50 +- .../VPivottableBodyRowsTotalRow.vue | 49 +- .../pivottable/VPivottableHeader.vue | 84 +- .../pivottable/VPivottableHeaderColumns.vue | 29 +- .../pivottable/VPivottableHeaderRows.vue | 35 +- .../pivottable/VPivottableHeaderRowsTotal.vue | 29 +- .../renderer/TSVExportRenderers.vue | 30 +- .../pivottable/renderer/TableRenderer.vue | 32 +- .../renderer/{index.ts => index.js} | 26 +- src/composables/{index.ts => index.js} | 1 - ...rializeInput.ts => useMaterializeInput.js} | 36 +- src/composables/usePivotData.ts | 18 - src/composables/usePivotUiState.js | 30 + src/composables/usePivotUiState.ts | 43 - src/composables/usePropsState.js | 72 + src/composables/usePropsState.ts | 95 - src/composables/useProvideFilterbox.js | 21 + src/composables/useProvideFilterbox.ts | 36 - src/composables/useProvidePivotData.js | 136 ++ src/composables/useProvidePivotData.ts | 147 -- src/helper/defaultProps.js | 94 + src/helper/defaultProps.ts | 96 - src/helper/index.js | 3 + src/helper/index.ts | 3 - src/helper/redColorScaleGenerator.js | 8 + src/helper/redColorScaleGenerator.ts | 8 - src/helper/utilities.js | 856 +++++++ src/helper/utilities.ts | 1001 --------- src/{index.ts => index.js} | 7 +- src/{main.ts => main.js} | 0 src/types/index.ts | 36 - tsconfig.json | 43 - vite.config.ts => vite.config.js | 15 +- 56 files changed, 2881 insertions(+), 2949 deletions(-) rename packages/lazy-table-renderer/src/{index.ts => index.js} (95%) delete mode 100644 packages/lazy-table-renderer/tsconfig.json rename packages/lazy-table-renderer/{vite.config.ts => vite.config.js} (79%) rename packages/plotly-renderer/src/{index.ts => index.js} (100%) delete mode 100644 packages/plotly-renderer/tsconfig.json rename packages/plotly-renderer/{vite.config.ts => vite.config.js} (63%) rename src/components/{index.ts => index.js} (100%) rename src/components/pivottable/renderer/{index.ts => index.js} (65%) rename src/composables/{index.ts => index.js} (87%) rename src/composables/{useMaterializeInput.ts => useMaterializeInput.js} (56%) delete mode 100644 src/composables/usePivotData.ts create mode 100644 src/composables/usePivotUiState.js delete mode 100644 src/composables/usePivotUiState.ts create mode 100644 src/composables/usePropsState.js delete mode 100644 src/composables/usePropsState.ts create mode 100644 src/composables/useProvideFilterbox.js delete mode 100644 src/composables/useProvideFilterbox.ts create mode 100644 src/composables/useProvidePivotData.js delete mode 100644 src/composables/useProvidePivotData.ts create mode 100644 src/helper/defaultProps.js delete mode 100644 src/helper/defaultProps.ts create mode 100644 src/helper/index.js delete mode 100644 src/helper/index.ts create mode 100644 src/helper/redColorScaleGenerator.js delete mode 100644 src/helper/redColorScaleGenerator.ts create mode 100644 src/helper/utilities.js delete mode 100644 src/helper/utilities.ts rename src/{index.ts => index.js} (74%) rename src/{main.ts => main.js} (100%) delete mode 100644 src/types/index.ts delete mode 100644 tsconfig.json rename vite.config.ts => vite.config.js (77%) diff --git a/.gitignore b/.gitignore index 6e931d3..f0d9303 100644 --- a/.gitignore +++ b/.gitignore @@ -25,5 +25,4 @@ dist-ssr *.sw? # vscode -.history -reference \ No newline at end of file +.history \ No newline at end of file diff --git a/eslint.config.js b/eslint.config.js index dd132dc..aa81b74 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,6 +1,5 @@ import { defineConfig } from 'eslint/config' import standardjs from '@seungwoo321/eslint-plugin-standard-js' -import tseslint from 'typescript-eslint' import pluginVue from 'eslint-plugin-vue' export default defineConfig([ @@ -15,29 +14,21 @@ export default defineConfig([ ] }, { - files: ['**/*.vue'], - languageOptions: { - parser: require.resolve('vue-eslint-parser'), - parserOptions: { - parser: require.resolve('@typescript-eslint/parser'), - ecmaVersion: 2020, - sourceType: 'module', - extraFileExtensions: ['.vue'] - } - }, - plugins: { - 'vue': pluginVue, - '@typescript-eslint': tseslint - } - }, - { - files: ['**/*.{js,mjs,cjs,vue,ts}', 'eslint.config.js'], + files: ['**/*.{js,mjs,cjs,vue}', 'eslint.config.js'], extends: [ - ...standardjs.configs.base, - ...tseslint.configs.recommended, + ...standardjs.configs.recommended, ...pluginVue.configs['flat/strongly-recommended'] ], rules: { + '@stylistic/space-before-function-paren': [ + 'error', + { + anonymous: 'always', + named: 'never', + asyncArrow: 'always' + } + ], + '@stylistic/quote-props': ['error', 'consistent'], 'vue/html-self-closing': [ 'error', { @@ -58,8 +49,7 @@ export default defineConfig([ ignores: ['pre', 'textarea', 'div'], externalIgnores: [] } - ], - '@typescript-eslint/no-explicit-any': 'off' + ] } } ]) diff --git a/package.json b/package.json index 7351057..c390dbf 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,6 @@ "description": "", "exports": { ".": { - "types": "./dist/types/index.d.ts", "import": "./dist/vue-pivottable.es.js", "require": "./dist/vue-pivottable.umd.js" }, @@ -14,8 +13,6 @@ }, "main": "./dist/vue-pivottable.umd.js", "module": "./dist/vue-pivottable.es.js", - "types": "./dist/types/index.d.ts", - "source": "./src/index.ts", "files": [ "dist", "LICENSE", @@ -73,12 +70,9 @@ "@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-pivottable/lazy-table-renderer": "workspace:*", "@vue-pivottable/plotly-renderer": "workspace:*", - "@vue/tsconfig": "^0.7.0", "concurrently": "^9.1.2", "conventional-changelog": "^6.0.0", "conventional-changelog-cli": "^5.0.0", @@ -88,13 +82,10 @@ "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-tsc": "^2.2.10" + "vue": "^3.2.0" }, "packageManager": "pnpm@9.12.2" } diff --git a/packages/lazy-table-renderer/package.json b/packages/lazy-table-renderer/package.json index 65e49bf..51b4263 100644 --- a/packages/lazy-table-renderer/package.json +++ b/packages/lazy-table-renderer/package.json @@ -5,7 +5,6 @@ "description": "", "exports": { ".": { - "types": "./dist/types/index.d.ts", "import": "./dist/lazy-table-renderer.es.js", "require": "./dist/lazy-table-renderer.umd.js" }, @@ -14,7 +13,6 @@ }, "main": "./dist/lazy-table-renderer.umd.js", "module": "./dist/lazy-table-renderer.es.js", - "types": "./dist/types/index.d.ts", "files": [ "dist", "LICENSE", @@ -47,15 +45,13 @@ "build": "vite build", "lint": "eslint ." }, + "dependencies": {}, "peerDependencies": { "vue": "^3.2.0", "vue-pivottable": "latest" }, "devDependencies": { "@vitejs/plugin-vue": "^5.2.1", - "@vue/tsconfig": "^0.7.0", - "typescript": "^5.8.3", - "vite": "^6.3.4", - "vue-tsc": "^2.2.10" + "vite": "^6.3.4" } } diff --git a/packages/lazy-table-renderer/src/index.ts b/packages/lazy-table-renderer/src/index.js similarity index 95% rename from packages/lazy-table-renderer/src/index.ts rename to packages/lazy-table-renderer/src/index.js index 4aec50c..a751014 100644 --- a/packages/lazy-table-renderer/src/index.ts +++ b/packages/lazy-table-renderer/src/index.js @@ -6,7 +6,7 @@ export default markRaw({ 'Lazy Table': defineComponent({ name: 'VueLazyTable', props: { ...PivotUtilities.defaultProps }, - setup (props) { + setup(props) { return () => h(LazyPivottableRenderer, { ...props, diff --git a/packages/lazy-table-renderer/tsconfig.json b/packages/lazy-table-renderer/tsconfig.json deleted file mode 100644 index f212c71..0000000 --- a/packages/lazy-table-renderer/tsconfig.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "noEmit": true, - "baseUrl": ".", - "paths": { - "vue-pivottable": ["../../src"] - } - }, - "include": ["src/**/*"], - "exclude": ["dist", "node_modules"] -} diff --git a/packages/lazy-table-renderer/vite.config.ts b/packages/lazy-table-renderer/vite.config.js similarity index 79% rename from packages/lazy-table-renderer/vite.config.ts rename to packages/lazy-table-renderer/vite.config.js index 63afc68..3c449e4 100644 --- a/packages/lazy-table-renderer/vite.config.ts +++ b/packages/lazy-table-renderer/vite.config.js @@ -3,13 +3,13 @@ import { resolve } from 'path' import dts from 'vite-plugin-dts' import vue from '@vitejs/plugin-vue' -export default defineConfig(() => { +export default defineConfig(({ command, mode, ssrBuild }) => { return { plugins: [ vue(), dts({ - include: ['src'], - outDir: 'dist/types', + include: ['src/**/*.{js,ts,vue,d.ts}'], + outDir: 'dist', staticImport: false, insertTypesEntry: true, rollupTypes: true @@ -18,10 +18,9 @@ export default defineConfig(() => { publicDir: false, build: { lib: { - entry: resolve(__dirname, 'src/index.ts'), + entry: resolve(__dirname, 'src/index.js'), name: 'LazyTableRenderer', - fileName: (format) => `lazy-table-renderer.${format}.js`, - formats: ['es', 'umd'] + fileName: (format) => `lazy-table-renderer.${format}.js` }, rollupOptions: { external: ['vue'], diff --git a/packages/plotly-renderer/package.json b/packages/plotly-renderer/package.json index c030ac7..42df7d6 100644 --- a/packages/plotly-renderer/package.json +++ b/packages/plotly-renderer/package.json @@ -4,7 +4,6 @@ "type": "module", "exports": { ".": { - "types": "./dist/types/index.d.ts", "import": "./dist/plotly-renderer.es.js", "require": "./dist/plotly-renderer.umd.js" }, @@ -13,7 +12,6 @@ }, "main": "./dist/plotly-renderer.umd.js", "module": "./dist/plotly-renderer.es.js", - "types": "./dist/types/index.d.ts", "files": [ "dist", "LICENSE", @@ -49,9 +47,6 @@ }, "devDependencies": { "@vitejs/plugin-vue": "^5.2.1", - "@vue/tsconfig": "^0.7.0", - "typescript": "^5.8.3", - "vite": "^6.3.4", - "vue-tsc": "^2.2.10" + "vite": "^6.3.4" } } diff --git a/packages/plotly-renderer/src/index.ts b/packages/plotly-renderer/src/index.js similarity index 100% rename from packages/plotly-renderer/src/index.ts rename to packages/plotly-renderer/src/index.js diff --git a/packages/plotly-renderer/tsconfig.json b/packages/plotly-renderer/tsconfig.json deleted file mode 100644 index f212c71..0000000 --- a/packages/plotly-renderer/tsconfig.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "noEmit": true, - "baseUrl": ".", - "paths": { - "vue-pivottable": ["../../src"] - } - }, - "include": ["src/**/*"], - "exclude": ["dist", "node_modules"] -} diff --git a/packages/plotly-renderer/vite.config.ts b/packages/plotly-renderer/vite.config.js similarity index 63% rename from packages/plotly-renderer/vite.config.ts rename to packages/plotly-renderer/vite.config.js index 834d24a..7fc8f5d 100644 --- a/packages/plotly-renderer/vite.config.ts +++ b/packages/plotly-renderer/vite.config.js @@ -1,15 +1,15 @@ import { defineConfig } from 'vite' -import { resolve } from 'path' +import path, { resolve } from 'path' import dts from 'vite-plugin-dts' import vue from '@vitejs/plugin-vue' -export default defineConfig(() => { +export default defineConfig(({ command, mode, ssrBuild }) => { return { plugins: [ vue(), dts({ - include: ['src'], - outDir: 'dist/types', + include: ['src/**/*.{js,ts,vue,d.ts}'], + outDir: 'dist', staticImport: false, insertTypesEntry: true, rollupTypes: true @@ -18,10 +18,9 @@ export default defineConfig(() => { publicDir: false, build: { lib: { - entry: resolve(__dirname, 'src/index.ts'), + entry: resolve(__dirname, 'src/index.js'), name: 'PlotlyRenderer', - fileName: (format) => `plotly-renderer.${format}.js`, - formats: ['es', 'umd'] + fileName: (format) => `plotly-renderer.${format}.js` }, rollupOptions: { external: ['vue'], @@ -38,8 +37,7 @@ export default defineConfig(() => { }, resolve: { alias: { - 'vue-pivottable': resolve(__dirname, '../../src'), - 'vue-plotly': resolve(__dirname, 'node_modules/vue-plotly') + 'vue-plotly': path.resolve(__dirname, 'node_modules/vue-plotly') } } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dcb1fd9..4d42efd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,44 +10,35 @@ importers: dependencies: vue-draggable-next: specifier: ^2.2.1 - version: 2.2.1(sortablejs@1.15.6)(vue@3.5.15(typescript@5.8.3)) + version: 2.2.1(sortablejs@1.15.6)(vue@3.5.13(typescript@5.8.2)) devDependencies: '@semantic-release/changelog': specifier: ^6.0.3 - version: 6.0.3(semantic-release@24.2.5(typescript@5.8.3)) + version: 6.0.3(semantic-release@24.2.3(typescript@5.8.2)) '@semantic-release/git': specifier: ^10.0.1 - version: 10.0.1(semantic-release@24.2.5(typescript@5.8.3)) + version: 10.0.1(semantic-release@24.2.3(typescript@5.8.2)) '@semantic-release/github': specifier: ^11.0.2 - version: 11.0.3(semantic-release@24.2.5(typescript@5.8.3)) + version: 11.0.2(semantic-release@24.2.3(typescript@5.8.2)) '@semantic-release/npm': specifier: ^12.0.1 - version: 12.0.1(semantic-release@24.2.5(typescript@5.8.3)) + version: 12.0.1(semantic-release@24.2.3(typescript@5.8.2)) '@seungwoo321/eslint-plugin-standard-js': specifier: ^1.0.1 - 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) + 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) '@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.4(vite@6.3.5(@types/node@22.15.21))(vue@3.5.15(typescript@5.8.3)) + version: 5.2.3(vite@6.3.5)(vue@3.5.13(typescript@5.8.2)) '@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 @@ -59,99 +50,72 @@ importers: version: 5.0.0(conventional-commits-filter@5.0.0) eslint: specifier: ^9.21.0 - version: 9.27.0 + version: 9.26.0 eslint-plugin-vue: specifier: ^9.32.0 - version: 9.33.0(eslint@9.27.0) + version: 9.33.0(eslint@9.26.0) globals: specifier: ^16.0.0 - version: 16.2.0 + version: 16.0.0 papaparse: specifier: ^5.5.2 - version: 5.5.3 + version: 5.5.2 rimraf: specifier: ^6.0.1 version: 6.0.1 semantic-release: specifier: ^24.2.3 - 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) + version: 24.2.3(typescript@5.8.2) vite: specifier: ^6.3.4 - version: 6.3.5(@types/node@22.15.21) + version: 6.3.5 vite-plugin-dts: specifier: ^4.5.3 - 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)) + version: 4.5.3(rollup@4.40.2)(typescript@5.8.2)(vite@6.3.5) vite-plugin-static-copy: specifier: ^2.3.1 - version: 2.3.1(vite@6.3.5(@types/node@22.15.21)) + version: 2.3.1(vite@6.3.5) vue: specifier: ^3.2.0 - version: 3.5.15(typescript@5.8.3) - vue-tsc: - specifier: ^2.2.10 - version: 2.2.10(typescript@5.8.3) + version: 3.5.13(typescript@5.8.2) packages/lazy-table-renderer: dependencies: vue: specifier: ^3.2.0 - version: 3.5.15(typescript@5.8.3) + version: 3.5.13(typescript@5.8.2) vue-pivottable: specifier: latest - version: 1.0.15(sortablejs@1.15.6)(vue@3.5.15(typescript@5.8.3)) + version: 1.0.3(sortablejs@1.15.6)(vue@3.5.13(typescript@5.8.2)) devDependencies: '@vitejs/plugin-vue': specifier: ^5.2.1 - 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 + version: 5.2.3(vite@6.3.5)(vue@3.5.13(typescript@5.8.2)) vite: specifier: ^6.3.4 - version: 6.3.5(@types/node@22.15.21) - vue-tsc: - specifier: ^2.2.10 - version: 2.2.10(typescript@5.8.3) + version: 6.3.5 packages/plotly-renderer: dependencies: '@clalarco/vue3-plotly': specifier: ^0.1.5 - version: 0.1.5(vue@3.5.15(typescript@5.8.3)) + version: 0.1.5(vue@3.5.13(typescript@5.8.2)) plotly.js-basic-dist: specifier: ^3.0.1 version: 3.0.1 vue: specifier: ^3.2.0 - version: 3.5.15(typescript@5.8.3) + version: 3.5.13(typescript@5.8.2) vue-pivottable: specifier: 1.0.1 - version: 1.0.1(sortablejs@1.15.6)(vue@3.5.15(typescript@5.8.3)) + version: 1.0.1(sortablejs@1.15.6)(vue@3.5.13(typescript@5.8.2)) devDependencies: '@vitejs/plugin-vue': specifier: ^5.2.1 - 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 + version: 5.2.3(vite@6.3.5)(vue@3.5.13(typescript@5.8.2)) vite: specifier: ^6.3.4 - version: 6.3.5(@types/node@22.15.21) - vue-tsc: - specifier: ^2.2.10 - version: 2.2.10(typescript@5.8.3) + version: 6.3.5 packages: @@ -197,152 +161,152 @@ packages: conventional-commits-parser: optional: true - '@esbuild/aix-ppc64@0.25.5': - resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} + '@esbuild/aix-ppc64@0.25.4': + resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.5': - resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} + '@esbuild/android-arm64@0.25.4': + resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.5': - resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} + '@esbuild/android-arm@0.25.4': + resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.5': - resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} + '@esbuild/android-x64@0.25.4': + resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.5': - resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} + '@esbuild/darwin-arm64@0.25.4': + resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.5': - resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} + '@esbuild/darwin-x64@0.25.4': + resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.5': - resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} + '@esbuild/freebsd-arm64@0.25.4': + resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.5': - resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} + '@esbuild/freebsd-x64@0.25.4': + resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.5': - resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} + '@esbuild/linux-arm64@0.25.4': + resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.5': - resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} + '@esbuild/linux-arm@0.25.4': + resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.5': - resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} + '@esbuild/linux-ia32@0.25.4': + resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.5': - resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} + '@esbuild/linux-loong64@0.25.4': + resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.5': - resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} + '@esbuild/linux-mips64el@0.25.4': + resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.5': - resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} + '@esbuild/linux-ppc64@0.25.4': + resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.5': - resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} + '@esbuild/linux-riscv64@0.25.4': + resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.5': - resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} + '@esbuild/linux-s390x@0.25.4': + resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.5': - resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} + '@esbuild/linux-x64@0.25.4': + resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.5': - resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} + '@esbuild/netbsd-arm64@0.25.4': + resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.5': - resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} + '@esbuild/netbsd-x64@0.25.4': + resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.5': - resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} + '@esbuild/openbsd-arm64@0.25.4': + resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.5': - resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} + '@esbuild/openbsd-x64@0.25.4': + resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.25.5': - resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} + '@esbuild/sunos-x64@0.25.4': + resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.5': - resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} + '@esbuild/win32-arm64@0.25.4': + resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.5': - resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} + '@esbuild/win32-ia32@0.25.4': + resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.5': - resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} + '@esbuild/win32-x64@0.25.4': + resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -365,24 +329,24 @@ packages: resolution: {integrity: sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.14.0': - resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} + '@eslint/core@0.13.0': + resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} 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.27.0': - resolution: {integrity: sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA==} + '@eslint/js@9.26.0': + resolution: {integrity: sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ==} 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.3.1': - resolution: {integrity: sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==} + '@eslint/plugin-kit@0.2.8': + resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@humanfs/core@0.19.1': @@ -401,8 +365,8 @@ packages: resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.3': - resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + '@humanwhocodes/retry@0.4.2': + resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} engines: {node: '>=18.18'} '@hutson/parse-repository-url@5.0.0': @@ -419,8 +383,8 @@ packages: '@microsoft/api-extractor-model@7.30.6': resolution: {integrity: sha512-znmFn69wf/AIrwHya3fxX6uB5etSIn6vg4Q4RB/tb5VDDs1rqREc+AvMC/p19MUN13CZ7+V/8pkYPTj7q8tftg==} - '@microsoft/api-extractor@7.52.8': - resolution: {integrity: sha512-cszYIcjiNscDoMB1CIKZ3My61+JOhpERGlGr54i6bocvGLrcL/wo9o+RNXMBrb7XgLtKaizZWUpqRduQuHQLdg==} + '@microsoft/api-extractor@7.52.7': + resolution: {integrity: sha512-YLdPS644MfbLJt4hArP1WcldcaEUBh9wnFjcLEcQnVG0AMznbLh2sdE0F5Wr+w6+Lyp5/XUPvRAg3sYGSP3GCw==} hasBin: true '@microsoft/tsdoc-config@0.17.1': @@ -429,6 +393,10 @@ 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'} @@ -441,53 +409,53 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@octokit/auth-token@6.0.0': - resolution: {integrity: sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==} - engines: {node: '>= 20'} + '@octokit/auth-token@5.1.2': + resolution: {integrity: sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==} + engines: {node: '>= 18'} - '@octokit/core@7.0.2': - resolution: {integrity: sha512-ODsoD39Lq6vR6aBgvjTnA3nZGliknKboc9Gtxr7E4WDNqY24MxANKcuDQSF0jzapvGb3KWOEDrKfve4HoWGK+g==} - engines: {node: '>= 20'} + '@octokit/core@6.1.5': + resolution: {integrity: sha512-vvmsN0r7rguA+FySiCsbaTTobSftpIDIpPW81trAmsv9TGxg3YCujAxRYp/Uy8xmDgYCzzgulG62H7KYUFmeIg==} + engines: {node: '>= 18'} - '@octokit/endpoint@11.0.0': - resolution: {integrity: sha512-hoYicJZaqISMAI3JfaDr1qMNi48OctWuOih1m80bkYow/ayPw6Jj52tqWJ6GEoFTk1gBqfanSoI1iY99Z5+ekQ==} - engines: {node: '>= 20'} + '@octokit/endpoint@10.1.4': + resolution: {integrity: sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==} + engines: {node: '>= 18'} - '@octokit/graphql@9.0.1': - resolution: {integrity: sha512-j1nQNU1ZxNFx2ZtKmL4sMrs4egy5h65OMDmSbVyuCzjOcwsHq6EaYjOTGXPQxgfiN8dJ4CriYHk6zF050WEULg==} - engines: {node: '>= 20'} + '@octokit/graphql@8.2.2': + resolution: {integrity: sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==} + engines: {node: '>= 18'} - '@octokit/openapi-types@25.1.0': - resolution: {integrity: sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==} + '@octokit/openapi-types@25.0.0': + resolution: {integrity: sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==} - '@octokit/plugin-paginate-rest@13.0.1': - resolution: {integrity: sha512-m1KvHlueScy4mQJWvFDCxFBTIdXS0K1SgFGLmqHyX90mZdCIv6gWBbKRhatxRjhGlONuTK/hztYdaqrTXcFZdQ==} - engines: {node: '>= 20'} + '@octokit/plugin-paginate-rest@12.0.0': + resolution: {integrity: sha512-MPd6WK1VtZ52lFrgZ0R2FlaoiWllzgqFHaSZxvp72NmoDeZ0m8GeJdg4oB6ctqMTYyrnDYp592Xma21mrgiyDA==} + engines: {node: '>= 18'} peerDependencies: '@octokit/core': '>=6' - '@octokit/plugin-retry@8.0.1': - resolution: {integrity: sha512-KUoYR77BjF5O3zcwDQHRRZsUvJwepobeqiSSdCJ8lWt27FZExzb0GgVxrhhfuyF6z2B2zpO0hN5pteni1sqWiw==} - engines: {node: '>= 20'} + '@octokit/plugin-retry@7.2.1': + resolution: {integrity: sha512-wUc3gv0D6vNHpGxSaR3FlqJpTXGWgqmk607N9L3LvPL4QjaxDgX/1nY2mGpT37Khn+nlIXdljczkRnNdTTV3/A==} + engines: {node: '>= 18'} peerDependencies: - '@octokit/core': '>=7' + '@octokit/core': '>=6' - '@octokit/plugin-throttling@11.0.1': - resolution: {integrity: sha512-S+EVhy52D/272L7up58dr3FNSMXWuNZolkL4zMJBNIfIxyZuUcczsQAU4b5w6dewJXnKYVgSHSV5wxitMSW1kw==} - engines: {node: '>= 20'} + '@octokit/plugin-throttling@10.0.0': + resolution: {integrity: sha512-Kuq5/qs0DVYTHZuBAzCZStCzo2nKvVRo/TDNhCcpC2TKiOGz/DisXMCvjt3/b5kr6SCI1Y8eeeJTHBxxpFvZEg==} + engines: {node: '>= 18'} peerDependencies: - '@octokit/core': ^7.0.0 + '@octokit/core': ^6.1.3 - '@octokit/request-error@7.0.0': - resolution: {integrity: sha512-KRA7VTGdVyJlh0cP5Tf94hTiYVVqmt2f3I6mnimmaVz4UG3gQV/k4mDJlJv3X67iX6rmN7gSHCF8ssqeMnmhZg==} - engines: {node: '>= 20'} + '@octokit/request-error@6.1.8': + resolution: {integrity: sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==} + engines: {node: '>= 18'} - '@octokit/request@10.0.2': - resolution: {integrity: sha512-iYj4SJG/2bbhh+iIpFmG5u49DtJ4lipQ+aPakjL9OKpsGY93wM8w06gvFbEQxcMsZcCvk5th5KkIm2m8o14aWA==} - engines: {node: '>= 20'} + '@octokit/request@9.2.3': + resolution: {integrity: sha512-Ma+pZU8PXLOEYzsWf0cn/gY+ME57Wq8f49WTXA8FMHp2Ps9djKw//xYJ1je8Hm0pR2lU9FUGeJRWOtxq6olt4w==} + engines: {node: '>= 18'} - '@octokit/types@14.1.0': - resolution: {integrity: sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==} + '@octokit/types@14.0.0': + resolution: {integrity: sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==} '@pnpm/config.env-replace@1.1.0': resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} @@ -510,103 +478,103 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.41.1': - resolution: {integrity: sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw==} + '@rollup/rollup-android-arm-eabi@4.40.2': + resolution: {integrity: sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.41.1': - resolution: {integrity: sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA==} + '@rollup/rollup-android-arm64@4.40.2': + resolution: {integrity: sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.41.1': - resolution: {integrity: sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w==} + '@rollup/rollup-darwin-arm64@4.40.2': + resolution: {integrity: sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.41.1': - resolution: {integrity: sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg==} + '@rollup/rollup-darwin-x64@4.40.2': + resolution: {integrity: sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.41.1': - resolution: {integrity: sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg==} + '@rollup/rollup-freebsd-arm64@4.40.2': + resolution: {integrity: sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.41.1': - resolution: {integrity: sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA==} + '@rollup/rollup-freebsd-x64@4.40.2': + resolution: {integrity: sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.41.1': - resolution: {integrity: sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg==} + '@rollup/rollup-linux-arm-gnueabihf@4.40.2': + resolution: {integrity: sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.41.1': - resolution: {integrity: sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA==} + '@rollup/rollup-linux-arm-musleabihf@4.40.2': + resolution: {integrity: sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.41.1': - resolution: {integrity: sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA==} + '@rollup/rollup-linux-arm64-gnu@4.40.2': + resolution: {integrity: sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.41.1': - resolution: {integrity: sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg==} + '@rollup/rollup-linux-arm64-musl@4.40.2': + resolution: {integrity: sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.41.1': - resolution: {integrity: sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw==} + '@rollup/rollup-linux-loongarch64-gnu@4.40.2': + resolution: {integrity: sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.41.1': - resolution: {integrity: sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A==} + '@rollup/rollup-linux-powerpc64le-gnu@4.40.2': + resolution: {integrity: sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.41.1': - resolution: {integrity: sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw==} + '@rollup/rollup-linux-riscv64-gnu@4.40.2': + resolution: {integrity: sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.41.1': - resolution: {integrity: sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw==} + '@rollup/rollup-linux-riscv64-musl@4.40.2': + resolution: {integrity: sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.41.1': - resolution: {integrity: sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g==} + '@rollup/rollup-linux-s390x-gnu@4.40.2': + resolution: {integrity: sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.41.1': - resolution: {integrity: sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A==} + '@rollup/rollup-linux-x64-gnu@4.40.2': + resolution: {integrity: sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.41.1': - resolution: {integrity: sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ==} + '@rollup/rollup-linux-x64-musl@4.40.2': + resolution: {integrity: sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.41.1': - resolution: {integrity: sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ==} + '@rollup/rollup-win32-arm64-msvc@4.40.2': + resolution: {integrity: sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.41.1': - resolution: {integrity: sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg==} + '@rollup/rollup-win32-ia32-msvc@4.40.2': + resolution: {integrity: sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.41.1': - resolution: {integrity: sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw==} + '@rollup/rollup-win32-x64-msvc@4.40.2': + resolution: {integrity: sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==} cpu: [x64] os: [win32] @@ -664,8 +632,8 @@ packages: peerDependencies: semantic-release: '>=18.0.0' - '@semantic-release/github@11.0.3': - resolution: {integrity: sha512-T2fKUyFkHHkUNa5XNmcsEcDPuG23hwBKptfUVcFXDVG2cSjXXZYDOfVYwfouqbWo/8UefotLaoGfQeK+k3ep6A==} + '@semantic-release/github@11.0.2': + resolution: {integrity: sha512-EhHimj3/eOSPu0OflgDzwgrawoGJIn8XLOkNS6WzwuTr8ebxyX976Y4mCqJ8MlkdQpV5+8T+49sy8xXlcm6uCg==} engines: {node: '>=20.8.1'} peerDependencies: semantic-release: '>=24.1.0' @@ -706,8 +674,8 @@ packages: resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} - '@stylistic/eslint-plugin@4.4.0': - resolution: {integrity: sha512-bIh/d9X+OQLCAMdhHtps+frvyjvAM4B1YlSJzcEEhl7wXLIqPar3ngn9DrHhkBOrTA/z9J0bUMtctAspe0dxdQ==} + '@stylistic/eslint-plugin@4.2.0': + resolution: {integrity: sha512-8hXezgz7jexGHdo5WN6JBEIPHCSFyyU4vgbxevu4YLVS5vl+sxqAAGyXSzfNDyR6xMNSH5H1x67nsXcYMOHtZA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=9.0.0' @@ -724,129 +692,86 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@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.33.1': - resolution: {integrity: sha512-TDCXj+YxLgtvxvFlAvpoRv9MAncDLBV2oT9Bd7YBGC/b/sEURoOYuIwLI99rjWOfY3QtDzO+mk0n4AmdFExW8A==} + '@typescript-eslint/eslint-plugin@8.32.0': + resolution: {integrity: sha512-/jU9ettcntkBFmWUzzGgsClEi2ZFiikMX5eEQsmxIAWMOn4H3D4rvHssstmAHGVvrYnaMqdWWWg0b5M6IN/MTQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.33.1 + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@8.33.1': - resolution: {integrity: sha512-qwxv6dq682yVvgKKp2qWwLgRbscDAYktPptK4JPojCwwi3R9cwrvIxS4lvBpzmcqzR4bdn54Z0IG1uHFskW4dA==} + '@typescript-eslint/parser@8.32.0': + resolution: {integrity: sha512-B2MdzyWxCE2+SqiZHAjPphft+/2x2FlO9YBx7eKE1BCb+rqBlQdhtAEhzIEdozHd55DXPmxBdpMygFJjfjjA9A==} 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/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/scope-manager@8.32.1': - resolution: {integrity: sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA==} + '@typescript-eslint/scope-manager@8.32.0': + resolution: {integrity: sha512-jc/4IxGNedXkmG4mx4nJTILb6TMjL66D41vyeaPWvDUmeYQzF3lKtN15WsAeTr65ce4mPxwopPSo1yUUAWw0hQ==} 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==} + '@typescript-eslint/type-utils@8.32.0': + resolution: {integrity: sha512-t2vouuYQKEKSLtJaa5bB4jHeha2HJczQ6E5IXPDPgIty9EqcJxpr1QHQ86YyIPwDwxvUmLfP2YADQ5ZY4qddZg==} 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.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.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==} + '@typescript-eslint/types@8.32.0': + resolution: {integrity: sha512-O5Id6tGadAZEMThM6L9HmVf5hQUXNSxLVKeGJYWNhhVseps/0LddMkp7//VDkzwJ69lPL0UmZdcZwggj9akJaA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.32.1': - resolution: {integrity: sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA==} + '@typescript-eslint/typescript-estree@8.32.0': + resolution: {integrity: sha512-pU9VD7anSCOIoBFnhTGfOzlVFQIA1XXiQpH/CezqOBaDppRwTglJzCC6fUQGpfwey4T183NKhF1/mfatYmjRqQ==} 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/utils@8.33.1': - resolution: {integrity: sha512-52HaBiEQUaRYqAXpfzWSR2U3gxk92Kw006+xZpElaPMg3C4PgM+A5LqwoQI1f9E5aZ/qlxAZxzm42WX+vn92SQ==} + '@typescript-eslint/utils@8.32.0': + resolution: {integrity: sha512-8S9hXau6nQ/sYVtC3D6ISIDoJzS1NsCK+gluVhLN2YkBPX+/1wkwyUiDKnxRh15579WoOIyVWnoyIf3yGI9REw==} 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==} + '@typescript-eslint/visitor-keys@8.32.0': + resolution: {integrity: sha512-1rYQTCLFFzOI5Nl0c8LUpJT8HxpwVRn9E4CkMsYfuN6ctmQqExjSTzzSk0Tz2apmXy7WU6/6fyaZVVA/thPN+w==} 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.4': - resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} + '@vitejs/plugin-vue@5.2.3': + resolution: {integrity: sha512-IYSLEQj4LgZZuoVpdSUCw3dIynTWQgPlaRP6iAvMle4My0HdYwr5g5wQAfwOeHQBmYwEkqF70nRpSilr6PoUDg==} 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.14': - resolution: {integrity: sha512-X6beusV0DvuVseaOEy7GoagS4rYHgDHnTrdOj5jeUb49fW5ceQyP9Ej5rBhqgz2wJggl+2fDbbojq1XKaxDi6w==} + '@volar/language-core@2.4.13': + resolution: {integrity: sha512-MnQJ7eKchJx5Oz+YdbqyFUk8BN6jasdJv31n/7r6/WwlOOv7qzvot6B66887l2ST3bUW4Mewml54euzpJWA6bg==} - '@volar/source-map@2.4.14': - resolution: {integrity: sha512-5TeKKMh7Sfxo8021cJfmBzcjfY1SsXsPMMjMvjY7ivesdnybqqS+GxGAoXHAOUawQTwtdUxgP65Im+dEmvWtYQ==} + '@volar/source-map@2.4.13': + resolution: {integrity: sha512-l/EBcc2FkvHgz2ZxV+OZK3kMSroMr7nN3sZLF2/f6kWW66q8+tEL4giiYyFjt0BcubqJhBt6soYIrAPhg/Yr+Q==} - '@volar/typescript@2.4.14': - resolution: {integrity: sha512-p8Z6f/bZM3/HyCdRNFZOEEzts51uV8WHeN8Tnfnm2EBv6FDB2TQLzfVx7aJvnl8ofKAOnS64B2O8bImBFaauRw==} + '@volar/typescript@2.4.13': + resolution: {integrity: sha512-Ukz4xv84swJPupZeoFsQoeJEOm7U9pqsEnaGGgt5ni3SCTa22m8oJP5Nng3Wed7Uw5RBELdLxxORX8YhJPyOgQ==} - '@vue/compiler-core@3.5.15': - resolution: {integrity: sha512-nGRc6YJg/kxNqbv/7Tg4juirPnjHvuVdhcmDvQWVZXlLHjouq7VsKmV1hIxM/8yKM0VUfwT/Uzc0lO510ltZqw==} + '@vue/compiler-core@3.5.13': + resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} - '@vue/compiler-dom@3.5.15': - resolution: {integrity: sha512-ZelQd9n+O/UCBdL00rlwCrsArSak+YLZpBVuNDio1hN3+wrCshYZEDUO3khSLAzPbF1oQS2duEoMDUHScUlYjA==} + '@vue/compiler-dom@3.5.13': + resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} - '@vue/compiler-sfc@3.5.15': - resolution: {integrity: sha512-3zndKbxMsOU6afQWer75Zot/aydjtxNj0T2KLg033rAFaQUn2PGuE32ZRe4iMhflbTcAxL0yEYsRWFxtPro8RQ==} + '@vue/compiler-sfc@3.5.13': + resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} - '@vue/compiler-ssr@3.5.15': - resolution: {integrity: sha512-gShn8zRREZbrXqTtmLSCffgZXDWv8nHc/GhsW+mbwBfNZL5pI96e7IWcIq8XGQe1TLtVbu7EV9gFIVSmfyarPg==} + '@vue/compiler-ssr@3.5.13': + resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} '@vue/compiler-vue2@2.7.16': resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} @@ -859,41 +784,26 @@ packages: typescript: optional: true - '@vue/language-core@2.2.10': - resolution: {integrity: sha512-+yNoYx6XIKuAO8Mqh1vGytu8jkFEOH5C8iOv3i8Z/65A7x9iAOXA97Q+PqZ3nlm2lxf5rOJuIGI/wDtx/riNYw==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@vue/reactivity@3.5.15': - resolution: {integrity: sha512-GaA5VUm30YWobCwpvcs9nvFKf27EdSLKDo2jA0IXzGS344oNpFNbEQ9z+Pp5ESDaxyS8FcH0vFN/XSe95BZtHQ==} + '@vue/reactivity@3.5.13': + resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} - '@vue/runtime-core@3.5.15': - resolution: {integrity: sha512-CZAlIOQ93nj0OPpWWOx4+QDLCMzBNY85IQR4Voe6vIID149yF8g9WQaWnw042f/6JfvLttK7dnyWlC1EVCRK8Q==} + '@vue/runtime-core@3.5.13': + resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} - '@vue/runtime-dom@3.5.15': - resolution: {integrity: sha512-wFplHKzKO/v998up2iCW3RN9TNUeDMhdBcNYZgs5LOokHntrB48dyuZHspcahKZczKKh3v6i164gapMPxBTKNw==} + '@vue/runtime-dom@3.5.13': + resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} - '@vue/server-renderer@3.5.15': - resolution: {integrity: sha512-Gehc693kVTYkLt6QSYEjGvqvdK2zZ/gf/D5zkgmvBdeB30dNnVZS8yY7+IlBmHRd1rR/zwaqeu06Ij04ZxBscg==} + '@vue/server-renderer@3.5.13': + resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} peerDependencies: - vue: 3.5.15 + vue: 3.5.13 - '@vue/shared@3.5.15': - resolution: {integrity: sha512-bKvgFJJL1ZX9KxMCTQY6xD9Dhe3nusd1OhyOb1cJYGqvAr0Vg8FIjHPMOEVbJ9GDT9HG+Bjdn4oS8ohKP8EvoA==} + '@vue/shared@3.5.13': + resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} - '@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 + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -948,9 +858,6 @@ 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-escapes@7.0.0: resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} engines: {node: '>=18'} @@ -1029,13 +936,17 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - before-after-hook@4.0.0: - resolution: {integrity: sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==} + before-after-hook@3.0.2: + resolution: {integrity: sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==} 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==} @@ -1052,6 +963,10 @@ 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'} @@ -1148,6 +1063,14 @@ 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'} @@ -1197,8 +1120,8 @@ packages: resolution: {integrity: sha512-SetDSntXLk8Jh1NOAl1Gu5uLiCNSYenB5tm0YVeZKePRIgDW9lQImromTwLa3c/Gae298tsgOM+/CYT9XAl0NA==} engines: {node: '>=18'} - conventional-changelog-writer@8.1.0: - resolution: {integrity: sha512-dpC440QnORNCO81XYuRRFOLCsjKj4W7tMkUIn3lR6F/FAaJcWLi7iCj6IcEvSQY2zw6VUgwUKd5DEHKEWrpmEQ==} + conventional-changelog-writer@8.0.1: + resolution: {integrity: sha512-hlqcy3xHred2gyYg/zXSMXraY2mjAYYo0msUCpK+BGyaVJMFCKWVXPIHiaacGO2GGp13kvHWXFhYmxT4QQqW3Q==} engines: {node: '>=18'} hasBin: true @@ -1219,9 +1142,21 @@ 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'} @@ -1270,8 +1205,8 @@ packages: supports-color: optional: true - debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1294,6 +1229,10 @@ 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'} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -1316,6 +1255,9 @@ 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==} @@ -1325,6 +1267,10 @@ 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'} @@ -1333,8 +1279,8 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - env-ci@11.1.1: - resolution: {integrity: sha512-mT3ks8F0kwpo7SYNds6nWj0PaRh+qJxIeBVBXAKTN9hphAzZv7s0QAZQbqnB1fAv/r4pJUGE15BV9UrS31FP2w==} + env-ci@11.1.0: + resolution: {integrity: sha512-Z8dnwSDbV1XYM9SBF2J0GcNVvmfmfh3a49qddGIROhBoVro6MZVTji15z/sJbQ2ko2ei8n988EU1wzoLU/tF+g==} engines: {node: ^18.17 || >=20.6.1} env-paths@2.2.1: @@ -1348,8 +1294,8 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-abstract@1.23.10: - resolution: {integrity: sha512-MtUbM072wlJNyeYAe0mhzrD+M6DIJa96CZAOBBrhDbgKnB4MApIKefcyAB1eOdYn8cUNZgvwBvEzdoAYsxgEIw==} + es-abstract@1.23.9: + resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} engines: {node: '>= 0.4'} es-define-property@1.0.1: @@ -1376,8 +1322,8 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - esbuild@0.25.5: - resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} + esbuild@0.25.4: + resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} engines: {node: '>=18'} hasBin: true @@ -1385,6 +1331,9 @@ 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'} @@ -1443,8 +1392,8 @@ packages: '@typescript-eslint/parser': optional: true - eslint-plugin-n@17.18.0: - resolution: {integrity: sha512-hvZ/HusueqTJ7VDLoCpjN0hx4N4+jHIWTXD4TMLHy9F23XkDagR9v+xQWRWR57yY55GPF8NnD4ox9iGTxirY8A==} + eslint-plugin-n@17.17.0: + resolution: {integrity: sha512-2VvPK7Mo73z1rDFb6pTvkH6kFibAmnTubFq5l83vePxu0WiY1s0LOtj2WHb6Sa40R3w4mnh8GFYbHBQyMlotKw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.23.0' @@ -1477,8 +1426,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.27.0: - resolution: {integrity: sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q==} + eslint@9.26.0: + resolution: {integrity: sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -1514,6 +1463,18 @@ 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'} @@ -1522,15 +1483,25 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} - execa@9.6.0: - resolution: {integrity: sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw==} + execa@9.5.2: + resolution: {integrity: sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==} 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@3.0.0: - resolution: {integrity: sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==} + fast-content-type-parse@2.0.1: + resolution: {integrity: sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -1572,6 +1543,10 @@ 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'} @@ -1603,6 +1578,14 @@ 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==} @@ -1661,8 +1644,8 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-tsconfig@4.10.1: - resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} + get-tsconfig@4.10.0: + resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} git-log-parser@1.2.1: resolution: {integrity: sha512-PI+sPDvHXNPl5WNOErAK05s3j0lgwUzMN6o8cyQrDaKfT3qd7TmNJKeXX+SknI5I0QhG5fVPAEwSY4tRGDtYoQ==} @@ -1702,8 +1685,8 @@ packages: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} - globals@16.2.0: - resolution: {integrity: sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==} + globals@16.0.0: + resolution: {integrity: sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==} engines: {node: '>=18'} globalthis@1.0.4: @@ -1782,6 +1765,10 @@ 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'} @@ -1802,6 +1789,10 @@ packages: resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} engines: {node: '>=18.18.0'} + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -1855,6 +1846,10 @@ 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'} @@ -1934,6 +1929,9 @@ 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'} @@ -1999,8 +1997,8 @@ packages: resolution: {integrity: sha512-3YZcUUR2Wt1WsapF+S/WiA2WmlW0cWAoPccMqne7AxEBhCdFeTPjfv/Axb8V2gyCgY3nRw+ksZ3xSUX+R47iAg==} engines: {node: ^18.17 || >=20.6.1} - jackspeak@4.1.1: - resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} + jackspeak@4.1.0: + resolution: {integrity: sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==} engines: {node: 20 || >=22} java-properties@1.0.2: @@ -2115,8 +2113,8 @@ packages: peerDependencies: marked: '>=1 <16' - marked@15.0.12: - resolution: {integrity: sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==} + marked@12.0.2: + resolution: {integrity: sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==} engines: {node: '>= 18'} hasBin: true @@ -2124,10 +2122,18 @@ 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==} @@ -2139,6 +2145,14 @@ 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'} @@ -2193,6 +2207,10 @@ 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==} @@ -2332,6 +2350,13 @@ 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'} @@ -2395,8 +2420,8 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - papaparse@5.5.3: - resolution: {integrity: sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==} + papaparse@5.5.2: + resolution: {integrity: sha512-PZXg8UuAc4PcVwLosEEDYjPyfWnTEhOrUfdv+3Bx+NuAb+5NhDmXzg5fHWmdCh1mP5p7JAZfFr3IMQfcntNAdA==} parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} @@ -2427,6 +2452,10 @@ 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==} @@ -2453,6 +2482,10 @@ 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'} @@ -2479,6 +2512,10 @@ 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'} + pkg-conf@2.1.0: resolution: {integrity: sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==} engines: {node: '>=4'} @@ -2526,16 +2563,32 @@ 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 @@ -2600,11 +2653,15 @@ packages: engines: {node: 20 || >=22} hasBin: true - rollup@4.41.1: - resolution: {integrity: sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==} + rollup@4.40.2: + resolution: {integrity: sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==} 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==} @@ -2618,6 +2675,9 @@ 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'} @@ -2626,8 +2686,11 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} - semantic-release@24.2.5: - resolution: {integrity: sha512-9xV49HNY8C0/WmPWxTlaNleiXhWb//qfMzG2c5X8/k7tuWcu8RssbuS+sujb/h7PiWSXv53mrQvV9hrO9b7vuQ==} + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + semantic-release@24.2.3: + resolution: {integrity: sha512-KRhQG9cUazPavJiJEFIJ3XAMjgfd0fcK3B+T26qOl8L0UG5aZUjeRfREO0KM5InGtYwxqiiytkJrbcYoLDEv0A==} engines: {node: '>=20.8.1'} hasBin: true @@ -2648,11 +2711,19 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} 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'} @@ -2665,6 +2736,9 @@ 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'} @@ -2744,6 +2818,10 @@ 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==} @@ -2830,8 +2908,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - tapable@2.2.2: - resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} temp-dir@3.0.0: @@ -2860,14 +2938,18 @@ packages: resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} engines: {node: '>=12'} - tinyglobby@0.2.14: - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + tinyglobby@0.2.13: + resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} engines: {node: '>=12.0.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'} @@ -2908,6 +2990,10 @@ 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'} @@ -2924,8 +3010,8 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript-eslint@8.33.1: - resolution: {integrity: sha512-AgRnV4sKkWOiZ0Kjbnf5ytTJXMUZQ0qhSVdQtDNYLPLnjsATEYhaO94GlRQwi4t4gO8FfjM6NnikHeKjUm8D7A==} + typescript-eslint@8.32.0: + resolution: {integrity: sha512-UMq2kxdXCzinFFPsXc9o2ozIpYCCOiEC46MG3yEh5Vipq6BO27otTtEBZA1fQ66DulEUgE97ucQ/3YY66CPg0A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -2936,11 +3022,6 @@ 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==} @@ -2953,9 +3034,6 @@ 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'} @@ -2972,13 +3050,17 @@ packages: resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} engines: {node: '>=12'} - universal-user-agent@7.0.3: - resolution: {integrity: sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==} + universal-user-agent@7.0.2: + resolution: {integrity: sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==} 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==} @@ -2992,8 +3074,12 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - vite-plugin-dts@4.5.4: - resolution: {integrity: sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==} + 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==} peerDependencies: typescript: '*' vite: '*' @@ -3067,19 +3153,13 @@ packages: peerDependencies: vue: ^3.2.0 - vue-pivottable@1.0.15: - resolution: {integrity: sha512-OSZK1/Xm11BQjLK7I1ZDi5oiaGfHyB+iqOhLCsIdcMveno5xmcilvZOv5lHQRZ+RmeNyvCEp8jfy4Pui6MeWOw==} + vue-pivottable@1.0.3: + resolution: {integrity: sha512-0gBrxoCHEAg0wEMaw9lAi+cVA3IUl5zv7L5y3LgY49DYQeNDjTH8iINOmxJdtoQijMbzOyios+9cYn6EDZ0Nrg==} peerDependencies: vue: ^3.2.0 - 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==} + vue@3.5.13: + resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -3122,6 +3202,9 @@ 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'} @@ -3161,6 +3244,14 @@ 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': @@ -3182,10 +3273,10 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@clalarco/vue3-plotly@0.1.5(vue@3.5.15(typescript@5.8.3))': + '@clalarco/vue3-plotly@0.1.5(vue@3.5.13(typescript@5.8.2))': dependencies: plotly.js-dist: 2.35.3 - vue: 3.5.15(typescript@5.8.3) + vue: 3.5.13(typescript@5.8.2) '@colors/colors@1.5.0': optional: true @@ -3193,89 +3284,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.2 + semver: 7.7.1 optionalDependencies: conventional-commits-filter: 5.0.0 conventional-commits-parser: 6.1.0 - '@esbuild/aix-ppc64@0.25.5': + '@esbuild/aix-ppc64@0.25.4': optional: true - '@esbuild/android-arm64@0.25.5': + '@esbuild/android-arm64@0.25.4': optional: true - '@esbuild/android-arm@0.25.5': + '@esbuild/android-arm@0.25.4': optional: true - '@esbuild/android-x64@0.25.5': + '@esbuild/android-x64@0.25.4': optional: true - '@esbuild/darwin-arm64@0.25.5': + '@esbuild/darwin-arm64@0.25.4': optional: true - '@esbuild/darwin-x64@0.25.5': + '@esbuild/darwin-x64@0.25.4': optional: true - '@esbuild/freebsd-arm64@0.25.5': + '@esbuild/freebsd-arm64@0.25.4': optional: true - '@esbuild/freebsd-x64@0.25.5': + '@esbuild/freebsd-x64@0.25.4': optional: true - '@esbuild/linux-arm64@0.25.5': + '@esbuild/linux-arm64@0.25.4': optional: true - '@esbuild/linux-arm@0.25.5': + '@esbuild/linux-arm@0.25.4': optional: true - '@esbuild/linux-ia32@0.25.5': + '@esbuild/linux-ia32@0.25.4': optional: true - '@esbuild/linux-loong64@0.25.5': + '@esbuild/linux-loong64@0.25.4': optional: true - '@esbuild/linux-mips64el@0.25.5': + '@esbuild/linux-mips64el@0.25.4': optional: true - '@esbuild/linux-ppc64@0.25.5': + '@esbuild/linux-ppc64@0.25.4': optional: true - '@esbuild/linux-riscv64@0.25.5': + '@esbuild/linux-riscv64@0.25.4': optional: true - '@esbuild/linux-s390x@0.25.5': + '@esbuild/linux-s390x@0.25.4': optional: true - '@esbuild/linux-x64@0.25.5': + '@esbuild/linux-x64@0.25.4': optional: true - '@esbuild/netbsd-arm64@0.25.5': + '@esbuild/netbsd-arm64@0.25.4': optional: true - '@esbuild/netbsd-x64@0.25.5': + '@esbuild/netbsd-x64@0.25.4': optional: true - '@esbuild/openbsd-arm64@0.25.5': + '@esbuild/openbsd-arm64@0.25.4': optional: true - '@esbuild/openbsd-x64@0.25.5': + '@esbuild/openbsd-x64@0.25.4': optional: true - '@esbuild/sunos-x64@0.25.5': + '@esbuild/sunos-x64@0.25.4': optional: true - '@esbuild/win32-arm64@0.25.5': + '@esbuild/win32-arm64@0.25.4': optional: true - '@esbuild/win32-ia32@0.25.5': + '@esbuild/win32-ia32@0.25.4': optional: true - '@esbuild/win32-x64@0.25.5': + '@esbuild/win32-x64@0.25.4': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@9.27.0)': + '@eslint-community/eslint-utils@4.7.0(eslint@9.26.0)': dependencies: - eslint: 9.27.0 + eslint: 9.26.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -3283,21 +3374,21 @@ snapshots: '@eslint/config-array@0.20.0': dependencies: '@eslint/object-schema': 2.1.6 - debug: 4.4.1 + debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color '@eslint/config-helpers@0.2.2': {} - '@eslint/core@0.14.0': + '@eslint/core@0.13.0': dependencies: '@types/json-schema': 7.0.15 '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.1 + debug: 4.4.0 espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 @@ -3308,13 +3399,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.27.0': {} + '@eslint/js@9.26.0': {} '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.3.1': + '@eslint/plugin-kit@0.2.8': dependencies: - '@eslint/core': 0.14.0 + '@eslint/core': 0.13.0 levn: 0.4.1 '@humanfs/core@0.19.1': {} @@ -3328,7 +3419,7 @@ snapshots: '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.3': {} + '@humanwhocodes/retry@0.4.2': {} '@hutson/parse-repository-url@5.0.0': {} @@ -3343,23 +3434,23 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.0': {} - '@microsoft/api-extractor-model@7.30.6(@types/node@22.15.21)': + '@microsoft/api-extractor-model@7.30.6': dependencies: '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.13.1(@types/node@22.15.21) + '@rushstack/node-core-library': 5.13.1 transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.52.8(@types/node@22.15.21)': + '@microsoft/api-extractor@7.52.7': dependencies: - '@microsoft/api-extractor-model': 7.30.6(@types/node@22.15.21) + '@microsoft/api-extractor-model': 7.30.6 '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.13.1(@types/node@22.15.21) + '@rushstack/node-core-library': 5.13.1 '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.15.3(@types/node@22.15.21) - '@rushstack/ts-command-line': 5.0.1(@types/node@22.15.21) + '@rushstack/terminal': 0.15.3 + '@rushstack/ts-command-line': 5.0.1 lodash: 4.17.21 minimatch: 3.0.8 resolve: 1.22.10 @@ -3378,6 +3469,21 @@ 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 @@ -3390,64 +3496,64 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@octokit/auth-token@6.0.0': {} + '@octokit/auth-token@5.1.2': {} - '@octokit/core@7.0.2': + '@octokit/core@6.1.5': dependencies: - '@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/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/endpoint@11.0.0': + '@octokit/endpoint@10.1.4': dependencies: - '@octokit/types': 14.1.0 - universal-user-agent: 7.0.3 + '@octokit/types': 14.0.0 + universal-user-agent: 7.0.2 - '@octokit/graphql@9.0.1': + '@octokit/graphql@8.2.2': dependencies: - '@octokit/request': 10.0.2 - '@octokit/types': 14.1.0 - universal-user-agent: 7.0.3 + '@octokit/request': 9.2.3 + '@octokit/types': 14.0.0 + universal-user-agent: 7.0.2 - '@octokit/openapi-types@25.1.0': {} + '@octokit/openapi-types@25.0.0': {} - '@octokit/plugin-paginate-rest@13.0.1(@octokit/core@7.0.2)': + '@octokit/plugin-paginate-rest@12.0.0(@octokit/core@6.1.5)': dependencies: - '@octokit/core': 7.0.2 - '@octokit/types': 14.1.0 + '@octokit/core': 6.1.5 + '@octokit/types': 14.0.0 - '@octokit/plugin-retry@8.0.1(@octokit/core@7.0.2)': + '@octokit/plugin-retry@7.2.1(@octokit/core@6.1.5)': dependencies: - '@octokit/core': 7.0.2 - '@octokit/request-error': 7.0.0 - '@octokit/types': 14.1.0 + '@octokit/core': 6.1.5 + '@octokit/request-error': 6.1.8 + '@octokit/types': 14.0.0 bottleneck: 2.19.5 - '@octokit/plugin-throttling@11.0.1(@octokit/core@7.0.2)': + '@octokit/plugin-throttling@10.0.0(@octokit/core@6.1.5)': dependencies: - '@octokit/core': 7.0.2 - '@octokit/types': 14.1.0 + '@octokit/core': 6.1.5 + '@octokit/types': 14.0.0 bottleneck: 2.19.5 - '@octokit/request-error@7.0.0': + '@octokit/request-error@6.1.8': dependencies: - '@octokit/types': 14.1.0 + '@octokit/types': 14.0.0 - '@octokit/request@10.0.2': + '@octokit/request@9.2.3': dependencies: - '@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/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/types@14.1.0': + '@octokit/types@14.0.0': dependencies: - '@octokit/openapi-types': 25.1.0 + '@octokit/openapi-types': 25.0.0 '@pnpm/config.env-replace@1.1.0': {} @@ -3461,77 +3567,77 @@ snapshots: '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 - '@rollup/pluginutils@5.1.4(rollup@4.41.1)': + '@rollup/pluginutils@5.1.4(rollup@4.40.2)': dependencies: '@types/estree': 1.0.7 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: - rollup: 4.41.1 + rollup: 4.40.2 - '@rollup/rollup-android-arm-eabi@4.41.1': + '@rollup/rollup-android-arm-eabi@4.40.2': optional: true - '@rollup/rollup-android-arm64@4.41.1': + '@rollup/rollup-android-arm64@4.40.2': optional: true - '@rollup/rollup-darwin-arm64@4.41.1': + '@rollup/rollup-darwin-arm64@4.40.2': optional: true - '@rollup/rollup-darwin-x64@4.41.1': + '@rollup/rollup-darwin-x64@4.40.2': optional: true - '@rollup/rollup-freebsd-arm64@4.41.1': + '@rollup/rollup-freebsd-arm64@4.40.2': optional: true - '@rollup/rollup-freebsd-x64@4.41.1': + '@rollup/rollup-freebsd-x64@4.40.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.41.1': + '@rollup/rollup-linux-arm-gnueabihf@4.40.2': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.41.1': + '@rollup/rollup-linux-arm-musleabihf@4.40.2': optional: true - '@rollup/rollup-linux-arm64-gnu@4.41.1': + '@rollup/rollup-linux-arm64-gnu@4.40.2': optional: true - '@rollup/rollup-linux-arm64-musl@4.41.1': + '@rollup/rollup-linux-arm64-musl@4.40.2': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.41.1': + '@rollup/rollup-linux-loongarch64-gnu@4.40.2': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.41.1': + '@rollup/rollup-linux-powerpc64le-gnu@4.40.2': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.41.1': + '@rollup/rollup-linux-riscv64-gnu@4.40.2': optional: true - '@rollup/rollup-linux-riscv64-musl@4.41.1': + '@rollup/rollup-linux-riscv64-musl@4.40.2': optional: true - '@rollup/rollup-linux-s390x-gnu@4.41.1': + '@rollup/rollup-linux-s390x-gnu@4.40.2': optional: true - '@rollup/rollup-linux-x64-gnu@4.41.1': + '@rollup/rollup-linux-x64-gnu@4.40.2': optional: true - '@rollup/rollup-linux-x64-musl@4.41.1': + '@rollup/rollup-linux-x64-musl@4.40.2': optional: true - '@rollup/rollup-win32-arm64-msvc@4.41.1': + '@rollup/rollup-win32-arm64-msvc@4.40.2': optional: true - '@rollup/rollup-win32-ia32-msvc@4.41.1': + '@rollup/rollup-win32-ia32-msvc@4.40.2': optional: true - '@rollup/rollup-win32-x64-msvc@4.41.1': + '@rollup/rollup-win32-x64-msvc@4.40.2': optional: true '@rtsao/scc@1.1.0': {} - '@rushstack/node-core-library@5.13.1(@types/node@22.15.21)': + '@rushstack/node-core-library@5.13.1': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -3541,24 +3647,20 @@ 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(@types/node@22.15.21)': + '@rushstack/terminal@0.15.3': dependencies: - '@rushstack/node-core-library': 5.13.1(@types/node@22.15.21) + '@rushstack/node-core-library': 5.13.1 supports-color: 8.1.1 - optionalDependencies: - '@types/node': 22.15.21 - '@rushstack/ts-command-line@5.0.1(@types/node@22.15.21)': + '@rushstack/ts-command-line@5.0.1': dependencies: - '@rushstack/terminal': 0.15.3(@types/node@22.15.21) + '@rushstack/terminal': 0.15.3 '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -3567,25 +3669,25 @@ snapshots: '@sec-ant/readable-stream@0.4.1': {} - '@semantic-release/changelog@6.0.3(semantic-release@24.2.5(typescript@5.8.3))': + '@semantic-release/changelog@6.0.3(semantic-release@24.2.3(typescript@5.8.2))': 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.5(typescript@5.8.3) + 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/commit-analyzer@13.0.1(semantic-release@24.2.3(typescript@5.8.2))': dependencies: conventional-changelog-angular: 8.0.0 - conventional-changelog-writer: 8.1.0 + conventional-changelog-writer: 8.0.1 conventional-commits-filter: 5.0.0 conventional-commits-parser: 6.1.0 - debug: 4.4.1 + debug: 4.4.0 import-from-esm: 2.0.0 lodash-es: 4.17.21 micromatch: 4.0.8 - semantic-release: 24.2.5(typescript@5.8.3) + semantic-release: 24.2.3(typescript@5.8.2) transitivePeerDependencies: - supports-color @@ -3593,29 +3695,29 @@ snapshots: '@semantic-release/error@4.0.0': {} - '@semantic-release/git@10.0.1(semantic-release@24.2.5(typescript@5.8.3))': + '@semantic-release/git@10.0.1(semantic-release@24.2.3(typescript@5.8.2))': dependencies: '@semantic-release/error': 3.0.0 aggregate-error: 3.1.0 - debug: 4.4.1 + debug: 4.4.0 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.5(typescript@5.8.3) + semantic-release: 24.2.3(typescript@5.8.2) transitivePeerDependencies: - supports-color - '@semantic-release/github@11.0.3(semantic-release@24.2.5(typescript@5.8.3))': + '@semantic-release/github@11.0.2(semantic-release@24.2.3(typescript@5.8.2))': dependencies: - '@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) + '@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) '@semantic-release/error': 4.0.0 aggregate-error: 5.0.0 - debug: 4.4.1 + debug: 4.4.0 dir-glob: 3.0.1 globby: 14.1.0 http-proxy-agent: 7.0.2 @@ -3624,16 +3726,16 @@ snapshots: lodash-es: 4.17.21 mime: 4.0.7 p-filter: 4.1.0 - semantic-release: 24.2.5(typescript@5.8.3) + semantic-release: 24.2.3(typescript@5.8.2) url-join: 5.0.0 transitivePeerDependencies: - supports-color - '@semantic-release/npm@12.0.1(semantic-release@24.2.5(typescript@5.8.3))': + '@semantic-release/npm@12.0.1(semantic-release@24.2.3(typescript@5.8.2))': dependencies: '@semantic-release/error': 4.0.0 aggregate-error: 5.0.0 - execa: 9.6.0 + execa: 9.5.2 fs-extra: 11.3.0 lodash-es: 4.17.21 nerf-dart: 1.0.0 @@ -3642,36 +3744,36 @@ snapshots: rc: 1.2.8 read-pkg: 9.0.1 registry-auth-token: 5.1.0 - semantic-release: 24.2.5(typescript@5.8.3) - semver: 7.7.2 + semantic-release: 24.2.3(typescript@5.8.2) + semver: 7.7.1 tempy: 3.1.0 - '@semantic-release/release-notes-generator@14.0.3(semantic-release@24.2.5(typescript@5.8.3))': + '@semantic-release/release-notes-generator@14.0.3(semantic-release@24.2.3(typescript@5.8.2))': dependencies: conventional-changelog-angular: 8.0.0 - conventional-changelog-writer: 8.1.0 + conventional-changelog-writer: 8.0.1 conventional-commits-filter: 5.0.0 conventional-commits-parser: 6.1.0 - debug: 4.4.1 + debug: 4.4.0 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.5(typescript@5.8.3) + semantic-release: 24.2.3(typescript@5.8.2) transitivePeerDependencies: - supports-color - '@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)': + '@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)': dependencies: - '@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) + '@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) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-typescript @@ -3689,10 +3791,10 @@ snapshots: '@sindresorhus/merge-streams@4.0.0': {} - '@stylistic/eslint-plugin@4.4.0(eslint@9.27.0)(typescript@5.8.3)': + '@stylistic/eslint-plugin@4.2.0(eslint@9.26.0)(typescript@5.8.2)': dependencies: - '@typescript-eslint/utils': 8.32.1(eslint@9.27.0)(typescript@5.8.3) - eslint: 9.27.0 + '@typescript-eslint/utils': 8.32.0(eslint@9.26.0)(typescript@5.8.2) + eslint: 9.26.0 eslint-visitor-keys: 4.2.0 espree: 10.3.0 estraverse: 5.3.0 @@ -3709,253 +3811,180 @@ snapshots: '@types/json5@0.0.29': {} - '@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.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/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)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@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 + '@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 graphemer: 1.4.0 - ignore: 7.0.4 + ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@8.33.1(eslint@9.27.0)(typescript@5.8.3)': - dependencies: - '@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 + ts-api-utils: 2.1.0(typescript@5.8.2) + typescript: 5.8.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.33.1(typescript@5.8.3)': + '@typescript-eslint/parser@8.32.0(eslint@9.26.0)(typescript@5.8.2)': 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 + '@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 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.32.1': + '@typescript-eslint/scope-manager@8.32.0': dependencies: - '@typescript-eslint/types': 8.32.1 - '@typescript-eslint/visitor-keys': 8.32.1 + '@typescript-eslint/types': 8.32.0 + '@typescript-eslint/visitor-keys': 8.32.0 - '@typescript-eslint/scope-manager@8.33.1': + '@typescript-eslint/type-utils@8.32.0(eslint@9.26.0)(typescript@5.8.2)': dependencies: - '@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 + '@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 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.32.1': {} - - '@typescript-eslint/types@8.33.1': {} - - '@typescript-eslint/typescript-estree@8.32.1(typescript@5.8.3)': - dependencies: - '@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.2 - 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/typescript-estree@8.33.1(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.32.0(typescript@5.8.2)': dependencies: - '@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 + '@typescript-eslint/types': 8.32.0 + '@typescript-eslint/visitor-keys': 8.32.0 + debug: 4.4.0 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 + semver: 7.7.1 + ts-api-utils: 2.1.0(typescript@5.8.2) + typescript: 5.8.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.33.1(eslint@9.27.0)(typescript@5.8.3)': + '@typescript-eslint/utils@8.32.0(eslint@9.26.0)(typescript@5.8.2)': 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 + '@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 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.32.1': - dependencies: - '@typescript-eslint/types': 8.32.1 - eslint-visitor-keys: 4.2.0 - - '@typescript-eslint/visitor-keys@8.33.1': + '@typescript-eslint/visitor-keys@8.32.0': dependencies: - '@typescript-eslint/types': 8.33.1 + '@typescript-eslint/types': 8.32.0 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))': + '@vitejs/plugin-vue@5.2.3(vite@6.3.5)(vue@3.5.13(typescript@5.8.2))': dependencies: - vite: 6.3.5(@types/node@22.15.21) - vue: 3.5.15(typescript@5.8.3) + vite: 6.3.5 + vue: 3.5.13(typescript@5.8.2) - '@volar/language-core@2.4.14': + '@volar/language-core@2.4.13': dependencies: - '@volar/source-map': 2.4.14 + '@volar/source-map': 2.4.13 - '@volar/source-map@2.4.14': {} + '@volar/source-map@2.4.13': {} - '@volar/typescript@2.4.14': + '@volar/typescript@2.4.13': dependencies: - '@volar/language-core': 2.4.14 + '@volar/language-core': 2.4.13 path-browserify: 1.0.1 vscode-uri: 3.1.0 - '@vue/compiler-core@3.5.15': + '@vue/compiler-core@3.5.13': dependencies: '@babel/parser': 7.27.2 - '@vue/shared': 3.5.15 + '@vue/shared': 3.5.13 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.5.15': + '@vue/compiler-dom@3.5.13': dependencies: - '@vue/compiler-core': 3.5.15 - '@vue/shared': 3.5.15 + '@vue/compiler-core': 3.5.13 + '@vue/shared': 3.5.13 - '@vue/compiler-sfc@3.5.15': + '@vue/compiler-sfc@3.5.13': dependencies: '@babel/parser': 7.27.2 - '@vue/compiler-core': 3.5.15 - '@vue/compiler-dom': 3.5.15 - '@vue/compiler-ssr': 3.5.15 - '@vue/shared': 3.5.15 + '@vue/compiler-core': 3.5.13 + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 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.15': + '@vue/compiler-ssr@3.5.13': dependencies: - '@vue/compiler-dom': 3.5.15 - '@vue/shared': 3.5.15 + '@vue/compiler-dom': 3.5.13 + '@vue/shared': 3.5.13 '@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.3)': + '@vue/language-core@2.2.0(typescript@5.8.2)': dependencies: - '@volar/language-core': 2.4.14 - '@vue/compiler-dom': 3.5.15 + '@volar/language-core': 2.4.13 + '@vue/compiler-dom': 3.5.13 '@vue/compiler-vue2': 2.7.16 - '@vue/shared': 3.5.15 + '@vue/shared': 3.5.13 alien-signals: 0.4.14 minimatch: 9.0.5 muggle-string: 0.4.1 path-browserify: 1.0.1 optionalDependencies: - typescript: 5.8.3 - - '@vue/language-core@2.2.10(typescript@5.8.3)': - dependencies: - '@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 + typescript: 5.8.2 - '@vue/reactivity@3.5.15': + '@vue/reactivity@3.5.13': dependencies: - '@vue/shared': 3.5.15 + '@vue/shared': 3.5.13 - '@vue/runtime-core@3.5.15': + '@vue/runtime-core@3.5.13': dependencies: - '@vue/reactivity': 3.5.15 - '@vue/shared': 3.5.15 + '@vue/reactivity': 3.5.13 + '@vue/shared': 3.5.13 - '@vue/runtime-dom@3.5.15': + '@vue/runtime-dom@3.5.13': dependencies: - '@vue/reactivity': 3.5.15 - '@vue/runtime-core': 3.5.15 - '@vue/shared': 3.5.15 + '@vue/reactivity': 3.5.13 + '@vue/runtime-core': 3.5.13 + '@vue/shared': 3.5.13 csstype: 3.1.3 - '@vue/server-renderer@3.5.15(vue@3.5.15(typescript@5.8.3))': + '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.8.2))': dependencies: - '@vue/compiler-ssr': 3.5.15 - '@vue/shared': 3.5.15 - vue: 3.5.15(typescript@5.8.3) + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + vue: 3.5.13(typescript@5.8.2) - '@vue/shared@3.5.15': {} + '@vue/shared@3.5.13': {} - '@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) + accepts@2.0.0: + dependencies: + mime-types: 3.0.1 + negotiator: 1.0.0 acorn-jsx@5.3.2(acorn@8.14.1): dependencies: @@ -4008,8 +4037,6 @@ snapshots: alien-signals@0.4.14: {} - alien-signals@1.0.13: {} - ansi-escapes@7.0.0: dependencies: environment: 1.1.0 @@ -4054,7 +4081,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.23.9 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 is-string: 1.1.1 @@ -4064,7 +4091,7 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 @@ -4073,14 +4100,14 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.23.9 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.10 + es-abstract: 1.23.9 es-shim-unscopables: 1.1.0 arraybuffer.prototype.slice@1.0.4: @@ -4088,7 +4115,7 @@ snapshots: array-buffer-byte-length: 1.0.2 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.23.9 es-errors: 1.3.0 get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 @@ -4101,10 +4128,24 @@ snapshots: balanced-match@1.0.2: {} - before-after-hook@4.0.0: {} + before-after-hook@3.0.2: {} binary-extensions@2.3.0: {} + 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 + boolbase@1.0.0: {} bottleneck@2.19.5: {} @@ -4122,6 +4163,8 @@ snapshots: dependencies: fill-range: 7.1.1 + bytes@3.1.2: {} + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -4241,6 +4284,12 @@ 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 @@ -4266,7 +4315,7 @@ snapshots: dependencies: '@hutson/parse-repository-url': 5.0.0 add-stream: 1.0.0 - conventional-changelog-writer: 8.1.0 + conventional-changelog-writer: 8.0.1 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) @@ -4291,12 +4340,12 @@ snapshots: conventional-changelog-preset-loader@5.0.0: {} - conventional-changelog-writer@8.1.0: + conventional-changelog-writer@8.0.1: dependencies: conventional-commits-filter: 5.0.0 handlebars: 4.7.8 meow: 13.2.0 - semver: 7.7.2 + semver: 7.7.1 conventional-changelog@6.0.0(conventional-commits-filter@5.0.0): dependencies: @@ -4322,16 +4371,25 @@ snapshots: convert-hrtime@5.0.0: {} + cookie-signature@1.2.2: {} + + cookie@0.7.2: {} + core-util-is@1.0.3: {} - cosmiconfig@9.0.0(typescript@5.8.3): + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + cosmiconfig@9.0.0(typescript@5.8.2): 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.3 + typescript: 5.8.2 cross-spawn@7.0.6: dependencies: @@ -4371,7 +4429,7 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.4.1: + debug@4.4.0: dependencies: ms: 2.1.3 @@ -4391,6 +4449,8 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 + depd@2.0.0: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -4415,20 +4475,24 @@ 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.2 + tapable: 2.2.1 entities@4.5.0: {} - env-ci@11.1.1: + env-ci@11.1.0: dependencies: execa: 8.0.1 java-properties: 1.0.2 @@ -4441,7 +4505,7 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-abstract@1.23.10: + es-abstract@1.23.9: dependencies: array-buffer-byte-length: 1.0.2 arraybuffer.prototype.slice: 1.0.4 @@ -4520,46 +4584,48 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild@0.25.5: + esbuild@0.25.4: optionalDependencies: - '@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 + '@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 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.27.0): + eslint-compat-utils@0.5.1(eslint@9.26.0): dependencies: - eslint: 9.27.0 - semver: 7.7.2 + eslint: 9.26.0 + semver: 7.7.1 eslint-import-resolver-node@0.3.9: dependencies: @@ -4569,24 +4635,24 @@ snapshots: transitivePeerDependencies: - supports-color - 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): + 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): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.33.1(eslint@9.27.0)(typescript@5.8.3) - eslint: 9.27.0 + '@typescript-eslint/parser': 8.32.0(eslint@9.26.0)(typescript@5.8.2) + eslint: 9.26.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-es-x@7.8.0(eslint@9.27.0): + eslint-plugin-es-x@7.8.0(eslint@9.26.0): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0) '@eslint-community/regexpp': 4.12.1 - eslint: 9.27.0 - eslint-compat-utils: 0.5.1(eslint@9.27.0) + eslint: 9.26.0 + eslint-compat-utils: 0.5.1(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): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0)(typescript@5.8.2))(eslint@9.26.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -4595,9 +4661,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.27.0 + eslint: 9.26.0 eslint-import-resolver-node: 0.3.9 - 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) + 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) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -4609,39 +4675,39 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.33.1(eslint@9.27.0)(typescript@5.8.3) + '@typescript-eslint/parser': 8.32.0(eslint@9.26.0)(typescript@5.8.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-n@17.18.0(eslint@9.27.0): + eslint-plugin-n@17.17.0(eslint@9.26.0): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0) enhanced-resolve: 5.18.1 - eslint: 9.27.0 - eslint-plugin-es-x: 7.8.0(eslint@9.27.0) - get-tsconfig: 4.10.1 + eslint: 9.26.0 + eslint-plugin-es-x: 7.8.0(eslint@9.26.0) + get-tsconfig: 4.10.0 globals: 15.15.0 ignore: 5.3.2 minimatch: 9.0.5 - semver: 7.7.2 + semver: 7.7.1 - eslint-plugin-promise@7.2.1(eslint@9.27.0): + eslint-plugin-promise@7.2.1(eslint@9.26.0): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0) - eslint: 9.27.0 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0) + eslint: 9.26.0 - eslint-plugin-vue@9.33.0(eslint@9.27.0): + eslint-plugin-vue@9.33.0(eslint@9.26.0): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0) - eslint: 9.27.0 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0) + eslint: 9.26.0 globals: 13.24.0 natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.1.2 - semver: 7.7.2 - vue-eslint-parser: 9.4.3(eslint@9.27.0) + semver: 7.7.1 + vue-eslint-parser: 9.4.3(eslint@9.26.0) xml-name-validator: 4.0.0 transitivePeerDependencies: - supports-color @@ -4660,25 +4726,26 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.27.0: + eslint@9.26.0: dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.20.0 '@eslint/config-helpers': 0.2.2 - '@eslint/core': 0.14.0 + '@eslint/core': 0.13.0 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.27.0 - '@eslint/plugin-kit': 0.3.1 + '@eslint/js': 9.26.0 + '@eslint/plugin-kit': 0.2.8 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.3 + '@humanwhocodes/retry': 0.4.2 + '@modelcontextprotocol/sdk': 1.11.0 '@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.1 + debug: 4.4.0 escape-string-regexp: 4.0.0 eslint-scope: 8.3.0 eslint-visitor-keys: 4.2.0 @@ -4697,6 +4764,7 @@ snapshots: minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 + zod: 3.24.4 transitivePeerDependencies: - supports-color @@ -4726,6 +4794,14 @@ 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 @@ -4750,7 +4826,7 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 - execa@9.6.0: + execa@9.5.2: dependencies: '@sindresorhus/merge-streams': 4.0.0 cross-spawn: 7.0.6 @@ -4765,9 +4841,45 @@ 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@3.0.0: {} + fast-content-type-parse@2.0.1: {} fast-deep-equal@3.1.3: {} @@ -4807,6 +4919,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: @@ -4839,6 +4962,10 @@ 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 @@ -4905,7 +5032,7 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 - get-tsconfig@4.10.1: + get-tsconfig@4.10.0: dependencies: resolve-pkg-maps: 1.0.0 @@ -4945,7 +5072,7 @@ snapshots: glob@11.0.2: dependencies: foreground-child: 3.3.1 - jackspeak: 4.1.1 + jackspeak: 4.1.0 minimatch: 10.0.1 minipass: 7.1.2 package-json-from-dist: 1.0.1 @@ -4959,7 +5086,7 @@ snapshots: globals@15.15.0: {} - globals@16.2.0: {} + globals@16.0.0: {} globalthis@1.0.4: dependencies: @@ -5030,17 +5157,25 @@ 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.1 + debug: 4.4.0 transitivePeerDependencies: - supports-color https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 - debug: 4.4.1 + debug: 4.4.0 transitivePeerDependencies: - supports-color @@ -5050,6 +5185,10 @@ snapshots: human-signals@8.0.1: {} + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + ignore@5.3.2: {} ignore@7.0.4: {} @@ -5061,7 +5200,7 @@ snapshots: import-from-esm@2.0.0: dependencies: - debug: 4.4.1 + debug: 4.4.0 import-meta-resolve: 4.1.0 transitivePeerDependencies: - supports-color @@ -5093,6 +5232,8 @@ 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 @@ -5171,6 +5312,8 @@ snapshots: is-plain-obj@4.1.0: {} + is-promise@4.0.0: {} + is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -5232,7 +5375,7 @@ snapshots: lodash.isstring: 4.0.1 lodash.uniqby: 4.7.0 - jackspeak@4.1.1: + jackspeak@4.1.0: dependencies: '@isaacs/cliui': 8.0.2 @@ -5331,23 +5474,27 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - marked-terminal@7.3.0(marked@15.0.12): + marked-terminal@7.3.0(marked@12.0.2): 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: 15.0.12 + marked: 12.0.2 node-emoji: 2.2.0 supports-hyperlinks: 3.2.0 - marked@15.0.12: {} + marked@12.0.2: {} 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: {} @@ -5357,6 +5504,12 @@ 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: {} @@ -5404,6 +5557,8 @@ snapshots: natural-compare@1.4.0: {} + negotiator@1.0.0: {} + neo-async@2.6.2: {} nerf-dart@1.0.0: {} @@ -5418,7 +5573,7 @@ snapshots: normalize-package-data@6.0.2: dependencies: hosted-git-info: 7.0.2 - semver: 7.7.2 + semver: 7.7.1 validate-npm-package-license: 3.0.4 normalize-path@3.0.0: {} @@ -5463,14 +5618,14 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.23.9 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.10 + es-abstract: 1.23.9 object.values@1.2.1: dependencies: @@ -5479,6 +5634,14 @@ 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 @@ -5536,7 +5699,7 @@ snapshots: package-json-from-dist@1.0.1: {} - papaparse@5.5.3: {} + papaparse@5.5.2: {} parent-module@1.0.1: dependencies: @@ -5570,6 +5733,8 @@ snapshots: parse5@6.0.1: {} + parseurl@1.3.3: {} + path-browserify@1.0.1: {} path-exists@3.0.0: {} @@ -5587,6 +5752,8 @@ 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: {} @@ -5601,6 +5768,8 @@ snapshots: pify@3.0.0: {} + pkce-challenge@5.0.0: {} + pkg-conf@2.1.0: dependencies: find-up: 2.1.0 @@ -5647,12 +5816,30 @@ 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 @@ -5692,7 +5879,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -5735,32 +5922,42 @@ snapshots: glob: 11.0.2 package-json-from-dist: 1.0.1 - rollup@4.41.1: + rollup@4.40.2: dependencies: '@types/estree': 1.0.7 optionalDependencies: - '@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 + '@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 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 @@ -5779,6 +5976,8 @@ snapshots: safe-buffer@5.1.2: {} + safe-buffer@5.2.1: {} + safe-push-apply@1.0.0: dependencies: es-errors: 1.3.0 @@ -5790,18 +5989,20 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 - semantic-release@24.2.5(typescript@5.8.3): + safer-buffer@2.1.2: {} + + semantic-release@24.2.3(typescript@5.8.2): dependencies: - '@semantic-release/commit-analyzer': 13.0.1(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/error': 4.0.0 - '@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)) + '@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)) aggregate-error: 5.0.0 - cosmiconfig: 9.0.0(typescript@5.8.3) - debug: 4.4.1 - env-ci: 11.1.1 - execa: 9.6.0 + cosmiconfig: 9.0.0(typescript@5.8.2) + debug: 4.4.0 + env-ci: 11.1.0 + execa: 9.5.2 figures: 6.1.0 find-versions: 6.0.0 get-stream: 6.0.1 @@ -5810,14 +6011,14 @@ snapshots: hosted-git-info: 8.1.0 import-from-esm: 2.0.0 lodash-es: 4.17.21 - marked: 15.0.12 - marked-terminal: 7.3.0(marked@15.0.12) + marked: 12.0.2 + marked-terminal: 7.3.0(marked@12.0.2) 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.2 + semver: 7.7.1 semver-diff: 4.0.0 signale: 1.4.0 yargs: 17.7.2 @@ -5827,7 +6028,7 @@ snapshots: semver-diff@4.0.0: dependencies: - semver: 7.7.2 + semver: 7.7.1 semver-regex@4.0.5: {} @@ -5837,7 +6038,32 @@ snapshots: dependencies: lru-cache: 6.0.0 - semver@7.7.2: {} + 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 set-function-length@1.2.2: dependencies: @@ -5861,6 +6087,8 @@ 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 @@ -5941,6 +6169,8 @@ snapshots: sprintf-js@1.0.3: {} + statuses@2.0.1: {} + stream-combiner2@1.1.1: dependencies: duplexer2: 0.1.4 @@ -5966,7 +6196,7 @@ snapshots: call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.23.9 es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 @@ -6031,7 +6261,7 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - tapable@2.2.2: {} + tapable@2.2.1: {} temp-dir@3.0.0: {} @@ -6063,7 +6293,7 @@ snapshots: dependencies: convert-hrtime: 5.0.0 - tinyglobby@0.2.14: + tinyglobby@0.2.13: dependencies: fdir: 6.4.4(picomatch@4.0.2) picomatch: 4.0.2 @@ -6072,13 +6302,15 @@ snapshots: 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.3): + ts-api-utils@2.1.0(typescript@5.8.2): dependencies: - typescript: 5.8.3 + typescript: 5.8.2 tsconfig-paths@3.15.0: dependencies: @@ -6101,6 +6333,12 @@ 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 @@ -6134,20 +6372,18 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.33.1(eslint@9.27.0)(typescript@5.8.3): + typescript-eslint@8.32.0(eslint@9.26.0)(typescript@5.8.2): dependencies: - '@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 + '@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 transitivePeerDependencies: - supports-color typescript@5.8.2: {} - typescript@5.8.3: {} - ufo@1.6.1: {} uglify-js@3.19.3: @@ -6160,8 +6396,6 @@ 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: {} @@ -6172,10 +6406,12 @@ snapshots: dependencies: crypto-random-string: 4.0.0 - universal-user-agent@7.0.3: {} + universal-user-agent@7.0.2: {} universalify@2.0.1: {} + unpipe@1.0.0: {} + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -6189,95 +6425,90 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - 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)): + vary@1.1.2: {} + + vite-plugin-dts@4.5.3(rollup@4.40.2)(typescript@5.8.2)(vite@6.3.5): dependencies: - '@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) + '@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) compare-versions: 6.1.1 - debug: 4.4.1 + debug: 4.4.0 kolorist: 1.8.0 local-pkg: 1.1.1 magic-string: 0.30.17 - typescript: 5.8.3 + typescript: 5.8.2 optionalDependencies: - vite: 6.3.5(@types/node@22.15.21) + vite: 6.3.5 transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-static-copy@2.3.1(vite@6.3.5(@types/node@22.15.21)): + vite-plugin-static-copy@2.3.1(vite@6.3.5): 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(@types/node@22.15.21) + vite: 6.3.5 - vite@6.3.5(@types/node@22.15.21): + vite@6.3.5: dependencies: - esbuild: 0.25.5 + esbuild: 0.25.4 fdir: 6.4.4(picomatch@4.0.2) picomatch: 4.0.2 postcss: 8.5.3 - rollup: 4.41.1 - tinyglobby: 0.2.14 + rollup: 4.40.2 + tinyglobby: 0.2.13 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.15(typescript@5.8.3)): + vue-draggable-next@2.2.1(sortablejs@1.15.6)(vue@3.5.13(typescript@5.8.2)): dependencies: sortablejs: 1.15.6 - vue: 3.5.15(typescript@5.8.3) + vue: 3.5.13(typescript@5.8.2) - vue-eslint-parser@9.4.3(eslint@9.27.0): + vue-eslint-parser@9.4.3(eslint@9.26.0): dependencies: - debug: 4.4.1 - eslint: 9.27.0 + debug: 4.4.0 + eslint: 9.26.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.2 + semver: 7.7.1 transitivePeerDependencies: - supports-color - vue-pivottable@1.0.1(sortablejs@1.15.6)(vue@3.5.15(typescript@5.8.3)): + vue-pivottable@1.0.1(sortablejs@1.15.6)(vue@3.5.13(typescript@5.8.2)): dependencies: - 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)) + 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)) transitivePeerDependencies: - sortablejs - vue-pivottable@1.0.15(sortablejs@1.15.6)(vue@3.5.15(typescript@5.8.3)): + vue-pivottable@1.0.3(sortablejs@1.15.6)(vue@3.5.13(typescript@5.8.2)): dependencies: - 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)) + 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)) transitivePeerDependencies: - sortablejs - vue-tsc@2.2.10(typescript@5.8.3): - dependencies: - '@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): + vue@3.5.13(typescript@5.8.2): 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 + '@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 optionalDependencies: - typescript: 5.8.3 + typescript: 5.8.2 which-boxed-primitive@1.1.1: dependencies: @@ -6340,6 +6571,8 @@ 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: {} @@ -6375,3 +6608,9 @@ 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/src/App.vue b/src/App.vue index ef886f0..333656d 100644 --- a/src/App.vue +++ b/src/App.vue @@ -111,7 +111,7 @@ const sorters = ref({ const vals = ref(['Tip']) const rendererName = ref('Table') -const onDataParsed = () => { +const onDataParsed = (data) => { rows.value = [] cols.value = [] vals.value = [] diff --git a/src/components/index.ts b/src/components/index.js similarity index 100% rename from src/components/index.ts rename to src/components/index.js diff --git a/src/components/pivottable-ui/VAggregatorCell.vue b/src/components/pivottable-ui/VAggregatorCell.vue index ab1f50c..7f8bec7 100644 --- a/src/components/pivottable-ui/VAggregatorCell.vue +++ b/src/components/pivottable-ui/VAggregatorCell.vue @@ -27,7 +27,7 @@ - diff --git a/src/components/pivottable-ui/VFilterBox.vue b/src/components/pivottable-ui/VFilterBox.vue index a42d3c5..9ed7fb8 100644 --- a/src/components/pivottable-ui/VFilterBox.vue +++ b/src/components/pivottable-ui/VFilterBox.vue @@ -62,96 +62,85 @@ - diff --git a/src/components/pivottable/VPivottable.vue b/src/components/pivottable/VPivottable.vue index 8370858..7f1c6fe 100644 --- a/src/components/pivottable/VPivottable.vue +++ b/src/components/pivottable/VPivottable.vue @@ -5,12 +5,13 @@ /> - diff --git a/src/components/pivottable/VPivottableHeaderColumns.vue b/src/components/pivottable/VPivottableHeaderColumns.vue index 0e4de8b..cde5525 100644 --- a/src/components/pivottable/VPivottableHeaderColumns.vue +++ b/src/components/pivottable/VPivottableHeaderColumns.vue @@ -14,16 +14,27 @@ - diff --git a/src/components/pivottable/VPivottableHeaderRows.vue b/src/components/pivottable/VPivottableHeaderRows.vue index d359ff7..3a75650 100644 --- a/src/components/pivottable/VPivottableHeaderRows.vue +++ b/src/components/pivottable/VPivottableHeaderRows.vue @@ -9,23 +9,30 @@ - {{ colAttrsLength === 0 && showRowTotal ? languagePack?.totals : null }} + {{ colAttrsLength === 0 && rowTotal ? localeStrings.totals : null }} - diff --git a/src/components/pivottable/VPivottableHeaderRowsTotal.vue b/src/components/pivottable/VPivottableHeaderRowsTotal.vue index 309b55a..cf11427 100644 --- a/src/components/pivottable/VPivottableHeaderRowsTotal.vue +++ b/src/components/pivottable/VPivottableHeaderRowsTotal.vue @@ -3,20 +3,23 @@ class="pvtTotalLabel" :rowSpan="colAttrsLength + (rowAttrsLength === 0 ? 0 : 1)" > - {{ languagePack?.totals }} + {{ localeStrings.totals }} - diff --git a/src/components/pivottable/renderer/TSVExportRenderers.vue b/src/components/pivottable/renderer/TSVExportRenderers.vue index c6e66a4..90f876a 100644 --- a/src/components/pivottable/renderer/TSVExportRenderers.vue +++ b/src/components/pivottable/renderer/TSVExportRenderers.vue @@ -6,13 +6,22 @@ /> - diff --git a/src/components/pivottable/renderer/index.ts b/src/components/pivottable/renderer/index.js similarity index 65% rename from src/components/pivottable/renderer/index.ts rename to src/components/pivottable/renderer/index.js index 3ab53e9..ab2905d 100644 --- a/src/components/pivottable/renderer/index.ts +++ b/src/components/pivottable/renderer/index.js @@ -1,21 +1,26 @@ import { h, markRaw } from 'vue' -import { RendererProps } from '@/types' import TableRenderer from './TableRenderer.vue' import TSVExportRenderers from './TSVExportRenderers.vue' +import { defaultProps } from '@/helper' +// 컴포넌트 팩토리 함수 생성 - defineComponent 사용하지 않음 const tableComponents = markRaw({ 'Table': { name: 'VueTable', - setup (props: RendererProps) { + setup(props) { return () => - h(TableRenderer, props) + h(TableRenderer, { + ...defaultProps, + ...props + }) } }, 'Table Heatmap': { name: 'VueTableHeatmap', - setup (props: RendererProps) { + setup(props) { return () => h(TableRenderer, { + ...defaultProps, ...props, heatmapMode: 'full' }) @@ -23,9 +28,10 @@ const tableComponents = markRaw({ }, 'Table Col Heatmap': { name: 'VueTableColHeatmap', - setup (props: RendererProps) { + setup(props) { return () => h(TableRenderer, { + ...defaultProps, ...props, heatmapMode: 'col' }) @@ -33,9 +39,10 @@ const tableComponents = markRaw({ }, 'Table Row Heatmap': { name: 'VueTableRowHeatmap', - setup (props: RendererProps) { + setup(props) { return () => h(TableRenderer, { + ...defaultProps, ...props, heatmapMode: 'row' }) @@ -43,9 +50,12 @@ const tableComponents = markRaw({ }, 'Export Table TSV': { name: 'TsvExportRenderers', - setup (props: RendererProps) { + setup(props) { return () => - h(TSVExportRenderers, props) + h(TSVExportRenderers, { + ...defaultProps, + ...props + }) } } }) diff --git a/src/composables/index.ts b/src/composables/index.js similarity index 87% rename from src/composables/index.ts rename to src/composables/index.js index 7232b5b..deb4db6 100644 --- a/src/composables/index.ts +++ b/src/composables/index.js @@ -3,4 +3,3 @@ 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.js similarity index 56% rename from src/composables/useMaterializeInput.ts rename to src/composables/useMaterializeInput.js index 618f4e7..3f723f3 100644 --- a/src/composables/useMaterializeInput.ts +++ b/src/composables/useMaterializeInput.js @@ -1,38 +1,24 @@ -import { Ref, ref, watch } from 'vue' -import { PivotData } from '@/helper' +import { ref, watch } from 'vue' +import { PivotData } from '@/helper/utilities.js' -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, options) { + const rawData = ref(null) + const allFilters = ref({}) + const materializedInput = ref([]) -export function useMaterializeInput ( - dataSource: Ref, - options: UseMaterializeInputOptions -): UseMaterializeInputReturn { - const rawData = ref(null) - const allFilters = ref>>({}) - const materializedInput = ref([]) - - function processData (data: any) { + function processData(data) { if (!data || rawData.value === data) return rawData.value = data - const newAllFilters: Record> = {} - const newMaterializedInput: any[] = [] + const newAllFilters = {} + const newMaterializedInput = [] let recordsProcessed = 0 PivotData.forEachRecord( data, options.derivedAttributes.value, - function (record: Record) { + function (record) { newMaterializedInput.push(record) for (const attr of Object.keys(record)) { @@ -80,4 +66,4 @@ export function useMaterializeInput ( materializedInput, processData } -} \ No newline at end of file +} diff --git a/src/composables/usePivotData.ts b/src/composables/usePivotData.ts deleted file mode 100644 index 114c7b9..0000000 --- a/src/composables/usePivotData.ts +++ /dev/null @@ -1,18 +0,0 @@ -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.js b/src/composables/usePivotUiState.js new file mode 100644 index 0000000..f48c80c --- /dev/null +++ b/src/composables/usePivotUiState.js @@ -0,0 +1,30 @@ +import { reactive } from 'vue' + +export function usePivotUiState() { + const pivotUiState = reactive({ + unusedOrder: [], + zIndices: {}, + maxZIndex: 1000, + openStatus: {} + }) + + const onMoveFilterBoxToTop = (attributeName) => { + pivotUiState.maxZIndex++ + pivotUiState.zIndices[attributeName] = pivotUiState.maxZIndex + } + + const onUpdateOpenStatus = ({ key, value }) => { + pivotUiState.openStatus[key] = value + } + + const onUpdateUnusedOrder = (newOrder) => { + pivotUiState.unusedOrder = newOrder + } + + return { + state: pivotUiState, + onMoveFilterBoxToTop, + onUpdateOpenStatus, + onUpdateUnusedOrder + } +} diff --git a/src/composables/usePivotUiState.ts b/src/composables/usePivotUiState.ts deleted file mode 100644 index 03d4f2e..0000000 --- a/src/composables/usePivotUiState.ts +++ /dev/null @@ -1,43 +0,0 @@ -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.js b/src/composables/usePropsState.js new file mode 100644 index 0000000..4d1ec32 --- /dev/null +++ b/src/composables/usePropsState.js @@ -0,0 +1,72 @@ +import { computed, reactive } from 'vue' + +export function usePropsState(initialProps) { + const state = reactive({ + ...initialProps + }) + const localeStrings = computed( + () => initialProps.languagePack[initialProps.locale].localeStrings + ) + const updateState = (key, value) => { + if (key in state) { + state[key] = value + } + } + + const updateMultiple = (updates) => { + Object.entries(updates).forEach(([key, value]) => { + if (key in state) { + state[key] = value + } + }) + } + const onUpdateValueFilter = ({ key, value }) => { + updateState('valueFilter', { + ...state.valueFilter, + [key]: value + }) + } + + const onUpdateRendererName = (rendererName) => { + updateState('rendererName', rendererName) + if (rendererName === 'Table Heatmap') { + updateState('heatmapMode', 'full') + } else if (rendererName === 'Table Row Heatmap') { + updateState('heatmapMode', 'row') + } else if (rendererName === 'Table Col Heatmap') { + updateState('heatmapMode', 'col') + } else { + updateState('heatmapMode', '') + } + } + + const onUpdateAggregatorName = (aggregatorName) => { + updateState('aggregatorName', aggregatorName) + } + const onUpdateRowOrder = (rowOrder) => { + updateState('rowOrder', rowOrder) + } + const onUpdateColOrder = (colOrder) => { + updateState('colOrder', colOrder) + } + const onUpdateVals = (vals) => { + updateState('vals', vals) + } + const onDraggedAttribute = ({ key, value }) => { + updateState(key, value) + } + + return { + state, + localeStrings, + updateState, + updateMultiple, + onUpdateValueFilter, + onUpdateRendererName, + onUpdateAggregatorName, + onUpdateRowOrder, + onUpdateColOrder, + onUpdateVals, + onDraggedAttribute + } +} diff --git a/src/composables/usePropsState.ts b/src/composables/usePropsState.ts deleted file mode 100644 index f6bb10f..0000000 --- a/src/composables/usePropsState.ts +++ /dev/null @@ -1,95 +0,0 @@ -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.js b/src/composables/useProvideFilterbox.js new file mode 100644 index 0000000..21b44e7 --- /dev/null +++ b/src/composables/useProvideFilterbox.js @@ -0,0 +1,21 @@ +import { computed, inject, provide } from 'vue' +import { getSort } from '../helper/utilities' +const filterBoxKey = Symbol('filterBox') + +export function provideFilterBox(props) { + const localeStrings = computed( + () => props.languagePack[props.locale].localeStrings + ) + const sorters = computed(() => props.sorters) + const sorter = (x) => 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/useProvideFilterbox.ts b/src/composables/useProvideFilterbox.ts deleted file mode 100644 index 812e1be..0000000 --- a/src/composables/useProvideFilterbox.ts +++ /dev/null @@ -1,36 +0,0 @@ -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.js b/src/composables/useProvidePivotData.js new file mode 100644 index 0000000..1484d22 --- /dev/null +++ b/src/composables/useProvidePivotData.js @@ -0,0 +1,136 @@ +import { ref, provide, inject, computed } from 'vue' +import { PivotData } from '@/helper' + +const PIVOT_DATA_KEY = Symbol('pivotData') + +export function providePivotData(props) { + 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 + } + }) + + 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, colKey) => + 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, r) => { + return acc.concat(colKeys.value.map((c) => getAggregator(r, c).value())) + }, []) + return colorScaleGenerator(values) + }) + const rowColorScales = computed(() => + rowKeys.value.reduce((scales, r) => { + scales[r] = colorScaleGenerator( + colKeys.value.map((x) => getAggregator(r, x).value()) + ) + return scales + }, {}) + ) + const colColorScales = computed(() => + colKeys.value.reduce((scales, c) => { + scales[c] = colorScaleGenerator( + rowKeys.value.map((x) => getAggregator(x, c).value()) + ) + return scales + }, {}) + ) + + const valueCellColors = (rowKey, colKey, value) => { + if (props.heatmapMode === 'full') { + return allColorScales.value(value) + } else if (props.heatmapMode === 'row') { + return rowColorScales.value[rowKey](value) + } else if (props.heatmapMode === 'col') { + return colColorScales.value[colKey](value) + } + return {} + } + const rowTotalValues = colKeys.value.map((x) => getAggregator([], x).value()) + const rowTotalColors = (value) => { + if (!props.heatmapMode) return {} + + return colorScaleGenerator(rowTotalValues)(value) + } + const colTotalValues = rowKeys.value.map((x) => getAggregator(x, []).value()) + const colTotalColors = (value) => { + if (!props.heatmapMode) return {} + + return colorScaleGenerator(colTotalValues)(value) + } + + const spanSize = (arr, i, j) => { + 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 = { + pivotData, + rowKeys, + colKeys, + colAttrs, + rowAttrs, + getAggregator, + grandTotalAggregator, + spanSize, + valueCellColors, + rowTotalColors, + colTotalColors, + error + } + + provide(PIVOT_DATA_KEY, pivotDataContext) + return pivotDataContext +} + +export function useProvidePivotData() { + return inject(PIVOT_DATA_KEY) +} diff --git a/src/composables/useProvidePivotData.ts b/src/composables/useProvidePivotData.ts deleted file mode 100644 index 80e30da..0000000 --- a/src/composables/useProvidePivotData.ts +++ /dev/null @@ -1,147 +0,0 @@ -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.js b/src/helper/defaultProps.js new file mode 100644 index 0000000..ef23453 --- /dev/null +++ b/src/helper/defaultProps.js @@ -0,0 +1,94 @@ +import { aggregators, locales } from './utilities' +import { redColorScaleGenerator } from './redColorScaleGenerator' +export default { + data: { + type: [Array, Object, Function], + required: true + }, + aggregators: { + type: Object, + default: () => aggregators + }, + aggregatorName: { + type: String, + default: 'Count' + }, + heatmapMode: String, + tableColorScaleGenerator: { + type: Function, + default: redColorScaleGenerator + }, + tableOptions: { + type: Object, + default: () => ({}) + }, + renderers: { + type: Object, + default: () => ({}) + }, + rendererName: { + type: String, + default: 'Table' + }, + locale: { + type: String, + default: 'en' + }, + languagePack: { + type: Object, + default: () => locales + }, + showRowTotal: { + type: Boolean, + default: true + }, + showColTotal: { + type: Boolean, + default: true + }, + cols: { + type: Array, + default: () => [] + }, + rows: { + type: Array, + default: () => [] + }, + vals: { + type: Array, + default: () => [] + }, + attributes: { + type: Array, + default: () => [] + }, + valueFilter: { + type: Object, + default: () => ({}) + }, + sorters: { + type: [Function, Object], + default: () => ({}) + }, + derivedAttributes: { + type: [Function, Object], + default: () => ({}) + }, + rowOrder: { + type: String, + default: 'key_a_to_z', + validator: (value) => + ['key_a_to_z', 'value_a_to_z', 'value_z_to_a'].indexOf(value) !== -1 + }, + colOrder: { + type: String, + default: 'key_a_to_z', + validator: (value) => + ['key_a_to_z', 'value_a_to_z', 'value_z_to_a'].indexOf(value) !== -1 + }, + tableMaxWidth: { + type: Number, + default: 0, + validator: (value) => value >= 0 + } +} diff --git a/src/helper/defaultProps.ts b/src/helper/defaultProps.ts deleted file mode 100644 index e0be8fe..0000000 --- a/src/helper/defaultProps.ts +++ /dev/null @@ -1,96 +0,0 @@ -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.js b/src/helper/index.js new file mode 100644 index 0000000..295a076 --- /dev/null +++ b/src/helper/index.js @@ -0,0 +1,3 @@ +export { default as defaultProps } from './defaultProps.js' +export { redColorScaleGenerator } from './redColorScaleGenerator.js' +export * from './utilities.js' diff --git a/src/helper/index.ts b/src/helper/index.ts deleted file mode 100644 index 2521a50..0000000 --- a/src/helper/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './utilities' -export { default as defaultProps } from './defaultProps' -export { redColorScaleGenerator } from './redColorScaleGenerator' diff --git a/src/helper/redColorScaleGenerator.js b/src/helper/redColorScaleGenerator.js new file mode 100644 index 0000000..3cfb87a --- /dev/null +++ b/src/helper/redColorScaleGenerator.js @@ -0,0 +1,8 @@ +export function redColorScaleGenerator(values) { + const min = Math.min.apply(Math, values) + const max = Math.max.apply(Math, values) + return (x) => { + const nonRed = 255 - Math.round((255 * (x - min)) / (max - min)) + return { backgroundColor: `rgb(255,${nonRed},${nonRed})` } + } +} diff --git a/src/helper/redColorScaleGenerator.ts b/src/helper/redColorScaleGenerator.ts deleted file mode 100644 index 9889547..0000000 --- a/src/helper/redColorScaleGenerator.ts +++ /dev/null @@ -1,8 +0,0 @@ -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.js b/src/helper/utilities.js new file mode 100644 index 0000000..261bcbd --- /dev/null +++ b/src/helper/utilities.js @@ -0,0 +1,856 @@ +const addSeparators = function (nStr, thousandsSep, decimalSep) { + 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 = function (optsIn) { + const defaults = { + digitsAfterDecimal: 2, + scaler: 1, + thousandsSep: ',', + decimalSep: '.', + prefix: '', + suffix: '' + } + const opts = Object.assign({}, defaults, optsIn) + return function (x) { + 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 = (as, bs) => { + // 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 per http://stackoverflow.com/a/4373421/112871 + let a = String(as) + let 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 + a = a.match(rx) + b = b.match(rx) + while (a.length && b.length) { + const a1 = a.shift() + const b1 = b.shift() + if (a1 !== b1) { + if (rd.test(a1) && rd.test(b1)) { + const numDiff = a1.replace(rz, '.0') - b1.replace(rz, '.0') + return numDiff !== 0 ? numDiff : a1.length - b1.length + } + return a1 > b1 ? 1 : -1 + } + } + return a.length - b.length +} +const sortAs = function (order) { + const mapping = {} + + // sort lowercased keys similarly + const lMapping = {} + for (const i in order) { + const x = order[i] + mapping[x] = i + if (typeof x === 'string') { + lMapping[x.toLowerCase()] = i + } + } + return function (a, b) { + 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 = function (sorters, attr) { + 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 +} + +// aggregator templates default to US number formatting but this is overrideable +const usFmt = numberFormat() +const usFmtInt = numberFormat({ digitsAfterDecimal: 0 }) +const usFmtPct = numberFormat({ + digitsAfterDecimal: 1, + scaler: 100, + suffix: '%' +}) + +const aggregatorTemplates = { + count(formatter = usFmtInt) { + return () => + function () { + return { + count: 0, + push() { + this.count++ + }, + value() { + return this.count + }, + format: formatter + } + } + }, + + uniques(fn, formatter = usFmtInt) { + return function ([attr]) { + return function () { + return { + uniq: [], + push(record) { + if (!Array.from(this.uniq).includes(record[attr])) { + this.uniq.push(record[attr]) + } + }, + value() { + return fn(this.uniq) + }, + format: formatter, + numInputs: typeof attr !== 'undefined' ? 0 : 1 + } + } + } + }, + + sum(formatter = usFmt) { + return function ([attr]) { + return function () { + return { + sum: 0, + push(record) { + if (!isNaN(parseFloat(record[attr]))) { + this.sum += parseFloat(record[attr]) + } + }, + value() { + return this.sum + }, + format: formatter, + numInputs: typeof attr !== 'undefined' ? 0 : 1 + } + } + } + }, + + extremes(mode, formatter = usFmt) { + return function ([attr]) { + return function (data) { + return { + val: null, + sorter: getSort( + typeof data !== 'undefined' ? data.sorters : null, + attr + ), + push(record) { + let x = record[attr] + if (['min', 'max'].includes(mode)) { + x = parseFloat(x) + if (!isNaN(x)) { + this.val = Math[mode](x, this.val !== null ? this.val : x) + } + } + 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) { + if (isNaN(x)) { + return x + } + return formatter(x) + }, + numInputs: typeof attr !== 'undefined' ? 0 : 1 + } + } + } + }, + + quantile(q, formatter = usFmt) { + return function ([attr]) { + return function () { + return { + vals: [], + push(record) { + const x = parseFloat(record[attr]) + if (!isNaN(x)) { + this.vals.push(x) + } + }, + value() { + if (this.vals.length === 0) { + return null + } + this.vals.sort((a, b) => 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', ddof = 1, formatter = usFmt) { + return function ([attr]) { + return function () { + return { + n: 0.0, + m: 0.0, + s: 0.0, + push(record) { + const x = parseFloat(record[attr]) + 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 0 / 0 + } + 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 = usFmt) { + return function ([num, denom]) { + return function () { + return { + sumNum: 0, + sumDenom: 0, + push(record) { + if (!isNaN(parseFloat(record[num]))) { + this.sumNum += parseFloat(record[num]) + } + if (!isNaN(parseFloat(record[denom]))) { + this.sumDenom += parseFloat(record[denom]) + } + }, + value() { + return this.sumNum / this.sumDenom + }, + format: formatter, + numInputs: + typeof num !== 'undefined' && typeof denom !== 'undefined' ? 0 : 2 + } + } + } + }, + + fractionOf(wrapped, type = 'total', formatter = usFmtPct) { + return (...x) => + function (data, rowKey, colKey) { + return { + selector: { total: [[], []], row: [rowKey, []], col: [[], colKey] }[ + type + ], + inner: wrapped(...Array.from(x || []))(data, rowKey, colKey), + push(record) { + this.inner.push(record) + }, + format: formatter, + value() { + return ( + this.inner.value() / + data + .getAggregator(...Array.from(this.selector || [])) + .inner.value() + ) + }, + numInputs: wrapped(...Array.from(x || []))().numInputs + } + } + } +} + +aggregatorTemplates.countUnique = (f) => + aggregatorTemplates.uniques((x) => x.length, f) +aggregatorTemplates.listUnique = (s) => + aggregatorTemplates.uniques( + (x) => x.join(s), + (x) => x + ) +aggregatorTemplates.max = (f) => aggregatorTemplates.extremes('max', f) +aggregatorTemplates.min = (f) => aggregatorTemplates.extremes('min', f) +aggregatorTemplates.first = (f) => aggregatorTemplates.extremes('first', f) +aggregatorTemplates.last = (f) => aggregatorTemplates.extremes('last', f) +aggregatorTemplates.median = (f) => aggregatorTemplates.quantile(0.5, f) +aggregatorTemplates.average = (f) => + aggregatorTemplates.runningStat('mean', 1, f) +aggregatorTemplates.var = (ddof, f) => + aggregatorTemplates.runningStat('var', ddof, f) +aggregatorTemplates.stdev = (ddof, f) => + aggregatorTemplates.runningStat('stdev', ddof, f) + +// default aggregators & renderers use US naming and number formatting +const aggregators = ((tpl) => ({ + 'Count': tpl.count(usFmtInt), + 'Count Unique Values': tpl.countUnique(usFmtInt), + 'List Unique Values': tpl.listUnique(', '), + 'Sum': tpl.sum(usFmt), + 'Integer Sum': tpl.sum(usFmtInt), + 'Average': tpl.average(usFmt), + 'Median': tpl.median(usFmt), + 'Sample Variance': tpl.var(1, usFmt), + 'Sample Standard Deviation': tpl.stdev(1, usFmt), + 'Minimum': tpl.min(usFmt), + 'Maximum': tpl.max(usFmt), + 'First': tpl.first(usFmt), + 'Last': tpl.last(usFmt), + 'Sum over Sum': tpl.sumOverSum(usFmt), + 'Sum as Fraction of Total': tpl.fractionOf(tpl.sum(), 'total', usFmtPct), + 'Sum as Fraction of Rows': tpl.fractionOf(tpl.sum(), 'row', usFmtPct), + 'Sum as Fraction of Columns': tpl.fractionOf(tpl.sum(), 'col', usFmtPct), + 'Count as Fraction of Total': tpl.fractionOf(tpl.count(), 'total', usFmtPct), + 'Count as Fraction of Rows': tpl.fractionOf(tpl.count(), 'row', usFmtPct), + 'Count as Fraction of Columns': tpl.fractionOf(tpl.count(), 'col', usFmtPct) +}))(aggregatorTemplates) + +// fr aggregators + +const frAggregators = ((tpl) => ({ + 'Compte': tpl.count(usFmtInt), + 'Compter les valeurs uniques': tpl.countUnique(usFmtInt), + 'Liste des valeurs uniques': tpl.listUnique(', '), + 'Somme': tpl.sum(usFmt), + 'Somme de nombres entiers': tpl.sum(usFmtInt), + 'Moyenne': tpl.average(usFmt), + 'Médiane': tpl.median(usFmt), + "Variance de l'échantillon": tpl.var(1, usFmt), + "Écart-type de l'échantillon": tpl.stdev(1, usFmt), + 'Minimum': tpl.min(usFmt), + 'Maximum': tpl.max(usFmt), + 'Premier': tpl.first(usFmt), + 'Dernier': tpl.last(usFmt), + 'Somme Total': tpl.sumOverSum(usFmt), + 'Somme en fraction du total': tpl.fractionOf(tpl.sum(), 'total', usFmtPct), + 'Somme en tant que fraction de lignes': tpl.fractionOf( + tpl.sum(), + 'row', + usFmtPct + ), + 'Somme en tant que fraction de colonnes': tpl.fractionOf( + tpl.sum(), + 'col', + usFmtPct + ), + 'Comptage en tant que fraction du total': tpl.fractionOf( + tpl.count(), + 'total', + usFmtPct + ), + 'Comptage en tant que fraction de lignes': tpl.fractionOf( + tpl.count(), + 'row', + usFmtPct + ), + 'Comptage en tant que fraction de colonnes': tpl.fractionOf( + tpl.count(), + 'col', + usFmtPct + ) +}))(aggregatorTemplates) + +const locales = { + 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' + } + } +} + +// dateFormat deriver l10n requires month and day names to be passed in directly +const mthNamesEn = [ + 'Jan', + 'Feb', + 'Mar', + 'Apr', + 'May', + 'Jun', + 'Jul', + 'Aug', + 'Sep', + 'Oct', + 'Nov', + 'Dec' +] +const dayNamesEn = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] +const zeroPad = (number) => `0${number}`.substr(-2, 2) + +const derivers = { + bin(col, binWidth) { + return (record) => record[col] - (record[col] % binWidth) + }, + dateFormat( + col, + formatString, + utcOutput = false, + mthNames = mthNamesEn, + dayNames = dayNamesEn + ) { + const utc = utcOutput ? 'UTC' : '' + return function (record) { + const date = new Date(Date.parse(record[col])) + if (isNaN(date)) { + return '' + } + return formatString.replace(/%(.)/g, function (m, p) { + switch (p) { + case 'y': + return date[`get${utc}FullYear`]() + case 'm': + return zeroPad(date[`get${utc}Month`]() + 1) + case 'n': + return mthNames[date[`get${utc}Month`]()] + case 'd': + return zeroPad(date[`get${utc}Date`]()) + case 'w': + return dayNames[date[`get${utc}Day`]()] + case 'x': + return date[`get${utc}Day`]() + case 'H': + return zeroPad(date[`get${utc}Hours`]()) + case 'M': + return zeroPad(date[`get${utc}Minutes`]()) + case 'S': + return zeroPad(date[`get${utc}Seconds`]()) + default: + return `%${p}` + } + }) + } + } +} + +/* +Data Model class +*/ + +class PivotData { + constructor(inputProps = {}) { + 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 = [] + // iterate through input, accumulating data for cells + PivotData.forEachRecord( + this.props.data, + this.props.derivedAttributes, + (record) => { + if (this.filter(record)) { + this.filteredData.push(record) + this.processRecord(record) + } + } + ) + } + + filter(record) { + const allSelector = '*' + for (const k in this.props.valueFilter) { + if (k !== allSelector) { + const valueFilterItem = + this.props.valueFilter && this.props.valueFilter[k] + if (record[k] in valueFilterItem) { + const existingKey = valueFilterItem[record[k]] + if (existingKey === true) { + return false + } + } else if (valueFilterItem[allSelector] === true) { + return false + } + } + } + return true + } + + forEachMatchingRecord(criteria, callback) { + return PivotData.forEachRecord( + this.props.data, + this.props.derivedAttributes, + (record) => { + 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) { + let a + const sortersArr = (() => { + const result = [] + for (a of Array.from(attrs)) { + result.push(getSort(this.props.sorters, a)) + } + return result + })() + return function (a, b) { + for (const i of Object.keys(sortersArr || {})) { + const sorter = sortersArr[i] + const comparison = sorter(a[i], b[i]) + if (comparison !== 0) { + return comparison + } + } + return 0 + } + } + + sortKeys() { + if (!this.sorted) { + this.sorted = true + const v = (r, c) => 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() { + return this.filteredData + } + + getColKeys() { + this.sortKeys() + return this.colKeys + } + + getRowKeys() { + this.sortKeys() + return this.rowKeys + } + + processRecord(record) { + // this code is called in a tight loop + const colKey = [] + const rowKey = [] + for (const x of Array.from(this.props.cols)) { + colKey.push(x in record ? record[x] : 'null') + } + for (const x of Array.from(this.props.rows)) { + rowKey.push(x in record ? record[x] : 'null') + } + const flatRowKey = rowKey.join(String.fromCharCode(0)) + const flatColKey = colKey.join(String.fromCharCode(0)) + + 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, colKey) { + let agg + const flatRowKey = rowKey.join(String.fromCharCode(0)) + const flatColKey = colKey.join(String.fromCharCode(0)) + 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() { + return null + }, + format() { + return '' + } + } + ) + } +} + +// can handle arrays or jQuery selections of tables +PivotData.forEachRecord = function (input, derivedAttributes, f) { + let addRecord, record + if (Object.getOwnPropertyNames(derivedAttributes).length === 0) { + addRecord = f + } else { + addRecord = function (record) { + for (const k in derivedAttributes) { + const derived = derivedAttributes[k](record) + if (derived !== null) { + record[k] = derived + } + } + return f(record) + } + } + + // if it's a function, have it call us back + if (typeof input === 'function') { + return input(addRecord) + } else if (Array.isArray(input)) { + if (Array.isArray(input[0])) { + // array of arrays + return (() => { + const result = [] + for (const i of Object.keys(input || {})) { + const compactRecord = input[i] + if (i > 0) { + record = {} + for (const j of Object.keys(input[0] || {})) { + const k = input[0][j] + record[k] = compactRecord[j] + } + result.push(addRecord(record)) + } + } + return result + })() + } + + // array of objects + return (() => { + const result1 = [] + for (record of Array.from(input)) { + result1.push(addRecord(record)) + } + return result1 + })() + } + throw new Error('unknown input format') +} + +PivotData.defaultProps = { + aggregators, + cols: [], + rows: [], + vals: [], + aggregatorName: 'Count', + sorters: {}, + valueFilter: {}, + rowOrder: 'key_a_to_z', + colOrder: 'key_a_to_z', + derivedAttributes: {} +} + +export { + aggregatorTemplates, + aggregators, + derivers, + locales, + naturalSort, + numberFormat, + getSort, + sortAs, + PivotData +} diff --git a/src/helper/utilities.ts b/src/helper/utilities.ts deleted file mode 100644 index f0ebb9a..0000000 --- a/src/helper/utilities.ts +++ /dev/null @@ -1,1001 +0,0 @@ -// 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.js similarity index 74% rename from src/index.ts rename to src/index.js index 98f226e..0c9e64d 100644 --- a/src/index.ts +++ b/src/index.js @@ -1,10 +1,9 @@ import { VuePivottable, VuePivottableUi } from './components' -import * as PivotUtilities from './helper' import TableRenderer from './components/pivottable/renderer' -import type { Component } from 'vue' -export * from './composables' +import * as PivotUtilities from './helper' +export * from './composables/index.js' -const Renderer: Record = { +const Renderer = { ...TableRenderer } diff --git a/src/main.ts b/src/main.js similarity index 100% rename from src/main.ts rename to src/main.js diff --git a/src/types/index.ts b/src/types/index.ts deleted file mode 100644 index c3c7bb3..0000000 --- a/src/types/index.ts +++ /dev/null @@ -1,36 +0,0 @@ -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 deleted file mode 100644 index c856c15..0000000 --- a/tsconfig.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "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.js similarity index 77% rename from vite.config.ts rename to vite.config.js index e2e4509..7956e96 100644 --- a/vite.config.ts +++ b/vite.config.js @@ -3,7 +3,6 @@ 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(), @@ -16,22 +15,18 @@ export default defineConfig({ ] }), dts({ - include: [ - 'src', - ], - outDir: 'dist/types', + include: ['src/**/*.{js,ts,vue,d.ts}'], + outDir: 'dist', staticImport: true, insertTypesEntry: true, - rollupTypes: true, - tsconfigPath: './tsconfig.json' + rollupTypes: true }) ], build: { lib: { - entry: resolve(__dirname, 'src/index.ts'), + entry: resolve(__dirname, 'src/index.js'), name: 'VuePivottable', - fileName: (format) => `vue-pivottable.${format}.js`, - formats: ['es', 'umd'] + fileName: (format) => `vue-pivottable.${format}.js` }, rollupOptions: { external: ['vue', 'vue-draggable-next', 'papaparse'],