├── .github ├── FUNDING.yml └── workflows │ └── publish.yml ├── .gitignore ├── .husky └── pre-commit ├── .prettierrc ├── LICENSE.md ├── README.md ├── eslint.config.mjs ├── icon.svg ├── index.html ├── package.json ├── pnpm-lock.yaml ├── screenshots ├── basic-table.png ├── percentile.png └── stats-01.png ├── src ├── components │ ├── Summary.tsx │ └── Table.tsx ├── helpers │ ├── blocks-as-columns.tsx │ ├── blocks-as-rows.tsx │ ├── child-blocks-as-columns.tsx │ ├── handle-cell-type.tsx │ └── math-helpers.ts ├── index.tsx ├── libs │ ├── check-params.ts │ ├── do-math.ts │ ├── process-content │ │ ├── handle-bold.tsx │ │ ├── handle-code.tsx │ │ ├── handle-codeblocks.tsx │ │ ├── handle-image.tsx │ │ ├── handle-italics.tsx │ │ ├── handle-link.tsx │ │ ├── handle-markdown-link.tsx │ │ ├── handle-tag.tsx │ │ └── remove-ls-attributes.ts │ └── types.ts └── stats-lite.d.ts ├── tsconfig.json └── vite.config.ts /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: [hkgnp] 2 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: Build Logseq Plugin 2 | 3 | on: 4 | push: 5 | branches: 6 | - "main" 7 | workflow_dispatch: 8 | 9 | env: 10 | PLUGIN_NAME: ${{ github.event.repository.name }} 11 | 12 | jobs: 13 | build: 14 | runs-on: ubuntu-latest 15 | 16 | steps: 17 | - uses: actions/checkout@v3 18 | 19 | - name: Use Node.js 20 | uses: actions/setup-node@v3 21 | with: 22 | node-version: "20.x" # You might need to adjust this value to your own version 23 | 24 | - uses: pnpm/action-setup@v2 25 | with: 26 | version: 6.0.2 27 | 28 | - name: Build 29 | id: build 30 | run: | 31 | pnpm i && pnpm run build 32 | mkdir ${{ env.PLUGIN_NAME }} 33 | cp README.md package.json icon.svg ${{ env.PLUGIN_NAME }} 34 | mv dist ${{ env.PLUGIN_NAME }} 35 | zip -r ${{ env.PLUGIN_NAME }}.zip ${{ env.PLUGIN_NAME }} 36 | ls 37 | echo "tag_name=git tag --sort version:refname | tail -n 1" >> $GITHUB_OUTPUT 38 | 39 | - name: Release 40 | run: npx semantic-release 41 | env: 42 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 43 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | .DS_Store 3 | # Logs 4 | logs 5 | *.log 6 | npm-debug.log* 7 | yarn-debug.log* 8 | yarn-error.log* 9 | lerna-debug.log* 10 | .pnpm-debug.log* 11 | 12 | # Diagnostic reports (https://nodejs.org/api/report.html) 13 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 14 | 15 | # Runtime data 16 | pids 17 | *.pid 18 | *.seed 19 | *.pid.lock 20 | 21 | # Directory for instrumented libs generated by jscoverage/JSCover 22 | lib-cov 23 | 24 | # Coverage directory used by tools like istanbul 25 | coverage 26 | *.lcov 27 | 28 | # nyc test coverage 29 | .nyc_output 30 | 31 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 32 | .grunt 33 | 34 | # Bower dependency directory (https://bower.io/) 35 | bower_components 36 | 37 | # node-waf configuration 38 | .lock-wscript 39 | 40 | # Compiled binary addons (https://nodejs.org/api/addons.html) 41 | build/Release 42 | 43 | # Dependency directories 44 | node_modules/ 45 | jspm_packages/ 46 | 47 | # Snowpack dependency directory (https://snowpack.dev/) 48 | web_modules/ 49 | 50 | # TypeScript cache 51 | *.tsbuildinfo 52 | 53 | # Optional npm cache directory 54 | .npm 55 | 56 | # Optional eslint cache 57 | .eslintcache 58 | 59 | # Microbundle cache 60 | .rpt2_cache/ 61 | .rts2_cache_cjs/ 62 | .rts2_cache_es/ 63 | .rts2_cache_umd/ 64 | 65 | # Optional REPL history 66 | .node_repl_history 67 | 68 | # Output of 'npm pack' 69 | *.tgz 70 | 71 | # Yarn Integrity file 72 | .yarn-integrity 73 | 74 | # dotenv environment variables file 75 | .env 76 | .env.test 77 | .env.production 78 | 79 | # parcel-bundler cache (https://parceljs.org/) 80 | .cache 81 | .parcel-cache 82 | 83 | # Next.js build output 84 | .next 85 | out 86 | 87 | # Nuxt.js build / generate output 88 | .nuxt 89 | dist 90 | 91 | # Gatsby files 92 | .cache/ 93 | # Comment in the public line in if your project uses Gatsby and not Next.js 94 | # https://nextjs.org/blog/next-9-1#public-directory-support 95 | # public 96 | 97 | # vuepress build output 98 | .vuepress/dist 99 | 100 | # Serverless directories 101 | .serverless/ 102 | 103 | # FuseBox cache 104 | .fusebox/ 105 | 106 | # DynamoDB Local files 107 | .dynamodb/ 108 | 109 | # TernJS port file 110 | .tern-port 111 | 112 | # Stores VSCode versions used for testing VSCode extensions 113 | .vscode-test 114 | 115 | # yarn v2 116 | .yarn/cache 117 | .yarn/unplugged 118 | .yarn/build-state.yml 119 | .yarn/install-state.gz 120 | .pnp.* -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | echo 'Running npx eslint . --fix' 2 | npx eslint . --fix 3 | echo 'Running tsc' 4 | npx tsc 5 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "all", 3 | "tabWidth": 2, 4 | "semi": false, 5 | "singleQuote": true 6 | } 7 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 hkgnp 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [:gift_heart: Sponsor this project on Github](https://github.com/sponsors/hkgnp) or [:coffee: Get me a coffee](https://www.buymeacoffee.com/hkgnp.dev) if you like this plugin! 2 | 3 | # Overview 4 | 5 | Render tables with basic math functions using data from your blocks. Just use the slash command `/Render table` to get started! 6 | 7 | # Instructions 8 | 9 | In the examples below, the {{renderer ...}} is automatically generated when you type /Render table, so you just need to add the portion from rows onwards. 10 | 11 | To add the mathematical formulas, add it to the same block as rows. Fr example, sum-2 sums up the values in column 2 of the table. 12 | 13 | - {{renderer :tables_656a0198-9b78-4d81-ae9a-09811cce3c8d}} 14 | - rows sum-2 15 | - hello 16 | - hello 17 | - **stuff** 18 | - _stuff_ 19 | - [[John Tan]] 20 | - The quick brown fox jumps over the lazy dog 21 | 22 | ## Basic table 23 | 24 | ![basic table](screenshots/basic-table.png) 25 | To draw a table above, you can use any one of the below approaches, with the flags `data`, `rows` or `cols`. 26 | 27 | 1. `data` 28 | 29 | ```md 30 | - {{renderer :tables_656a0198-9b78-4d81-ae9a-09811cce3c8d}} 31 | - data 32 | - Category 33 | - Fruits 34 | - Vegetables 35 | - Fruits and Vegetables 36 | - Fresh Produce 37 | - Apples 38 | - Lettuce 39 | - Tomatoes 40 | - Price 41 | - 1 42 | - 3 43 | - 5 44 | ``` 45 | 46 | 2. `rows` 47 | 48 | ```md 49 | - {{renderer :tables_656a0198-9b78-4d81-ae9a-09811cce3c8d}} 50 | - rows 51 | - Category 52 | - Fresh Produce 53 | - Price 54 | - Fruits 55 | - Apples 56 | - 1 57 | - Vegetables 58 | - Lettuce 59 | - 3 60 | - Fruits and Vegetables 61 | - Tomatoes 62 | - 5 63 | ``` 64 | 65 | 3. `cols` 66 | 67 | ```md 68 | - {{renderer :tables_656a0198-9b78-4d81-ae9a-09811cce3c8d}} 69 | - cols 70 | - Category 71 | - Fresh Produce 72 | - Price 73 | - Fruits 74 | - Apples 75 | - 1 76 | - Vegetables 77 | - Lettuce 78 | - 3 79 | - Fruits and Vegetables 80 | - Tomatoes' 81 | - 5 82 | ``` 83 | 84 | ## Table with basic stats 85 | 86 | The following basic statistical calculations are available: 87 | 88 | - Sum (sum) 89 | - Average (average) 90 | - Median (median) 91 | - Mode (mode) 92 | - Variance (variance) 93 | - Standard Deviation (sd) 94 | - Sample Standard Deviation (ssd) 95 | - Percentile (percentile)\* 96 | 97 | To use any of the above, use its shortcut (in brackets above) with the columns that you would like to compute (`-`). 98 | 99 | ### Example 100 | 101 | 1. `sum-3 average-3 median-3 mode-3` will render: 102 | ![stats-01](screenshots/stats-01.png) 103 | 104 | 2. \*Percentile requires an additional flag to indicate the perecntile that you would like to compute. `percentile-3-50` will compute the 50th percentile of the 3rd column. 105 | ![percentile](screenshots/percentile.png) 106 | 107 | # Installation 108 | 109 | Look for `logseq-tablerender-plugin` in the marketplace and install from there. 110 | 111 | # Credits 112 | 113 | [stats-lite](https://github.com/brycebaril/node-stats-lite) for providing the calculations. 114 | -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import eslint from '@eslint/js' 2 | import prettierConfig from 'eslint-config-prettier' 3 | import simpleImportSort from 'eslint-plugin-simple-import-sort' 4 | import tseslint from 'typescript-eslint' 5 | 6 | export default tseslint.config( 7 | eslint.configs.recommended, 8 | ...tseslint.configs.stylistic, 9 | ...tseslint.configs.recommended, 10 | prettierConfig, 11 | { 12 | ignores: ['**/dist/'], 13 | }, 14 | { 15 | plugins: { 16 | 'simple-import-sort': simpleImportSort, 17 | }, 18 | rules: { 19 | 'simple-import-sort/imports': 'error', 20 | 'simple-import-sort/exports': 'error', 21 | '@typescript-eslint/no-explicit-any': 'off', 22 | '@typescript-eslint/no-unused-vars': [ 23 | 'error', 24 | { varsIgnorePattern: '^_' }, 25 | ], 26 | }, 27 | }, 28 | ) 29 | -------------------------------------------------------------------------------- /icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Document 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "logseq-tablerender-plugin", 3 | "author": "hkgnp", 4 | "description": "Render tables using blocks", 5 | "license": "MIT", 6 | "logseq": { 7 | "id": "logseq-tablerender-plugin", 8 | "title": "logseq-tablerender-plugin", 9 | "icon": "./icon.svg", 10 | "main": "dist/index.html" 11 | }, 12 | "scripts": { 13 | "dev": "npx vite", 14 | "build": "npx eslint . --fix && npx tsc && npx vite build", 15 | "preview": "npx vite preview", 16 | "prepare": "husky" 17 | }, 18 | "release": { 19 | "branches": [ 20 | "main" 21 | ], 22 | "plugins": [ 23 | [ 24 | "@semantic-release/github", 25 | { 26 | "assets": [ 27 | "logseq-tablerender-plugin.zip" 28 | ] 29 | } 30 | ] 31 | ] 32 | }, 33 | "dependencies": { 34 | "@logseq/libs": "^0.0.17", 35 | "@tanstack/react-table": "^8.20.5", 36 | "react": "^18.3.1", 37 | "react-dom": "^18.3.1", 38 | "react-string-replace": "github:iansinnott/react-string-replace", 39 | "showdown": "^2.1.0", 40 | "stats-lite": "^2.2.0" 41 | }, 42 | "devDependencies": { 43 | "@eslint/js": "^9.9.1", 44 | "@types/eslint": "^9.6.1", 45 | "@types/eslint-config-prettier": "^6.11.3", 46 | "@types/eslint__js": "^8.42.3", 47 | "@types/node": "^22.5.1", 48 | "@types/react": "^18.3.5", 49 | "@types/react-dom": "^18.3.0", 50 | "@types/showdown": "^2.0.6", 51 | "@typescript-eslint/eslint-plugin": "^8.3.0", 52 | "@typescript-eslint/parser": "^8.3.0", 53 | "eslint": "^9.9.1", 54 | "eslint-config-prettier": "^9.1.0", 55 | "eslint-plugin-prettier": "^5.2.1", 56 | "eslint-plugin-simple-import-sort": "^12.1.1", 57 | "husky": "^9.1.5", 58 | "prettier": "^3.3.3", 59 | "typescript": "^5.5.4", 60 | "typescript-eslint": "^8.3.0", 61 | "vite": "^5.4.2", 62 | "vite-plugin-logseq": "^1.1.2", 63 | "vite-tsconfig-paths": "^5.0.1" 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | '@logseq/libs': 12 | specifier: ^0.0.17 13 | version: 0.0.17 14 | '@tanstack/react-table': 15 | specifier: ^8.20.5 16 | version: 8.20.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 17 | react: 18 | specifier: ^18.3.1 19 | version: 18.3.1 20 | react-dom: 21 | specifier: ^18.3.1 22 | version: 18.3.1(react@18.3.1) 23 | react-string-replace: 24 | specifier: github:iansinnott/react-string-replace 25 | version: https://codeload.github.com/iansinnott/react-string-replace/tar.gz/ead57a2d814558a288a069b99dcf3f1ae406a71e 26 | showdown: 27 | specifier: ^2.1.0 28 | version: 2.1.0 29 | stats-lite: 30 | specifier: ^2.2.0 31 | version: 2.2.0 32 | devDependencies: 33 | '@eslint/js': 34 | specifier: ^9.9.1 35 | version: 9.9.1 36 | '@types/eslint': 37 | specifier: ^9.6.1 38 | version: 9.6.1 39 | '@types/eslint-config-prettier': 40 | specifier: ^6.11.3 41 | version: 6.11.3 42 | '@types/eslint__js': 43 | specifier: ^8.42.3 44 | version: 8.42.3 45 | '@types/node': 46 | specifier: ^22.5.1 47 | version: 22.5.1 48 | '@types/react': 49 | specifier: ^18.3.5 50 | version: 18.3.5 51 | '@types/react-dom': 52 | specifier: ^18.3.0 53 | version: 18.3.0 54 | '@types/showdown': 55 | specifier: ^2.0.6 56 | version: 2.0.6 57 | '@typescript-eslint/eslint-plugin': 58 | specifier: ^8.3.0 59 | version: 8.3.0(@typescript-eslint/parser@8.3.0(eslint@9.9.1)(typescript@5.5.4))(eslint@9.9.1)(typescript@5.5.4) 60 | '@typescript-eslint/parser': 61 | specifier: ^8.3.0 62 | version: 8.3.0(eslint@9.9.1)(typescript@5.5.4) 63 | eslint: 64 | specifier: ^9.9.1 65 | version: 9.9.1 66 | eslint-config-prettier: 67 | specifier: ^9.1.0 68 | version: 9.1.0(eslint@9.9.1) 69 | eslint-plugin-prettier: 70 | specifier: ^5.2.1 71 | version: 5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@9.9.1))(eslint@9.9.1)(prettier@3.3.3) 72 | eslint-plugin-simple-import-sort: 73 | specifier: ^12.1.1 74 | version: 12.1.1(eslint@9.9.1) 75 | husky: 76 | specifier: ^9.1.5 77 | version: 9.1.5 78 | prettier: 79 | specifier: ^3.3.3 80 | version: 3.3.3 81 | typescript: 82 | specifier: ^5.5.4 83 | version: 5.5.4 84 | typescript-eslint: 85 | specifier: ^8.3.0 86 | version: 8.3.0(eslint@9.9.1)(typescript@5.5.4) 87 | vite: 88 | specifier: ^5.4.2 89 | version: 5.4.2(@types/node@22.5.1) 90 | vite-plugin-logseq: 91 | specifier: ^1.1.2 92 | version: 1.1.2 93 | vite-tsconfig-paths: 94 | specifier: ^5.0.1 95 | version: 5.0.1(typescript@5.5.4)(vite@5.4.2(@types/node@22.5.1)) 96 | 97 | packages: 98 | 99 | '@esbuild/aix-ppc64@0.21.5': 100 | resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} 101 | engines: {node: '>=12'} 102 | cpu: [ppc64] 103 | os: [aix] 104 | 105 | '@esbuild/android-arm64@0.21.5': 106 | resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} 107 | engines: {node: '>=12'} 108 | cpu: [arm64] 109 | os: [android] 110 | 111 | '@esbuild/android-arm@0.21.5': 112 | resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} 113 | engines: {node: '>=12'} 114 | cpu: [arm] 115 | os: [android] 116 | 117 | '@esbuild/android-x64@0.21.5': 118 | resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} 119 | engines: {node: '>=12'} 120 | cpu: [x64] 121 | os: [android] 122 | 123 | '@esbuild/darwin-arm64@0.21.5': 124 | resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} 125 | engines: {node: '>=12'} 126 | cpu: [arm64] 127 | os: [darwin] 128 | 129 | '@esbuild/darwin-x64@0.21.5': 130 | resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} 131 | engines: {node: '>=12'} 132 | cpu: [x64] 133 | os: [darwin] 134 | 135 | '@esbuild/freebsd-arm64@0.21.5': 136 | resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} 137 | engines: {node: '>=12'} 138 | cpu: [arm64] 139 | os: [freebsd] 140 | 141 | '@esbuild/freebsd-x64@0.21.5': 142 | resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} 143 | engines: {node: '>=12'} 144 | cpu: [x64] 145 | os: [freebsd] 146 | 147 | '@esbuild/linux-arm64@0.21.5': 148 | resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} 149 | engines: {node: '>=12'} 150 | cpu: [arm64] 151 | os: [linux] 152 | 153 | '@esbuild/linux-arm@0.21.5': 154 | resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} 155 | engines: {node: '>=12'} 156 | cpu: [arm] 157 | os: [linux] 158 | 159 | '@esbuild/linux-ia32@0.21.5': 160 | resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} 161 | engines: {node: '>=12'} 162 | cpu: [ia32] 163 | os: [linux] 164 | 165 | '@esbuild/linux-loong64@0.21.5': 166 | resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} 167 | engines: {node: '>=12'} 168 | cpu: [loong64] 169 | os: [linux] 170 | 171 | '@esbuild/linux-mips64el@0.21.5': 172 | resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} 173 | engines: {node: '>=12'} 174 | cpu: [mips64el] 175 | os: [linux] 176 | 177 | '@esbuild/linux-ppc64@0.21.5': 178 | resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} 179 | engines: {node: '>=12'} 180 | cpu: [ppc64] 181 | os: [linux] 182 | 183 | '@esbuild/linux-riscv64@0.21.5': 184 | resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} 185 | engines: {node: '>=12'} 186 | cpu: [riscv64] 187 | os: [linux] 188 | 189 | '@esbuild/linux-s390x@0.21.5': 190 | resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} 191 | engines: {node: '>=12'} 192 | cpu: [s390x] 193 | os: [linux] 194 | 195 | '@esbuild/linux-x64@0.21.5': 196 | resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} 197 | engines: {node: '>=12'} 198 | cpu: [x64] 199 | os: [linux] 200 | 201 | '@esbuild/netbsd-x64@0.21.5': 202 | resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} 203 | engines: {node: '>=12'} 204 | cpu: [x64] 205 | os: [netbsd] 206 | 207 | '@esbuild/openbsd-x64@0.21.5': 208 | resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} 209 | engines: {node: '>=12'} 210 | cpu: [x64] 211 | os: [openbsd] 212 | 213 | '@esbuild/sunos-x64@0.21.5': 214 | resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} 215 | engines: {node: '>=12'} 216 | cpu: [x64] 217 | os: [sunos] 218 | 219 | '@esbuild/win32-arm64@0.21.5': 220 | resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} 221 | engines: {node: '>=12'} 222 | cpu: [arm64] 223 | os: [win32] 224 | 225 | '@esbuild/win32-ia32@0.21.5': 226 | resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} 227 | engines: {node: '>=12'} 228 | cpu: [ia32] 229 | os: [win32] 230 | 231 | '@esbuild/win32-x64@0.21.5': 232 | resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} 233 | engines: {node: '>=12'} 234 | cpu: [x64] 235 | os: [win32] 236 | 237 | '@eslint-community/eslint-utils@4.4.0': 238 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 239 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 240 | peerDependencies: 241 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 242 | 243 | '@eslint-community/regexpp@4.11.0': 244 | resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} 245 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 246 | 247 | '@eslint/config-array@0.18.0': 248 | resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} 249 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 250 | 251 | '@eslint/eslintrc@3.1.0': 252 | resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} 253 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 254 | 255 | '@eslint/js@9.9.1': 256 | resolution: {integrity: sha512-xIDQRsfg5hNBqHz04H1R3scSVwmI+KUbqjsQKHKQ1DAUSaUjYPReZZmS/5PNiKu1fUvzDd6H7DEDKACSEhu+TQ==} 257 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 258 | 259 | '@eslint/object-schema@2.1.4': 260 | resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} 261 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 262 | 263 | '@humanwhocodes/module-importer@1.0.1': 264 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 265 | engines: {node: '>=12.22'} 266 | 267 | '@humanwhocodes/retry@0.3.0': 268 | resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==} 269 | engines: {node: '>=18.18'} 270 | 271 | '@logseq/libs@0.0.17': 272 | resolution: {integrity: sha512-SkzzAaocmrgeHYrCOaRyEqzPOxw3d0qVEZSrt9qVvXE4tuEgbvEHR8tzI1N5RjgAv+PDWuGPiP7/mhcXHpINEw==} 273 | 274 | '@nodelib/fs.scandir@2.1.5': 275 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 276 | engines: {node: '>= 8'} 277 | 278 | '@nodelib/fs.stat@2.0.5': 279 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 280 | engines: {node: '>= 8'} 281 | 282 | '@nodelib/fs.walk@1.2.8': 283 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 284 | engines: {node: '>= 8'} 285 | 286 | '@pkgr/core@0.1.1': 287 | resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} 288 | engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} 289 | 290 | '@rollup/rollup-android-arm-eabi@4.21.2': 291 | resolution: {integrity: sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==} 292 | cpu: [arm] 293 | os: [android] 294 | 295 | '@rollup/rollup-android-arm64@4.21.2': 296 | resolution: {integrity: sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==} 297 | cpu: [arm64] 298 | os: [android] 299 | 300 | '@rollup/rollup-darwin-arm64@4.21.2': 301 | resolution: {integrity: sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==} 302 | cpu: [arm64] 303 | os: [darwin] 304 | 305 | '@rollup/rollup-darwin-x64@4.21.2': 306 | resolution: {integrity: sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==} 307 | cpu: [x64] 308 | os: [darwin] 309 | 310 | '@rollup/rollup-linux-arm-gnueabihf@4.21.2': 311 | resolution: {integrity: sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==} 312 | cpu: [arm] 313 | os: [linux] 314 | 315 | '@rollup/rollup-linux-arm-musleabihf@4.21.2': 316 | resolution: {integrity: sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==} 317 | cpu: [arm] 318 | os: [linux] 319 | 320 | '@rollup/rollup-linux-arm64-gnu@4.21.2': 321 | resolution: {integrity: sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==} 322 | cpu: [arm64] 323 | os: [linux] 324 | 325 | '@rollup/rollup-linux-arm64-musl@4.21.2': 326 | resolution: {integrity: sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==} 327 | cpu: [arm64] 328 | os: [linux] 329 | 330 | '@rollup/rollup-linux-powerpc64le-gnu@4.21.2': 331 | resolution: {integrity: sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==} 332 | cpu: [ppc64] 333 | os: [linux] 334 | 335 | '@rollup/rollup-linux-riscv64-gnu@4.21.2': 336 | resolution: {integrity: sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==} 337 | cpu: [riscv64] 338 | os: [linux] 339 | 340 | '@rollup/rollup-linux-s390x-gnu@4.21.2': 341 | resolution: {integrity: sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==} 342 | cpu: [s390x] 343 | os: [linux] 344 | 345 | '@rollup/rollup-linux-x64-gnu@4.21.2': 346 | resolution: {integrity: sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==} 347 | cpu: [x64] 348 | os: [linux] 349 | 350 | '@rollup/rollup-linux-x64-musl@4.21.2': 351 | resolution: {integrity: sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==} 352 | cpu: [x64] 353 | os: [linux] 354 | 355 | '@rollup/rollup-win32-arm64-msvc@4.21.2': 356 | resolution: {integrity: sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==} 357 | cpu: [arm64] 358 | os: [win32] 359 | 360 | '@rollup/rollup-win32-ia32-msvc@4.21.2': 361 | resolution: {integrity: sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==} 362 | cpu: [ia32] 363 | os: [win32] 364 | 365 | '@rollup/rollup-win32-x64-msvc@4.21.2': 366 | resolution: {integrity: sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==} 367 | cpu: [x64] 368 | os: [win32] 369 | 370 | '@tanstack/react-table@8.20.5': 371 | resolution: {integrity: sha512-WEHopKw3znbUZ61s9i0+i9g8drmDo6asTWbrQh8Us63DAk/M0FkmIqERew6P71HI75ksZ2Pxyuf4vvKh9rAkiA==} 372 | engines: {node: '>=12'} 373 | peerDependencies: 374 | react: '>=16.8' 375 | react-dom: '>=16.8' 376 | 377 | '@tanstack/table-core@8.20.5': 378 | resolution: {integrity: sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==} 379 | engines: {node: '>=12'} 380 | 381 | '@types/eslint-config-prettier@6.11.3': 382 | resolution: {integrity: sha512-3wXCiM8croUnhg9LdtZUJQwNcQYGWxxdOWDjPe1ykCqJFPVpzAKfs/2dgSoCtAvdPeaponcWPI7mPcGGp9dkKQ==} 383 | 384 | '@types/eslint@9.6.1': 385 | resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} 386 | 387 | '@types/eslint__js@8.42.3': 388 | resolution: {integrity: sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw==} 389 | 390 | '@types/estree@1.0.5': 391 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} 392 | 393 | '@types/json-schema@7.0.15': 394 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 395 | 396 | '@types/node@22.5.1': 397 | resolution: {integrity: sha512-KkHsxej0j9IW1KKOOAA/XBA0z08UFSrRQHErzEfA3Vgq57eXIMYboIlHJuYIfd+lwCQjtKqUu3UnmKbtUc9yRw==} 398 | 399 | '@types/prop-types@15.7.12': 400 | resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} 401 | 402 | '@types/react-dom@18.3.0': 403 | resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} 404 | 405 | '@types/react@18.3.5': 406 | resolution: {integrity: sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==} 407 | 408 | '@types/showdown@2.0.6': 409 | resolution: {integrity: sha512-pTvD/0CIeqe4x23+YJWlX2gArHa8G0J0Oh6GKaVXV7TAeickpkkZiNOgFcFcmLQ5lB/K0qBJL1FtRYltBfbGCQ==} 410 | 411 | '@typescript-eslint/eslint-plugin@8.3.0': 412 | resolution: {integrity: sha512-FLAIn63G5KH+adZosDYiutqkOkYEx0nvcwNNfJAf+c7Ae/H35qWwTYvPZUKFj5AS+WfHG/WJJfWnDnyNUlp8UA==} 413 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 414 | peerDependencies: 415 | '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 416 | eslint: ^8.57.0 || ^9.0.0 417 | typescript: '*' 418 | peerDependenciesMeta: 419 | typescript: 420 | optional: true 421 | 422 | '@typescript-eslint/parser@8.3.0': 423 | resolution: {integrity: sha512-h53RhVyLu6AtpUzVCYLPhZGL5jzTD9fZL+SYf/+hYOx2bDkyQXztXSc4tbvKYHzfMXExMLiL9CWqJmVz6+78IQ==} 424 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 425 | peerDependencies: 426 | eslint: ^8.57.0 || ^9.0.0 427 | typescript: '*' 428 | peerDependenciesMeta: 429 | typescript: 430 | optional: true 431 | 432 | '@typescript-eslint/scope-manager@8.3.0': 433 | resolution: {integrity: sha512-mz2X8WcN2nVu5Hodku+IR8GgCOl4C0G/Z1ruaWN4dgec64kDBabuXyPAr+/RgJtumv8EEkqIzf3X2U5DUKB2eg==} 434 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 435 | 436 | '@typescript-eslint/type-utils@8.3.0': 437 | resolution: {integrity: sha512-wrV6qh//nLbfXZQoj32EXKmwHf4b7L+xXLrP3FZ0GOUU72gSvLjeWUl5J5Ue5IwRxIV1TfF73j/eaBapxx99Lg==} 438 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 439 | peerDependencies: 440 | typescript: '*' 441 | peerDependenciesMeta: 442 | typescript: 443 | optional: true 444 | 445 | '@typescript-eslint/types@8.3.0': 446 | resolution: {integrity: sha512-y6sSEeK+facMaAyixM36dQ5NVXTnKWunfD1Ft4xraYqxP0lC0POJmIaL/mw72CUMqjY9qfyVfXafMeaUj0noWw==} 447 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 448 | 449 | '@typescript-eslint/typescript-estree@8.3.0': 450 | resolution: {integrity: sha512-Mq7FTHl0R36EmWlCJWojIC1qn/ZWo2YiWYc1XVtasJ7FIgjo0MVv9rZWXEE7IK2CGrtwe1dVOxWwqXUdNgfRCA==} 451 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 452 | peerDependencies: 453 | typescript: '*' 454 | peerDependenciesMeta: 455 | typescript: 456 | optional: true 457 | 458 | '@typescript-eslint/utils@8.3.0': 459 | resolution: {integrity: sha512-F77WwqxIi/qGkIGOGXNBLV7nykwfjLsdauRB/DOFPdv6LTF3BHHkBpq81/b5iMPSF055oO2BiivDJV4ChvNtXA==} 460 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 461 | peerDependencies: 462 | eslint: ^8.57.0 || ^9.0.0 463 | 464 | '@typescript-eslint/visitor-keys@8.3.0': 465 | resolution: {integrity: sha512-RmZwrTbQ9QveF15m/Cl28n0LXD6ea2CjkhH5rQ55ewz3H24w+AMCJHPVYaZ8/0HoG8Z3cLLFFycRXxeO2tz9FA==} 466 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 467 | 468 | acorn-jsx@5.3.2: 469 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 470 | peerDependencies: 471 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 472 | 473 | acorn@8.12.1: 474 | resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} 475 | engines: {node: '>=0.4.0'} 476 | hasBin: true 477 | 478 | ajv@6.12.6: 479 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 480 | 481 | ansi-regex@5.0.1: 482 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 483 | engines: {node: '>=8'} 484 | 485 | ansi-styles@4.3.0: 486 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 487 | engines: {node: '>=8'} 488 | 489 | argparse@2.0.1: 490 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 491 | 492 | balanced-match@1.0.2: 493 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 494 | 495 | brace-expansion@1.1.11: 496 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 497 | 498 | brace-expansion@2.0.1: 499 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 500 | 501 | braces@3.0.3: 502 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 503 | engines: {node: '>=8'} 504 | 505 | callsites@3.1.0: 506 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 507 | engines: {node: '>=6'} 508 | 509 | chalk@4.1.2: 510 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 511 | engines: {node: '>=10'} 512 | 513 | color-convert@2.0.1: 514 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 515 | engines: {node: '>=7.0.0'} 516 | 517 | color-name@1.1.4: 518 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 519 | 520 | commander@9.5.0: 521 | resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} 522 | engines: {node: ^12.20.0 || >=14} 523 | 524 | concat-map@0.0.1: 525 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 526 | 527 | cross-spawn@7.0.3: 528 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 529 | engines: {node: '>= 8'} 530 | 531 | csstype@3.1.0: 532 | resolution: {integrity: sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==} 533 | 534 | csstype@3.1.3: 535 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 536 | 537 | debug@4.3.4: 538 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 539 | engines: {node: '>=6.0'} 540 | peerDependencies: 541 | supports-color: '*' 542 | peerDependenciesMeta: 543 | supports-color: 544 | optional: true 545 | 546 | debug@4.3.6: 547 | resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} 548 | engines: {node: '>=6.0'} 549 | peerDependencies: 550 | supports-color: '*' 551 | peerDependenciesMeta: 552 | supports-color: 553 | optional: true 554 | 555 | deep-is@0.1.4: 556 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 557 | 558 | deepmerge@4.3.1: 559 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 560 | engines: {node: '>=0.10.0'} 561 | 562 | dompurify@2.3.8: 563 | resolution: {integrity: sha512-eVhaWoVibIzqdGYjwsBWodIQIaXFSB+cKDf4cfxLMsK0xiud6SE+/WCVx/Xw/UwQsa4cS3T2eITcdtmTg2UKcw==} 564 | 565 | dot-case@3.0.4: 566 | resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} 567 | 568 | esbuild@0.21.5: 569 | resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} 570 | engines: {node: '>=12'} 571 | hasBin: true 572 | 573 | escape-string-regexp@4.0.0: 574 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 575 | engines: {node: '>=10'} 576 | 577 | eslint-config-prettier@9.1.0: 578 | resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} 579 | hasBin: true 580 | peerDependencies: 581 | eslint: '>=7.0.0' 582 | 583 | eslint-plugin-prettier@5.2.1: 584 | resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==} 585 | engines: {node: ^14.18.0 || >=16.0.0} 586 | peerDependencies: 587 | '@types/eslint': '>=8.0.0' 588 | eslint: '>=8.0.0' 589 | eslint-config-prettier: '*' 590 | prettier: '>=3.0.0' 591 | peerDependenciesMeta: 592 | '@types/eslint': 593 | optional: true 594 | eslint-config-prettier: 595 | optional: true 596 | 597 | eslint-plugin-simple-import-sort@12.1.1: 598 | resolution: {integrity: sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==} 599 | peerDependencies: 600 | eslint: '>=5.0.0' 601 | 602 | eslint-scope@8.0.2: 603 | resolution: {integrity: sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==} 604 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 605 | 606 | eslint-visitor-keys@3.4.3: 607 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 608 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 609 | 610 | eslint-visitor-keys@4.0.0: 611 | resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} 612 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 613 | 614 | eslint@9.9.1: 615 | resolution: {integrity: sha512-dHvhrbfr4xFQ9/dq+jcVneZMyRYLjggWjk6RVsIiHsP8Rz6yZ8LvZ//iU4TrZF+SXWG+JkNF2OyiZRvzgRDqMg==} 616 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 617 | hasBin: true 618 | peerDependencies: 619 | jiti: '*' 620 | peerDependenciesMeta: 621 | jiti: 622 | optional: true 623 | 624 | espree@10.1.0: 625 | resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} 626 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 627 | 628 | esquery@1.6.0: 629 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 630 | engines: {node: '>=0.10'} 631 | 632 | esrecurse@4.3.0: 633 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 634 | engines: {node: '>=4.0'} 635 | 636 | estraverse@5.3.0: 637 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 638 | engines: {node: '>=4.0'} 639 | 640 | esutils@2.0.3: 641 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 642 | engines: {node: '>=0.10.0'} 643 | 644 | eventemitter3@4.0.7: 645 | resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} 646 | 647 | fast-deep-equal@3.1.3: 648 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 649 | 650 | fast-diff@1.3.0: 651 | resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} 652 | 653 | fast-glob@3.3.2: 654 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 655 | engines: {node: '>=8.6.0'} 656 | 657 | fast-json-stable-stringify@2.1.0: 658 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 659 | 660 | fast-levenshtein@2.0.6: 661 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 662 | 663 | fastq@1.17.1: 664 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 665 | 666 | file-entry-cache@8.0.0: 667 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 668 | engines: {node: '>=16.0.0'} 669 | 670 | fill-range@7.1.1: 671 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 672 | engines: {node: '>=8'} 673 | 674 | find-up@5.0.0: 675 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 676 | engines: {node: '>=10'} 677 | 678 | flat-cache@4.0.1: 679 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 680 | engines: {node: '>=16'} 681 | 682 | flatted@3.3.1: 683 | resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} 684 | 685 | fsevents@2.3.3: 686 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 687 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 688 | os: [darwin] 689 | 690 | glob-parent@5.1.2: 691 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 692 | engines: {node: '>= 6'} 693 | 694 | glob-parent@6.0.2: 695 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 696 | engines: {node: '>=10.13.0'} 697 | 698 | globals@14.0.0: 699 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 700 | engines: {node: '>=18'} 701 | 702 | globrex@0.1.2: 703 | resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} 704 | 705 | graphemer@1.4.0: 706 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 707 | 708 | has-flag@4.0.0: 709 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 710 | engines: {node: '>=8'} 711 | 712 | husky@9.1.5: 713 | resolution: {integrity: sha512-rowAVRUBfI0b4+niA4SJMhfQwc107VLkBUgEYYAOQAbqDCnra1nYh83hF/MDmhYs9t9n1E3DuKOrs2LYNC+0Ag==} 714 | engines: {node: '>=18'} 715 | hasBin: true 716 | 717 | ignore@5.3.2: 718 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 719 | engines: {node: '>= 4'} 720 | 721 | import-fresh@3.3.0: 722 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 723 | engines: {node: '>=6'} 724 | 725 | imurmurhash@0.1.4: 726 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 727 | engines: {node: '>=0.8.19'} 728 | 729 | inherits@2.0.3: 730 | resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} 731 | 732 | is-extglob@2.1.1: 733 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 734 | engines: {node: '>=0.10.0'} 735 | 736 | is-glob@4.0.3: 737 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 738 | engines: {node: '>=0.10.0'} 739 | 740 | is-number@7.0.0: 741 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 742 | engines: {node: '>=0.12.0'} 743 | 744 | is-path-inside@3.0.3: 745 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 746 | engines: {node: '>=8'} 747 | 748 | isexe@2.0.0: 749 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 750 | 751 | isnumber@1.0.0: 752 | resolution: {integrity: sha512-JLiSz/zsZcGFXPrB4I/AGBvtStkt+8QmksyZBZnVXnnK9XdTEyz0tX8CRYljtwYDuIuZzih6DpHQdi+3Q6zHPw==} 753 | 754 | js-tokens@4.0.0: 755 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 756 | 757 | js-yaml@4.1.0: 758 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 759 | hasBin: true 760 | 761 | json-buffer@3.0.1: 762 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 763 | 764 | json-schema-traverse@0.4.1: 765 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 766 | 767 | json-stable-stringify-without-jsonify@1.0.1: 768 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 769 | 770 | keyv@4.5.4: 771 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 772 | 773 | levn@0.4.1: 774 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 775 | engines: {node: '>= 0.8.0'} 776 | 777 | locate-path@6.0.0: 778 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 779 | engines: {node: '>=10'} 780 | 781 | lodash-es@4.17.21: 782 | resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} 783 | 784 | lodash.merge@4.6.2: 785 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 786 | 787 | loose-envify@1.4.0: 788 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 789 | hasBin: true 790 | 791 | lower-case@2.0.2: 792 | resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} 793 | 794 | magic-string@0.26.7: 795 | resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==} 796 | engines: {node: '>=12'} 797 | 798 | merge2@1.4.1: 799 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 800 | engines: {node: '>= 8'} 801 | 802 | micromatch@4.0.8: 803 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 804 | engines: {node: '>=8.6'} 805 | 806 | minimatch@3.1.2: 807 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 808 | 809 | minimatch@9.0.5: 810 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 811 | engines: {node: '>=16 || 14 >=14.17'} 812 | 813 | ms@2.1.2: 814 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 815 | 816 | nanoid@3.3.7: 817 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 818 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 819 | hasBin: true 820 | 821 | natural-compare@1.4.0: 822 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 823 | 824 | no-case@3.0.4: 825 | resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} 826 | 827 | optionator@0.9.4: 828 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 829 | engines: {node: '>= 0.8.0'} 830 | 831 | p-limit@3.1.0: 832 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 833 | engines: {node: '>=10'} 834 | 835 | p-locate@5.0.0: 836 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 837 | engines: {node: '>=10'} 838 | 839 | parent-module@1.0.1: 840 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 841 | engines: {node: '>=6'} 842 | 843 | path-exists@4.0.0: 844 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 845 | engines: {node: '>=8'} 846 | 847 | path-key@3.1.1: 848 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 849 | engines: {node: '>=8'} 850 | 851 | path@0.12.7: 852 | resolution: {integrity: sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==} 853 | 854 | picocolors@1.0.1: 855 | resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} 856 | 857 | picomatch@2.3.1: 858 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 859 | engines: {node: '>=8.6'} 860 | 861 | postcss@8.4.42: 862 | resolution: {integrity: sha512-hywKUQB9Ra4dR1mGhldy5Aj1X3MWDSIA1cEi+Uy0CjheLvP6Ual5RlwMCh8i/X121yEDLDIKBsrCQ8ba3FDMfQ==} 863 | engines: {node: ^10 || ^12 || >=14} 864 | 865 | prelude-ls@1.2.1: 866 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 867 | engines: {node: '>= 0.8.0'} 868 | 869 | prettier-linter-helpers@1.0.0: 870 | resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} 871 | engines: {node: '>=6.0.0'} 872 | 873 | prettier@3.3.3: 874 | resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} 875 | engines: {node: '>=14'} 876 | hasBin: true 877 | 878 | process@0.11.10: 879 | resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} 880 | engines: {node: '>= 0.6.0'} 881 | 882 | punycode@2.3.1: 883 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 884 | engines: {node: '>=6'} 885 | 886 | queue-microtask@1.2.3: 887 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 888 | 889 | react-dom@18.3.1: 890 | resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} 891 | peerDependencies: 892 | react: ^18.3.1 893 | 894 | react-string-replace@https://codeload.github.com/iansinnott/react-string-replace/tar.gz/ead57a2d814558a288a069b99dcf3f1ae406a71e: 895 | resolution: {tarball: https://codeload.github.com/iansinnott/react-string-replace/tar.gz/ead57a2d814558a288a069b99dcf3f1ae406a71e} 896 | version: 1.1.1 897 | engines: {node: '>=0.12.0'} 898 | 899 | react@18.3.1: 900 | resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} 901 | engines: {node: '>=0.10.0'} 902 | 903 | resolve-from@4.0.0: 904 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 905 | engines: {node: '>=4'} 906 | 907 | reusify@1.0.4: 908 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 909 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 910 | 911 | rollup@4.21.2: 912 | resolution: {integrity: sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==} 913 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 914 | hasBin: true 915 | 916 | run-parallel@1.2.0: 917 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 918 | 919 | scheduler@0.23.2: 920 | resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} 921 | 922 | semver@7.6.3: 923 | resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} 924 | engines: {node: '>=10'} 925 | hasBin: true 926 | 927 | shebang-command@2.0.0: 928 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 929 | engines: {node: '>=8'} 930 | 931 | shebang-regex@3.0.0: 932 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 933 | engines: {node: '>=8'} 934 | 935 | showdown@2.1.0: 936 | resolution: {integrity: sha512-/6NVYu4U819R2pUIk79n67SYgJHWCce0a5xTP979WbNp0FL9MN1I1QK662IDU1b6JzKTvmhgI7T7JYIxBi3kMQ==} 937 | hasBin: true 938 | 939 | snake-case@3.0.4: 940 | resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} 941 | 942 | source-map-js@1.2.0: 943 | resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} 944 | engines: {node: '>=0.10.0'} 945 | 946 | sourcemap-codec@1.4.8: 947 | resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} 948 | deprecated: Please use @jridgewell/sourcemap-codec instead 949 | 950 | stats-lite@2.2.0: 951 | resolution: {integrity: sha512-/Kz55rgUIv2KP2MKphwYT/NCuSfAlbbMRv2ZWw7wyXayu230zdtzhxxuXXcvsc6EmmhS8bSJl3uS1wmMHFumbA==} 952 | engines: {node: '>=2.0.0'} 953 | 954 | strip-ansi@6.0.1: 955 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 956 | engines: {node: '>=8'} 957 | 958 | strip-json-comments@3.1.1: 959 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 960 | engines: {node: '>=8'} 961 | 962 | supports-color@7.2.0: 963 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 964 | engines: {node: '>=8'} 965 | 966 | synckit@0.9.1: 967 | resolution: {integrity: sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==} 968 | engines: {node: ^14.18.0 || >=16.0.0} 969 | 970 | text-table@0.2.0: 971 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 972 | 973 | to-regex-range@5.0.1: 974 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 975 | engines: {node: '>=8.0'} 976 | 977 | ts-api-utils@1.3.0: 978 | resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} 979 | engines: {node: '>=16'} 980 | peerDependencies: 981 | typescript: '>=4.2.0' 982 | 983 | tsconfck@3.1.3: 984 | resolution: {integrity: sha512-ulNZP1SVpRDesxeMLON/LtWM8HIgAJEIVpVVhBM6gsmvQ8+Rh+ZG7FWGvHh7Ah3pRABwVJWklWCr/BTZSv0xnQ==} 985 | engines: {node: ^18 || >=20} 986 | hasBin: true 987 | peerDependencies: 988 | typescript: ^5.0.0 989 | peerDependenciesMeta: 990 | typescript: 991 | optional: true 992 | 993 | tslib@2.7.0: 994 | resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} 995 | 996 | type-check@0.4.0: 997 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 998 | engines: {node: '>= 0.8.0'} 999 | 1000 | typescript-eslint@8.3.0: 1001 | resolution: {integrity: sha512-EvWjwWLwwKDIJuBjk2I6UkV8KEQcwZ0VM10nR1rIunRDIP67QJTZAHBXTX0HW/oI1H10YESF8yWie8fRQxjvFA==} 1002 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1003 | peerDependencies: 1004 | typescript: '*' 1005 | peerDependenciesMeta: 1006 | typescript: 1007 | optional: true 1008 | 1009 | typescript@5.5.4: 1010 | resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} 1011 | engines: {node: '>=14.17'} 1012 | hasBin: true 1013 | 1014 | undici-types@6.19.8: 1015 | resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} 1016 | 1017 | uri-js@4.4.1: 1018 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1019 | 1020 | util@0.10.4: 1021 | resolution: {integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==} 1022 | 1023 | vite-plugin-logseq@1.1.2: 1024 | resolution: {integrity: sha512-l5YvoH3K25Zx9eqgoJFug7NfVqSPwq7/FcYYhN1TkdG8ZOiD+c+TAwdCS2dJbGgvx8GmSpbgwSZWgslB+wH53g==} 1025 | 1026 | vite-tsconfig-paths@5.0.1: 1027 | resolution: {integrity: sha512-yqwv+LstU7NwPeNqajZzLEBVpUFU6Dugtb2P84FXuvaoYA+/70l9MHE+GYfYAycVyPSDYZ7mjOFuYBRqlEpTig==} 1028 | peerDependencies: 1029 | vite: '*' 1030 | peerDependenciesMeta: 1031 | vite: 1032 | optional: true 1033 | 1034 | vite@5.4.2: 1035 | resolution: {integrity: sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==} 1036 | engines: {node: ^18.0.0 || >=20.0.0} 1037 | hasBin: true 1038 | peerDependencies: 1039 | '@types/node': ^18.0.0 || >=20.0.0 1040 | less: '*' 1041 | lightningcss: ^1.21.0 1042 | sass: '*' 1043 | sass-embedded: '*' 1044 | stylus: '*' 1045 | sugarss: '*' 1046 | terser: ^5.4.0 1047 | peerDependenciesMeta: 1048 | '@types/node': 1049 | optional: true 1050 | less: 1051 | optional: true 1052 | lightningcss: 1053 | optional: true 1054 | sass: 1055 | optional: true 1056 | sass-embedded: 1057 | optional: true 1058 | stylus: 1059 | optional: true 1060 | sugarss: 1061 | optional: true 1062 | terser: 1063 | optional: true 1064 | 1065 | which@2.0.2: 1066 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1067 | engines: {node: '>= 8'} 1068 | hasBin: true 1069 | 1070 | word-wrap@1.2.5: 1071 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1072 | engines: {node: '>=0.10.0'} 1073 | 1074 | yocto-queue@0.1.0: 1075 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1076 | engines: {node: '>=10'} 1077 | 1078 | snapshots: 1079 | 1080 | '@esbuild/aix-ppc64@0.21.5': 1081 | optional: true 1082 | 1083 | '@esbuild/android-arm64@0.21.5': 1084 | optional: true 1085 | 1086 | '@esbuild/android-arm@0.21.5': 1087 | optional: true 1088 | 1089 | '@esbuild/android-x64@0.21.5': 1090 | optional: true 1091 | 1092 | '@esbuild/darwin-arm64@0.21.5': 1093 | optional: true 1094 | 1095 | '@esbuild/darwin-x64@0.21.5': 1096 | optional: true 1097 | 1098 | '@esbuild/freebsd-arm64@0.21.5': 1099 | optional: true 1100 | 1101 | '@esbuild/freebsd-x64@0.21.5': 1102 | optional: true 1103 | 1104 | '@esbuild/linux-arm64@0.21.5': 1105 | optional: true 1106 | 1107 | '@esbuild/linux-arm@0.21.5': 1108 | optional: true 1109 | 1110 | '@esbuild/linux-ia32@0.21.5': 1111 | optional: true 1112 | 1113 | '@esbuild/linux-loong64@0.21.5': 1114 | optional: true 1115 | 1116 | '@esbuild/linux-mips64el@0.21.5': 1117 | optional: true 1118 | 1119 | '@esbuild/linux-ppc64@0.21.5': 1120 | optional: true 1121 | 1122 | '@esbuild/linux-riscv64@0.21.5': 1123 | optional: true 1124 | 1125 | '@esbuild/linux-s390x@0.21.5': 1126 | optional: true 1127 | 1128 | '@esbuild/linux-x64@0.21.5': 1129 | optional: true 1130 | 1131 | '@esbuild/netbsd-x64@0.21.5': 1132 | optional: true 1133 | 1134 | '@esbuild/openbsd-x64@0.21.5': 1135 | optional: true 1136 | 1137 | '@esbuild/sunos-x64@0.21.5': 1138 | optional: true 1139 | 1140 | '@esbuild/win32-arm64@0.21.5': 1141 | optional: true 1142 | 1143 | '@esbuild/win32-ia32@0.21.5': 1144 | optional: true 1145 | 1146 | '@esbuild/win32-x64@0.21.5': 1147 | optional: true 1148 | 1149 | '@eslint-community/eslint-utils@4.4.0(eslint@9.9.1)': 1150 | dependencies: 1151 | eslint: 9.9.1 1152 | eslint-visitor-keys: 3.4.3 1153 | 1154 | '@eslint-community/regexpp@4.11.0': {} 1155 | 1156 | '@eslint/config-array@0.18.0': 1157 | dependencies: 1158 | '@eslint/object-schema': 2.1.4 1159 | debug: 4.3.6 1160 | minimatch: 3.1.2 1161 | transitivePeerDependencies: 1162 | - supports-color 1163 | 1164 | '@eslint/eslintrc@3.1.0': 1165 | dependencies: 1166 | ajv: 6.12.6 1167 | debug: 4.3.6 1168 | espree: 10.1.0 1169 | globals: 14.0.0 1170 | ignore: 5.3.2 1171 | import-fresh: 3.3.0 1172 | js-yaml: 4.1.0 1173 | minimatch: 3.1.2 1174 | strip-json-comments: 3.1.1 1175 | transitivePeerDependencies: 1176 | - supports-color 1177 | 1178 | '@eslint/js@9.9.1': {} 1179 | 1180 | '@eslint/object-schema@2.1.4': {} 1181 | 1182 | '@humanwhocodes/module-importer@1.0.1': {} 1183 | 1184 | '@humanwhocodes/retry@0.3.0': {} 1185 | 1186 | '@logseq/libs@0.0.17': 1187 | dependencies: 1188 | csstype: 3.1.0 1189 | debug: 4.3.4 1190 | deepmerge: 4.3.1 1191 | dompurify: 2.3.8 1192 | eventemitter3: 4.0.7 1193 | fast-deep-equal: 3.1.3 1194 | lodash-es: 4.17.21 1195 | path: 0.12.7 1196 | snake-case: 3.0.4 1197 | transitivePeerDependencies: 1198 | - supports-color 1199 | 1200 | '@nodelib/fs.scandir@2.1.5': 1201 | dependencies: 1202 | '@nodelib/fs.stat': 2.0.5 1203 | run-parallel: 1.2.0 1204 | 1205 | '@nodelib/fs.stat@2.0.5': {} 1206 | 1207 | '@nodelib/fs.walk@1.2.8': 1208 | dependencies: 1209 | '@nodelib/fs.scandir': 2.1.5 1210 | fastq: 1.17.1 1211 | 1212 | '@pkgr/core@0.1.1': {} 1213 | 1214 | '@rollup/rollup-android-arm-eabi@4.21.2': 1215 | optional: true 1216 | 1217 | '@rollup/rollup-android-arm64@4.21.2': 1218 | optional: true 1219 | 1220 | '@rollup/rollup-darwin-arm64@4.21.2': 1221 | optional: true 1222 | 1223 | '@rollup/rollup-darwin-x64@4.21.2': 1224 | optional: true 1225 | 1226 | '@rollup/rollup-linux-arm-gnueabihf@4.21.2': 1227 | optional: true 1228 | 1229 | '@rollup/rollup-linux-arm-musleabihf@4.21.2': 1230 | optional: true 1231 | 1232 | '@rollup/rollup-linux-arm64-gnu@4.21.2': 1233 | optional: true 1234 | 1235 | '@rollup/rollup-linux-arm64-musl@4.21.2': 1236 | optional: true 1237 | 1238 | '@rollup/rollup-linux-powerpc64le-gnu@4.21.2': 1239 | optional: true 1240 | 1241 | '@rollup/rollup-linux-riscv64-gnu@4.21.2': 1242 | optional: true 1243 | 1244 | '@rollup/rollup-linux-s390x-gnu@4.21.2': 1245 | optional: true 1246 | 1247 | '@rollup/rollup-linux-x64-gnu@4.21.2': 1248 | optional: true 1249 | 1250 | '@rollup/rollup-linux-x64-musl@4.21.2': 1251 | optional: true 1252 | 1253 | '@rollup/rollup-win32-arm64-msvc@4.21.2': 1254 | optional: true 1255 | 1256 | '@rollup/rollup-win32-ia32-msvc@4.21.2': 1257 | optional: true 1258 | 1259 | '@rollup/rollup-win32-x64-msvc@4.21.2': 1260 | optional: true 1261 | 1262 | '@tanstack/react-table@8.20.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': 1263 | dependencies: 1264 | '@tanstack/table-core': 8.20.5 1265 | react: 18.3.1 1266 | react-dom: 18.3.1(react@18.3.1) 1267 | 1268 | '@tanstack/table-core@8.20.5': {} 1269 | 1270 | '@types/eslint-config-prettier@6.11.3': {} 1271 | 1272 | '@types/eslint@9.6.1': 1273 | dependencies: 1274 | '@types/estree': 1.0.5 1275 | '@types/json-schema': 7.0.15 1276 | 1277 | '@types/eslint__js@8.42.3': 1278 | dependencies: 1279 | '@types/eslint': 9.6.1 1280 | 1281 | '@types/estree@1.0.5': {} 1282 | 1283 | '@types/json-schema@7.0.15': {} 1284 | 1285 | '@types/node@22.5.1': 1286 | dependencies: 1287 | undici-types: 6.19.8 1288 | 1289 | '@types/prop-types@15.7.12': {} 1290 | 1291 | '@types/react-dom@18.3.0': 1292 | dependencies: 1293 | '@types/react': 18.3.5 1294 | 1295 | '@types/react@18.3.5': 1296 | dependencies: 1297 | '@types/prop-types': 15.7.12 1298 | csstype: 3.1.3 1299 | 1300 | '@types/showdown@2.0.6': {} 1301 | 1302 | '@typescript-eslint/eslint-plugin@8.3.0(@typescript-eslint/parser@8.3.0(eslint@9.9.1)(typescript@5.5.4))(eslint@9.9.1)(typescript@5.5.4)': 1303 | dependencies: 1304 | '@eslint-community/regexpp': 4.11.0 1305 | '@typescript-eslint/parser': 8.3.0(eslint@9.9.1)(typescript@5.5.4) 1306 | '@typescript-eslint/scope-manager': 8.3.0 1307 | '@typescript-eslint/type-utils': 8.3.0(eslint@9.9.1)(typescript@5.5.4) 1308 | '@typescript-eslint/utils': 8.3.0(eslint@9.9.1)(typescript@5.5.4) 1309 | '@typescript-eslint/visitor-keys': 8.3.0 1310 | eslint: 9.9.1 1311 | graphemer: 1.4.0 1312 | ignore: 5.3.2 1313 | natural-compare: 1.4.0 1314 | ts-api-utils: 1.3.0(typescript@5.5.4) 1315 | optionalDependencies: 1316 | typescript: 5.5.4 1317 | transitivePeerDependencies: 1318 | - supports-color 1319 | 1320 | '@typescript-eslint/parser@8.3.0(eslint@9.9.1)(typescript@5.5.4)': 1321 | dependencies: 1322 | '@typescript-eslint/scope-manager': 8.3.0 1323 | '@typescript-eslint/types': 8.3.0 1324 | '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.5.4) 1325 | '@typescript-eslint/visitor-keys': 8.3.0 1326 | debug: 4.3.6 1327 | eslint: 9.9.1 1328 | optionalDependencies: 1329 | typescript: 5.5.4 1330 | transitivePeerDependencies: 1331 | - supports-color 1332 | 1333 | '@typescript-eslint/scope-manager@8.3.0': 1334 | dependencies: 1335 | '@typescript-eslint/types': 8.3.0 1336 | '@typescript-eslint/visitor-keys': 8.3.0 1337 | 1338 | '@typescript-eslint/type-utils@8.3.0(eslint@9.9.1)(typescript@5.5.4)': 1339 | dependencies: 1340 | '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.5.4) 1341 | '@typescript-eslint/utils': 8.3.0(eslint@9.9.1)(typescript@5.5.4) 1342 | debug: 4.3.6 1343 | ts-api-utils: 1.3.0(typescript@5.5.4) 1344 | optionalDependencies: 1345 | typescript: 5.5.4 1346 | transitivePeerDependencies: 1347 | - eslint 1348 | - supports-color 1349 | 1350 | '@typescript-eslint/types@8.3.0': {} 1351 | 1352 | '@typescript-eslint/typescript-estree@8.3.0(typescript@5.5.4)': 1353 | dependencies: 1354 | '@typescript-eslint/types': 8.3.0 1355 | '@typescript-eslint/visitor-keys': 8.3.0 1356 | debug: 4.3.6 1357 | fast-glob: 3.3.2 1358 | is-glob: 4.0.3 1359 | minimatch: 9.0.5 1360 | semver: 7.6.3 1361 | ts-api-utils: 1.3.0(typescript@5.5.4) 1362 | optionalDependencies: 1363 | typescript: 5.5.4 1364 | transitivePeerDependencies: 1365 | - supports-color 1366 | 1367 | '@typescript-eslint/utils@8.3.0(eslint@9.9.1)(typescript@5.5.4)': 1368 | dependencies: 1369 | '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.1) 1370 | '@typescript-eslint/scope-manager': 8.3.0 1371 | '@typescript-eslint/types': 8.3.0 1372 | '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.5.4) 1373 | eslint: 9.9.1 1374 | transitivePeerDependencies: 1375 | - supports-color 1376 | - typescript 1377 | 1378 | '@typescript-eslint/visitor-keys@8.3.0': 1379 | dependencies: 1380 | '@typescript-eslint/types': 8.3.0 1381 | eslint-visitor-keys: 3.4.3 1382 | 1383 | acorn-jsx@5.3.2(acorn@8.12.1): 1384 | dependencies: 1385 | acorn: 8.12.1 1386 | 1387 | acorn@8.12.1: {} 1388 | 1389 | ajv@6.12.6: 1390 | dependencies: 1391 | fast-deep-equal: 3.1.3 1392 | fast-json-stable-stringify: 2.1.0 1393 | json-schema-traverse: 0.4.1 1394 | uri-js: 4.4.1 1395 | 1396 | ansi-regex@5.0.1: {} 1397 | 1398 | ansi-styles@4.3.0: 1399 | dependencies: 1400 | color-convert: 2.0.1 1401 | 1402 | argparse@2.0.1: {} 1403 | 1404 | balanced-match@1.0.2: {} 1405 | 1406 | brace-expansion@1.1.11: 1407 | dependencies: 1408 | balanced-match: 1.0.2 1409 | concat-map: 0.0.1 1410 | 1411 | brace-expansion@2.0.1: 1412 | dependencies: 1413 | balanced-match: 1.0.2 1414 | 1415 | braces@3.0.3: 1416 | dependencies: 1417 | fill-range: 7.1.1 1418 | 1419 | callsites@3.1.0: {} 1420 | 1421 | chalk@4.1.2: 1422 | dependencies: 1423 | ansi-styles: 4.3.0 1424 | supports-color: 7.2.0 1425 | 1426 | color-convert@2.0.1: 1427 | dependencies: 1428 | color-name: 1.1.4 1429 | 1430 | color-name@1.1.4: {} 1431 | 1432 | commander@9.5.0: {} 1433 | 1434 | concat-map@0.0.1: {} 1435 | 1436 | cross-spawn@7.0.3: 1437 | dependencies: 1438 | path-key: 3.1.1 1439 | shebang-command: 2.0.0 1440 | which: 2.0.2 1441 | 1442 | csstype@3.1.0: {} 1443 | 1444 | csstype@3.1.3: {} 1445 | 1446 | debug@4.3.4: 1447 | dependencies: 1448 | ms: 2.1.2 1449 | 1450 | debug@4.3.6: 1451 | dependencies: 1452 | ms: 2.1.2 1453 | 1454 | deep-is@0.1.4: {} 1455 | 1456 | deepmerge@4.3.1: {} 1457 | 1458 | dompurify@2.3.8: {} 1459 | 1460 | dot-case@3.0.4: 1461 | dependencies: 1462 | no-case: 3.0.4 1463 | tslib: 2.7.0 1464 | 1465 | esbuild@0.21.5: 1466 | optionalDependencies: 1467 | '@esbuild/aix-ppc64': 0.21.5 1468 | '@esbuild/android-arm': 0.21.5 1469 | '@esbuild/android-arm64': 0.21.5 1470 | '@esbuild/android-x64': 0.21.5 1471 | '@esbuild/darwin-arm64': 0.21.5 1472 | '@esbuild/darwin-x64': 0.21.5 1473 | '@esbuild/freebsd-arm64': 0.21.5 1474 | '@esbuild/freebsd-x64': 0.21.5 1475 | '@esbuild/linux-arm': 0.21.5 1476 | '@esbuild/linux-arm64': 0.21.5 1477 | '@esbuild/linux-ia32': 0.21.5 1478 | '@esbuild/linux-loong64': 0.21.5 1479 | '@esbuild/linux-mips64el': 0.21.5 1480 | '@esbuild/linux-ppc64': 0.21.5 1481 | '@esbuild/linux-riscv64': 0.21.5 1482 | '@esbuild/linux-s390x': 0.21.5 1483 | '@esbuild/linux-x64': 0.21.5 1484 | '@esbuild/netbsd-x64': 0.21.5 1485 | '@esbuild/openbsd-x64': 0.21.5 1486 | '@esbuild/sunos-x64': 0.21.5 1487 | '@esbuild/win32-arm64': 0.21.5 1488 | '@esbuild/win32-ia32': 0.21.5 1489 | '@esbuild/win32-x64': 0.21.5 1490 | 1491 | escape-string-regexp@4.0.0: {} 1492 | 1493 | eslint-config-prettier@9.1.0(eslint@9.9.1): 1494 | dependencies: 1495 | eslint: 9.9.1 1496 | 1497 | eslint-plugin-prettier@5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@9.9.1))(eslint@9.9.1)(prettier@3.3.3): 1498 | dependencies: 1499 | eslint: 9.9.1 1500 | prettier: 3.3.3 1501 | prettier-linter-helpers: 1.0.0 1502 | synckit: 0.9.1 1503 | optionalDependencies: 1504 | '@types/eslint': 9.6.1 1505 | eslint-config-prettier: 9.1.0(eslint@9.9.1) 1506 | 1507 | eslint-plugin-simple-import-sort@12.1.1(eslint@9.9.1): 1508 | dependencies: 1509 | eslint: 9.9.1 1510 | 1511 | eslint-scope@8.0.2: 1512 | dependencies: 1513 | esrecurse: 4.3.0 1514 | estraverse: 5.3.0 1515 | 1516 | eslint-visitor-keys@3.4.3: {} 1517 | 1518 | eslint-visitor-keys@4.0.0: {} 1519 | 1520 | eslint@9.9.1: 1521 | dependencies: 1522 | '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.1) 1523 | '@eslint-community/regexpp': 4.11.0 1524 | '@eslint/config-array': 0.18.0 1525 | '@eslint/eslintrc': 3.1.0 1526 | '@eslint/js': 9.9.1 1527 | '@humanwhocodes/module-importer': 1.0.1 1528 | '@humanwhocodes/retry': 0.3.0 1529 | '@nodelib/fs.walk': 1.2.8 1530 | ajv: 6.12.6 1531 | chalk: 4.1.2 1532 | cross-spawn: 7.0.3 1533 | debug: 4.3.6 1534 | escape-string-regexp: 4.0.0 1535 | eslint-scope: 8.0.2 1536 | eslint-visitor-keys: 4.0.0 1537 | espree: 10.1.0 1538 | esquery: 1.6.0 1539 | esutils: 2.0.3 1540 | fast-deep-equal: 3.1.3 1541 | file-entry-cache: 8.0.0 1542 | find-up: 5.0.0 1543 | glob-parent: 6.0.2 1544 | ignore: 5.3.2 1545 | imurmurhash: 0.1.4 1546 | is-glob: 4.0.3 1547 | is-path-inside: 3.0.3 1548 | json-stable-stringify-without-jsonify: 1.0.1 1549 | levn: 0.4.1 1550 | lodash.merge: 4.6.2 1551 | minimatch: 3.1.2 1552 | natural-compare: 1.4.0 1553 | optionator: 0.9.4 1554 | strip-ansi: 6.0.1 1555 | text-table: 0.2.0 1556 | transitivePeerDependencies: 1557 | - supports-color 1558 | 1559 | espree@10.1.0: 1560 | dependencies: 1561 | acorn: 8.12.1 1562 | acorn-jsx: 5.3.2(acorn@8.12.1) 1563 | eslint-visitor-keys: 4.0.0 1564 | 1565 | esquery@1.6.0: 1566 | dependencies: 1567 | estraverse: 5.3.0 1568 | 1569 | esrecurse@4.3.0: 1570 | dependencies: 1571 | estraverse: 5.3.0 1572 | 1573 | estraverse@5.3.0: {} 1574 | 1575 | esutils@2.0.3: {} 1576 | 1577 | eventemitter3@4.0.7: {} 1578 | 1579 | fast-deep-equal@3.1.3: {} 1580 | 1581 | fast-diff@1.3.0: {} 1582 | 1583 | fast-glob@3.3.2: 1584 | dependencies: 1585 | '@nodelib/fs.stat': 2.0.5 1586 | '@nodelib/fs.walk': 1.2.8 1587 | glob-parent: 5.1.2 1588 | merge2: 1.4.1 1589 | micromatch: 4.0.8 1590 | 1591 | fast-json-stable-stringify@2.1.0: {} 1592 | 1593 | fast-levenshtein@2.0.6: {} 1594 | 1595 | fastq@1.17.1: 1596 | dependencies: 1597 | reusify: 1.0.4 1598 | 1599 | file-entry-cache@8.0.0: 1600 | dependencies: 1601 | flat-cache: 4.0.1 1602 | 1603 | fill-range@7.1.1: 1604 | dependencies: 1605 | to-regex-range: 5.0.1 1606 | 1607 | find-up@5.0.0: 1608 | dependencies: 1609 | locate-path: 6.0.0 1610 | path-exists: 4.0.0 1611 | 1612 | flat-cache@4.0.1: 1613 | dependencies: 1614 | flatted: 3.3.1 1615 | keyv: 4.5.4 1616 | 1617 | flatted@3.3.1: {} 1618 | 1619 | fsevents@2.3.3: 1620 | optional: true 1621 | 1622 | glob-parent@5.1.2: 1623 | dependencies: 1624 | is-glob: 4.0.3 1625 | 1626 | glob-parent@6.0.2: 1627 | dependencies: 1628 | is-glob: 4.0.3 1629 | 1630 | globals@14.0.0: {} 1631 | 1632 | globrex@0.1.2: {} 1633 | 1634 | graphemer@1.4.0: {} 1635 | 1636 | has-flag@4.0.0: {} 1637 | 1638 | husky@9.1.5: {} 1639 | 1640 | ignore@5.3.2: {} 1641 | 1642 | import-fresh@3.3.0: 1643 | dependencies: 1644 | parent-module: 1.0.1 1645 | resolve-from: 4.0.0 1646 | 1647 | imurmurhash@0.1.4: {} 1648 | 1649 | inherits@2.0.3: {} 1650 | 1651 | is-extglob@2.1.1: {} 1652 | 1653 | is-glob@4.0.3: 1654 | dependencies: 1655 | is-extglob: 2.1.1 1656 | 1657 | is-number@7.0.0: {} 1658 | 1659 | is-path-inside@3.0.3: {} 1660 | 1661 | isexe@2.0.0: {} 1662 | 1663 | isnumber@1.0.0: {} 1664 | 1665 | js-tokens@4.0.0: {} 1666 | 1667 | js-yaml@4.1.0: 1668 | dependencies: 1669 | argparse: 2.0.1 1670 | 1671 | json-buffer@3.0.1: {} 1672 | 1673 | json-schema-traverse@0.4.1: {} 1674 | 1675 | json-stable-stringify-without-jsonify@1.0.1: {} 1676 | 1677 | keyv@4.5.4: 1678 | dependencies: 1679 | json-buffer: 3.0.1 1680 | 1681 | levn@0.4.1: 1682 | dependencies: 1683 | prelude-ls: 1.2.1 1684 | type-check: 0.4.0 1685 | 1686 | locate-path@6.0.0: 1687 | dependencies: 1688 | p-locate: 5.0.0 1689 | 1690 | lodash-es@4.17.21: {} 1691 | 1692 | lodash.merge@4.6.2: {} 1693 | 1694 | loose-envify@1.4.0: 1695 | dependencies: 1696 | js-tokens: 4.0.0 1697 | 1698 | lower-case@2.0.2: 1699 | dependencies: 1700 | tslib: 2.7.0 1701 | 1702 | magic-string@0.26.7: 1703 | dependencies: 1704 | sourcemap-codec: 1.4.8 1705 | 1706 | merge2@1.4.1: {} 1707 | 1708 | micromatch@4.0.8: 1709 | dependencies: 1710 | braces: 3.0.3 1711 | picomatch: 2.3.1 1712 | 1713 | minimatch@3.1.2: 1714 | dependencies: 1715 | brace-expansion: 1.1.11 1716 | 1717 | minimatch@9.0.5: 1718 | dependencies: 1719 | brace-expansion: 2.0.1 1720 | 1721 | ms@2.1.2: {} 1722 | 1723 | nanoid@3.3.7: {} 1724 | 1725 | natural-compare@1.4.0: {} 1726 | 1727 | no-case@3.0.4: 1728 | dependencies: 1729 | lower-case: 2.0.2 1730 | tslib: 2.7.0 1731 | 1732 | optionator@0.9.4: 1733 | dependencies: 1734 | deep-is: 0.1.4 1735 | fast-levenshtein: 2.0.6 1736 | levn: 0.4.1 1737 | prelude-ls: 1.2.1 1738 | type-check: 0.4.0 1739 | word-wrap: 1.2.5 1740 | 1741 | p-limit@3.1.0: 1742 | dependencies: 1743 | yocto-queue: 0.1.0 1744 | 1745 | p-locate@5.0.0: 1746 | dependencies: 1747 | p-limit: 3.1.0 1748 | 1749 | parent-module@1.0.1: 1750 | dependencies: 1751 | callsites: 3.1.0 1752 | 1753 | path-exists@4.0.0: {} 1754 | 1755 | path-key@3.1.1: {} 1756 | 1757 | path@0.12.7: 1758 | dependencies: 1759 | process: 0.11.10 1760 | util: 0.10.4 1761 | 1762 | picocolors@1.0.1: {} 1763 | 1764 | picomatch@2.3.1: {} 1765 | 1766 | postcss@8.4.42: 1767 | dependencies: 1768 | nanoid: 3.3.7 1769 | picocolors: 1.0.1 1770 | source-map-js: 1.2.0 1771 | 1772 | prelude-ls@1.2.1: {} 1773 | 1774 | prettier-linter-helpers@1.0.0: 1775 | dependencies: 1776 | fast-diff: 1.3.0 1777 | 1778 | prettier@3.3.3: {} 1779 | 1780 | process@0.11.10: {} 1781 | 1782 | punycode@2.3.1: {} 1783 | 1784 | queue-microtask@1.2.3: {} 1785 | 1786 | react-dom@18.3.1(react@18.3.1): 1787 | dependencies: 1788 | loose-envify: 1.4.0 1789 | react: 18.3.1 1790 | scheduler: 0.23.2 1791 | 1792 | react-string-replace@https://codeload.github.com/iansinnott/react-string-replace/tar.gz/ead57a2d814558a288a069b99dcf3f1ae406a71e: {} 1793 | 1794 | react@18.3.1: 1795 | dependencies: 1796 | loose-envify: 1.4.0 1797 | 1798 | resolve-from@4.0.0: {} 1799 | 1800 | reusify@1.0.4: {} 1801 | 1802 | rollup@4.21.2: 1803 | dependencies: 1804 | '@types/estree': 1.0.5 1805 | optionalDependencies: 1806 | '@rollup/rollup-android-arm-eabi': 4.21.2 1807 | '@rollup/rollup-android-arm64': 4.21.2 1808 | '@rollup/rollup-darwin-arm64': 4.21.2 1809 | '@rollup/rollup-darwin-x64': 4.21.2 1810 | '@rollup/rollup-linux-arm-gnueabihf': 4.21.2 1811 | '@rollup/rollup-linux-arm-musleabihf': 4.21.2 1812 | '@rollup/rollup-linux-arm64-gnu': 4.21.2 1813 | '@rollup/rollup-linux-arm64-musl': 4.21.2 1814 | '@rollup/rollup-linux-powerpc64le-gnu': 4.21.2 1815 | '@rollup/rollup-linux-riscv64-gnu': 4.21.2 1816 | '@rollup/rollup-linux-s390x-gnu': 4.21.2 1817 | '@rollup/rollup-linux-x64-gnu': 4.21.2 1818 | '@rollup/rollup-linux-x64-musl': 4.21.2 1819 | '@rollup/rollup-win32-arm64-msvc': 4.21.2 1820 | '@rollup/rollup-win32-ia32-msvc': 4.21.2 1821 | '@rollup/rollup-win32-x64-msvc': 4.21.2 1822 | fsevents: 2.3.3 1823 | 1824 | run-parallel@1.2.0: 1825 | dependencies: 1826 | queue-microtask: 1.2.3 1827 | 1828 | scheduler@0.23.2: 1829 | dependencies: 1830 | loose-envify: 1.4.0 1831 | 1832 | semver@7.6.3: {} 1833 | 1834 | shebang-command@2.0.0: 1835 | dependencies: 1836 | shebang-regex: 3.0.0 1837 | 1838 | shebang-regex@3.0.0: {} 1839 | 1840 | showdown@2.1.0: 1841 | dependencies: 1842 | commander: 9.5.0 1843 | 1844 | snake-case@3.0.4: 1845 | dependencies: 1846 | dot-case: 3.0.4 1847 | tslib: 2.7.0 1848 | 1849 | source-map-js@1.2.0: {} 1850 | 1851 | sourcemap-codec@1.4.8: {} 1852 | 1853 | stats-lite@2.2.0: 1854 | dependencies: 1855 | isnumber: 1.0.0 1856 | 1857 | strip-ansi@6.0.1: 1858 | dependencies: 1859 | ansi-regex: 5.0.1 1860 | 1861 | strip-json-comments@3.1.1: {} 1862 | 1863 | supports-color@7.2.0: 1864 | dependencies: 1865 | has-flag: 4.0.0 1866 | 1867 | synckit@0.9.1: 1868 | dependencies: 1869 | '@pkgr/core': 0.1.1 1870 | tslib: 2.7.0 1871 | 1872 | text-table@0.2.0: {} 1873 | 1874 | to-regex-range@5.0.1: 1875 | dependencies: 1876 | is-number: 7.0.0 1877 | 1878 | ts-api-utils@1.3.0(typescript@5.5.4): 1879 | dependencies: 1880 | typescript: 5.5.4 1881 | 1882 | tsconfck@3.1.3(typescript@5.5.4): 1883 | optionalDependencies: 1884 | typescript: 5.5.4 1885 | 1886 | tslib@2.7.0: {} 1887 | 1888 | type-check@0.4.0: 1889 | dependencies: 1890 | prelude-ls: 1.2.1 1891 | 1892 | typescript-eslint@8.3.0(eslint@9.9.1)(typescript@5.5.4): 1893 | dependencies: 1894 | '@typescript-eslint/eslint-plugin': 8.3.0(@typescript-eslint/parser@8.3.0(eslint@9.9.1)(typescript@5.5.4))(eslint@9.9.1)(typescript@5.5.4) 1895 | '@typescript-eslint/parser': 8.3.0(eslint@9.9.1)(typescript@5.5.4) 1896 | '@typescript-eslint/utils': 8.3.0(eslint@9.9.1)(typescript@5.5.4) 1897 | optionalDependencies: 1898 | typescript: 5.5.4 1899 | transitivePeerDependencies: 1900 | - eslint 1901 | - supports-color 1902 | 1903 | typescript@5.5.4: {} 1904 | 1905 | undici-types@6.19.8: {} 1906 | 1907 | uri-js@4.4.1: 1908 | dependencies: 1909 | punycode: 2.3.1 1910 | 1911 | util@0.10.4: 1912 | dependencies: 1913 | inherits: 2.0.3 1914 | 1915 | vite-plugin-logseq@1.1.2: 1916 | dependencies: 1917 | magic-string: 0.26.7 1918 | 1919 | vite-tsconfig-paths@5.0.1(typescript@5.5.4)(vite@5.4.2(@types/node@22.5.1)): 1920 | dependencies: 1921 | debug: 4.3.6 1922 | globrex: 0.1.2 1923 | tsconfck: 3.1.3(typescript@5.5.4) 1924 | optionalDependencies: 1925 | vite: 5.4.2(@types/node@22.5.1) 1926 | transitivePeerDependencies: 1927 | - supports-color 1928 | - typescript 1929 | 1930 | vite@5.4.2(@types/node@22.5.1): 1931 | dependencies: 1932 | esbuild: 0.21.5 1933 | postcss: 8.4.42 1934 | rollup: 4.21.2 1935 | optionalDependencies: 1936 | '@types/node': 22.5.1 1937 | fsevents: 2.3.3 1938 | 1939 | which@2.0.2: 1940 | dependencies: 1941 | isexe: 2.0.0 1942 | 1943 | word-wrap@1.2.5: {} 1944 | 1945 | yocto-queue@0.1.0: {} 1946 | -------------------------------------------------------------------------------- /screenshots/basic-table.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benjypng/logseq-tablerender-plugin/d1b724d45f6f5dbf2ce818f5d9c2ecffcdfdc21e/screenshots/basic-table.png -------------------------------------------------------------------------------- /screenshots/percentile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benjypng/logseq-tablerender-plugin/d1b724d45f6f5dbf2ce818f5d9c2ecffcdfdc21e/screenshots/percentile.png -------------------------------------------------------------------------------- /screenshots/stats-01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benjypng/logseq-tablerender-plugin/d1b724d45f6f5dbf2ce818f5d9c2ecffcdfdc21e/screenshots/stats-01.png -------------------------------------------------------------------------------- /src/components/Summary.tsx: -------------------------------------------------------------------------------- 1 | import { MathResults } from '../libs/types' 2 | 3 | export const Summary = ({ results }: { results: MathResults[] }) => { 4 | logseq.provideStyle(` 5 | .summary { 6 | border: 2px solid; 7 | display: flex; 8 | flex-direction: row; 9 | padding: 3px; 10 | border-radius: 8px; 11 | gap: 2px; 12 | font-size: 90%; 13 | } 14 | 15 | .result-card { 16 | text-align: center; 17 | padding: 3px 2px; 18 | border: 1px solid; 19 | width: 100%; 20 | } 21 | 22 | .result-card > p { 23 | margin: 2px; 24 | } 25 | 26 | .description { 27 | font-style: italic; 28 | } 29 | `) 30 | 31 | if (results.length === 0) return null 32 | 33 | return ( 34 |
35 | {results.map((result, index) => { 36 | switch (result.type) { 37 | case 'average': 38 | return ( 39 |
40 | AVERAGE 41 |

{result.description}

42 |

{result.value.toFixed(4)}

43 |
44 | ) 45 | case 'sum': 46 | return ( 47 |
48 | SUM 49 |

{result.description}

50 |

{result.value.toFixed(4)}

51 |
52 | ) 53 | case 'median': 54 | return ( 55 |
56 | MEDIAN 57 |

{result.description}

58 |

{result.value.toFixed(4)}

59 |
60 | ) 61 | case 'mode': 62 | return ( 63 |
64 | MODE 65 |

{result.description}

66 |

{result.value.toFixed(4)}

67 |
68 | ) 69 | case 'variance': 70 | return ( 71 |
72 | VARIANCE 73 |

{result.description}

74 |

{result.value.toFixed(4)}

75 |
76 | ) 77 | case 'sd': 78 | return ( 79 |
80 | STANDARD DEVIATION 81 |

{result.description}

82 |

{result.value.toFixed(4)}

83 |
84 | ) 85 | case 'ssd': 86 | return ( 87 |
88 | SAMPLE STANDARD DEVIATION 89 |

{result.description}

90 |

{result.value.toFixed(4)}

91 |
92 | ) 93 | case 'percentile': 94 | return ( 95 |
96 | PERCENTILE 97 |

{result.description}

98 |

{result.value.toFixed(4)}

99 |
100 | ) 101 | default: 102 | return ( 103 |
104 | No data found 105 |
106 | ) 107 | } 108 | })} 109 |
110 | ) 111 | } 112 | -------------------------------------------------------------------------------- /src/components/Table.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | flexRender, 3 | getCoreRowModel, 4 | useReactTable, 5 | } from '@tanstack/react-table' 6 | 7 | import { ColumnProps, DataProps } from '../libs/types' 8 | 9 | export const Table = ({ 10 | data, 11 | columns, 12 | }: { 13 | data: DataProps[] 14 | columns: ColumnProps[] 15 | }) => { 16 | const table = useReactTable({ 17 | data, 18 | columns, 19 | getCoreRowModel: getCoreRowModel(), 20 | }) 21 | 22 | return ( 23 |
24 | 25 | 26 | {table.getHeaderGroups().map((headerGroup) => ( 27 | 28 | {headerGroup.headers.map((header) => ( 29 | 37 | ))} 38 | 39 | ))} 40 | 41 | 42 | {table.getRowModel().rows.map((row) => ( 43 | 44 | {row.getVisibleCells().map((cell) => { 45 | return ( 46 | 49 | ) 50 | })} 51 | 52 | ))} 53 | 54 |
30 | {header.isPlaceholder 31 | ? null 32 | : flexRender( 33 | header.column.columnDef.header, 34 | header.getContext(), 35 | )} 36 |
47 | {flexRender(cell.column.columnDef.cell, cell.getContext())} 48 |
55 |
56 | ) 57 | } 58 | -------------------------------------------------------------------------------- /src/helpers/blocks-as-columns.tsx: -------------------------------------------------------------------------------- 1 | import { BlockEntity } from '@logseq/libs/dist/LSPlugin.user' 2 | 3 | import { removeLsAttributes } from '../libs/process-content/remove-ls-attributes' 4 | import { checkCell } from './handle-cell-type' 5 | 6 | const getFirstChildren = (blockData: BlockEntity[]) => { 7 | if (blockData.length === 0) return [] 8 | const result = blockData.map((b: BlockEntity) => b.content) 9 | return result 10 | } 11 | 12 | const getData = (blockData: BlockEntity[]) => { 13 | if (blockData.length === 0) return [] 14 | 15 | // Get length of longest children 16 | const childrenBlocksLength = blockData.map((b) => b.children) 17 | const longestArrLength = Math.max( 18 | 0, 19 | ...childrenBlocksLength.map((s) => s!.length), 20 | ) 21 | 22 | const arr = [] 23 | for (let i = 0; i < longestArrLength; i++) { 24 | const mappedVal = blockData.map((b) => { 25 | if (!b.children) return 26 | if (b.children[i]) { 27 | return (b.children[i] as BlockEntity).content 28 | } 29 | }) 30 | arr.push(mappedVal) 31 | } 32 | return arr 33 | } 34 | 35 | export const blocksAsColumns = async ( 36 | blockData: BlockEntity[], 37 | graphName: string, 38 | path: string, 39 | ) => { 40 | // Column Headers Start 41 | const colArr = [] 42 | for (const [i, value] of getFirstChildren(blockData).entries()) { 43 | const col = `col${i + 1}` 44 | const payload = { 45 | accessorKey: col, 46 | header: removeLsAttributes(value), 47 | cell: ({ getValue }: { getValue: any }) => getValue(), 48 | } 49 | colArr.push(payload) 50 | } 51 | // Column Headers End 52 | 53 | // Data Row Start 54 | const rowArr = [] 55 | for (const [_i, cols] of getData(blockData).entries()) { 56 | const payload: Record = {} 57 | for (const [j, value] of cols.entries()) { 58 | if (!value) continue 59 | payload[`col${j + 1}`] = await checkCell(path, graphName, value) 60 | } 61 | rowArr.push(payload) 62 | } 63 | // Data Row End 64 | 65 | return { colArr, rowArr } 66 | } 67 | -------------------------------------------------------------------------------- /src/helpers/blocks-as-rows.tsx: -------------------------------------------------------------------------------- 1 | import { BlockEntity } from '@logseq/libs/dist/LSPlugin.user' 2 | 3 | import { removeLsAttributes } from '../libs/process-content/remove-ls-attributes' 4 | import { checkCell } from './handle-cell-type' 5 | 6 | const getFirstChildren = (blockData: BlockEntity[]) => { 7 | if (blockData.length === 0 || !blockData[0]) { 8 | return [] 9 | } 10 | const result = [] 11 | result.push(blockData[0].content) 12 | for (const b of blockData[0].children as BlockEntity[]) { 13 | result.push(b.content) 14 | } 15 | return result 16 | } 17 | 18 | export const blocksAsRows = async ( 19 | blockData: BlockEntity[], 20 | graphName: string, 21 | path: string, 22 | ) => { 23 | // Column Headers Start 24 | const colArr = [] 25 | for (const [i, value] of getFirstChildren(blockData).entries()) { 26 | const col = `col${i + 1}` 27 | const payload = { 28 | accessorKey: col, 29 | header: removeLsAttributes(value), 30 | cell: ({ getValue }: { getValue: any }) => getValue(), 31 | } 32 | colArr.push(payload) 33 | } 34 | // Column Headers End 35 | 36 | // Data Row Start 37 | const rowArr = [] 38 | for (let i = 1; i < blockData.length!; i++) { 39 | const payload: Record = {} 40 | payload[`col1`] =

{blockData[i]!.content}

41 | 42 | for (const [j, value] of blockData[i]!.children!.entries()) { 43 | if (!value) continue 44 | payload[`col${j + 2}`] = await checkCell( 45 | path, 46 | graphName, 47 | (value as BlockEntity).content, 48 | ) 49 | } 50 | rowArr.push(payload) 51 | } 52 | // Data Row End 53 | return { colArr, rowArr } 54 | } 55 | -------------------------------------------------------------------------------- /src/helpers/child-blocks-as-columns.tsx: -------------------------------------------------------------------------------- 1 | import { BlockEntity } from '@logseq/libs/dist/LSPlugin' 2 | 3 | import { removeLsAttributes } from '../libs/process-content/remove-ls-attributes' 4 | import { checkCell } from './handle-cell-type' 5 | 6 | const getFirstChildren = (blockData: BlockEntity) => { 7 | if (blockData.length == 0) { 8 | return [] 9 | } 10 | let trace = blockData 11 | const result = [trace.content] 12 | while (trace.children!.length > 0) { 13 | trace = trace.children![0] as BlockEntity 14 | result.push(trace.content) 15 | } 16 | return result 17 | } 18 | 19 | export const childBlocksAsColumns = async ( 20 | blockData: BlockEntity[], 21 | graphName: string, 22 | path: string, 23 | ) => { 24 | // Column Headers Start 25 | // When children are treated as rows, column headers come from the trace of first children of the tree. 26 | const colArr = [] 27 | if (blockData.length > 0 && blockData[0]) { 28 | for (const [i, value] of getFirstChildren(blockData[0]).entries()) { 29 | const col = `col${i + 1}` 30 | const payload = { 31 | accessorKey: col, 32 | header: removeLsAttributes(value), 33 | cell: ({ getValue }: { getValue: any }) => getValue(), 34 | } 35 | colArr.push(payload) 36 | } 37 | } 38 | // Column Headers End 39 | 40 | // Data Row Start 41 | const rowArr = [] 42 | for (let i = 1; i < blockData.length; i++) { 43 | const payload: Record = {} 44 | for (const [j, value] of getFirstChildren( 45 | blockData[i] as BlockEntity, 46 | ).entries()) { 47 | if (!value) continue 48 | payload[`col${j + 1}`] = await checkCell(path, graphName, value) 49 | } 50 | rowArr.push(payload) 51 | } 52 | // Data Row End 53 | 54 | return { colArr, rowArr } 55 | } 56 | -------------------------------------------------------------------------------- /src/helpers/handle-cell-type.tsx: -------------------------------------------------------------------------------- 1 | import showdown from 'showdown' 2 | 3 | import { removeLsAttributes } from '../libs/process-content/remove-ls-attributes' 4 | 5 | const converter = new showdown.Converter() 6 | 7 | export const checkCell = async ( 8 | _path: string, 9 | graphName: string, 10 | content: string, 11 | ) => { 12 | let str = removeLsAttributes(content) 13 | str = converter.makeHtml(str) 14 | 15 | if (str.startsWith('

https://')) { 16 | str = str.replaceAll('

', '').replaceAll('

', '') 17 | str = `${str}` 18 | } 19 | 20 | const rxPageRef = /\[\[(.*?)\]\]/g 21 | const matchedPageRef = rxPageRef.exec(str) 22 | if (matchedPageRef) { 23 | str = str.replace( 24 | matchedPageRef[0], 25 | `${matchedPageRef[1]}`, 26 | ) 27 | } 28 | 29 | const rxBlockRef = /\(\((.*?)\)\)/g 30 | const matchedBlockRef = rxBlockRef.exec(str) 31 | if (matchedBlockRef) { 32 | const block = await logseq.Editor.getBlock(matchedBlockRef[1] as string) 33 | const content = 34 | block!.content.indexOf('id:: ') !== -1 35 | ? block!.content.substring(0, block!.content.indexOf('id:: ')) 36 | : block!.content 37 | str = str.replace( 38 | matchedBlockRef[0], 39 | `${content}`, 40 | ) 41 | } 42 | 43 | return
44 | } 45 | -------------------------------------------------------------------------------- /src/helpers/math-helpers.ts: -------------------------------------------------------------------------------- 1 | import { ReactElement } from 'react' 2 | import stats from 'stats-lite' 3 | 4 | import { DataProps } from '../libs/types' 5 | 6 | const extractNumber = (obj: ReactElement | undefined) => { 7 | if (!obj) return obj 8 | 9 | const html = obj.props.dangerouslySetInnerHTML.__html 10 | if (!html) return obj 11 | 12 | const match = html.match(/-?\d+(\.\d+)?/) 13 | return match ? parseFloat(match[0]) : obj 14 | } 15 | 16 | export const getSum = (col: string, data: DataProps[]): number => { 17 | const values = data.map((d) => { 18 | return extractNumber(d[`col${col}`]) 19 | }) 20 | return stats.sum(values) 21 | } 22 | 23 | export const getAverage = (col: string, data: DataProps[]): number => { 24 | const values = data.map((d) => { 25 | return extractNumber(d[`col${col}`]) 26 | }) 27 | return stats.mean(values) 28 | } 29 | 30 | export const getMedian = (col: string, data: DataProps[]): number => { 31 | const values = data.map((d) => { 32 | return extractNumber(d[`col${col}`]) 33 | }) 34 | return stats.median(values) 35 | } 36 | 37 | export const getMode = (col: string, data: DataProps[]): number => { 38 | const values = data.map((d) => { 39 | return extractNumber(d[`col${col}`]) 40 | }) 41 | const mode = stats.mode(values) 42 | // Return 0 if there is no frequent number 43 | if (Array.isArray(mode)) return 0 44 | return stats.mode(values) 45 | } 46 | 47 | export const getVariance = (col: string, data: DataProps[]): number => { 48 | const values = data.map((d) => { 49 | return extractNumber(d[`col${col}`]) 50 | }) 51 | return stats.variance(values) 52 | } 53 | 54 | export const getSD = (col: string, data: DataProps[]): number => { 55 | const values = data.map((d) => { 56 | return extractNumber(d[`col${col}`]) 57 | }) 58 | return stats.stdev(values) 59 | } 60 | 61 | export const getSampleSD = (col: string, data: DataProps[]): number => { 62 | const values = data.map((d) => { 63 | return extractNumber(d[`col${col}`]) 64 | }) 65 | return stats.sampleStdev(values) 66 | } 67 | 68 | export const getPercentile = ( 69 | col: string, 70 | data: DataProps[], 71 | percentile: number, 72 | ): number => { 73 | const values = data.map((d) => { 74 | return extractNumber(d[`col${col}`]) 75 | }) 76 | return stats.percentile(values, percentile / 100) // Percentile is in whole numbers 77 | } 78 | -------------------------------------------------------------------------------- /src/index.tsx: -------------------------------------------------------------------------------- 1 | import '@logseq/libs' 2 | 3 | import { BlockEntity } from '@logseq/libs/dist/LSPlugin.user' 4 | import { renderToStaticMarkup } from 'react-dom/server' 5 | 6 | import { Summary } from './components/Summary' 7 | import { Table } from './components/Table' 8 | import { blocksAsColumns } from './helpers/blocks-as-columns' 9 | import { blocksAsRows } from './helpers/blocks-as-rows' 10 | import { childBlocksAsColumns } from './helpers/child-blocks-as-columns' 11 | import { checkParams } from './libs/check-params' 12 | import { doMath } from './libs/do-math' 13 | 14 | const main = async () => { 15 | console.log('Table Render plugin loaded') 16 | 17 | // Insert renderer upon slash command 18 | logseq.Editor.registerSlashCommand('Render table', async (e) => { 19 | await logseq.Editor.insertAtEditingCursor(`{{renderer :tables_${e.uuid}}}`) 20 | }) 21 | 22 | logseq.App.onMacroRendererSlotted(async ({ slot, payload }) => { 23 | const { uuid } = payload 24 | const [type] = payload.arguments 25 | if (!type) return 26 | const tableId = `tables_${uuid}_${slot}` 27 | if (!type.startsWith(':tables_')) return 28 | 29 | // Get graph name 30 | const { name, path } = (await logseq.App.getCurrentGraph())! 31 | 32 | // Get block data to render 33 | const blk = await logseq.Editor.getBlock(uuid, { 34 | includeChildren: true, 35 | }) 36 | if (!blk || !blk.children || blk.children.length === 0) return 37 | 38 | const paramsBlk = blk?.children![0] 39 | const { content, children } = paramsBlk as BlockEntity 40 | if (children?.length === 0) return 41 | 42 | let data 43 | let columns 44 | switch (true) { 45 | case content.includes('rows'): { 46 | const { rowArr: dataVar, colArr: columnsVar } = 47 | await childBlocksAsColumns(children as BlockEntity[], name, path) 48 | data = dataVar 49 | columns = columnsVar 50 | break 51 | } 52 | case content.includes('cols'): { 53 | const { rowArr: dataVar, colArr: columnsVar } = await blocksAsRows( 54 | children as BlockEntity[], 55 | name, 56 | path, 57 | ) 58 | data = dataVar 59 | columns = columnsVar 60 | break 61 | } 62 | case content.includes('data'): { 63 | const { rowArr: dataVar, colArr: columnsVar } = await blocksAsColumns( 64 | children as BlockEntity[], 65 | name, 66 | path, 67 | ) 68 | data = dataVar 69 | columns = columnsVar 70 | break 71 | } 72 | default: 73 | } 74 | 75 | if (!data || !columns) return 76 | 77 | const summaryResults = doMath(checkParams(content), data, columns) 78 | 79 | let html 80 | if (summaryResults) { 81 | html = renderToStaticMarkup( 82 |
83 | 84 | 85 | , 86 | ) 87 | } else { 88 | html = renderToStaticMarkup(
) 89 | if (!html) return 90 | } 91 | 92 | logseq.provideUI({ 93 | key: `${tableId}`, 94 | slot, 95 | reset: true, 96 | template: html, 97 | }) 98 | }) 99 | } 100 | 101 | logseq.ready(main).catch(console.error) 102 | -------------------------------------------------------------------------------- /src/libs/check-params.ts: -------------------------------------------------------------------------------- 1 | import { CalculationTypes, MathTypeProps, ParamsProps } from "./types"; 2 | 3 | export const checkParams = (content: string): ParamsProps[] => { 4 | const rxToCheck: { [key in MathTypeProps]: RegExp } = { 5 | sumCol: /(sum)(-)(\d+)/, 6 | averageCol: /(average)(-)(\d+)/, 7 | medianCol: /(median)(-)(\d+)/, 8 | modeCol: /(mode)(-)(\d+)/, 9 | varianceCol: /(variance)(-)(\d+)/, 10 | sdCol: /(sd)(-)(\d+)/, 11 | ssdCol: /(ssd)(-)(\d+)/, 12 | percentileCol: /^(percentile)(-)(\d+)(-)(\d+)$/, 13 | }; 14 | 15 | const paramsArr = content.split(" "); 16 | const results = []; 17 | 18 | for (const param of paramsArr) { 19 | for (const rx of Object.keys(rxToCheck)) { 20 | const match = rxToCheck[rx as MathTypeProps].exec(param); 21 | if (!match) continue; 22 | const type = match[1] as CalculationTypes; 23 | 24 | if (param.startsWith("percentile") && match[2] && match[4]) { 25 | results.push({ 26 | type, 27 | percentileCol: match[3], 28 | percent: match[5], 29 | }); 30 | } else { 31 | if (match[1] && match[3]) { 32 | results.push({ 33 | type, 34 | [match[1] + "Col"]: match[3], 35 | }); 36 | } 37 | } 38 | } 39 | } 40 | 41 | return results; 42 | }; 43 | -------------------------------------------------------------------------------- /src/libs/do-math.ts: -------------------------------------------------------------------------------- 1 | import { 2 | getAverage, 3 | getMedian, 4 | getMode, 5 | getPercentile, 6 | getSampleSD, 7 | getSD, 8 | getSum, 9 | getVariance, 10 | } from '../helpers/math-helpers' 11 | import { 12 | CalculationTypes, 13 | ColumnProps, 14 | DataProps, 15 | MathResults, 16 | MathTypeProps, 17 | ParamsProps, 18 | } from './types' 19 | 20 | export const doMath = ( 21 | params: ParamsProps[], 22 | data: DataProps[], 23 | columns: ColumnProps[], 24 | ): MathResults[] => { 25 | const getSummaryObj = ( 26 | param: ParamsProps, 27 | mathType: MathTypeProps, 28 | ): MathResults => { 29 | const paramValues = Object.values(param) 30 | const type = paramValues[0] as CalculationTypes 31 | const colNum = paramValues[1] as string 32 | 33 | let value 34 | switch (mathType) { 35 | case 'percentileCol': 36 | value = getPercentile(colNum, data, parseFloat(paramValues[2] ?? '0')) 37 | break 38 | case 'sumCol': 39 | value = getSum(colNum, data) 40 | break 41 | case 'averageCol': 42 | value = getAverage(colNum, data) 43 | break 44 | case 'medianCol': 45 | value = getMedian(colNum, data) 46 | break 47 | case 'modeCol': 48 | value = getMode(colNum, data) 49 | break 50 | case 'varianceCol': 51 | value = getVariance(colNum, data) 52 | break 53 | case 'sdCol': 54 | value = getSD(colNum, data) 55 | break 56 | case 'ssdCol': 57 | value = getSampleSD(colNum, data) 58 | break 59 | default: 60 | value = 0 61 | } 62 | 63 | const description = columns.filter( 64 | (c: any) => c.accessorKey === `col${colNum}`, 65 | ) 66 | 67 | return { 68 | description: (description[0]?.header as string) ?? 'Error', 69 | type, 70 | value, 71 | } 72 | } 73 | 74 | const results = params.map((param) => { 75 | const mathType = Object.keys(param)[1] as MathTypeProps 76 | return getSummaryObj(param, mathType) 77 | }) 78 | 79 | return results 80 | } 81 | -------------------------------------------------------------------------------- /src/libs/process-content/handle-bold.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from "react"; 2 | import reactStringReplace from "react-string-replace"; 3 | 4 | export const handleBold = (str: ReactNode[]): ReactNode[] => { 5 | const rxBoldRef = /\*\*(.*?)\*\*/g; 6 | return reactStringReplace(str, rxBoldRef, (match, i) => ( 7 | {match} 8 | )); 9 | }; 10 | -------------------------------------------------------------------------------- /src/libs/process-content/handle-code.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from 'react' 2 | import reactStringReplace from 'react-string-replace' 3 | 4 | export const handleCode = (str: ReactNode[]): ReactNode[] => { 5 | const rxCodeBlocksRef = /^`([^`\n]+)`$/gm 6 | return reactStringReplace(str, rxCodeBlocksRef, (match, i) => ( 7 |
16 | {match.replaceAll('\n', '')} 17 |
18 | )) 19 | } 20 | -------------------------------------------------------------------------------- /src/libs/process-content/handle-codeblocks.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from 'react' 2 | import reactStringReplace from 'react-string-replace' 3 | 4 | export const handleCodeblocks = (str: ReactNode[]): ReactNode[] => { 5 | const rxCodeBlocksRef = /^```\n([\s\S]*?)\n```$/gm 6 | return reactStringReplace(str, rxCodeBlocksRef, (match, i) => ( 7 |
16 | {match.replaceAll('\n', '')} 17 |
18 | )) 19 | } 20 | -------------------------------------------------------------------------------- /src/libs/process-content/handle-image.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from "react"; 2 | import reactStringReplace from "react-string-replace"; 3 | 4 | export const handleImage = ( 5 | str: string | ReactNode[], 6 | path: string, 7 | ): ReactNode[] => { 8 | const rxImgRef = /!\[(.*?)\}/g; 9 | return reactStringReplace(str, rxImgRef, (match, i) => { 10 | const filename = /\(\.\.\/assets\/(.*?)\)/.exec(match)![1]; 11 | const height = /:height(.*?)(\d+)/.exec(match)![2]; 12 | const width = /:width(.*?)(\d+)/.exec(match)![2]; 13 | if (height && width) { 14 | return ( 15 | 21 | ); 22 | } else { 23 | return ; 24 | } 25 | }); 26 | }; 27 | -------------------------------------------------------------------------------- /src/libs/process-content/handle-italics.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from "react"; 2 | import reactStringReplace from "react-string-replace"; 3 | 4 | export const handleItalics = (str: ReactNode[]): ReactNode[] => { 5 | const rxItalicsRef = /\*(.*?)\*/g; 6 | return reactStringReplace(str, rxItalicsRef, (match, i) => ( 7 | {match} 8 | )); 9 | }; 10 | -------------------------------------------------------------------------------- /src/libs/process-content/handle-link.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from "react"; 2 | import reactStringReplace from "react-string-replace"; 3 | 4 | export const handleLink = (str: ReactNode[]): ReactNode[] => { 5 | const rxLinkRef = /(https:\/\/[\w.-]+(?:\/[\w.-]*)*)/gi; 6 | return reactStringReplace(str, rxLinkRef, (match, i) => ( 7 | 8 | {match} 9 | 10 | )); 11 | }; 12 | -------------------------------------------------------------------------------- /src/libs/process-content/handle-markdown-link.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from 'react' 2 | import reactStringReplace from 'react-string-replace' 3 | 4 | export const handleMarkdownLink = (str: ReactNode[]): ReactNode[] => { 5 | const rxLinkRef = /(https:\/\/[\w.-]+(?:\/[\w.-]*)*)/g 6 | 7 | const x = reactStringReplace(str, rxLinkRef, (match, i) => ( 8 | 9 | {match} 10 | 11 | )) 12 | 13 | console.log(x) 14 | 15 | return x 16 | } 17 | -------------------------------------------------------------------------------- /src/libs/process-content/handle-tag.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from "react"; 2 | import reactStringReplace from "react-string-replace"; 3 | 4 | export const handleTag = (str: ReactNode[], name: string): ReactNode[] => { 5 | const rxTagRef = /(#(.*?))/g; 6 | return reactStringReplace(str, rxTagRef, (match, i) => ( 7 | 8 | {match} 9 | 10 | )); 11 | }; 12 | -------------------------------------------------------------------------------- /src/libs/process-content/remove-ls-attributes.ts: -------------------------------------------------------------------------------- 1 | export const removeLsAttributes = (str: string) => { 2 | // Note: Logbook is always at the end of the block content 3 | // \n:LOGBOOK:\nCLOCK: [2024-09-01 Sun 17:09:11]--[2024-09-01 Sun 17:09:16] => 00:00:05\n:END: 4 | 5 | let content = str 6 | content = content.replace(/collapsed::\s*(true|false)/, '') 7 | if (content.indexOf('\nid:: ') !== -1) { 8 | content = content.substring(0, content.indexOf('\nid:: ')) 9 | } 10 | if (content.indexOf('\n:LOGBOOK:') !== -1) { 11 | content = content.substring(0, content.indexOf('\n:LOGBOOK:')) 12 | } 13 | 14 | const markersMap: Record = { 15 | NOW: '⏰', 16 | LATER: '🕒', 17 | DOING: '🏗️', 18 | DONE: '✅', 19 | CANCELLED: '❌', 20 | CANCELED: '❌', 21 | 'IN-PROGRESS': '🚧', 22 | TODO: '📝', 23 | WAITING: '⏳', 24 | WAIT: '⏳', 25 | } 26 | 27 | Object.keys(markersMap).forEach((m) => { 28 | if (!markersMap[m]) return 29 | content = content.replace(m, markersMap[m]) 30 | }) 31 | 32 | return content 33 | } 34 | -------------------------------------------------------------------------------- /src/libs/types.ts: -------------------------------------------------------------------------------- 1 | import { ColumnDef } from '@tanstack/react-table' 2 | 3 | export type DataProps = Record 4 | 5 | export type ColumnProps = ColumnDef> 6 | 7 | export interface MathProps { 8 | sumCol: string 9 | data: DataProps 10 | } 11 | 12 | export type MathTypeProps = 13 | | 'sumCol' 14 | | 'averageCol' 15 | | 'medianCol' 16 | | 'modeCol' 17 | | 'varianceCol' 18 | | 'sdCol' 19 | | 'ssdCol' 20 | | 'percentileCol' 21 | 22 | export type CalculationTypes = 23 | | 'sum' 24 | | 'average' 25 | | 'median' 26 | | 'mode' 27 | | 'variance' 28 | | 'sd' 29 | | 'ssd' 30 | | 'percentile' 31 | 32 | type MathTypeMapping = { 33 | [key in MathTypeProps]?: string 34 | } 35 | 36 | export type ParamsProps = { 37 | type: CalculationTypes 38 | } & MathTypeMapping 39 | 40 | export interface MathResults { 41 | description: string 42 | type: CalculationTypes 43 | value: number 44 | } 45 | -------------------------------------------------------------------------------- /src/stats-lite.d.ts: -------------------------------------------------------------------------------- 1 | declare module "stats-lite"; 2 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "jsx": "react-jsx", 4 | "target": "es2017", 5 | "lib": [ 6 | "dom", 7 | "dom.iterable", 8 | "esnext" 9 | ], 10 | "allowJs": true, 11 | "checkJs": true, 12 | "skipLibCheck": true, 13 | "strict": true, 14 | "forceConsistentCasingInFileNames": true, 15 | "noEmit": true, 16 | "esModuleInterop": true, 17 | "module": "esnext", 18 | "moduleResolution": "node", 19 | "resolveJsonModule": true, 20 | "isolatedModules": true, 21 | "incremental": true, 22 | "noUncheckedIndexedAccess": true, 23 | "baseUrl": "./", 24 | "paths": { 25 | "../*": [ 26 | "src/*" 27 | ] 28 | } 29 | }, 30 | "include": [ 31 | "**/*.ts", 32 | "**/*.tsx", 33 | "**/*.cjs", 34 | "**/*.mjs" 35 | ], 36 | "exclude": [ 37 | "node_modules", 38 | "./dist/**/*", 39 | "./screenshots", 40 | "tailwind.config.js" 41 | ] 42 | } 43 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import logseqDevPlugin from "vite-plugin-logseq"; 3 | 4 | export default defineConfig({ 5 | plugins: [logseqDevPlugin()], 6 | }); 7 | --------------------------------------------------------------------------------