diff --git a/CHANGELOG.md b/CHANGELOG.md index 4bd7a64..0689580 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,17 @@ This changelog is not exhaustive. +## 1.23.x + +- Updated Chinese tokenizer +- Added user-defined boosted fields +- No more freezes when loading large caches (hopefully) +- Large refactoring to properly clean up several older warnings + +## 1.22.x + +- Improved highlighting + ## 1.21.x - Added support for .docx and .xlsx diff --git a/README.md b/README.md index 25f7c00..4f8b2f7 100644 --- a/README.md +++ b/README.md @@ -14,11 +14,10 @@ **Omnisearch** is a search engine that "_just works_". It always instantly shows you the most relevant results, thanks to its smart weighting algorithm. -Under the hood, it uses the excellent [MiniSearch](https://github.com/lucaong/minisearch) library. +Under the hood, it uses the excellent [MiniSearch](https://github.com/lucaong/minisearch) library. This free plugin is totally unrelated to the omnisearch.ai paid product. ![](https://raw.githubusercontent.com/scambier/obsidian-omnisearch/master/images/omnisearch.gif) - ## Documentation https://publish.obsidian.md/omnisearch/Index diff --git a/assets/styles.css b/assets/styles.css index f163256..bdd10e7 100644 --- a/assets/styles.css +++ b/assets/styles.css @@ -56,12 +56,12 @@ -webkit-box-orient: vertical; color: var(--text-muted); - margin-left: 0.5em; + margin-inline-start: 0.5em; } .omnisearch-result__image-container { flex-basis: 20%; - text-align: right; + text-align: end; } .omnisearch-highlight { @@ -101,7 +101,7 @@ @media only screen and (min-width: 600px) { .omnisearch-input-container__buttons { - margin-right: 1em; + margin-inline-end: 1em; } } diff --git a/esbuild.config.mjs b/esbuild.config.mjs index 598c833..6d7cfe1 100644 --- a/esbuild.config.mjs +++ b/esbuild.config.mjs @@ -57,6 +57,14 @@ build({ to: ['./'], }, }), + { + name: 'resolve-minisearch', + setup(build) { + build.onResolve({ filter: /^minisearch$/ }, () => { + return { path: path.resolve('node_modules/minisearch/src/MiniSearch.ts') }; + }); + }, + }, ], format: 'cjs', watch: !prod, diff --git a/manifest-beta.json b/manifest-beta.json index f2dd978..14a7256 100644 --- a/manifest-beta.json +++ b/manifest-beta.json @@ -1,7 +1,7 @@ { "id": "omnisearch", "name": "Omnisearch", - "version": "1.23.0-beta.5", + "version": "1.23.0", "minAppVersion": "1.3.0", "description": "A search engine that just works", "author": "Simon Cambier", diff --git a/manifest.json b/manifest.json index 58b565d..fc6efcb 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "omnisearch", "name": "Omnisearch", - "version": "1.22.2", + "version": "1.23.0", "minAppVersion": "1.3.0", "description": "A search engine that just works", "author": "Simon Cambier", diff --git a/package.json b/package.json index 00d8584..73e3e86 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "scambier.obsidian-search", - "version": "1.22.2", + "version": "1.23.0", "description": "A search engine for Obsidian", "main": "dist/main.js", "scripts": { @@ -14,13 +14,13 @@ "author": "Simon Cambier", "license": "GPL-3", "devDependencies": { - "@babel/preset-env": "^7.24.3", - "@babel/preset-typescript": "^7.24.1", + "@babel/preset-env": "^7.24.6", + "@babel/preset-typescript": "^7.24.6", "@testing-library/jest-dom": "^5.17.0", "@tsconfig/svelte": "^3.0.0", "@types/jest": "^27.5.2", "@types/lodash-es": "^4.17.12", - "@types/node": "^16.18.91", + "@types/node": "^16.18.97", "@types/pako": "^2.0.3", "babel-jest": "^27.5.1", "builtin-modules": "^3.3.0", @@ -28,7 +28,7 @@ "esbuild-plugin-copy": "1.3.0", "esbuild-svelte": "0.7.1", "jest": "^27.5.1", - "obsidian": "1.3.5", + "obsidian": "1.5.7-1", "prettier": "^2.8.8", "prettier-plugin-svelte": "^2.10.1", "svelte": "^3.59.2", @@ -44,7 +44,7 @@ "dexie": "^3.2.7", "lodash-es": "4.17.21", "markdown-link-extractor": "^4.0.2", - "minisearch": "^6.3.0", + "minisearch": "github:scambier/minisearch#async-load-json", "pure-md5": "^0.1.14", "search-query-parser": "^1.6.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c0ecc1f..fd1faac 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,8 +24,8 @@ importers: specifier: ^4.0.2 version: 4.0.2 minisearch: - specifier: ^6.3.0 - version: 6.3.0 + specifier: github:scambier/minisearch#async-load-json + version: https://codeload.github.com/scambier/minisearch/tar.gz/bc9302398847fb8e818e6392f0e5af911394fdd0 pure-md5: specifier: ^0.1.14 version: 0.1.14 @@ -34,11 +34,11 @@ importers: version: 1.6.0 devDependencies: '@babel/preset-env': - specifier: ^7.24.3 - version: 7.24.3(@babel/core@7.24.3) + specifier: ^7.24.6 + version: 7.24.6(@babel/core@7.24.6) '@babel/preset-typescript': - specifier: ^7.24.1 - version: 7.24.1(@babel/core@7.24.3) + specifier: ^7.24.6 + version: 7.24.6(@babel/core@7.24.6) '@testing-library/jest-dom': specifier: ^5.17.0 version: 5.17.0 @@ -52,14 +52,14 @@ importers: specifier: ^4.17.12 version: 4.17.12 '@types/node': - specifier: ^16.18.91 - version: 16.18.91 + specifier: ^16.18.97 + version: 16.18.97 '@types/pako': specifier: ^2.0.3 version: 2.0.3 babel-jest: specifier: ^27.5.1 - version: 27.5.1(@babel/core@7.24.3) + version: 27.5.1(@babel/core@7.24.6) builtin-modules: specifier: ^3.3.0 version: 3.3.0 @@ -76,8 +76,8 @@ importers: specifier: ^27.5.1 version: 27.5.1 obsidian: - specifier: 1.3.5 - version: 1.3.5(@codemirror/state@6.4.1)(@codemirror/view@6.26.0) + specifier: 1.5.7-1 + version: 1.5.7-1(@codemirror/state@6.4.1)(@codemirror/view@6.26.3) prettier: specifier: ^2.8.8 version: 2.8.8 @@ -89,13 +89,13 @@ importers: version: 3.59.2 svelte-check: specifier: ^2.10.3 - version: 2.10.3(@babel/core@7.24.3)(svelte@3.59.2) + version: 2.10.3(@babel/core@7.24.6)(postcss@8.4.38)(sass@1.77.2)(svelte@3.59.2) svelte-jester: specifier: ^2.3.2 version: 2.3.2(jest@27.5.1)(svelte@3.59.2) svelte-preprocess: specifier: ^4.10.7 - version: 4.10.7(@babel/core@7.24.3)(svelte@3.59.2)(typescript@4.9.5) + version: 4.10.7(@babel/core@7.24.6)(postcss@8.4.38)(sass@1.77.2)(svelte@3.59.2)(typescript@4.9.5) tslib: specifier: 2.3.1 version: 2.3.1 @@ -104,7 +104,7 @@ importers: version: 4.9.5 vite: specifier: ^3.2.10 - version: 3.2.10(@types/node@16.18.91) + version: 3.2.10(@types/node@16.18.97)(sass@1.77.2) packages: @@ -115,152 +115,158 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@babel/code-frame@7.24.2': - resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + '@babel/code-frame@7.24.6': + resolution: {integrity: sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.24.1': - resolution: {integrity: sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==} + '@babel/compat-data@7.24.6': + resolution: {integrity: sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ==} engines: {node: '>=6.9.0'} - '@babel/core@7.24.3': - resolution: {integrity: sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==} + '@babel/core@7.24.6': + resolution: {integrity: sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ==} engines: {node: '>=6.9.0'} - '@babel/generator@7.24.1': - resolution: {integrity: sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==} + '@babel/generator@7.24.6': + resolution: {integrity: sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.22.5': - resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + '@babel/helper-annotate-as-pure@7.24.6': + resolution: {integrity: sha512-DitEzDfOMnd13kZnDqns1ccmftwJTS9DMkyn9pYTxulS7bZxUxpMly3Nf23QQ6NwA4UB8lAqjbqWtyvElEMAkg==} engines: {node: '>=6.9.0'} - '@babel/helper-builder-binary-assignment-operator-visitor@7.22.15': - resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} + '@babel/helper-builder-binary-assignment-operator-visitor@7.24.6': + resolution: {integrity: sha512-+wnfqc5uHiMYtvRX7qu80Toef8BXeh4HHR1SPeonGb1SKPniNEd4a/nlaJJMv/OIEYvIVavvo0yR7u10Gqz0Iw==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.23.6': - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + '@babel/helper-compilation-targets@7.24.6': + resolution: {integrity: sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.24.1': - resolution: {integrity: sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==} + '@babel/helper-create-class-features-plugin@7.24.6': + resolution: {integrity: sha512-djsosdPJVZE6Vsw3kk7IPRWethP94WHGOhQTc67SNXE0ZzMhHgALw8iGmYS0TD1bbMM0VDROy43od7/hN6WYcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-create-regexp-features-plugin@7.22.15': - resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} + '@babel/helper-create-regexp-features-plugin@7.24.6': + resolution: {integrity: sha512-C875lFBIWWwyv6MHZUG9HmRrlTDgOsLWZfYR0nW69gaKJNe0/Mpxx5r0EID2ZdHQkdUmQo2t0uNckTL08/1BgA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-define-polyfill-provider@0.6.1': - resolution: {integrity: sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==} + '@babel/helper-define-polyfill-provider@0.6.2': + resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - '@babel/helper-environment-visitor@7.22.20': - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + '@babel/helper-environment-visitor@7.24.6': + resolution: {integrity: sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g==} engines: {node: '>=6.9.0'} - '@babel/helper-function-name@7.23.0': - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + '@babel/helper-function-name@7.24.6': + resolution: {integrity: sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w==} engines: {node: '>=6.9.0'} - '@babel/helper-hoist-variables@7.22.5': - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + '@babel/helper-hoist-variables@7.24.6': + resolution: {integrity: sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA==} engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.23.0': - resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} + '@babel/helper-member-expression-to-functions@7.24.6': + resolution: {integrity: sha512-OTsCufZTxDUsv2/eDXanw/mUZHWOxSbEmC3pP8cgjcy5rgeVPWWMStnv274DV60JtHxTk0adT0QrCzC4M9NWGg==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.24.3': - resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} + '@babel/helper-module-imports@7.24.6': + resolution: {integrity: sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.23.3': - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + '@babel/helper-module-transforms@7.24.6': + resolution: {integrity: sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.22.5': - resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + '@babel/helper-optimise-call-expression@7.24.6': + resolution: {integrity: sha512-3SFDJRbx7KuPRl8XDUr8O7GAEB8iGyWPjLKJh/ywP/Iy9WOmEfMrsWbaZpvBu2HSYn4KQygIsz0O7m8y10ncMA==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.24.0': - resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} + '@babel/helper-plugin-utils@7.24.6': + resolution: {integrity: sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg==} engines: {node: '>=6.9.0'} - '@babel/helper-remap-async-to-generator@7.22.20': - resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + '@babel/helper-remap-async-to-generator@7.24.6': + resolution: {integrity: sha512-1Qursq9ArRZPAMOZf/nuzVW8HgJLkTB9y9LfP4lW2MVp4e9WkLJDovfKBxoDcCk6VuzIxyqWHyBoaCtSRP10yg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.24.1': - resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} + '@babel/helper-replace-supers@7.24.6': + resolution: {integrity: sha512-mRhfPwDqDpba8o1F8ESxsEkJMQkUF8ZIWrAc0FtWhxnjfextxMWxr22RtFizxxSYLjVHDeMgVsRq8BBZR2ikJQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-simple-access@7.22.5': - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + '@babel/helper-simple-access@7.24.6': + resolution: {integrity: sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g==} engines: {node: '>=6.9.0'} - '@babel/helper-skip-transparent-expression-wrappers@7.22.5': - resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + '@babel/helper-skip-transparent-expression-wrappers@7.24.6': + resolution: {integrity: sha512-jhbbkK3IUKc4T43WadP96a27oYti9gEf1LdyGSP2rHGH77kwLwfhO7TgwnWvxxQVmke0ImmCSS47vcuxEMGD3Q==} engines: {node: '>=6.9.0'} - '@babel/helper-split-export-declaration@7.22.6': - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + '@babel/helper-split-export-declaration@7.24.6': + resolution: {integrity: sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.24.1': - resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + '@babel/helper-string-parser@7.24.6': + resolution: {integrity: sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.22.20': - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + '@babel/helper-validator-identifier@7.24.6': + resolution: {integrity: sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.23.5': - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + '@babel/helper-validator-option@7.24.6': + resolution: {integrity: sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ==} engines: {node: '>=6.9.0'} - '@babel/helper-wrap-function@7.22.20': - resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} + '@babel/helper-wrap-function@7.24.6': + resolution: {integrity: sha512-f1JLrlw/jbiNfxvdrfBgio/gRBk3yTAEJWirpAkiJG2Hb22E7cEYKHWo0dFPTv/niPovzIdPdEDetrv6tC6gPQ==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.24.1': - resolution: {integrity: sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==} + '@babel/helpers@7.24.6': + resolution: {integrity: sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.24.2': - resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + '@babel/highlight@7.24.6': + resolution: {integrity: sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==} engines: {node: '>=6.9.0'} - '@babel/parser@7.24.1': - resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} + '@babel/parser@7.24.6': + resolution: {integrity: sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1': - resolution: {integrity: sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==} + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.6': + resolution: {integrity: sha512-bYndrJ6Ph6Ar+GaB5VAc0JPoP80bQCm4qon6JEzXfRl5QZyQ8Ur1K6k7htxWmPA5z+k7JQvaMUrtXlqclWYzKw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1': - resolution: {integrity: sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==} + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.6': + resolution: {integrity: sha512-iVuhb6poq5ikqRq2XWU6OQ+R5o9wF+r/or9CeUyovgptz0UlnK4/seOQ1Istu/XybYjAhQv1FRSSfHHufIku5Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.6': + resolution: {integrity: sha512-c8TER5xMDYzzFcGqOEp9l4hvB7dcbhcGjcLVwxWfe4P5DOafdwjsBJZKsmv+o3aXh7NhopvayQIovHrh2zSRUQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1': - resolution: {integrity: sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.6': + resolution: {integrity: sha512-z8zEjYmwBUHN/pCF3NuWBhHQjJCrd33qAi8MgANfMrAvn72k2cImT8VjK9LJFu4ysOLJqhfkYYb3MvwANRUNZQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -302,14 +308,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-assertions@7.24.1': - resolution: {integrity: sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==} + '@babel/plugin-syntax-import-assertions@7.24.6': + resolution: {integrity: sha512-BE6o2BogJKJImTmGpkmOic4V0hlRRxVtzqxiSPa8TIFxyhi4EFjHm08nq1M4STK4RytuLMgnSz0/wfflvGFNOg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.24.1': - resolution: {integrity: sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==} + '@babel/plugin-syntax-import-attributes@7.24.6': + resolution: {integrity: sha512-D+CfsVZousPXIdudSII7RGy52+dYRtbyKAZcvtQKq/NpsivyMVduepzcLqG5pMBugtMdedxdC8Ramdpcne9ZWQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -324,8 +330,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.24.1': - resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} + '@babel/plugin-syntax-jsx@7.24.6': + resolution: {integrity: sha512-lWfvAIFNWMlCsU0DRUun2GpFwZdGTukLaHJqRh1JRb80NdAP5Sb1HDHB5X9P9OtgZHQl089UzQkpYlBq2VTPRw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -372,8 +378,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.24.1': - resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} + '@babel/plugin-syntax-typescript@7.24.6': + resolution: {integrity: sha512-TzCtxGgVTEJWWwcYwQhCIQ6WaKlo80/B+Onsk4RRCcYqpYGFcG9etPW94VToGte5AAcxRrhjPUFvUS3Y2qKi4A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -384,302 +390,302 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-arrow-functions@7.24.1': - resolution: {integrity: sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==} + '@babel/plugin-transform-arrow-functions@7.24.6': + resolution: {integrity: sha512-jSSSDt4ZidNMggcLx8SaKsbGNEfIl0PHx/4mFEulorE7bpYLbN0d3pDW3eJ7Y5Z3yPhy3L3NaPCYyTUY7TuugQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-generator-functions@7.24.3': - resolution: {integrity: sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==} + '@babel/plugin-transform-async-generator-functions@7.24.6': + resolution: {integrity: sha512-VEP2o4iR2DqQU6KPgizTW2mnMx6BG5b5O9iQdrW9HesLkv8GIA8x2daXBQxw1MrsIkFQGA/iJ204CKoQ8UcnAA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-to-generator@7.24.1': - resolution: {integrity: sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==} + '@babel/plugin-transform-async-to-generator@7.24.6': + resolution: {integrity: sha512-NTBA2SioI3OsHeIn6sQmhvXleSl9T70YY/hostQLveWs0ic+qvbA3fa0kwAwQ0OA/XGaAerNZRQGJyRfhbJK4g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoped-functions@7.24.1': - resolution: {integrity: sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==} + '@babel/plugin-transform-block-scoped-functions@7.24.6': + resolution: {integrity: sha512-XNW7jolYHW9CwORrZgA/97tL/k05qe/HL0z/qqJq1mdWhwwCM6D4BJBV7wAz9HgFziN5dTOG31znkVIzwxv+vw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.24.1': - resolution: {integrity: sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw==} + '@babel/plugin-transform-block-scoping@7.24.6': + resolution: {integrity: sha512-S/t1Xh4ehW7sGA7c1j/hiOBLnEYCp/c2sEG4ZkL8kI1xX9tW2pqJTCHKtdhe/jHKt8nG0pFCrDHUXd4DvjHS9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-properties@7.24.1': - resolution: {integrity: sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==} + '@babel/plugin-transform-class-properties@7.24.6': + resolution: {integrity: sha512-j6dZ0Z2Z2slWLR3kt9aOmSIrBvnntWjMDN/TVcMPxhXMLmJVqX605CBRlcGI4b32GMbfifTEsdEjGjiE+j/c3A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-static-block@7.24.1': - resolution: {integrity: sha512-FUHlKCn6J3ERiu8Dv+4eoz7w8+kFLSyeVG4vDAikwADGjUCoHw/JHokyGtr8OR4UjpwPVivyF+h8Q5iv/JmrtA==} + '@babel/plugin-transform-class-static-block@7.24.6': + resolution: {integrity: sha512-1QSRfoPI9RoLRa8Mnakc6v3e0gJxiZQTYrMfLn+mD0sz5+ndSzwymp2hDcYJTyT0MOn0yuWzj8phlIvO72gTHA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 - '@babel/plugin-transform-classes@7.24.1': - resolution: {integrity: sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==} + '@babel/plugin-transform-classes@7.24.6': + resolution: {integrity: sha512-+fN+NO2gh8JtRmDSOB6gaCVo36ha8kfCW1nMq2Gc0DABln0VcHN4PrALDvF5/diLzIRKptC7z/d7Lp64zk92Fg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-computed-properties@7.24.1': - resolution: {integrity: sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==} + '@babel/plugin-transform-computed-properties@7.24.6': + resolution: {integrity: sha512-cRzPobcfRP0ZtuIEkA8QzghoUpSB3X3qSH5W2+FzG+VjWbJXExtx0nbRqwumdBN1x/ot2SlTNQLfBCnPdzp6kg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-destructuring@7.24.1': - resolution: {integrity: sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==} + '@babel/plugin-transform-destructuring@7.24.6': + resolution: {integrity: sha512-YLW6AE5LQpk5npNXL7i/O+U9CE4XsBCuRPgyjl1EICZYKmcitV+ayuuUGMJm2lC1WWjXYszeTnIxF/dq/GhIZQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dotall-regex@7.24.1': - resolution: {integrity: sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==} + '@babel/plugin-transform-dotall-regex@7.24.6': + resolution: {integrity: sha512-rCXPnSEKvkm/EjzOtLoGvKseK+dS4kZwx1HexO3BtRtgL0fQ34awHn34aeSHuXtZY2F8a1X8xqBBPRtOxDVmcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-keys@7.24.1': - resolution: {integrity: sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==} + '@babel/plugin-transform-duplicate-keys@7.24.6': + resolution: {integrity: sha512-/8Odwp/aVkZwPFJMllSbawhDAO3UJi65foB00HYnK/uXvvCPm0TAXSByjz1mpRmp0q6oX2SIxpkUOpPFHk7FLA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dynamic-import@7.24.1': - resolution: {integrity: sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==} + '@babel/plugin-transform-dynamic-import@7.24.6': + resolution: {integrity: sha512-vpq8SSLRTBLOHUZHSnBqVo0AKX3PBaoPs2vVzYVWslXDTDIpwAcCDtfhUcHSQQoYoUvcFPTdC8TZYXu9ZnLT/w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-exponentiation-operator@7.24.1': - resolution: {integrity: sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==} + '@babel/plugin-transform-exponentiation-operator@7.24.6': + resolution: {integrity: sha512-EemYpHtmz0lHE7hxxxYEuTYOOBZ43WkDgZ4arQ4r+VX9QHuNZC+WH3wUWmRNvR8ECpTRne29aZV6XO22qpOtdA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-export-namespace-from@7.24.1': - resolution: {integrity: sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==} + '@babel/plugin-transform-export-namespace-from@7.24.6': + resolution: {integrity: sha512-inXaTM1SVrIxCkIJ5gqWiozHfFMStuGbGJAxZFBoHcRRdDP0ySLb3jH6JOwmfiinPwyMZqMBX+7NBDCO4z0NSA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-for-of@7.24.1': - resolution: {integrity: sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==} + '@babel/plugin-transform-for-of@7.24.6': + resolution: {integrity: sha512-n3Sf72TnqK4nw/jziSqEl1qaWPbCRw2CziHH+jdRYvw4J6yeCzsj4jdw8hIntOEeDGTmHVe2w4MVL44PN0GMzg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-function-name@7.24.1': - resolution: {integrity: sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==} + '@babel/plugin-transform-function-name@7.24.6': + resolution: {integrity: sha512-sOajCu6V0P1KPljWHKiDq6ymgqB+vfo3isUS4McqW1DZtvSVU2v/wuMhmRmkg3sFoq6GMaUUf8W4WtoSLkOV/Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-json-strings@7.24.1': - resolution: {integrity: sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==} + '@babel/plugin-transform-json-strings@7.24.6': + resolution: {integrity: sha512-Uvgd9p2gUnzYJxVdBLcU0KurF8aVhkmVyMKW4MIY1/BByvs3EBpv45q01o7pRTVmTvtQq5zDlytP3dcUgm7v9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-literals@7.24.1': - resolution: {integrity: sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==} + '@babel/plugin-transform-literals@7.24.6': + resolution: {integrity: sha512-f2wHfR2HF6yMj+y+/y07+SLqnOSwRp8KYLpQKOzS58XLVlULhXbiYcygfXQxJlMbhII9+yXDwOUFLf60/TL5tw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-logical-assignment-operators@7.24.1': - resolution: {integrity: sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==} + '@babel/plugin-transform-logical-assignment-operators@7.24.6': + resolution: {integrity: sha512-EKaWvnezBCMkRIHxMJSIIylzhqK09YpiJtDbr2wsXTwnO0TxyjMUkaw4RlFIZMIS0iDj0KyIg7H7XCguHu/YDA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-member-expression-literals@7.24.1': - resolution: {integrity: sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==} + '@babel/plugin-transform-member-expression-literals@7.24.6': + resolution: {integrity: sha512-9g8iV146szUo5GWgXpRbq/GALTnY+WnNuRTuRHWWFfWGbP9ukRL0aO/jpu9dmOPikclkxnNsjY8/gsWl6bmZJQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-amd@7.24.1': - resolution: {integrity: sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==} + '@babel/plugin-transform-modules-amd@7.24.6': + resolution: {integrity: sha512-eAGogjZgcwqAxhyFgqghvoHRr+EYRQPFjUXrTYKBRb5qPnAVxOOglaxc4/byHqjvq/bqO2F3/CGwTHsgKJYHhQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.24.1': - resolution: {integrity: sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==} + '@babel/plugin-transform-modules-commonjs@7.24.6': + resolution: {integrity: sha512-JEV8l3MHdmmdb7S7Cmx6rbNEjRCgTQMZxllveHO0mx6uiclB0NflCawlQQ6+o5ZrwjUBYPzHm2XoK4wqGVUFuw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.24.1': - resolution: {integrity: sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==} + '@babel/plugin-transform-modules-systemjs@7.24.6': + resolution: {integrity: sha512-xg1Z0J5JVYxtpX954XqaaAT6NpAY6LtZXvYFCJmGFJWwtlz2EmJoR8LycFRGNE8dBKizGWkGQZGegtkV8y8s+w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-umd@7.24.1': - resolution: {integrity: sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==} + '@babel/plugin-transform-modules-umd@7.24.6': + resolution: {integrity: sha512-esRCC/KsSEUvrSjv5rFYnjZI6qv4R1e/iHQrqwbZIoRJqk7xCvEUiN7L1XrmW5QSmQe3n1XD88wbgDTWLbVSyg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-named-capturing-groups-regex@7.22.5': - resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + '@babel/plugin-transform-named-capturing-groups-regex@7.24.6': + resolution: {integrity: sha512-6DneiCiu91wm3YiNIGDWZsl6GfTTbspuj/toTEqLh9d4cx50UIzSdg+T96p8DuT7aJOBRhFyaE9ZvTHkXrXr6Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-new-target@7.24.1': - resolution: {integrity: sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==} + '@babel/plugin-transform-new-target@7.24.6': + resolution: {integrity: sha512-f8liz9JG2Va8A4J5ZBuaSdwfPqN6axfWRK+y66fjKYbwf9VBLuq4WxtinhJhvp1w6lamKUwLG0slK2RxqFgvHA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-nullish-coalescing-operator@7.24.1': - resolution: {integrity: sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==} + '@babel/plugin-transform-nullish-coalescing-operator@7.24.6': + resolution: {integrity: sha512-+QlAiZBMsBK5NqrBWFXCYeXyiU1y7BQ/OYaiPAcQJMomn5Tyg+r5WuVtyEuvTbpV7L25ZSLfE+2E9ywj4FD48A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-numeric-separator@7.24.1': - resolution: {integrity: sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==} + '@babel/plugin-transform-numeric-separator@7.24.6': + resolution: {integrity: sha512-6voawq8T25Jvvnc4/rXcWZQKKxUNZcKMS8ZNrjxQqoRFernJJKjE3s18Qo6VFaatG5aiX5JV1oPD7DbJhn0a4Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.24.1': - resolution: {integrity: sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==} + '@babel/plugin-transform-object-rest-spread@7.24.6': + resolution: {integrity: sha512-OKmi5wiMoRW5Smttne7BwHM8s/fb5JFs+bVGNSeHWzwZkWXWValR1M30jyXo1s/RaqgwwhEC62u4rFH/FBcBPg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-super@7.24.1': - resolution: {integrity: sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==} + '@babel/plugin-transform-object-super@7.24.6': + resolution: {integrity: sha512-N/C76ihFKlZgKfdkEYKtaRUtXZAgK7sOY4h2qrbVbVTXPrKGIi8aww5WGe/+Wmg8onn8sr2ut6FXlsbu/j6JHg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-catch-binding@7.24.1': - resolution: {integrity: sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==} + '@babel/plugin-transform-optional-catch-binding@7.24.6': + resolution: {integrity: sha512-L5pZ+b3O1mSzJ71HmxSCmTVd03VOT2GXOigug6vDYJzE5awLI7P1g0wFcdmGuwSDSrQ0L2rDOe/hHws8J1rv3w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-chaining@7.24.1': - resolution: {integrity: sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==} + '@babel/plugin-transform-optional-chaining@7.24.6': + resolution: {integrity: sha512-cHbqF6l1QP11OkYTYQ+hhVx1E017O5ZcSPXk9oODpqhcAD1htsWG2NpHrrhthEO2qZomLK0FXS+u7NfrkF5aOQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-parameters@7.24.1': - resolution: {integrity: sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==} + '@babel/plugin-transform-parameters@7.24.6': + resolution: {integrity: sha512-ST7guE8vLV+vI70wmAxuZpIKzVjvFX9Qs8bl5w6tN/6gOypPWUmMQL2p7LJz5E63vEGrDhAiYetniJFyBH1RkA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-methods@7.24.1': - resolution: {integrity: sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==} + '@babel/plugin-transform-private-methods@7.24.6': + resolution: {integrity: sha512-T9LtDI0BgwXOzyXrvgLTT8DFjCC/XgWLjflczTLXyvxbnSR/gpv0hbmzlHE/kmh9nOvlygbamLKRo6Op4yB6aw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-property-in-object@7.24.1': - resolution: {integrity: sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==} + '@babel/plugin-transform-private-property-in-object@7.24.6': + resolution: {integrity: sha512-Qu/ypFxCY5NkAnEhCF86Mvg3NSabKsh/TPpBVswEdkGl7+FbsYHy1ziRqJpwGH4thBdQHh8zx+z7vMYmcJ7iaQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-property-literals@7.24.1': - resolution: {integrity: sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==} + '@babel/plugin-transform-property-literals@7.24.6': + resolution: {integrity: sha512-oARaglxhRsN18OYsnPTpb8TcKQWDYNsPNmTnx5++WOAsUJ0cSC/FZVlIJCKvPbU4yn/UXsS0551CFKJhN0CaMw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.24.1': - resolution: {integrity: sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==} + '@babel/plugin-transform-regenerator@7.24.6': + resolution: {integrity: sha512-SMDxO95I8WXRtXhTAc8t/NFQUT7VYbIWwJCJgEli9ml4MhqUMh4S6hxgH6SmAC3eAQNWCDJFxcFeEt9w2sDdXg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-reserved-words@7.24.1': - resolution: {integrity: sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==} + '@babel/plugin-transform-reserved-words@7.24.6': + resolution: {integrity: sha512-DcrgFXRRlK64dGE0ZFBPD5egM2uM8mgfrvTMOSB2yKzOtjpGegVYkzh3s1zZg1bBck3nkXiaOamJUqK3Syk+4A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-shorthand-properties@7.24.1': - resolution: {integrity: sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==} + '@babel/plugin-transform-shorthand-properties@7.24.6': + resolution: {integrity: sha512-xnEUvHSMr9eOWS5Al2YPfc32ten7CXdH7Zwyyk7IqITg4nX61oHj+GxpNvl+y5JHjfN3KXE2IV55wAWowBYMVw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-spread@7.24.1': - resolution: {integrity: sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==} + '@babel/plugin-transform-spread@7.24.6': + resolution: {integrity: sha512-h/2j7oIUDjS+ULsIrNZ6/TKG97FgmEk1PXryk/HQq6op4XUUUwif2f69fJrzK0wza2zjCS1xhXmouACaWV5uPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-sticky-regex@7.24.1': - resolution: {integrity: sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==} + '@babel/plugin-transform-sticky-regex@7.24.6': + resolution: {integrity: sha512-fN8OcTLfGmYv7FnDrsjodYBo1DhPL3Pze/9mIIE2MGCT1KgADYIOD7rEglpLHZj8PZlC/JFX5WcD+85FLAQusw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-template-literals@7.24.1': - resolution: {integrity: sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==} + '@babel/plugin-transform-template-literals@7.24.6': + resolution: {integrity: sha512-BJbEqJIcKwrqUP+KfUIkxz3q8VzXe2R8Wv8TaNgO1cx+nNavxn/2+H8kp9tgFSOL6wYPPEgFvU6IKS4qoGqhmg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typeof-symbol@7.24.1': - resolution: {integrity: sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==} + '@babel/plugin-transform-typeof-symbol@7.24.6': + resolution: {integrity: sha512-IshCXQ+G9JIFJI7bUpxTE/oA2lgVLAIK8q1KdJNoPXOpvRaNjMySGuvLfBw/Xi2/1lLo953uE8hyYSDW3TSYig==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.24.1': - resolution: {integrity: sha512-liYSESjX2fZ7JyBFkYG78nfvHlMKE6IpNdTVnxmlYUR+j5ZLsitFbaAE+eJSK2zPPkNWNw4mXL51rQ8WrvdK0w==} + '@babel/plugin-transform-typescript@7.24.6': + resolution: {integrity: sha512-H0i+hDLmaYYSt6KU9cZE0gb3Cbssa/oxWis7PX4ofQzbvsfix9Lbh8SRk7LCPDlLWJHUiFeHU0qRRpF/4Zv7mQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-escapes@7.24.1': - resolution: {integrity: sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==} + '@babel/plugin-transform-unicode-escapes@7.24.6': + resolution: {integrity: sha512-bKl3xxcPbkQQo5eX9LjjDpU2xYHeEeNQbOhj0iPvetSzA+Tu9q/o5lujF4Sek60CM6MgYvOS/DJuwGbiEYAnLw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-property-regex@7.24.1': - resolution: {integrity: sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==} + '@babel/plugin-transform-unicode-property-regex@7.24.6': + resolution: {integrity: sha512-8EIgImzVUxy15cZiPii9GvLZwsy7Vxc+8meSlR3cXFmBIl5W5Tn9LGBf7CDKkHj4uVfNXCJB8RsVfnmY61iedA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-regex@7.24.1': - resolution: {integrity: sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==} + '@babel/plugin-transform-unicode-regex@7.24.6': + resolution: {integrity: sha512-pssN6ExsvxaKU638qcWb81RrvvgZom3jDgU/r5xFZ7TONkZGFf4MhI2ltMb8OcQWhHyxgIavEU+hgqtbKOmsPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-sets-regex@7.24.1': - resolution: {integrity: sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==} + '@babel/plugin-transform-unicode-sets-regex@7.24.6': + resolution: {integrity: sha512-quiMsb28oXWIDK0gXLALOJRXLgICLiulqdZGOaPPd0vRT7fQp74NtdADAVu+D8s00C+0Xs0MxVP0VKF/sZEUgw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/preset-env@7.24.3': - resolution: {integrity: sha512-fSk430k5c2ff8536JcPvPWK4tZDwehWLGlBp0wrsBUjZVdeQV6lePbwKWZaZfK2vnh/1kQX1PzAJWsnBmVgGJA==} + '@babel/preset-env@7.24.6': + resolution: {integrity: sha512-CrxEAvN7VxfjOG8JNF2Y/eMqMJbZPZ185amwGUBp8D9USK90xQmv7dLdFSa+VbD7fdIqcy/Mfv7WtzG8+/qxKg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -689,8 +695,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - '@babel/preset-typescript@7.24.1': - resolution: {integrity: sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==} + '@babel/preset-typescript@7.24.6': + resolution: {integrity: sha512-U10aHPDnokCFRXgyT/MaIRTivUu2K/mu0vJlwRS9LxJmJet+PFQNKpggPyFCUtC6zWSBPjvxjnpNkAn3Uw2m5w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -698,20 +704,20 @@ packages: '@babel/regjsgen@0.8.0': resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} - '@babel/runtime@7.24.1': - resolution: {integrity: sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==} + '@babel/runtime@7.24.6': + resolution: {integrity: sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==} engines: {node: '>=6.9.0'} - '@babel/template@7.24.0': - resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + '@babel/template@7.24.6': + resolution: {integrity: sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.24.1': - resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} + '@babel/traverse@7.24.6': + resolution: {integrity: sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw==} engines: {node: '>=6.9.0'} - '@babel/types@7.24.0': - resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + '@babel/types@7.24.6': + resolution: {integrity: sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@0.2.3': @@ -720,8 +726,8 @@ packages: '@codemirror/state@6.4.1': resolution: {integrity: sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==} - '@codemirror/view@6.26.0': - resolution: {integrity: sha512-nSSmzONpqsNzshPOxiKhK203R6BvABepugAe34QfQDbNDslyjkqBuKgrK5ZBvqNXpfxz5iLrlGTmEfhbQyH46A==} + '@codemirror/view@6.26.3': + resolution: {integrity: sha512-gmqxkPALZjkgSxIeeweY/wGQXBfwTUaLs8h7OKtSwfbj9Ct3L11lD+u1sS7XHppxFQoMDiMDp07P9f3I2jWOHw==} '@esbuild/android-arm@0.15.18': resolution: {integrity: sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==} @@ -853,8 +859,8 @@ packages: '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@types/babel__traverse@7.20.5': - resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} '@types/codemirror@5.60.8': resolution: {integrity: sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==} @@ -880,11 +886,11 @@ packages: '@types/lodash-es@4.17.12': resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} - '@types/lodash@4.17.0': - resolution: {integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==} + '@types/lodash@4.17.4': + resolution: {integrity: sha512-wYCP26ZLxaT3R39kiN2+HcJ4kTd3U1waI/cY7ivWYqFP6pW3ZNpvi6Wd6PHZx7T/t8z0vlkXMg3QYLa7DZ/IJQ==} - '@types/node@16.18.91': - resolution: {integrity: sha512-h8Q4klc8xzc9kJKr7UYNtJde5TU2qEePVyH3WyzJaUC+3ptyc5kPQbWOIUcn8ZsG5+KSkq+P0py0kC0VqxgAXw==} + '@types/node@16.18.97': + resolution: {integrity: sha512-4muilE1Lbfn57unR+/nT9AFjWk0MtWi5muwCEJqnOvfRQDbSfLCUdN7vCIg8TYuaANfhLOV85ve+FNpiUsbSRg==} '@types/pako@2.0.3': resolution: {integrity: sha512-bq0hMV9opAcrmE0Byyo0fY3Ew4tgOevJmQ9grUhpXQhYfyLJ1Kqg3P33JT5fdbT2AjeAjR51zqqVjAL/HMkx7Q==} @@ -990,8 +996,8 @@ packages: resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - babel-plugin-polyfill-corejs2@0.4.10: - resolution: {integrity: sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==} + babel-plugin-polyfill-corejs2@0.4.11: + resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -1000,8 +1006,8 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-regenerator@0.6.1: - resolution: {integrity: sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==} + babel-plugin-polyfill-regenerator@0.6.2: + resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -1029,8 +1035,8 @@ packages: brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} browser-process-hrtime@1.0.0: @@ -1069,8 +1075,8 @@ packages: cancelable-promise@4.3.1: resolution: {integrity: sha512-A/8PwLk/T7IJDfUdQ68NR24QHa8rIlnN/stiJEBo6dmVUkD4K14LswG0w3VwdeK/o7qOwRUR1k2MhK5Rpy2m7A==} - caniuse-lite@1.0.30001600: - resolution: {integrity: sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==} + caniuse-lite@1.0.30001625: + resolution: {integrity: sha512-4KE9N2gcRH+HQhpeiRZXd+1niLB/XNLAhSy4z7fI8EzcbcPoAqjNInxVHTiTwWfTIV4w096XG8OtCOCQQKPv3w==} chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -1103,8 +1109,8 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - cjs-module-lexer@1.2.3: - resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + cjs-module-lexer@1.3.1: + resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} @@ -1134,7 +1140,7 @@ packages: engines: {node: '>= 0.8'} concat-map@0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} @@ -1142,8 +1148,8 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - core-js-compat@3.36.1: - resolution: {integrity: sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==} + core-js-compat@3.37.1: + resolution: {integrity: sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==} cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} @@ -1241,8 +1247,8 @@ packages: domutils@3.1.0: resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} - electron-to-chromium@1.4.717: - resolution: {integrity: sha512-6Fmg8QkkumNOwuZ/5mIbMU9WI3H2fmn5ajcVya64I5Yr5CcNmO7vcLt0Y7c96DCiMO5/9G+4sI2r6eEvdg1F7A==} + electron-to-chromium@1.4.783: + resolution: {integrity: sha512-bT0jEz/Xz1fahQpbZ1D7LgmPYZ3iHVY39NcWWro1+hA2IvjiPeaXtfSqrQ+nXjApMvQRE2ASt1itSLRrebHMRQ==} emittery@0.8.1: resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==} @@ -1542,8 +1548,8 @@ packages: fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} find-up@4.1.0: @@ -1591,6 +1597,7 @@ packages: glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} @@ -1648,8 +1655,8 @@ packages: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} - immutable@4.3.5: - resolution: {integrity: sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==} + immutable@4.3.6: + resolution: {integrity: sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==} import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} @@ -1670,6 +1677,7 @@ packages: inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -1938,10 +1946,6 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} @@ -1955,8 +1959,8 @@ packages: markdown-link-extractor@4.0.2: resolution: {integrity: sha512-5cUOu4Vwx1wenJgxaudsJ8xwLUMN7747yDJX3V/L7+gi3e4MsCm7w5nbrDQQy8nEfnl4r5NV3pDXMAjhGXYXAw==} - marked@12.0.1: - resolution: {integrity: sha512-Y1/V2yafOcOdWQCX0XpAKXzDakPOpn6U0YLxTJs3cww6VxOzZV1BTOOYWLvH3gX38cq+iLwljHHTnMtlDfg01Q==} + marked@12.0.2: + resolution: {integrity: sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==} engines: {node: '>= 18'} hasBin: true @@ -1967,8 +1971,8 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} engines: {node: '>=8.6'} mime-db@1.52.0: @@ -1993,8 +1997,9 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minisearch@6.3.0: - resolution: {integrity: sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==} + minisearch@https://codeload.github.com/scambier/minisearch/tar.gz/bc9302398847fb8e818e6392f0e5af911394fdd0: + resolution: {tarball: https://codeload.github.com/scambier/minisearch/tar.gz/bc9302398847fb8e818e6392f0e5af911394fdd0} + version: 6.3.0 mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} @@ -2035,11 +2040,11 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - nwsapi@2.2.7: - resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} + nwsapi@2.2.10: + resolution: {integrity: sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==} - obsidian@1.3.5: - resolution: {integrity: sha512-2Zg9vlaEZw6fd2AohcdrC1kV+lZcb4a1Ju6GcIwdWaGOWj6l//7wbKD6vVhO2GlfoQRGARYu++eLo7FEc+f6Tw==} + obsidian@1.5.7-1: + resolution: {integrity: sha512-T5ZRuQ1FnfXqEoakTTHVDYvzUEEoT8zSPnQCW31PVgYwG4D4tZCQfKHN2hTz1ifnCe8upvwa6mBTAP2WUA5Vng==} peerDependencies: '@codemirror/state': ^6.0.0 '@codemirror/view': ^6.0.0 @@ -2099,8 +2104,8 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -2218,10 +2223,12 @@ packages: rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rollup@2.79.1: @@ -2242,8 +2249,8 @@ packages: sander@0.5.1: resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} - sass@1.72.0: - resolution: {integrity: sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA==} + sass@1.77.2: + resolution: {integrity: sha512-eb4GZt1C3avsX3heBNlrc7I09nyT00IUuo4eFhAbeXWU2fvA7oXI53SxODVAA+zgZCk9aunAZgO+losjR3fAwA==} engines: {node: '>=14.0.0'} hasBin: true @@ -2258,8 +2265,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + semver@7.6.2: + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} engines: {node: '>=10'} hasBin: true @@ -2444,8 +2451,8 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - tough-cookie@4.1.3: - resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} + tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} engines: {node: '>=6'} tr46@2.1.0: @@ -2495,8 +2502,8 @@ packages: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} - update-browserslist-db@1.0.13: - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + update-browserslist-db@1.0.16: + resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -2605,9 +2612,6 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} @@ -2625,25 +2629,25 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - '@babel/code-frame@7.24.2': + '@babel/code-frame@7.24.6': dependencies: - '@babel/highlight': 7.24.2 - picocolors: 1.0.0 + '@babel/highlight': 7.24.6 + picocolors: 1.0.1 - '@babel/compat-data@7.24.1': {} + '@babel/compat-data@7.24.6': {} - '@babel/core@7.24.3': + '@babel/core@7.24.6': dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.1 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) - '@babel/helpers': 7.24.1 - '@babel/parser': 7.24.1 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.1 - '@babel/types': 7.24.0 + '@babel/code-frame': 7.24.6 + '@babel/generator': 7.24.6 + '@babel/helper-compilation-targets': 7.24.6 + '@babel/helper-module-transforms': 7.24.6(@babel/core@7.24.6) + '@babel/helpers': 7.24.6 + '@babel/parser': 7.24.6 + '@babel/template': 7.24.6 + '@babel/traverse': 7.24.6 + '@babel/types': 7.24.6 convert-source-map: 2.0.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -2652,718 +2656,722 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.24.1': + '@babel/generator@7.24.6': dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.6 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 - '@babel/helper-annotate-as-pure@7.22.5': + '@babel/helper-annotate-as-pure@7.24.6': dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.6 - '@babel/helper-builder-binary-assignment-operator-visitor@7.22.15': + '@babel/helper-builder-binary-assignment-operator-visitor@7.24.6': dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.6 - '@babel/helper-compilation-targets@7.23.6': + '@babel/helper-compilation-targets@7.24.6': dependencies: - '@babel/compat-data': 7.24.1 - '@babel/helper-validator-option': 7.23.5 + '@babel/compat-data': 7.24.6 + '@babel/helper-validator-option': 7.24.6 browserslist: 4.23.0 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.24.1(@babel/core@7.24.3)': + '@babel/helper-create-class-features-plugin@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-member-expression-to-functions': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.3) - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 + '@babel/core': 7.24.6 + '@babel/helper-annotate-as-pure': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-function-name': 7.24.6 + '@babel/helper-member-expression-to-functions': 7.24.6 + '@babel/helper-optimise-call-expression': 7.24.6 + '@babel/helper-replace-supers': 7.24.6(@babel/core@7.24.6) + '@babel/helper-skip-transparent-expression-wrappers': 7.24.6 + '@babel/helper-split-export-declaration': 7.24.6 semver: 6.3.1 - '@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.3)': + '@babel/helper-create-regexp-features-plugin@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-annotate-as-pure': 7.24.6 regexpu-core: 5.3.2 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.1(@babel/core@7.24.3)': + '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-compilation-targets': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 debug: 4.3.4 lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: - supports-color - '@babel/helper-environment-visitor@7.22.20': {} + '@babel/helper-environment-visitor@7.24.6': {} - '@babel/helper-function-name@7.23.0': + '@babel/helper-function-name@7.24.6': dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.0 + '@babel/template': 7.24.6 + '@babel/types': 7.24.6 - '@babel/helper-hoist-variables@7.22.5': + '@babel/helper-hoist-variables@7.24.6': dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.6 - '@babel/helper-member-expression-to-functions@7.23.0': + '@babel/helper-member-expression-to-functions@7.24.6': dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.6 - '@babel/helper-module-imports@7.24.3': + '@babel/helper-module-imports@7.24.6': dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.6 - '@babel/helper-module-transforms@7.23.3(@babel/core@7.24.3)': + '@babel/helper-module-transforms@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/core': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-module-imports': 7.24.6 + '@babel/helper-simple-access': 7.24.6 + '@babel/helper-split-export-declaration': 7.24.6 + '@babel/helper-validator-identifier': 7.24.6 - '@babel/helper-optimise-call-expression@7.22.5': + '@babel/helper-optimise-call-expression@7.24.6': dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.6 - '@babel/helper-plugin-utils@7.24.0': {} + '@babel/helper-plugin-utils@7.24.6': {} - '@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.3)': + '@babel/helper-remap-async-to-generator@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-wrap-function': 7.22.20 + '@babel/core': 7.24.6 + '@babel/helper-annotate-as-pure': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-wrap-function': 7.24.6 - '@babel/helper-replace-supers@7.24.1(@babel/core@7.24.3)': + '@babel/helper-replace-supers@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-member-expression-to-functions': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-member-expression-to-functions': 7.24.6 + '@babel/helper-optimise-call-expression': 7.24.6 - '@babel/helper-simple-access@7.22.5': + '@babel/helper-simple-access@7.24.6': dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.6 - '@babel/helper-skip-transparent-expression-wrappers@7.22.5': + '@babel/helper-skip-transparent-expression-wrappers@7.24.6': dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.6 - '@babel/helper-split-export-declaration@7.22.6': + '@babel/helper-split-export-declaration@7.24.6': dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.6 - '@babel/helper-string-parser@7.24.1': {} + '@babel/helper-string-parser@7.24.6': {} - '@babel/helper-validator-identifier@7.22.20': {} + '@babel/helper-validator-identifier@7.24.6': {} - '@babel/helper-validator-option@7.23.5': {} + '@babel/helper-validator-option@7.24.6': {} - '@babel/helper-wrap-function@7.22.20': + '@babel/helper-wrap-function@7.24.6': dependencies: - '@babel/helper-function-name': 7.23.0 - '@babel/template': 7.24.0 - '@babel/types': 7.24.0 + '@babel/helper-function-name': 7.24.6 + '@babel/template': 7.24.6 + '@babel/types': 7.24.6 - '@babel/helpers@7.24.1': + '@babel/helpers@7.24.6': dependencies: - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.1 - '@babel/types': 7.24.0 - transitivePeerDependencies: - - supports-color + '@babel/template': 7.24.6 + '@babel/types': 7.24.6 - '@babel/highlight@7.24.2': + '@babel/highlight@7.24.6': dependencies: - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-validator-identifier': 7.24.6 chalk: 2.4.2 js-tokens: 4.0.0 - picocolors: 1.0.0 + picocolors: 1.0.1 - '@babel/parser@7.24.1': + '@babel/parser@7.24.6': dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.6 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.3) + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.6 + '@babel/plugin-transform-optional-chaining': 7.24.6(@babel/core@7.24.6) - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.3)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.3)': + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.3)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.3)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.3)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.3)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.3)': + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-syntax-import-assertions@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.3)': + '@babel/plugin-syntax-import-attributes@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.3)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.3)': + '@babel/plugin-syntax-jsx@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.3)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.3)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.3)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.3)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.3)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.3)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.3)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.3)': + '@babel/plugin-syntax-typescript@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-create-regexp-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.24.3)': + '@babel/plugin-transform-arrow-functions@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.3) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.3) + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-async-to-generator@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-async-generator-functions@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.3) + '@babel/core': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-remap-async-to-generator': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.6) - '@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-async-to-generator@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-module-imports': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-remap-async-to-generator': 7.24.6(@babel/core@7.24.6) - '@babel/plugin-transform-block-scoping@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-block-scoped-functions@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-block-scoping@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-class-static-block@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-class-properties@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.3) + '@babel/core': 7.24.6 + '@babel/helper-create-class-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-classes@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-class-static-block@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.3) - '@babel/helper-split-export-declaration': 7.22.6 + '@babel/core': 7.24.6 + '@babel/helper-create-class-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.6) + + '@babel/plugin-transform-classes@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-annotate-as-pure': 7.24.6 + '@babel/helper-compilation-targets': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-function-name': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-replace-supers': 7.24.6(@babel/core@7.24.6) + '@babel/helper-split-export-declaration': 7.24.6 globals: 11.12.0 - '@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-computed-properties@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/template': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/template': 7.24.6 - '@babel/plugin-transform-destructuring@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-destructuring@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-dotall-regex@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-create-regexp-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-duplicate-keys@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-dynamic-import@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.3) + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.6) - '@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-exponentiation-operator@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-export-namespace-from@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.3) + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.6) - '@babel/plugin-transform-for-of@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-for-of@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.6 - '@babel/plugin-transform-function-name@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-function-name@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-compilation-targets': 7.24.6 + '@babel/helper-function-name': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-json-strings@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.3) + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.6) - '@babel/plugin-transform-literals@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-literals@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-logical-assignment-operators@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.3) + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.6) - '@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-member-expression-literals@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-modules-amd@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-module-transforms': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-modules-commonjs@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-simple-access': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-module-transforms': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-simple-access': 7.24.6 - '@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-modules-systemjs@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/core': 7.24.6 + '@babel/helper-hoist-variables': 7.24.6 + '@babel/helper-module-transforms': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-validator-identifier': 7.24.6 - '@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-modules-umd@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-module-transforms': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.3)': + '@babel/plugin-transform-named-capturing-groups-regex@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-create-regexp-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-new-target@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-new-target@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-nullish-coalescing-operator@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.3) + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.6) - '@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-numeric-separator@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.3) + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.6) - '@babel/plugin-transform-object-rest-spread@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-object-rest-spread@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.3) + '@babel/core': 7.24.6 + '@babel/helper-compilation-targets': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-transform-parameters': 7.24.6(@babel/core@7.24.6) - '@babel/plugin-transform-object-super@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-object-super@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.3) + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-replace-supers': 7.24.6(@babel/core@7.24.6) - '@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-optional-catch-binding@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.3) + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.6) - '@babel/plugin-transform-optional-chaining@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-optional-chaining@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.3) + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.6 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.6) - '@babel/plugin-transform-parameters@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-parameters@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-private-methods@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-create-class-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-private-property-in-object@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-private-property-in-object@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.3) + '@babel/core': 7.24.6 + '@babel/helper-annotate-as-pure': 7.24.6 + '@babel/helper-create-class-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.6) - '@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-property-literals@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-regenerator@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 regenerator-transform: 0.15.2 - '@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-reserved-words@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-shorthand-properties@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-spread@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-spread@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.6 - '@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-sticky-regex@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-template-literals@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-typeof-symbol@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-typeof-symbol@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-typescript@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-typescript@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.3) + '@babel/core': 7.24.6 + '@babel/helper-annotate-as-pure': 7.24.6 + '@babel/helper-create-class-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-typescript': 7.24.6(@babel/core@7.24.6) - '@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-unicode-escapes@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-unicode-property-regex@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-create-regexp-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-unicode-regex@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-create-regexp-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-transform-unicode-sets-regex@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-create-regexp-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 - '@babel/preset-env@7.24.3(@babel/core@7.24.3)': + '@babel/preset-env@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/compat-data': 7.24.1 - '@babel/core': 7.24.3 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.3) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.3) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.3) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.3) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-syntax-import-attributes': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.3) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.3) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.3) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.3) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.3) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.3) - '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-async-generator-functions': 7.24.3(@babel/core@7.24.3) - '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-block-scoping': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-class-static-block': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-classes': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-destructuring': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-dotall-regex': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-duplicate-keys': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-dynamic-import': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-exponentiation-operator': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-export-namespace-from': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-json-strings': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-logical-assignment-operators': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-modules-amd': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-modules-systemjs': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-modules-umd': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.3) - '@babel/plugin-transform-new-target': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-numeric-separator': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-object-rest-spread': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-optional-catch-binding': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-private-property-in-object': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-regenerator': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-reserved-words': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-typeof-symbol': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-unicode-escapes': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-unicode-property-regex': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-unicode-sets-regex': 7.24.1(@babel/core@7.24.3) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.3) - babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.24.3) - babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.3) - babel-plugin-polyfill-regenerator: 0.6.1(@babel/core@7.24.3) - core-js-compat: 3.36.1 + '@babel/compat-data': 7.24.6 + '@babel/core': 7.24.6 + '@babel/helper-compilation-targets': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-validator-option': 7.24.6 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.6) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.6) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.6) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.6) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-import-assertions': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-syntax-import-attributes': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.6) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.6) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.6) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.6) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.6) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.6) + '@babel/plugin-transform-arrow-functions': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-async-generator-functions': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-async-to-generator': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-block-scoped-functions': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-block-scoping': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-class-properties': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-class-static-block': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-classes': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-computed-properties': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-destructuring': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-dotall-regex': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-duplicate-keys': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-dynamic-import': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-exponentiation-operator': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-export-namespace-from': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-for-of': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-function-name': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-json-strings': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-literals': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-logical-assignment-operators': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-member-expression-literals': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-modules-amd': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-modules-commonjs': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-modules-systemjs': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-modules-umd': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-named-capturing-groups-regex': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-new-target': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-nullish-coalescing-operator': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-numeric-separator': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-object-rest-spread': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-object-super': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-optional-catch-binding': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-optional-chaining': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-parameters': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-private-methods': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-private-property-in-object': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-property-literals': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-regenerator': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-reserved-words': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-shorthand-properties': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-spread': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-sticky-regex': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-template-literals': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-typeof-symbol': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-unicode-escapes': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-unicode-property-regex': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-unicode-regex': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-unicode-sets-regex': 7.24.6(@babel/core@7.24.6) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.6) + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.24.6) + babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.6) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.24.6) + core-js-compat: 3.37.1 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.3)': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/types': 7.24.0 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/types': 7.24.6 esutils: 2.0.3 - '@babel/preset-typescript@7.24.1(@babel/core@7.24.3)': + '@babel/preset-typescript@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-typescript': 7.24.1(@babel/core@7.24.3) + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-validator-option': 7.24.6 + '@babel/plugin-syntax-jsx': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-modules-commonjs': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-typescript': 7.24.6(@babel/core@7.24.6) '@babel/regjsgen@0.8.0': {} - '@babel/runtime@7.24.1': + '@babel/runtime@7.24.6': dependencies: regenerator-runtime: 0.14.1 - '@babel/template@7.24.0': + '@babel/template@7.24.6': dependencies: - '@babel/code-frame': 7.24.2 - '@babel/parser': 7.24.1 - '@babel/types': 7.24.0 + '@babel/code-frame': 7.24.6 + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 - '@babel/traverse@7.24.1': + '@babel/traverse@7.24.6': dependencies: - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.1 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.24.1 - '@babel/types': 7.24.0 + '@babel/code-frame': 7.24.6 + '@babel/generator': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-function-name': 7.24.6 + '@babel/helper-hoist-variables': 7.24.6 + '@babel/helper-split-export-declaration': 7.24.6 + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.24.0': + '@babel/types@7.24.6': dependencies: - '@babel/helper-string-parser': 7.24.1 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-string-parser': 7.24.6 + '@babel/helper-validator-identifier': 7.24.6 to-fast-properties: 2.0.0 '@bcoe/v8-coverage@0.2.3': {} '@codemirror/state@6.4.1': {} - '@codemirror/view@6.26.0': + '@codemirror/view@6.26.3': dependencies: '@codemirror/state': 6.4.1 style-mod: 4.1.2 @@ -3388,7 +3396,7 @@ snapshots: '@jest/console@27.5.1': dependencies: '@jest/types': 27.5.1 - '@types/node': 16.18.91 + '@types/node': 16.18.97 chalk: 4.1.2 jest-message-util: 27.5.1 jest-util: 27.5.1 @@ -3401,7 +3409,7 @@ snapshots: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 16.18.91 + '@types/node': 16.18.97 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.8.1 @@ -3420,7 +3428,7 @@ snapshots: jest-util: 27.5.1 jest-validate: 27.5.1 jest-watcher: 27.5.1 - micromatch: 4.0.5 + micromatch: 4.0.7 rimraf: 3.0.2 slash: 3.0.0 strip-ansi: 6.0.1 @@ -3435,14 +3443,14 @@ snapshots: dependencies: '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 16.18.91 + '@types/node': 16.18.97 jest-mock: 27.5.1 '@jest/fake-timers@27.5.1': dependencies: '@jest/types': 27.5.1 '@sinonjs/fake-timers': 8.1.0 - '@types/node': 16.18.91 + '@types/node': 16.18.97 jest-message-util: 27.5.1 jest-mock: 27.5.1 jest-util: 27.5.1 @@ -3460,7 +3468,7 @@ snapshots: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 16.18.91 + '@types/node': 16.18.97 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -3507,7 +3515,7 @@ snapshots: '@jest/transform@27.5.1': dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.6 '@jest/types': 27.5.1 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 @@ -3517,7 +3525,7 @@ snapshots: jest-haste-map: 27.5.1 jest-regex-util: 27.5.1 jest-util: 27.5.1 - micromatch: 4.0.5 + micromatch: 4.0.7 pirates: 4.0.6 slash: 3.0.0 source-map: 0.6.1 @@ -3529,7 +3537,7 @@ snapshots: dependencies: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 16.18.91 + '@types/node': 16.18.97 '@types/yargs': 16.0.9 chalk: 4.1.2 @@ -3573,7 +3581,7 @@ snapshots: '@testing-library/jest-dom@5.17.0': dependencies: '@adobe/css-tools': 4.3.3 - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 '@types/testing-library__jest-dom': 5.14.9 aria-query: 5.3.0 chalk: 3.0.0 @@ -3588,24 +3596,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.24.1 - '@babel/types': 7.24.0 + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.5 + '@types/babel__traverse': 7.20.6 '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.6 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.24.1 - '@babel/types': 7.24.0 + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 - '@types/babel__traverse@7.20.5': + '@types/babel__traverse@7.20.6': dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.6 '@types/codemirror@5.60.8': dependencies: @@ -3615,7 +3623,7 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 16.18.91 + '@types/node': 16.18.97 '@types/istanbul-lib-coverage@2.0.6': {} @@ -3634,11 +3642,11 @@ snapshots: '@types/lodash-es@4.17.12': dependencies: - '@types/lodash': 4.17.0 + '@types/lodash': 4.17.4 - '@types/lodash@4.17.0': {} + '@types/lodash@4.17.4': {} - '@types/node@16.18.91': {} + '@types/node@16.18.97': {} '@types/pako@2.0.3': {} @@ -3648,7 +3656,7 @@ snapshots: '@types/sass@1.45.0': dependencies: - sass: 1.72.0 + sass: 1.77.2 '@types/stack-utils@2.0.3': {} @@ -3718,14 +3726,14 @@ snapshots: asynckit@0.4.0: {} - babel-jest@27.5.1(@babel/core@7.24.3): + babel-jest@27.5.1(@babel/core@7.24.6): dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.6 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 27.5.1(@babel/core@7.24.3) + babel-preset-jest: 27.5.1(@babel/core@7.24.6) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -3734,7 +3742,7 @@ snapshots: babel-plugin-istanbul@6.1.1: dependencies: - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.6 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 @@ -3744,56 +3752,56 @@ snapshots: babel-plugin-jest-hoist@27.5.1: dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.0 + '@babel/template': 7.24.6 + '@babel/types': 7.24.6 '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.5 + '@types/babel__traverse': 7.20.6 - babel-plugin-polyfill-corejs2@0.4.10(@babel/core@7.24.3): + babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.24.6): dependencies: - '@babel/compat-data': 7.24.1 - '@babel/core': 7.24.3 - '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.3) + '@babel/compat-data': 7.24.6 + '@babel/core': 7.24.6 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.6) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.3): + babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.6): dependencies: - '@babel/core': 7.24.3 - '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.3) - core-js-compat: 3.36.1 + '@babel/core': 7.24.6 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.6) + core-js-compat: 3.37.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.1(@babel/core@7.24.3): + babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.24.6): dependencies: - '@babel/core': 7.24.3 - '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.3) + '@babel/core': 7.24.6 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.6) transitivePeerDependencies: - supports-color - babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.3): + babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.6): dependencies: - '@babel/core': 7.24.3 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.3) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.3) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.3) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.3) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.3) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.3) + '@babel/core': 7.24.6 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.6) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.6) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.6) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.6) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.6) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.6) - babel-preset-jest@27.5.1(@babel/core@7.24.3): + babel-preset-jest@27.5.1(@babel/core@7.24.6): dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.6 babel-plugin-jest-hoist: 27.5.1 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.3) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.6) balanced-match@1.0.2: {} @@ -3806,18 +3814,18 @@ snapshots: balanced-match: 1.0.2 concat-map: 0.0.1 - braces@3.0.2: + braces@3.0.3: dependencies: - fill-range: 7.0.1 + fill-range: 7.1.1 browser-process-hrtime@1.0.0: {} browserslist@4.23.0: dependencies: - caniuse-lite: 1.0.30001600 - electron-to-chromium: 1.4.717 + caniuse-lite: 1.0.30001625 + electron-to-chromium: 1.4.783 node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.23.0) + update-browserslist-db: 1.0.16(browserslist@4.23.0) bser@2.1.1: dependencies: @@ -3837,7 +3845,7 @@ snapshots: cancelable-promise@4.3.1: {} - caniuse-lite@1.0.30001600: {} + caniuse-lite@1.0.30001625: {} chalk@2.4.2: dependencies: @@ -3879,7 +3887,7 @@ snapshots: chokidar@3.6.0: dependencies: anymatch: 3.1.3 - braces: 3.0.2 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 @@ -3890,7 +3898,7 @@ snapshots: ci-info@3.9.0: {} - cjs-module-lexer@1.2.3: {} + cjs-module-lexer@1.3.1: {} cliui@7.0.4: dependencies: @@ -3924,7 +3932,7 @@ snapshots: convert-source-map@2.0.0: {} - core-js-compat@3.36.1: + core-js-compat@3.37.1: dependencies: browserslist: 4.23.0 @@ -4010,7 +4018,7 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 - electron-to-chromium@1.4.717: {} + electron-to-chromium@1.4.783: {} emittery@0.8.1: {} @@ -4239,7 +4247,7 @@ snapshots: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 + micromatch: 4.0.7 fast-json-stable-stringify@2.1.0: {} @@ -4251,7 +4259,7 @@ snapshots: dependencies: bser: 2.1.1 - fill-range@7.0.1: + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -4361,7 +4369,7 @@ snapshots: ignore@5.3.1: {} - immutable@4.3.5: {} + immutable@4.3.6: {} import-fresh@3.3.0: dependencies: @@ -4418,8 +4426,8 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: - '@babel/core': 7.24.3 - '@babel/parser': 7.24.1 + '@babel/core': 7.24.6 + '@babel/parser': 7.24.6 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -4456,7 +4464,7 @@ snapshots: '@jest/environment': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 16.18.91 + '@types/node': 16.18.97 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -4498,10 +4506,10 @@ snapshots: jest-config@27.5.1: dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.6 '@jest/test-sequencer': 27.5.1 '@jest/types': 27.5.1 - babel-jest: 27.5.1(@babel/core@7.24.3) + babel-jest: 27.5.1(@babel/core@7.24.6) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -4517,7 +4525,7 @@ snapshots: jest-runner: 27.5.1 jest-util: 27.5.1 jest-validate: 27.5.1 - micromatch: 4.0.5 + micromatch: 4.0.7 parse-json: 5.2.0 pretty-format: 27.5.1 slash: 3.0.0 @@ -4552,7 +4560,7 @@ snapshots: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 16.18.91 + '@types/node': 16.18.97 jest-mock: 27.5.1 jest-util: 27.5.1 jsdom: 16.7.0 @@ -4567,7 +4575,7 @@ snapshots: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 16.18.91 + '@types/node': 16.18.97 jest-mock: 27.5.1 jest-util: 27.5.1 @@ -4577,7 +4585,7 @@ snapshots: dependencies: '@jest/types': 27.5.1 '@types/graceful-fs': 4.1.9 - '@types/node': 16.18.91 + '@types/node': 16.18.97 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -4585,7 +4593,7 @@ snapshots: jest-serializer: 27.5.1 jest-util: 27.5.1 jest-worker: 27.5.1 - micromatch: 4.0.5 + micromatch: 4.0.7 walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 @@ -4596,7 +4604,7 @@ snapshots: '@jest/source-map': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 16.18.91 + '@types/node': 16.18.97 chalk: 4.1.2 co: 4.6.0 expect: 27.5.1 @@ -4626,12 +4634,12 @@ snapshots: jest-message-util@27.5.1: dependencies: - '@babel/code-frame': 7.24.2 + '@babel/code-frame': 7.24.6 '@jest/types': 27.5.1 '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 - micromatch: 4.0.5 + micromatch: 4.0.7 pretty-format: 27.5.1 slash: 3.0.0 stack-utils: 2.0.6 @@ -4639,10 +4647,10 @@ snapshots: jest-mock@27.5.1: dependencies: '@jest/types': 27.5.1 - '@types/node': 16.18.91 + '@types/node': 16.18.97 jest-pnp-resolver@1.2.3(jest-resolve@27.5.1): - dependencies: + optionalDependencies: jest-resolve: 27.5.1 jest-regex-util@27.5.1: {} @@ -4675,7 +4683,7 @@ snapshots: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 16.18.91 + '@types/node': 16.18.97 chalk: 4.1.2 emittery: 0.8.1 graceful-fs: 4.2.11 @@ -4707,7 +4715,7 @@ snapshots: '@jest/transform': 27.5.1 '@jest/types': 27.5.1 chalk: 4.1.2 - cjs-module-lexer: 1.2.3 + cjs-module-lexer: 1.3.1 collect-v8-coverage: 1.0.2 execa: 5.1.1 glob: 7.2.3 @@ -4726,21 +4734,21 @@ snapshots: jest-serializer@27.5.1: dependencies: - '@types/node': 16.18.91 + '@types/node': 16.18.97 graceful-fs: 4.2.11 jest-snapshot@27.5.1: dependencies: - '@babel/core': 7.24.3 - '@babel/generator': 7.24.1 - '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.3) - '@babel/traverse': 7.24.1 - '@babel/types': 7.24.0 + '@babel/core': 7.24.6 + '@babel/generator': 7.24.6 + '@babel/plugin-syntax-typescript': 7.24.6(@babel/core@7.24.6) + '@babel/traverse': 7.24.6 + '@babel/types': 7.24.6 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/babel__traverse': 7.20.5 + '@types/babel__traverse': 7.20.6 '@types/prettier': 2.7.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.3) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.6) chalk: 4.1.2 expect: 27.5.1 graceful-fs: 4.2.11 @@ -4752,14 +4760,14 @@ snapshots: jest-util: 27.5.1 natural-compare: 1.4.0 pretty-format: 27.5.1 - semver: 7.6.0 + semver: 7.6.2 transitivePeerDependencies: - supports-color jest-util@27.5.1: dependencies: '@jest/types': 27.5.1 - '@types/node': 16.18.91 + '@types/node': 16.18.97 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -4778,7 +4786,7 @@ snapshots: dependencies: '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 16.18.91 + '@types/node': 16.18.97 ansi-escapes: 4.3.2 chalk: 4.1.2 jest-util: 27.5.1 @@ -4786,7 +4794,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 16.18.91 + '@types/node': 16.18.97 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -4825,11 +4833,11 @@ snapshots: http-proxy-agent: 4.0.1 https-proxy-agent: 5.0.1 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.7 + nwsapi: 2.2.10 parse5: 6.0.1 saxes: 5.0.1 symbol-tree: 3.2.4 - tough-cookie: 4.1.3 + tough-cookie: 4.1.4 w3c-hr-time: 1.0.2 w3c-xmlserializer: 2.0.0 webidl-conversions: 6.1.0 @@ -4877,17 +4885,13 @@ snapshots: dependencies: yallist: 3.1.1 - lru-cache@6.0.0: - dependencies: - yallist: 4.0.0 - magic-string@0.25.9: dependencies: sourcemap-codec: 1.4.8 make-dir@4.0.0: dependencies: - semver: 7.6.0 + semver: 7.6.2 makeerror@1.0.12: dependencies: @@ -4896,17 +4900,17 @@ snapshots: markdown-link-extractor@4.0.2: dependencies: html-link-extractor: 1.0.5 - marked: 12.0.1 + marked: 12.0.2 - marked@12.0.1: {} + marked@12.0.2: {} merge-stream@2.0.0: {} merge2@1.4.1: {} - micromatch@4.0.5: + micromatch@4.0.7: dependencies: - braces: 3.0.2 + braces: 3.0.3 picomatch: 2.3.1 mime-db@1.52.0: {} @@ -4925,7 +4929,7 @@ snapshots: minimist@1.2.8: {} - minisearch@6.3.0: {} + minisearch@https://codeload.github.com/scambier/minisearch/tar.gz/bc9302398847fb8e818e6392f0e5af911394fdd0: {} mkdirp@0.5.6: dependencies: @@ -4955,12 +4959,12 @@ snapshots: dependencies: boolbase: 1.0.0 - nwsapi@2.2.7: {} + nwsapi@2.2.10: {} - obsidian@1.3.5(@codemirror/state@6.4.1)(@codemirror/view@6.26.0): + obsidian@1.5.7-1(@codemirror/state@6.4.1)(@codemirror/view@6.26.3): dependencies: '@codemirror/state': 6.4.1 - '@codemirror/view': 6.26.0 + '@codemirror/view': 6.26.3 '@types/codemirror': 5.60.8 moment: 2.29.4 @@ -4988,7 +4992,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.24.2 + '@babel/code-frame': 7.24.6 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -5014,7 +5018,7 @@ snapshots: path-type@4.0.0: {} - picocolors@1.0.0: {} + picocolors@1.0.1: {} picomatch@2.3.1: {} @@ -5027,7 +5031,7 @@ snapshots: postcss@8.4.38: dependencies: nanoid: 3.3.7 - picocolors: 1.0.0 + picocolors: 1.0.1 source-map-js: 1.2.0 prettier-plugin-svelte@2.10.1(prettier@2.8.8)(svelte@3.59.2): @@ -5079,7 +5083,7 @@ snapshots: regenerator-transform@0.15.2: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 regexpu-core@5.3.2: dependencies: @@ -5145,10 +5149,10 @@ snapshots: mkdirp: 0.5.6 rimraf: 2.7.1 - sass@1.72.0: + sass@1.77.2: dependencies: chokidar: 3.6.0 - immutable: 4.3.5 + immutable: 4.3.6 source-map-js: 1.2.0 saxes@5.0.1: @@ -5159,9 +5163,7 @@ snapshots: semver@6.3.1: {} - semver@7.6.0: - dependencies: - lru-cache: 6.0.0 + semver@7.6.2: {} shebang-command@2.0.0: dependencies: @@ -5247,16 +5249,16 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-check@2.10.3(@babel/core@7.24.3)(svelte@3.59.2): + svelte-check@2.10.3(@babel/core@7.24.6)(postcss@8.4.38)(sass@1.77.2)(svelte@3.59.2): dependencies: '@jridgewell/trace-mapping': 0.3.25 chokidar: 3.6.0 fast-glob: 3.3.2 import-fresh: 3.3.0 - picocolors: 1.0.0 + picocolors: 1.0.1 sade: 1.8.1 svelte: 3.59.2 - svelte-preprocess: 4.10.7(@babel/core@7.24.3)(svelte@3.59.2)(typescript@4.9.5) + svelte-preprocess: 4.10.7(@babel/core@7.24.6)(postcss@8.4.38)(sass@1.77.2)(svelte@3.59.2)(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - '@babel/core' @@ -5275,9 +5277,8 @@ snapshots: jest: 27.5.1 svelte: 3.59.2 - svelte-preprocess@4.10.7(@babel/core@7.24.3)(svelte@3.59.2)(typescript@4.9.5): + svelte-preprocess@4.10.7(@babel/core@7.24.6)(postcss@8.4.38)(sass@1.77.2)(svelte@3.59.2)(typescript@4.9.5): dependencies: - '@babel/core': 7.24.3 '@types/pug': 2.0.10 '@types/sass': 1.45.0 detect-indent: 6.1.0 @@ -5285,6 +5286,10 @@ snapshots: sorcery: 0.10.0 strip-indent: 3.0.0 svelte: 3.59.2 + optionalDependencies: + '@babel/core': 7.24.6 + postcss: 8.4.38 + sass: 1.77.2 typescript: 4.9.5 svelte@3.59.2: {} @@ -5312,7 +5317,7 @@ snapshots: dependencies: is-number: 7.0.0 - tough-cookie@4.1.3: + tough-cookie@4.1.4: dependencies: psl: 1.9.0 punycode: 2.3.1 @@ -5350,11 +5355,11 @@ snapshots: universalify@2.0.1: {} - update-browserslist-db@1.0.13(browserslist@4.23.0): + update-browserslist-db@1.0.16(browserslist@4.23.0): dependencies: browserslist: 4.23.0 escalade: 3.1.2 - picocolors: 1.0.0 + picocolors: 1.0.1 url-parse@1.5.10: dependencies: @@ -5367,15 +5372,16 @@ snapshots: convert-source-map: 1.9.0 source-map: 0.7.4 - vite@3.2.10(@types/node@16.18.91): + vite@3.2.10(@types/node@16.18.97)(sass@1.77.2): dependencies: - '@types/node': 16.18.91 esbuild: 0.15.18 postcss: 8.4.38 resolve: 1.22.8 rollup: 2.79.1 optionalDependencies: + '@types/node': 16.18.97 fsevents: 2.3.3 + sass: 1.77.2 w3c-hr-time@1.0.2: dependencies: @@ -5436,8 +5442,6 @@ snapshots: yallist@3.1.1: {} - yallist@4.0.0: {} - yargs-parser@20.2.9: {} yargs@16.2.0: diff --git a/src/__tests__/query-tests.ts b/src/__tests__/query-tests.ts index ef9155e..8ef016e 100644 --- a/src/__tests__/query-tests.ts +++ b/src/__tests__/query-tests.ts @@ -6,7 +6,7 @@ describe('The Query class', () => { it('should correctly parse string queries', () => { // Act - const query = new Query(stringQuery) + const query = new Query(stringQuery, { ignoreDiacritics: true }) // Assert const segments = query.query.text @@ -25,7 +25,7 @@ describe('The Query class', () => { it('should not exclude words when there is no space before', () => { // Act - const query = new Query('foo bar-baz') + const query = new Query('foo bar-baz', { ignoreDiacritics: true }) // Assert expect(query.query.exclude.text).toHaveLength(0) @@ -34,7 +34,7 @@ describe('The Query class', () => { describe('.getExactTerms()', () => { it('should an array of strings containg "exact" values', () => { // Act - const query = new Query(stringQuery) + const query = new Query(stringQuery, { ignoreDiacritics: true }) // Assert expect(query.getExactTerms()).toEqual(['lorem ipsum', 'sit amet']) diff --git a/src/cache-manager.ts b/src/cache-manager.ts index 1f14fec..6b8ebaf 100644 --- a/src/cache-manager.ts +++ b/src/cache-manager.ts @@ -1,10 +1,5 @@ -import { Notice, TFile } from 'obsidian' -import { - type DocumentRef, - getTextExtractor, - type IndexedDocument, -} from './globals' -import { database } from './database' +import { TFile } from 'obsidian' +import type { IndexedDocument } from './globals' import { extractHeadingsFromCache, getAliasesFromMetadata, @@ -12,167 +7,17 @@ import { isFileCanvas, isFileFromDataloomPlugin, isFileImage, - isFilePDF, isFileOffice, - isFilePlaintext, - isFilenameIndexable, + isFilePDF, logDebug, - makeMD5, removeDiacritics, stripMarkdownCharacters, } from './tools/utils' import type { CanvasData } from 'obsidian/canvas' -import type { AsPlainObject } from 'minisearch' -import type MiniSearch from 'minisearch' -import { settings } from './settings' -import { getObsidianApp } from './stores/obsidian-app' +import type OmnisearchPlugin from './main' +import { getNonExistingNotes } from './tools/notes' -const app = getObsidianApp() - -/** - * This function is responsible for extracting the text from a file and - * returning it as an `IndexedDocument` object. - * @param path - */ -async function getAndMapIndexedDocument( - path: string -): Promise { - const file = app.vault.getAbstractFileByPath(path) - if (!file) throw new Error(`Invalid file path: "${path}"`) - if (!(file instanceof TFile)) throw new Error(`Not a TFile: "${path}"`) - let content: string | null = null - - const extractor = getTextExtractor() - - // ** Plain text ** - // Just read the file content - if (isFilePlaintext(path)) { - content = await app.vault.cachedRead(file) - } - - // ** Canvas ** - // Extract the text fields from the json - else if (isFileCanvas(path)) { - const canvas = JSON.parse(await app.vault.cachedRead(file)) as CanvasData - let texts: string[] = [] - // Concatenate text from the canvas fields - for (const node of canvas.nodes) { - if (node.type === 'text') { - texts.push(node.text) - } else if (node.type === 'file') { - texts.push(node.file) - } - } - for (const edge of canvas.edges.filter(e => !!e.label)) { - texts.push(edge.label!) - } - content = texts.join('\r\n') - } - - // ** Dataloom plugin ** - else if (isFileFromDataloomPlugin(path)) { - try { - const data = JSON.parse(await app.vault.cachedRead(file)) - // data is a json object, we recursively iterate the keys - // and concatenate the values if the key is "markdown" - const texts: string[] = [] - const iterate = (obj: any) => { - for (const key in obj) { - if (typeof obj[key] === 'object') { - iterate(obj[key]) - } else if (key === 'content') { - texts.push(obj[key]) - } - } - } - iterate(data) - content = texts.join('\r\n') - } catch (e) { - console.error('Omnisearch: Error while parsing Dataloom file', path) - console.error(e) - } - } - - // ** Image ** - else if ( - isFileImage(path) && - settings.imagesIndexing && - extractor?.canFileBeExtracted(path) - ) { - content = await extractor.extractText(file) - } - // ** PDF ** - else if ( - isFilePDF(path) && - settings.PDFIndexing && - extractor?.canFileBeExtracted(path) - ) { - content = await extractor.extractText(file) - } - - // ** Office document ** - else if ( - isFileOffice(path) && - settings.officeIndexing && - extractor?.canFileBeExtracted(path) - ) { - content = await extractor.extractText(file) - } - - // ** Unsupported files ** - else if (isFilenameIndexable(path)) { - content = file.path - } - - if (content === null || content === undefined) { - // This shouldn't happen - console.warn(`Omnisearch: ${content} content for file`, file.path) - content = '' - } - const metadata = app.metadataCache.getFileCache(file) - - // Look for links that lead to non-existing files, - // and add them to the index. - if (metadata) { - // // FIXME: https://github.com/scambier/obsidian-omnisearch/issues/129 - // const nonExisting = getNonExistingNotes(file, metadata) - // for (const name of nonExisting.filter( - // o => !cacheManager.getLiveDocument(o) - // )) { - // NotesIndex.addNonExistingToIndex(name, file.path) - // } - - // EXCALIDRAW - // Remove the json code - if (metadata.frontmatter?.['excalidraw-plugin']) { - const comments = - metadata.sections?.filter(s => s.type === 'comment') ?? [] - for (const { start, end } of comments.map(c => c.position)) { - content = - content.substring(0, start.offset - 1) + content.substring(end.offset) - } - } - } - - const tags = getTagsFromMetadata(metadata) - return { - basename: file.basename, - content, - /** Content without diacritics and markdown chars */ - cleanedContent: stripMarkdownCharacters(removeDiacritics(content)), - path: file.path, - mtime: file.stat.mtime, - - tags: tags, - unmarkedTags: tags.map(t => t.replace('#', '')), - aliases: getAliasesFromMetadata(metadata).join(''), - headings1: metadata ? extractHeadingsFromCache(metadata, 1).join(' ') : '', - headings2: metadata ? extractHeadingsFromCache(metadata, 2).join(' ') : '', - headings3: metadata ? extractHeadingsFromCache(metadata, 3).join(' ') : '', - } -} - -class CacheManager { +export class CacheManager { /** * Show an empty input field next time the user opens Omnisearch modal */ @@ -184,13 +29,15 @@ class CacheManager { */ private documents: Map = new Map() + constructor(private plugin: OmnisearchPlugin) {} + /** * Set or update the live cache with the content of the given file. * @param path */ public async addToLiveCache(path: string): Promise { try { - const doc = await getAndMapIndexedDocument(path) + const doc = await this.getAndMapIndexedDocument(path) if (!doc.path) { console.error( `Missing .path field in IndexedDocument "${doc.basename}", skipping` @@ -224,6 +71,7 @@ class CacheManager { return } this.nextQueryIsEmpty = false + const database = this.plugin.database let history = await database.searchHistory.toArray() history = history.filter(s => s.query !== query).reverse() history.unshift({ query }) @@ -236,7 +84,7 @@ class CacheManager { * @returns The search history, in reverse chronological order */ public async getSearchHistory(): Promise> { - const data = (await database.searchHistory.toArray()) + const data = (await this.plugin.database.searchHistory.toArray()) .reverse() .map(o => o.query) if (this.nextQueryIsEmpty) { @@ -245,55 +93,156 @@ class CacheManager { return data } - //#region Minisearch + /** + * This function is responsible for extracting the text from a file and + * returning it as an `IndexedDocument` object. + * @param path + */ + private async getAndMapIndexedDocument( + path: string + ): Promise { + const app = this.plugin.app + const file = app.vault.getAbstractFileByPath(path) + if (!file) throw new Error(`Invalid file path: "${path}"`) + if (!(file instanceof TFile)) throw new Error(`Not a TFile: "${path}"`) + let content: string | null = null - public getDocumentsChecksum(documents: IndexedDocument[]): string { - return makeMD5( - JSON.stringify( - documents.sort((a, b) => { - if (a.path < b.path) { - return -1 - } else if (a.path > b.path) { - return 1 + const extractor = this.plugin.getTextExtractor() + + // ** Plain text ** + // Just read the file content + if (this.plugin.notesIndexer.isFilePlaintext(path)) { + content = await app.vault.cachedRead(file) + } + + // ** Canvas ** + // Extract the text fields from the json + else if (isFileCanvas(path)) { + const canvas = JSON.parse(await app.vault.cachedRead(file)) as CanvasData + let texts: string[] = [] + // Concatenate text from the canvas fields + for (const node of canvas.nodes) { + if (node.type === 'text') { + texts.push(node.text) + } else if (node.type === 'file') { + texts.push(node.file) + } + } + for (const edge of canvas.edges.filter(e => !!e.label)) { + texts.push(edge.label!) + } + content = texts.join('\r\n') + } + + // ** Dataloom plugin ** + else if (isFileFromDataloomPlugin(path)) { + try { + const data = JSON.parse(await app.vault.cachedRead(file)) + // data is a json object, we recursively iterate the keys + // and concatenate the values if the key is "markdown" + const texts: string[] = [] + const iterate = (obj: any) => { + for (const key in obj) { + if (typeof obj[key] === 'object') { + iterate(obj[key]) + } else if (key === 'content') { + texts.push(obj[key]) + } } - return 0 - }) - ) - ) - } + } + iterate(data) + content = texts.join('\r\n') + } catch (e) { + console.error('Omnisearch: Error while parsing Dataloom file', path) + console.error(e) + } + } - public async getMinisearchCache(): Promise<{ - paths: DocumentRef[] - data: AsPlainObject - } | null> { - try { - const cachedIndex = (await database.minisearch.toArray())[0] - return cachedIndex - } catch (e) { - new Notice( - 'Omnisearch - Cache missing or invalid. Some freezes may occur while Omnisearch indexes your vault.' - ) - console.error('Omnisearch - Error while loading Minisearch cache') - console.error(e) - return null + // ** Image ** + else if ( + isFileImage(path) && + this.plugin.settings.imagesIndexing && + extractor?.canFileBeExtracted(path) + ) { + content = await extractor.extractText(file) + } + // ** PDF ** + else if ( + isFilePDF(path) && + this.plugin.settings.PDFIndexing && + extractor?.canFileBeExtracted(path) + ) { + content = await extractor.extractText(file) + } + + // ** Office document ** + else if ( + isFileOffice(path) && + this.plugin.settings.officeIndexing && + extractor?.canFileBeExtracted(path) + ) { + content = await extractor.extractText(file) + } + + // ** Unsupported files ** + else if (this.plugin.notesIndexer.isFilenameIndexable(path)) { + content = file.path + } + + if (content === null || content === undefined) { + // This shouldn't happen + console.warn(`Omnisearch: ${content} content for file`, file.path) + content = '' + } + const metadata = app.metadataCache.getFileCache(file) + + // Look for links that lead to non-existing files, + // and add them to the index. + if (metadata) { + const nonExisting = getNonExistingNotes(this.plugin.app, file, metadata) + for (const name of nonExisting.filter(o => !this.documents.has(o))) { + const doc = + this.plugin.notesIndexer.generateIndexableNonexistingDocument( + name, + file.path + ) + // TODO: index non-existing note + } + + // EXCALIDRAW + // Remove the json code + if (metadata.frontmatter?.['excalidraw-plugin']) { + const comments = + metadata.sections?.filter(s => s.type === 'comment') ?? [] + for (const { start, end } of comments.map(c => c.position)) { + content = + content.substring(0, start.offset - 1) + + content.substring(end.offset) + } + } + } + + const tags = getTagsFromMetadata(metadata) + return { + basename: file.basename, + content, + /** Content without diacritics and markdown chars */ + cleanedContent: stripMarkdownCharacters(removeDiacritics(content)), + path: file.path, + mtime: file.stat.mtime, + + tags: tags, + unmarkedTags: tags.map(t => t.replace('#', '')), + aliases: getAliasesFromMetadata(metadata).join(''), + headings1: metadata + ? extractHeadingsFromCache(metadata, 1).join(' ') + : '', + headings2: metadata + ? extractHeadingsFromCache(metadata, 2).join(' ') + : '', + headings3: metadata + ? extractHeadingsFromCache(metadata, 3).join(' ') + : '', } } - - public async writeMinisearchCache( - minisearch: MiniSearch, - indexed: Map - ): Promise { - const paths = Array.from(indexed).map(([k, v]) => ({ path: k, mtime: v })) - await database.minisearch.clear() - await database.minisearch.add({ - date: new Date().toISOString(), - paths, - data: minisearch.toJSON(), - }) - console.log('Omnisearch - Search cache written') - } - - //#endregion Minisearch } - -export const cacheManager = new CacheManager() diff --git a/src/components/InputSearch.svelte b/src/components/InputSearch.svelte index b940547..d29044e 100644 --- a/src/components/InputSearch.svelte +++ b/src/components/InputSearch.svelte @@ -2,10 +2,11 @@ import { debounce } from 'obsidian' import { toggleInputComposition } from 'src/globals' import { createEventDispatcher, tick } from 'svelte' - import { cacheManager } from '../cache-manager' + import type OmnisearchPlugin from '../main' export let initialValue = '' export let placeholder = '' + export let plugin: OmnisearchPlugin let initialSet = false let value = '' let elInput: HTMLInputElement @@ -39,7 +40,7 @@ const debouncedOnInput = debounce(() => { // If typing a query and not executing it, // the next time we open the modal, the search field will be empty - cacheManager.addToSearchHistory('') + plugin.cacheManager.addToSearchHistory('') dispatch('input', value) }, 300) @@ -50,13 +51,13 @@ bind:this="{elInput}" bind:value="{value}" class="prompt-input" - use:selectInput on:compositionend="{_ => toggleInputComposition(false)}" on:compositionstart="{_ => toggleInputComposition(true)}" on:input="{debouncedOnInput}" placeholder="{placeholder}" spellcheck="false" - type="text" /> + type="text" + use:selectInput /> - \ No newline at end of file + diff --git a/src/components/ModalInFile.svelte b/src/components/ModalInFile.svelte index 81867f3..d53cef4 100644 --- a/src/components/ModalInFile.svelte +++ b/src/components/ModalInFile.svelte @@ -9,7 +9,7 @@ } from 'src/globals' import { getCtrlKeyLabel, loopIndex } from 'src/tools/utils' import { onDestroy, onMount, tick } from 'svelte' - import { MarkdownView, App, Platform } from 'obsidian' + import { MarkdownView, Platform } from 'obsidian' import ModalContainer from './ModalContainer.svelte' import { OmnisearchInFileModal, @@ -18,14 +18,13 @@ import ResultItemInFile from './ResultItemInFile.svelte' import { Query } from 'src/search/query' import { openNote } from 'src/tools/notes' - import { searchEngine } from 'src/search/omnisearch' - import { stringsToRegex } from 'src/tools/text-processing' + import type OmnisearchPlugin from '../main' + export let plugin: OmnisearchPlugin export let modal: OmnisearchInFileModal export let parent: OmnisearchVaultModal | null = null export let singleFilePath = '' export let previousQuery: string | undefined - export let app: App let searchQuery: string let groupedOffsets: number[] = [] @@ -51,10 +50,12 @@ $: (async () => { if (searchQuery) { - query = new Query(searchQuery) + query = new Query(searchQuery, { + ignoreDiacritics: plugin.settings.ignoreDiacritics, + }) note = ( - await searchEngine.getSuggestions(query, { + await plugin.searchEngine.getSuggestions(query, { singleFilePath, }) )[0] ?? null @@ -131,12 +132,12 @@ if (parent) parent.close() // Open (or switch focus to) the note - const reg = stringsToRegex(note.foundWords) + const reg = plugin.textProcessor.stringsToRegex(note.foundWords) reg.exec(note.content) - await openNote(note, reg.lastIndex, newTab) + await openNote(plugin.app, note, reg.lastIndex, newTab) // Move cursor to the match - const view = app.workspace.getActiveViewOfType(MarkdownView) + const view = plugin.app.workspace.getActiveViewOfType(MarkdownView) if (!view) { // Not an editable document, so no cursor to place return @@ -155,12 +156,13 @@ } function switchToVaultModal(): void { - new OmnisearchVaultModal(app, searchQuery ?? previousQuery).open() + new OmnisearchVaultModal(plugin, searchQuery ?? previousQuery).open() modal.close() } @@ -175,6 +177,7 @@ {#if groupedOffsets.length && note} {#each groupedOffsets as offset, i} - import { App, MarkdownView, Notice, Platform, TFile } from 'obsidian' + import { MarkdownView, Notice, Platform, TFile } from 'obsidian' import { onDestroy, onMount, tick } from 'svelte' import InputSearch from './InputSearch.svelte' import ModalContainer from './ModalContainer.svelte' @@ -24,16 +24,13 @@ } from 'src/components/modals' import ResultItemVault from './ResultItemVault.svelte' import { Query } from 'src/search/query' - import { settings } from '../settings' - import * as NotesIndex from '../notes-index' - import { cacheManager } from '../cache-manager' - import { searchEngine } from 'src/search/omnisearch' import { cancelable, CancelablePromise } from 'cancelable-promise' import { debounce } from 'lodash-es' + import type OmnisearchPlugin from '../main' export let modal: OmnisearchVaultModal export let previousQuery: string | undefined - export let app: App + export let plugin: OmnisearchPlugin let selectedIndex = 0 let historySearchIndex = 0 @@ -51,7 +48,7 @@ $: selectedNote = resultNotes[selectedIndex] $: searchQuery = searchQuery ?? previousQuery - $: if (settings.openInNewPane) { + $: if (plugin.settings.openInNewPane) { openInNewPaneKey = '↵' openInCurrentPaneKey = getCtrlKeyLabel() + ' ↵' createInNewPaneKey = 'shift ↵' @@ -103,7 +100,7 @@ eventBus.on('vault', Action.PrevSearchHistory, prevSearchHistory) eventBus.on('vault', Action.NextSearchHistory, nextSearchHistory) eventBus.on('vault', Action.OpenInNewLeaf, openNoteInNewLeaf) - await NotesIndex.refreshIndex() + await plugin.notesIndexer.refreshIndex() await updateResultsDebounced() }) @@ -113,7 +110,9 @@ async function prevSearchHistory() { // Filter out the empty string, if it's there - const history = (await cacheManager.getSearchHistory()).filter(s => s) + const history = (await plugin.cacheManager.getSearchHistory()).filter( + s => s + ) if (++historySearchIndex >= history.length) { historySearchIndex = 0 } @@ -122,7 +121,9 @@ } async function nextSearchHistory() { - const history = (await cacheManager.getSearchHistory()).filter(s => s) + const history = (await plugin.cacheManager.getSearchHistory()).filter( + s => s + ) if (--historySearchIndex < 0) { historySearchIndex = history.length ? history.length - 1 : 0 } @@ -138,10 +139,12 @@ cancelableQuery.cancel() cancelableQuery = null } - query = new Query(searchQuery) + query = new Query(searchQuery, { + ignoreDiacritics: plugin.settings.ignoreDiacritics, + }) cancelableQuery = cancelable( new Promise(resolve => { - resolve(searchEngine.getSuggestions(query)) + resolve(plugin.searchEngine.getSuggestions(query)) }) ) resultNotes = await cancelableQuery @@ -188,7 +191,7 @@ function saveCurrentQuery() { if (searchQuery) { - cacheManager.addToSearchHistory(searchQuery) + plugin.cacheManager.addToSearchHistory(searchQuery) } } @@ -199,7 +202,7 @@ ) { saveCurrentQuery() const offset = note.matches?.[0]?.offset ?? 0 - openNote(note, offset, newPane, newLeaf) + openNote(plugin.app, note, offset, newPane, newLeaf) } async function onClickCreateNote(_e: MouseEvent) { @@ -211,7 +214,7 @@ }): Promise { if (searchQuery) { try { - await createNote(searchQuery, opt?.newLeaf) + await createNote(plugin.app, searchQuery, opt?.newLeaf) } catch (e) { new Notice((e as Error).message) return @@ -222,11 +225,11 @@ function insertLink(): void { if (!selectedNote) return - const file = app.vault + const file = plugin.app.vault .getMarkdownFiles() .find(f => f.path === selectedNote.path) - const active = app.workspace.getActiveFile() - const view = app.workspace.getActiveViewOfType(MarkdownView) + const active = plugin.app.workspace.getActiveFile() + const view = plugin.app.workspace.getActiveViewOfType(MarkdownView) if (!view?.editor) { new Notice('Omnisearch - Error - No active editor', 3000) return @@ -235,7 +238,7 @@ // Generate link let link: string if (file && active) { - link = app.fileManager.generateMarkdownLink(file, active.path) + link = plugin.app.fileManager.generateMarkdownLink(file, active.path) } else { link = `[[${selectedNote.basename}.${getExtension(selectedNote.path)}]]` } @@ -249,7 +252,7 @@ modal.close() } - function switchToInFileModal(): void { + function switchToInFileModal(): void { // Do nothing if the selectedNote is a PDF, // or if there is 0 match (e.g indexing in progress) if ( @@ -264,15 +267,15 @@ if (selectedNote) { // Open in-file modal for selected search result - const file = app.vault.getAbstractFileByPath(selectedNote.path) + const file = plugin.app.vault.getAbstractFileByPath(selectedNote.path) if (file && file instanceof TFile) { - new OmnisearchInFileModal(app, file, searchQuery).open() + new OmnisearchInFileModal(plugin, file, searchQuery).open() } } else { // Open in-file modal for active file - const view = app.workspace.getActiveViewOfType(MarkdownView) + const view = plugin.app.workspace.getActiveViewOfType(MarkdownView) if (view?.file) { - new OmnisearchInFileModal(app, view.file, searchQuery).open() + new OmnisearchInFileModal(plugin, view.file, searchQuery).open() } } } @@ -295,11 +298,12 @@
- {#if settings.showCreateButton} + {#if plugin.settings.showCreateButton} {/if} {#if Platform.isMobile} @@ -317,7 +321,7 @@ {#each resultNotes as result, i} {#if !resultNotes.length && searchQuery && !searching} We found 0 result for your search here. - {#if settings.simpleSearch && searchQuery + {#if plugin.settings.simpleSearch && searchQuery .split(SPACE_OR_PUNCTUATION) .some(w => w.length < 3)}
diff --git a/src/components/ResultItemInFile.svelte b/src/components/ResultItemInFile.svelte index 01ee5ba..ba9f148 100644 --- a/src/components/ResultItemInFile.svelte +++ b/src/components/ResultItemInFile.svelte @@ -1,24 +1,24 @@ + on:mousemove + selected="{selected}">
- {@html highlightText(cleanedContent, note.matches)} + {@html plugin.textProcessor.highlightText(cleanedContent, note.matches)}
diff --git a/src/components/ResultItemVault.svelte b/src/components/ResultItemVault.svelte index b1f9970..d5a6387 100644 --- a/src/components/ResultItemVault.svelte +++ b/src/components/ResultItemVault.svelte @@ -9,18 +9,12 @@ pathWithoutFilename, } from '../tools/utils' import ResultItemContainer from './ResultItemContainer.svelte' - import { TFile, setIcon, App } from 'obsidian' - import { cloneDeep } from 'lodash-es' - import { - stringsToRegex, - getMatches, - makeExcerpt, - highlightText, - } from 'src/tools/text-processing' + import { TFile, setIcon } from 'obsidian' + import type OmnisearchPlugin from '../main' export let selected = false export let note: ResultNote - export let app: App + export let plugin: OmnisearchPlugin let imagePath: string | null = null let title = '' @@ -31,16 +25,15 @@ $: { imagePath = null if (isFileImage(note.path)) { - const file = app.vault.getAbstractFileByPath(note.path) + const file = plugin.app.vault.getAbstractFileByPath(note.path) if (file instanceof TFile) { - imagePath = app.vault.getResourcePath(file) + imagePath = plugin.app.vault.getResourcePath(file) } } } - $: reg = stringsToRegex(note.foundWords) - $: matchesTitle = getMatches(title, reg) - $: matchesNotePath = getMatches(notePath, reg) - $: cleanedContent = makeExcerpt(note.content, note.matches[0]?.offset ?? -1) + $: matchesTitle = plugin.textProcessor.getMatches(title, note.foundWords) + $: matchesNotePath = plugin.textProcessor.getMatches(notePath, note.foundWords) + $: cleanedContent = plugin.textProcessor.makeExcerpt(note.content, note.matches[0]?.offset ?? -1) $: glyph = false //cacheManager.getLiveDocument(note.path)?.doesNotExist $: { title = note.basename @@ -63,15 +56,15 @@
- {@html highlightText(title, matchesTitle)} + {@html plugin.textProcessor.highlightText(title, matchesTitle)} .{getExtension(note.path)} @@ -91,14 +84,14 @@ {#if notePath}
- {@html highlightText(notePath, matchesNotePath)} + {@html plugin.textProcessor.highlightText(notePath, matchesNotePath)}
{/if}
{#if $showExcerpt}
- {@html highlightText(cleanedContent, note.matches)} + {@html plugin.textProcessor.highlightText(cleanedContent, note.matches)}
{/if} diff --git a/src/components/modals.ts b/src/components/modals.ts index e313869..e439866 100644 --- a/src/components/modals.ts +++ b/src/components/modals.ts @@ -1,14 +1,14 @@ -import { App, MarkdownView, Modal, TFile } from 'obsidian' +import { MarkdownView, Modal, TFile } from 'obsidian' import type { Modifier } from 'obsidian' import ModalVault from './ModalVault.svelte' import ModalInFile from './ModalInFile.svelte' import { Action, eventBus, EventNames, isInputComposition } from '../globals' -import { settings } from '../settings' -import { cacheManager } from 'src/cache-manager' +import type OmnisearchPlugin from 'src/main' abstract class OmnisearchModal extends Modal { - protected constructor(app: App) { - super(app) + protected constructor(plugin: OmnisearchPlugin) { + super(plugin.app) + const settings = plugin.settings // Remove all the default modal's children // so that we can more easily customize it @@ -152,26 +152,28 @@ abstract class OmnisearchModal extends Modal { export class OmnisearchVaultModal extends OmnisearchModal { /** * Instanciate the Omnisearch vault modal - * @param app + * @param plugin * @param query The query to pre-fill the search field with */ - constructor(app: App, query?: string) { - super(app) + constructor(plugin: OmnisearchPlugin, query?: string) { + super(plugin) // Selected text in the editor - const selectedText = app.workspace + const selectedText = plugin.app.workspace .getActiveViewOfType(MarkdownView) ?.editor.getSelection() - cacheManager.getSearchHistory().then(history => { + plugin.cacheManager.getSearchHistory().then(history => { // Previously searched query (if enabled in settings) - const previous = settings.showPreviousQueryResults ? history[0] : null + const previous = plugin.settings.showPreviousQueryResults + ? history[0] + : null // Instantiate and display the Svelte component const cmp = new ModalVault({ target: this.modalEl, props: { - app, + plugin, modal: this, previousQuery: query || selectedText || previous || '', }, @@ -187,17 +189,17 @@ export class OmnisearchVaultModal extends OmnisearchModal { export class OmnisearchInFileModal extends OmnisearchModal { constructor( - app: App, + plugin: OmnisearchPlugin, file: TFile, searchQuery: string = '', parent?: OmnisearchModal ) { - super(app) + super(plugin) const cmp = new ModalInFile({ target: this.modalEl, props: { - app, + plugin, modal: this, singleFilePath: file.path, parent: parent, diff --git a/src/database.ts b/src/database.ts index 51c559b..e3e9d32 100644 --- a/src/database.ts +++ b/src/database.ts @@ -1,15 +1,12 @@ import Dexie from 'dexie' +import type MiniSearch from 'minisearch' import type { AsPlainObject } from 'minisearch' import type { DocumentRef } from './globals' import { Notice } from 'obsidian' -import { getObsidianApp } from './stores/obsidian-app' +import type OmnisearchPlugin from './main' -export class OmnisearchCache extends Dexie { +export class Database extends Dexie { public static readonly dbVersion = 8 - public static readonly dbName = 'omnisearch/cache/' + getObsidianApp().appId - - private static instance: OmnisearchCache - searchHistory!: Dexie.Table<{ id?: number; query: string }, number> minisearch!: Dexie.Table< { @@ -20,26 +17,62 @@ export class OmnisearchCache extends Dexie { string > - private constructor() { - super(OmnisearchCache.dbName) + constructor(private plugin: OmnisearchPlugin) { + super(Database.getDbName(plugin.app.appId)) // Database structure - this.version(OmnisearchCache.dbVersion).stores({ + this.version(Database.dbVersion).stores({ searchHistory: '++id', minisearch: 'date', }) } + private static getDbName(appId: string) { + return 'omnisearch/cache/' + appId + } + //#endregion Table declarations + public async getMinisearchCache(): Promise<{ + paths: DocumentRef[] + data: AsPlainObject + } | null> { + try { + const cachedIndex = (await this.plugin.database.minisearch.toArray())[0] + return cachedIndex + } catch (e) { + new Notice( + 'Omnisearch - Cache missing or invalid. Some freezes may occur while Omnisearch indexes your vault.' + ) + console.error('Omnisearch - Error while loading Minisearch cache') + console.error(e) + return null + } + } + + public async writeMinisearchCache( + minisearch: MiniSearch, + indexed: Map + ): Promise { + const paths = Array.from(indexed).map(([k, v]) => ({ path: k, mtime: v })) + const database = this.plugin.database + await database.minisearch.clear() + await database.minisearch.add({ + date: new Date().toISOString(), + paths, + data: minisearch.toJSON(), + }) + console.log('Omnisearch - Search cache written') + } + /** * Deletes Omnisearch databases that have an older version than the current one */ - public static async clearOldDatabases(): Promise { + public async clearOldDatabases(): Promise { const toDelete = (await indexedDB.databases()).filter( db => - db.name === OmnisearchCache.dbName && + db.name === Database.getDbName(this.plugin.app.appId) && // version multiplied by 10 https://github.com/dexie/Dexie.js/issues/59 - db.version !== OmnisearchCache.dbVersion * 10 + db.version !== Database.dbVersion * 10 ) if (toDelete.length) { console.log('Omnisearch - Those IndexedDb databases will be deleted:') @@ -51,17 +84,8 @@ export class OmnisearchCache extends Dexie { } } - public static getInstance() { - if (!OmnisearchCache.instance) { - OmnisearchCache.instance = new OmnisearchCache() - } - return OmnisearchCache.instance - } - public async clearCache() { new Notice('Omnisearch - Cache cleared. Please restart Obsidian.') await this.minisearch.clear() } } - -export const database = OmnisearchCache.getInstance() diff --git a/src/globals.ts b/src/globals.ts index 833fe4a..716fbe2 100644 --- a/src/globals.ts +++ b/src/globals.ts @@ -1,9 +1,6 @@ import { EventBus } from './tools/event-bus' import { writable } from 'svelte/store' -import { settings } from './settings' import type { TFile } from 'obsidian' -import { Platform } from 'obsidian' -import { getObsidianApp } from './stores/obsidian-app' export const regexLineSplit = /\r?\n|\r|((\.|\?|!)( |\r?\n|\r))/g export const regexYaml = /^---\s*\n(.*?)\n?^---\s?/ms @@ -14,9 +11,6 @@ export const regexExtensions = /(?:^|\s)\.(\w+)/g export const excerptBefore = 100 export const excerptAfter = 300 -export const highlightClass = `suggestion-highlight omnisearch-highlight ${ - settings.highlight ? 'omnisearch-default-highlight' : '' -}` export const K_DISABLE_OMNISEARCH = 'omnisearch-disabled' export const eventBus = new EventBus() @@ -97,31 +91,11 @@ export function isInputComposition(): boolean { return inComposition } -/** - * Plugin dependency - Chs Patch for Chinese word segmentation - * @returns - */ -export function getChsSegmenter(): any | undefined { - return (getObsidianApp() as any).plugins.plugins['cm-chs-patch'] -} - export type TextExtractorApi = { extractText: (file: TFile) => Promise canFileBeExtracted: (filePath: string) => boolean } -/** - * Plugin dependency - Text Extractor - * @returns - */ -export function getTextExtractor(): TextExtractorApi | undefined { - return (getObsidianApp() as any).plugins?.plugins?.['text-extractor']?.api -} - -export function isCacheEnabled(): boolean { - return !Platform.isIosApp && settings.useCache -} - export const SEPARATORS = /[|\t\n\r\^"= -#%-*,.`\/<>:;?@[-\]_{}\u00A0\u00A1\u00A7\u00AB\u00B6\u00B7\u00BB\u00BF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C77\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166E\u1680\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2000-\u200A\u2010-\u2029\u202F-\u2043\u2045-\u2051\u2053-\u205F\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4F\u3000-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]/ .toString() diff --git a/src/main.ts b/src/main.ts index fe00b8b..4924dd0 100644 --- a/src/main.ts +++ b/src/main.ts @@ -4,10 +4,12 @@ import { OmnisearchVaultModal, } from './components/modals' import { + getDefaultSettings, + isCacheEnabled, isPluginDisabled, loadSettings, + type OmnisearchSettings, saveSettings, - settings, SettingsTab, showExcerpt, } from './settings' @@ -16,46 +18,57 @@ import { EventNames, indexingStep, IndexingStepType, - isCacheEnabled, + type TextExtractorApi, } from './globals' -import api, { notifyOnIndexed } from './tools/api' -import { isFileIndexable, logDebug } from './tools/utils' -import { OmnisearchCache, database } from './database' -import * as NotesIndex from './notes-index' -import { searchEngine } from './search/omnisearch' -import { cacheManager } from './cache-manager' -import { setObsidianApp } from './stores/obsidian-app' +import { notifyOnIndexed, registerAPI } from './tools/api' +import { Database } from './database' +import { SearchEngine } from './search/search-engine' +import { CacheManager } from './cache-manager' +import { logDebug } from './tools/utils' +import { NotesIndexer } from './notes-indexer' +import { TextProcessor } from './tools/text-processing' export default class OmnisearchPlugin extends Plugin { // FIXME: fix the type public apiHttpServer: null | any = null + public settings: OmnisearchSettings = getDefaultSettings(this.app) + + // FIXME: merge cache and cacheManager, or find other names + public readonly cacheManager: CacheManager + public readonly database = new Database(this) + + public readonly notesIndexer = new NotesIndexer(this) + public readonly textProcessor = new TextProcessor(this) + public readonly searchEngine = new SearchEngine(this) + private ribbonButton?: HTMLElement constructor(app: App, manifest: PluginManifest) { super(app, manifest) - setObsidianApp(this.app) + this.cacheManager = new CacheManager(this) } async onload(): Promise { - await loadSettings(this) + this.settings = await loadSettings(this) this.addSettingTab(new SettingsTab(this)) if (!Platform.isMobile) { import('./tools/api-server').then( - m => (this.apiHttpServer = m.getServer()) + m => (this.apiHttpServer = m.getServer(this)) ) } - if (isPluginDisabled()) { + if (isPluginDisabled(this.app)) { console.log('Omnisearch - Plugin disabled') return } await cleanOldCacheFiles(this.app) - await OmnisearchCache.clearOldDatabases() + await this.database.clearOldDatabases() registerAPI(this) + const settings = this.settings if (settings.ribbonIcon) { this.addRibbonButton() } @@ -71,7 +84,7 @@ export default class OmnisearchPlugin extends Plugin { id: 'show-modal', name: 'Vault search', callback: () => { - new OmnisearchVaultModal(this.app).open() + new OmnisearchVaultModal(this).open() }, }) @@ -80,16 +93,18 @@ export default class OmnisearchPlugin extends Plugin { name: 'In-file search', editorCallback: (_editor, view) => { if (view.file) { - new OmnisearchInFileModal(this.app, view.file).open() + new OmnisearchInFileModal(this, view.file).open() } }, }) + const searchEngine = this.searchEngine + this.app.workspace.onLayoutReady(async () => { // Listeners to keep the search index up-to-date this.registerEvent( this.app.vault.on('create', file => { - if (isFileIndexable(file.path)) { + if (this.notesIndexer.isFileIndexable(file.path)) { logDebug('Indexing new file', file.path) // await cacheManager.addToLiveCache(file.path) searchEngine.addFromPaths([file.path]) @@ -99,25 +114,25 @@ export default class OmnisearchPlugin extends Plugin { this.registerEvent( this.app.vault.on('delete', file => { logDebug('Removing file', file.path) - cacheManager.removeFromLiveCache(file.path) + this.cacheManager.removeFromLiveCache(file.path) searchEngine.removeFromPaths([file.path]) }) ) this.registerEvent( this.app.vault.on('modify', async file => { - if (isFileIndexable(file.path)) { + if (this.notesIndexer.isFileIndexable(file.path)) { logDebug('Updating file', file.path) - await cacheManager.addToLiveCache(file.path) - NotesIndex.markNoteForReindex(file) + await this.cacheManager.addToLiveCache(file.path) + this.notesIndexer.flagNoteForReindex(file) } }) ) this.registerEvent( this.app.vault.on('rename', async (file, oldPath) => { - if (isFileIndexable(file.path)) { + if (this.notesIndexer.isFileIndexable(file.path)) { logDebug('Renaming file', file.path) - cacheManager.removeFromLiveCache(oldPath) - await cacheManager.addToLiveCache(file.path) + this.cacheManager.removeFromLiveCache(oldPath) + await this.cacheManager.addToLiveCache(file.path) searchEngine.removeFromPaths([oldPath]) await searchEngine.addFromPaths([file.path]) } @@ -142,8 +157,8 @@ export default class OmnisearchPlugin extends Plugin { // }) // new Notice(welcome, 20_000) // } - settings.welcomeMessage = code - await this.saveData(settings) + this.settings.welcomeMessage = code + await this.saveData(this.settings) } async onunload(): Promise { @@ -152,14 +167,14 @@ export default class OmnisearchPlugin extends Plugin { // Clear cache when disabling Omnisearch if (process.env.NODE_ENV === 'production') { - await database.clearCache() + await this.database.clearCache() } this.apiHttpServer.close() } addRibbonButton(): void { this.ribbonButton = this.addRibbonIcon('search', 'Omnisearch', _evt => { - new OmnisearchVaultModal(this.app).open() + new OmnisearchVaultModal(this).open() }) } @@ -169,10 +184,28 @@ export default class OmnisearchPlugin extends Plugin { } } + /** + * Plugin dependency - Chs Patch for Chinese word segmentation + * @returns + */ + public getChsSegmenter(): any | undefined { + return (this.app as any).plugins.plugins['cm-chs-patch'] + } + + /** + * Plugin dependency - Text Extractor + * @returns + */ + public getTextExtractor(): TextExtractorApi | undefined { + return (this.app as any).plugins?.plugins?.['text-extractor']?.api + } + private async populateIndex(): Promise { console.time('Omnisearch - Indexing total time') indexingStep.set(IndexingStepType.ReadingFiles) - const files = this.app.vault.getFiles().filter(f => isFileIndexable(f.path)) + const files = this.app.vault + .getFiles() + .filter(f => this.notesIndexer.isFileIndexable(f.path)) console.log(`Omnisearch - ${files.length} files total`) console.log( `Omnisearch - Cache is ${isCacheEnabled() ? 'enabled' : 'disabled'}` @@ -180,6 +213,7 @@ export default class OmnisearchPlugin extends Plugin { // Map documents in the background // Promise.all(files.map(f => cacheManager.addToLiveCache(f.path))) + const searchEngine = this.searchEngine if (isCacheEnabled()) { console.time('Omnisearch - Loading index from cache') indexingStep.set(IndexingStepType.LoadingCache) @@ -223,14 +257,14 @@ export default class OmnisearchPlugin extends Plugin { indexingStep.set(IndexingStepType.WritingCache) // Disable settings.useCache while writing the cache, in case it freezes - settings.useCache = false + this.settings.useCache = false await saveSettings(this) // Write the cache await searchEngine.writeToCache() // Re-enable settings.caching - settings.useCache = true + this.settings.useCache = true await saveSettings(this) } @@ -264,16 +298,3 @@ async function cleanOldCacheFiles(app: App) { } } } - -function registerAPI(plugin: OmnisearchPlugin): void { - // Url scheme for obsidian://omnisearch?query=foobar - plugin.registerObsidianProtocolHandler('omnisearch', params => { - new OmnisearchVaultModal(plugin.app, params.query).open() - }) - - // Public api - // @ts-ignore - globalThis['omnisearch'] = api - // Deprecated - ;(plugin.app as any).plugins.plugins.omnisearch.api = api -} diff --git a/src/notes-index.ts b/src/notes-index.ts deleted file mode 100644 index a6bffe5..0000000 --- a/src/notes-index.ts +++ /dev/null @@ -1,50 +0,0 @@ -import type { TAbstractFile } from 'obsidian' -import { searchEngine } from './search/omnisearch' - -// /** -// * Index a non-existing note. -// * Useful to find internal links that lead (yet) to nowhere -// * @param name -// * @param parent The note referencing the -// */ -// export function addNonExistingToIndex(name: string, parent: string): void { -// name = removeAnchors(name) -// const filename = name + (name.endsWith('.md') ? '' : '.md') -// -// const note: IndexedDocument = { -// path: filename, -// basename: name, -// mtime: 0, -// -// content: '', -// tags: [], -// aliases: '', -// headings1: '', -// headings2: '', -// headings3: '', -// -// doesNotExist: true, -// parent, -// } -// // searchEngine.addDocuments([note]) -// } - -const notesToReindex = new Set() - -/** - * Updated notes are not reindexed immediately for performance reasons. - * They're added to a list, and reindex is done the next time we open Omnisearch. - */ -export function markNoteForReindex(note: TAbstractFile): void { - notesToReindex.add(note) -} - -export async function refreshIndex(): Promise { - const paths = [...notesToReindex].map(n => n.path) - if (paths.length) { - searchEngine.removeFromPaths(paths) - await searchEngine.addFromPaths(paths) - notesToReindex.clear() - // console.log(`Omnisearch - Reindexed ${paths.length} file(s)`) - } -} diff --git a/src/notes-indexer.ts b/src/notes-indexer.ts new file mode 100644 index 0000000..611051b --- /dev/null +++ b/src/notes-indexer.ts @@ -0,0 +1,106 @@ +import type { TAbstractFile } from 'obsidian' +import type OmnisearchPlugin from './main' +import { removeAnchors } from './tools/notes' +import type { IndexedDocument } from './globals' +import { + isFileCanvas, + isFileFromDataloomPlugin, + isFileImage, + isFilePDF, +} from './tools/utils' + +export class NotesIndexer { + private notesToReindex = new Set() + + constructor(private plugin: OmnisearchPlugin) {} + + /** + * Updated notes are not reindexed immediately for performance reasons. + * They're added to a list, and reindex is done the next time we open Omnisearch. + */ + public flagNoteForReindex(note: TAbstractFile): void { + this.notesToReindex.add(note) + } + + public async refreshIndex(): Promise { + const paths = [...this.notesToReindex].map(n => n.path) + if (paths.length) { + this.plugin.searchEngine.removeFromPaths(paths) + await this.plugin.searchEngine.addFromPaths(paths) + this.notesToReindex.clear() + } + } + + public isFileIndexable(path: string): boolean { + return this.isFilenameIndexable(path) || this.isContentIndexable(path) + } + + public isContentIndexable(path: string): boolean { + const settings = this.plugin.settings + const hasTextExtractor = !!this.plugin.getTextExtractor() + const canIndexPDF = hasTextExtractor && settings.PDFIndexing + const canIndexImages = hasTextExtractor && settings.imagesIndexing + return ( + this.isFilePlaintext(path) || + isFileCanvas(path) || + isFileFromDataloomPlugin(path) || + (canIndexPDF && isFilePDF(path)) || + (canIndexImages && isFileImage(path)) + ) + } + + public isFilenameIndexable(path: string): boolean { + return ( + this.canIndexUnsupportedFiles() || + this.isFilePlaintext(path) || + isFileCanvas(path) || + isFileFromDataloomPlugin(path) + ) + } + + public canIndexUnsupportedFiles(): boolean { + return ( + this.plugin.settings.unsupportedFilesIndexing === 'yes' || + (this.plugin.settings.unsupportedFilesIndexing === 'default' && + !!this.plugin.app.vault.getConfig('showUnsupportedFiles')) + ) + } + + /** + * Index a non-existing note. + * Useful to find internal links that lead (yet) to nowhere + * @param name + * @param parent The note referencing the + */ + public generateIndexableNonexistingDocument( + name: string, + parent: string + ): IndexedDocument { + name = removeAnchors(name) + const filename = name + (name.endsWith('.md') ? '' : '.md') + + return { + path: filename, + basename: name, + mtime: 0, + + content: '', + cleanedContent: '', + tags: [], + unmarkedTags: [], + aliases: '', + headings1: '', + headings2: '', + headings3: '', + + doesNotExist: true, + parent, + } + } + + public isFilePlaintext(path: string): boolean { + return [...this.plugin.settings.indexedFileTypes, 'md'].some(t => + path.endsWith(`.${t}`) + ) + } +} diff --git a/src/search/query.ts b/src/search/query.ts index a6d7dba..2264832 100644 --- a/src/search/query.ts +++ b/src/search/query.ts @@ -1,4 +1,3 @@ -import { settings } from '../settings' import { removeDiacritics } from '../tools/utils' import { parse } from 'search-query-parser' @@ -14,8 +13,8 @@ export class Query { } #inQuotes: string[] - constructor(text = '') { - if (settings.ignoreDiacritics) { + constructor(text = '', options: { ignoreDiacritics: boolean }) { + if (options.ignoreDiacritics) { text = removeDiacritics(text) } const parsed = parse(text.toLowerCase(), { diff --git a/src/search/omnisearch.ts b/src/search/search-engine.ts similarity index 81% rename from src/search/omnisearch.ts rename to src/search/search-engine.ts index 0f7f99b..dba9a80 100644 --- a/src/search/omnisearch.ts +++ b/src/search/search-engine.ts @@ -1,72 +1,36 @@ import MiniSearch, { type Options, type SearchResult } from 'minisearch' import type { DocumentRef, IndexedDocument, ResultNote } from '../globals' -import { settings } from '../settings' import { chunkArray, logDebug, removeDiacritics } from '../tools/utils' import { Notice } from 'obsidian' import type { Query } from './query' -import { cacheManager } from '../cache-manager' import { sortBy } from 'lodash-es' -import { getMatches, stringsToRegex } from 'src/tools/text-processing' -import { tokenizeForIndexing, tokenizeForSearch } from './tokenizer' -import { getObsidianApp } from '../stores/obsidian-app' +import type OmnisearchPlugin from '../main' +import { Tokenizer } from './tokenizer' -export class Omnisearch { - - app = getObsidianApp() - - public static readonly options: Options = { - tokenize: tokenizeForIndexing, - extractField: (doc, fieldName) => { - if (fieldName === 'directory') { - // return path without the filename - const parts = doc.path.split('/') - parts.pop() - return parts.join('/') - } - return (doc as any)[fieldName] - }, - processTerm: (term: string) => - (settings.ignoreDiacritics ? removeDiacritics(term) : term).toLowerCase(), - idField: 'path', - fields: [ - 'basename', - // Different from `path`, since `path` is the unique index and needs to include the filename - 'directory', - 'aliases', - 'content', - 'headings1', - 'headings2', - 'headings3', - ], - storeFields: ['tags'], - logger(_level, _message, code) { - if (code === 'version_conflict') { - new Notice( - 'Omnisearch - Your index cache may be incorrect or corrupted. If this message keeps appearing, go to Settings to clear the cache.', - 5000 - ) - } - }, - } +export class SearchEngine { + private tokenizer: Tokenizer private minisearch: MiniSearch /** Map */ private indexedDocuments: Map = new Map() // private previousResults: SearchResult[] = [] // private previousQuery: Query | null = null - constructor() { - this.minisearch = new MiniSearch(Omnisearch.options) + constructor(protected plugin: OmnisearchPlugin) { + this.tokenizer = new Tokenizer(plugin) + this.minisearch = new MiniSearch(this.getOptions()) } /** * Return true if the cache is valid */ async loadCache(): Promise { - const cache = await cacheManager.getMinisearchCache() + const cache = await this.plugin.database.getMinisearchCache() if (cache) { - // console.log('Omnisearch - Cache', cache) - this.minisearch = MiniSearch.loadJS(cache.data, Omnisearch.options) + this.minisearch = await MiniSearch.loadJSAsync( + cache.data, + this.getOptions() + ) this.indexedDocuments = new Map(cache.paths.map(o => [o.path, o.mtime])) return true } @@ -107,7 +71,9 @@ export class Omnisearch { logDebug('Adding files', paths) let documents = ( await Promise.all( - paths.map(async path => await cacheManager.getDocument(path)) + paths.map( + async path => await this.plugin.cacheManager.getDocument(path) + ) ) ).filter(d => !!d?.path) logDebug('Sorting documents to first index markdown') @@ -154,6 +120,7 @@ export class Omnisearch { query: Query, options: { prefixLength: number; singleFilePath?: string } ): Promise { + const settings = this.plugin.settings if (query.isEmpty()) { // this.previousResults = [] // this.previousQuery = null @@ -176,7 +143,7 @@ export class Omnisearch { break } - const searchTokens = tokenizeForSearch(query.segmentsToStr()) + const searchTokens = this.tokenizer.tokenizeForSearch(query.segmentsToStr()) logDebug(JSON.stringify(searchTokens, null, 1)) let results = this.minisearch.search(searchTokens, { prefix: term => term.length >= options.prefixLength, @@ -248,16 +215,16 @@ export class Omnisearch { results = results.filter( result => !( - this.app.metadataCache.isUserIgnored && - this.app.metadataCache.isUserIgnored(result.id) + this.plugin.app.metadataCache.isUserIgnored && + this.plugin.app.metadataCache.isUserIgnored(result.id) ) ) } else { // Just downrank them results.forEach(result => { if ( - this.app.metadataCache.isUserIgnored && - this.app.metadataCache.isUserIgnored(result.id) + this.plugin.app.metadataCache.isUserIgnored && + this.plugin.app.metadataCache.isUserIgnored(result.id) ) { result.score /= 10 } @@ -297,7 +264,7 @@ export class Omnisearch { } // Boost custom properties - const metadata = this.app.metadataCache.getCache(path) + const metadata = this.plugin.app.metadataCache.getCache(path) if (metadata) { for (const { name, weight } of settings.weightCustomProperties) { const values = metadata?.frontmatter?.[name] @@ -323,7 +290,9 @@ export class Omnisearch { if (results.length) logDebug('First result:', results[0]) const documents = await Promise.all( - results.map(async result => await cacheManager.getDocument(result.id)) + results.map( + async result => await this.plugin.cacheManager.getDocument(result.id) + ) ) // If the search query contains quotes, filter out results that don't have the exact match @@ -379,7 +348,7 @@ export class Omnisearch { ): Promise { // Get the raw results let results: SearchResult[] - if (settings.simpleSearch) { + if (this.plugin.settings.simpleSearch) { results = await this.search(query, { prefixLength: 3, singleFilePath: options?.singleFilePath, @@ -392,7 +361,9 @@ export class Omnisearch { } const documents = await Promise.all( - results.map(async result => await cacheManager.getDocument(result.id)) + results.map( + async result => await this.plugin.cacheManager.getDocument(result.id) + ) ) // Map the raw results to get usable suggestions @@ -425,9 +396,9 @@ export class Omnisearch { logDebug('Matching tokens:', foundWords) logDebug('Getting matches locations...') - const matches = getMatches( + const matches = this.plugin.textProcessor.getMatches( note.content, - stringsToRegex(foundWords), + foundWords, query ) logDebug(`Matches for ${note.basename}`, matches) @@ -443,11 +414,49 @@ export class Omnisearch { } public async writeToCache(): Promise { - await cacheManager.writeMinisearchCache( + await this.plugin.database.writeMinisearchCache( this.minisearch, this.indexedDocuments ) } -} -export const searchEngine = new Omnisearch() + private getOptions(): Options { + return { + tokenize: this.tokenizer.tokenizeForIndexing.bind(this.tokenizer), + extractField: (doc, fieldName) => { + if (fieldName === 'directory') { + // return path without the filename + const parts = doc.path.split('/') + parts.pop() + return parts.join('/') + } + return (doc as any)[fieldName] + }, + processTerm: (term: string) => + (this.plugin.settings.ignoreDiacritics + ? removeDiacritics(term) + : term + ).toLowerCase(), + idField: 'path', + fields: [ + 'basename', + // Different from `path`, since `path` is the unique index and needs to include the filename + 'directory', + 'aliases', + 'content', + 'headings1', + 'headings2', + 'headings3', + ], + storeFields: ['tags'], + logger(_level, _message, code) { + if (code === 'version_conflict') { + new Notice( + 'Omnisearch - Your index cache may be incorrect or corrupted. If this message keeps appearing, go to Settings to clear the cache.', + 5000 + ) + } + }, + } + } +} diff --git a/src/search/tokenizer.ts b/src/search/tokenizer.ts index bd5fb50..9ede21a 100644 --- a/src/search/tokenizer.ts +++ b/src/search/tokenizer.ts @@ -1,93 +1,96 @@ import type { QueryCombination } from 'minisearch' -import { - BRACKETS_AND_SPACE, - SPACE_OR_PUNCTUATION, - chsRegex, - getChsSegmenter, -} from 'src/globals' -import { settings } from 'src/settings' +import { BRACKETS_AND_SPACE, chsRegex, SPACE_OR_PUNCTUATION } from 'src/globals' import { logDebug, splitCamelCase, splitHyphens } from 'src/tools/utils' +import type OmnisearchPlugin from '../main' + const markdownLinkExtractor = require('markdown-link-extractor') -function tokenizeWords(text: string, { skipChs = false } = {}): string[] { - const tokens = text.split(BRACKETS_AND_SPACE) - if (skipChs) return tokens - return tokenizeChsWord(tokens) -} +export class Tokenizer { + constructor(private plugin: OmnisearchPlugin) {} -function tokenizeTokens(text: string, { skipChs = false } = {}): string[] { - const tokens = text.split(SPACE_OR_PUNCTUATION) - if (skipChs) return tokens - return tokenizeChsWord(tokens) -} + /** + * Tokenization for indexing will possibly return more tokens than the original text. + * This is because we combine different methods of tokenization to get the best results. + * @param text + * @returns + */ + public tokenizeForIndexing(text: string): string[] { + const words = this.tokenizeWords(text) + let urls: string[] = [] + if (this.plugin.settings.tokenizeUrls) { + try { + urls = markdownLinkExtractor(text) + } catch (e) { + logDebug('Error extracting urls', e) + } + } -function tokenizeChsWord(tokens: string[]): string[] { - const segmenter = getChsSegmenter() - if (!segmenter) return tokens - return tokens.flatMap(word => - chsRegex.test(word) ? segmenter.cut(word, { search: true }) : [word] - ) -} + let tokens = this.tokenizeTokens(text, { skipChs: true }) -/** - * Tokenization for indexing will possibly return more tokens than the original text. - * This is because we combine different methods of tokenization to get the best results. - * @param text - * @returns - */ -export function tokenizeForIndexing(text: string): string[] { - const words = tokenizeWords(text) - let urls: string[] = [] - if (settings.tokenizeUrls) { - try { - urls = markdownLinkExtractor(text) - } catch (e) { - logDebug('Error extracting urls', e) + // Split hyphenated tokens + tokens = [...tokens, ...tokens.flatMap(splitHyphens)] + + // Split camelCase tokens into "camel" and "case + tokens = [...tokens, ...tokens.flatMap(splitCamelCase)] + + // Add whole words (aka "not tokens") + tokens = [...tokens, ...words] + + // Add urls + if (urls.length) { + tokens = [...tokens, ...urls] + } + + // Remove duplicates + tokens = [...new Set(tokens)] + + return tokens + } + + /** + * Search tokenization will use the same tokenization methods as indexing, + * but will combine each group with "OR" operators + * @param text + * @returns + */ + public tokenizeForSearch(text: string): QueryCombination { + // Extract urls and remove them from the query + const urls: string[] = markdownLinkExtractor(text) + text = urls.reduce((acc, url) => acc.replace(url, ''), text) + + const tokens = [...this.tokenizeTokens(text), ...urls].filter(Boolean) + + return { + combineWith: 'OR', + queries: [ + { combineWith: 'AND', queries: tokens }, + { + combineWith: 'AND', + queries: this.tokenizeWords(text).filter(Boolean), + }, + { combineWith: 'AND', queries: tokens.flatMap(splitHyphens) }, + { combineWith: 'AND', queries: tokens.flatMap(splitCamelCase) }, + ], } } - let tokens = tokenizeTokens(text, { skipChs: true }) - - // Split hyphenated tokens - tokens = [...tokens, ...tokens.flatMap(splitHyphens)] - - // Split camelCase tokens into "camel" and "case - tokens = [...tokens, ...tokens.flatMap(splitCamelCase)] - - // Add whole words (aka "not tokens") - tokens = [...tokens, ...words] - - // Add urls - if (urls.length) { - tokens = [...tokens, ...urls] + private tokenizeWords(text: string, { skipChs = false } = {}): string[] { + const tokens = text.split(BRACKETS_AND_SPACE) + if (skipChs) return tokens + return this.tokenizeChsWord(tokens) } - // Remove duplicates - tokens = [...new Set(tokens)] + private tokenizeTokens(text: string, { skipChs = false } = {}): string[] { + const tokens = text.split(SPACE_OR_PUNCTUATION) + if (skipChs) return tokens + return this.tokenizeChsWord(tokens) + } - return tokens -} - -/** - * Search tokenization will use the same tokenization methods as indexing, - * but will combine each group with "OR" operators - * @param text - * @returns - */ -export function tokenizeForSearch(text: string): QueryCombination { - // Extract urls and remove them from the query - const urls: string[] = markdownLinkExtractor(text) - text = urls.reduce((acc, url) => acc.replace(url, ''), text) - - const tokens = [...tokenizeTokens(text), ...urls].filter(Boolean) - - return { - combineWith: 'OR', - queries: [ - { combineWith: 'AND', queries: tokens }, - { combineWith: 'AND', queries: tokenizeWords(text).filter(Boolean) }, - { combineWith: 'AND', queries: tokens.flatMap(splitHyphens) }, - { combineWith: 'AND', queries: tokens.flatMap(splitCamelCase) }, - ], + private tokenizeChsWord(tokens: string[]): string[] { + const segmenter = this.plugin.getChsSegmenter() + if (!segmenter) return tokens + return tokens.flatMap(word => + chsRegex.test(word) ? segmenter.cut(word, { search: true }) : [word] + ) } } diff --git a/src/settings.ts b/src/settings.ts index d9a4b41..8512252 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -1,5 +1,6 @@ // noinspection CssUnresolvedCustomProperty import { + App, Notice, Platform, Plugin, @@ -8,14 +9,9 @@ import { SliderComponent, } from 'obsidian' import { writable } from 'svelte/store' -import { database } from './database' -import { - K_DISABLE_OMNISEARCH, - getTextExtractor, - isCacheEnabled, -} from './globals' +import { K_DISABLE_OMNISEARCH } from './globals' import type OmnisearchPlugin from './main' -import { getObsidianApp } from './stores/obsidian-app' +import { enablePrintDebug } from "./tools/utils"; interface WeightingSettings { weightBasename: number @@ -71,6 +67,8 @@ export interface OmnisearchSettings extends WeightingSettings { httpApiEnabled: boolean httpApiPort: string httpApiNotice: boolean + + DANGER_httpHost: string | null } /** @@ -95,6 +93,8 @@ export class SettingsTab extends PluginSettingTab { display(): void { const { containerEl } = this + const database = this.plugin.database + const textExtractor = this.plugin.getTextExtractor() containerEl.empty() if (this.app.loadLocalStorage(K_DISABLE_OMNISEARCH) == '1') { @@ -117,7 +117,7 @@ export class SettingsTab extends PluginSettingTab { const indexingDesc = new DocumentFragment() indexingDesc.createSpan({}, span => { span.innerHTML = `⚠️ Changing indexing settings will clear the cache, and requires a restart of Obsidian.

` - if (getTextExtractor()) { + if (textExtractor) { span.innerHTML += ` 👍 You have installed Text Extractor, Omnisearch can use it to index PDFs and images contents.
Text extraction only works on desktop, but the cache can be synchronized with your mobile device.` @@ -138,7 +138,7 @@ export class SettingsTab extends PluginSettingTab { }) new Setting(containerEl) .setName( - `PDFs content indexing ${getTextExtractor() ? '' : '⚠️ Disabled'}` + `PDFs content indexing ${textExtractor ? '' : '⚠️ Disabled'}` ) .setDesc(indexPDFsDesc) .addToggle(toggle => @@ -148,7 +148,7 @@ export class SettingsTab extends PluginSettingTab { await saveSettings(this.plugin) }) ) - .setDisabled(!getTextExtractor()) + .setDisabled(!textExtractor) // Images Indexing const indexImagesDesc = new DocumentFragment() @@ -156,7 +156,7 @@ export class SettingsTab extends PluginSettingTab { span.innerHTML = `Omnisearch will use Text Extractor to OCR your images and index their content.` }) new Setting(containerEl) - .setName(`Images OCR indexing ${getTextExtractor() ? '' : '⚠️ Disabled'}`) + .setName(`Images OCR indexing ${textExtractor ? '' : '⚠️ Disabled'}`) .setDesc(indexImagesDesc) .addToggle(toggle => toggle.setValue(settings.imagesIndexing).onChange(async v => { @@ -165,7 +165,7 @@ export class SettingsTab extends PluginSettingTab { await saveSettings(this.plugin) }) ) - .setDisabled(!getTextExtractor()) + .setDisabled(!textExtractor) // Office Documents Indexing const indexOfficesDesc = new DocumentFragment() @@ -174,7 +174,7 @@ export class SettingsTab extends PluginSettingTab { }) new Setting(containerEl) .setName( - `Documents content indexing ${getTextExtractor() ? '' : '⚠️ Disabled'}` + `Documents content indexing ${textExtractor ? '' : '⚠️ Disabled'}` ) .setDesc(indexOfficesDesc) .addToggle(toggle => @@ -184,7 +184,7 @@ export class SettingsTab extends PluginSettingTab { await saveSettings(this.plugin) }) ) - .setDisabled(!getTextExtractor()) + .setDisabled(!textExtractor) // Index filenames of unsupported files const indexUnsupportedDesc = new DocumentFragment() @@ -475,42 +475,43 @@ export class SettingsTab extends PluginSettingTab { //#region Results Weighting + const defaultSettings = getDefaultSettings(this.app) + new Setting(containerEl).setName('Results weighting').setHeading() new Setting(containerEl) .setName( - `File name & declared aliases (default: ${DEFAULT_SETTINGS.weightBasename})` + `File name & declared aliases (default: ${defaultSettings.weightBasename})` ) .addSlider(cb => this.weightSlider(cb, 'weightBasename')) new Setting(containerEl) - .setName(`File directory (default: ${DEFAULT_SETTINGS.weightDirectory})`) + .setName(`File directory (default: ${defaultSettings.weightDirectory})`) .addSlider(cb => this.weightSlider(cb, 'weightDirectory')) new Setting(containerEl) - .setName(`Headings level 1 (default: ${DEFAULT_SETTINGS.weightH1})`) + .setName(`Headings level 1 (default: ${defaultSettings.weightH1})`) .addSlider(cb => this.weightSlider(cb, 'weightH1')) new Setting(containerEl) - .setName(`Headings level 2 (default: ${DEFAULT_SETTINGS.weightH2})`) + .setName(`Headings level 2 (default: ${defaultSettings.weightH2})`) .addSlider(cb => this.weightSlider(cb, 'weightH2')) new Setting(containerEl) - .setName(`Headings level 3 (default: ${DEFAULT_SETTINGS.weightH3})`) + .setName(`Headings level 3 (default: ${defaultSettings.weightH3})`) .addSlider(cb => this.weightSlider(cb, 'weightH3')) new Setting(containerEl) - .setName( - `Tags (default: ${DEFAULT_SETTINGS.weightUnmarkedTags})` - ) + .setName(`Tags (default: ${defaultSettings.weightUnmarkedTags})`) .addSlider(cb => this.weightSlider(cb, 'weightUnmarkedTags')) //#region Specific tags new Setting(containerEl) .setName('Header properties fields') - .setDesc('You can set custom weights for values of header properties (e.g. "keywords").') - + .setDesc( + 'You can set custom weights for values of header properties (e.g. "keywords"). Weights under 1.0 will downrank the results.' + ) for (let i = 0; i < settings.weightCustomProperties.length; i++) { const item = settings.weightCustomProperties[i] @@ -527,7 +528,7 @@ export class SettingsTab extends PluginSettingTab { }) }) .addSlider(cb => { - cb.setLimits(1, 5, 0.1) + cb.setLimits(0.1, 5, 0.1) .setValue(item.weight) .setDynamicTooltip() .onChange(async v => { @@ -547,14 +548,13 @@ export class SettingsTab extends PluginSettingTab { } // Add a new custom tag - new Setting(containerEl) - .addButton(btn => { - btn.setButtonText('Add a new property') - btn.onClick(cb => { - settings.weightCustomProperties.push({ name: '', weight: 1 }) - this.display() - }) + new Setting(containerEl).addButton(btn => { + btn.setButtonText('Add a new property') + btn.onClick(_cb => { + settings.weightCustomProperties.push({ name: '', weight: 1 }) + this.display() }) + }) //#endregion Specific tags @@ -631,6 +631,7 @@ export class SettingsTab extends PluginSettingTab { .addToggle(toggle => toggle.setValue(settings.verboseLogging).onChange(async v => { settings.verboseLogging = v + enablePrintDebug(v) await saveSettings(this.plugin) }) ) @@ -670,7 +671,7 @@ export class SettingsTab extends PluginSettingTab { .setName('Disable on this device') .setDesc(disableDesc) .addToggle(toggle => - toggle.setValue(isPluginDisabled()).onChange(async v => { + toggle.setValue(isPluginDisabled(this.app)).onChange(async v => { if (v) { this.app.saveLocalStorage(K_DISABLE_OMNISEARCH, '1') } else { @@ -712,67 +713,83 @@ export class SettingsTab extends PluginSettingTab { } } -const app = getObsidianApp() +export function getDefaultSettings(app: App): OmnisearchSettings { + return { + useCache: true, + hideExcluded: false, + downrankedFoldersFilters: [] as string[], + ignoreDiacritics: true, + indexedFileTypes: [] as string[], + PDFIndexing: false, + officeIndexing: false, + imagesIndexing: false, + unsupportedFilesIndexing: 'default', + splitCamelCase: false, + openInNewPane: false, + vimLikeNavigationShortcut: app.vault.getConfig('vimMode') as boolean, -export const DEFAULT_SETTINGS: OmnisearchSettings = { - useCache: true, - hideExcluded: false, - downrankedFoldersFilters: [] as string[], - ignoreDiacritics: true, - indexedFileTypes: [] as string[], - PDFIndexing: false, - officeIndexing: false, - imagesIndexing: false, - unsupportedFilesIndexing: 'default', - splitCamelCase: false, - openInNewPane: false, - vimLikeNavigationShortcut: app.vault.getConfig('vimMode') as boolean, + ribbonIcon: true, + showExcerpt: true, + renderLineReturnInExcerpts: true, + showCreateButton: false, + highlight: true, + showPreviousQueryResults: true, + simpleSearch: false, + tokenizeUrls: false, + fuzziness: '1', - ribbonIcon: true, - showExcerpt: true, - renderLineReturnInExcerpts: true, - showCreateButton: false, - highlight: true, - showPreviousQueryResults: true, - simpleSearch: false, - tokenizeUrls: false, - fuzziness: '1', + weightBasename: 3, + weightDirectory: 2, + weightH1: 1.5, + weightH2: 1.3, + weightH3: 1.1, + weightUnmarkedTags: 1.1, + weightCustomProperties: [] as { name: string; weight: number }[], - weightBasename: 3, - weightDirectory: 2, - weightH1: 1.5, - weightH2: 1.3, - weightH3: 1.1, - weightUnmarkedTags: 1.1, - weightCustomProperties: [] as { name: string; weight: number }[], + httpApiEnabled: false, + httpApiPort: '51361', + httpApiNotice: true, - httpApiEnabled: false, - httpApiPort: '51361', - httpApiNotice: true, + welcomeMessage: '', + verboseLogging: false, - welcomeMessage: '', - verboseLogging: false, -} as const + DANGER_httpHost: null, + } +} -export let settings = Object.assign({}, DEFAULT_SETTINGS) as OmnisearchSettings +let settings: OmnisearchSettings -export async function loadSettings(plugin: Plugin): Promise { - settings = Object.assign({}, DEFAULT_SETTINGS, await plugin.loadData()) +// /** +// * @deprecated +// */ +// export function getSettings(): OmnisearchSettings { +// if (!settings) { +// settings = Object.assign({}, getDefaultSettings()) as OmnisearchSettings +// } +// return settings +// } + +export async function loadSettings( + plugin: Plugin +): Promise { + settings = Object.assign( + {}, + getDefaultSettings(plugin.app), + await plugin.loadData() + ) showExcerpt.set(settings.showExcerpt) + enablePrintDebug(settings.verboseLogging) + return settings } export async function saveSettings(plugin: Plugin): Promise { await plugin.saveData(settings) } -export function isPluginDisabled(): boolean { +export function isPluginDisabled(app: App): boolean { return app.loadLocalStorage(K_DISABLE_OMNISEARCH) === '1' } -export function canIndexUnsupportedFiles(): boolean { - return ( - settings.unsupportedFilesIndexing === 'yes' || - (settings.unsupportedFilesIndexing === 'default' && - !!app.vault.getConfig('showUnsupportedFiles')) - ) +export function isCacheEnabled(): boolean { + return !Platform.isIosApp && settings.useCache } diff --git a/src/stores/obsidian-app.ts b/src/stores/obsidian-app.ts deleted file mode 100644 index 27885c3..0000000 --- a/src/stores/obsidian-app.ts +++ /dev/null @@ -1,19 +0,0 @@ -import type { App } from 'obsidian' - -let obsidianApp: App | null = null - -export function setObsidianApp(app: App) { - obsidianApp = app -} - -/** - * Helper function to get the Obsidian app instance. - */ -export function getObsidianApp() { - if (!obsidianApp) { - // throw new Error('Obsidian app not set') - // console.trace('Obsidian app not set') - return app // FIXME: please. - } - return obsidianApp as App -} diff --git a/src/tools/api-server.ts b/src/tools/api-server.ts index b49e6aa..53c172c 100644 --- a/src/tools/api-server.ts +++ b/src/tools/api-server.ts @@ -1,10 +1,11 @@ import * as http from 'http' import * as url from 'url' -import api from './api' import { Notice } from 'obsidian' -import { settings } from 'src/settings' +import type OmnisearchPlugin from '../main' +import { getApi } from './api' -export function getServer() { +export function getServer(plugin: OmnisearchPlugin) { + const api = getApi(plugin) const server = http.createServer(async function (req, res) { res.setHeader('Access-Control-Allow-Origin', '*') res.setHeader( @@ -43,11 +44,14 @@ export function getServer() { server.listen( { port: parseInt(port), - host: 'localhost', + host: plugin.settings.DANGER_httpHost ?? 'localhost', }, () => { console.log(`Omnisearch - Started HTTP server on port ${port}`) - if (settings.httpApiNotice) { + if (plugin.settings.DANGER_httpHost && plugin.settings.DANGER_httpHost !== 'localhost') { + new Notice(`Omnisearch - Started non-localhost HTTP server at ${plugin.settings.DANGER_httpHost}:${port}`, 120_000) + } + else if (plugin.settings.httpApiNotice) { new Notice(`Omnisearch - Started HTTP server on port ${port}`) } } @@ -63,7 +67,7 @@ export function getServer() { close() { server.close() console.log(`Omnisearch - Terminated HTTP server`) - if (settings.httpApiEnabled && settings.httpApiNotice) { + if (plugin.settings.httpApiEnabled && plugin.settings.httpApiNotice) { new Notice(`Omnisearch - Terminated HTTP server`) } }, diff --git a/src/tools/api.ts b/src/tools/api.ts index 7b7d4dc..7761c8a 100644 --- a/src/tools/api.ts +++ b/src/tools/api.ts @@ -1,9 +1,7 @@ import type { ResultNote } from '../globals' import { Query } from '../search/query' -import { searchEngine } from '../search/omnisearch' -import { makeExcerpt } from './text-processing' -import { refreshIndex } from '../notes-index' -import { getObsidianApp } from '../stores/obsidian-app' +import type OmnisearchPlugin from '../main' +import { OmnisearchVaultModal } from '../components/modals' type ResultNoteApi = { score: number @@ -20,8 +18,6 @@ export type SearchMatchApi = { offset: number } -const app = getObsidianApp() - let notified = false /** @@ -29,15 +25,21 @@ let notified = false */ let onIndexedCallbacks: Array<() => void> = [] -function mapResults(results: ResultNote[]): ResultNoteApi[] { +function mapResults( + plugin: OmnisearchPlugin, + results: ResultNote[] +): ResultNoteApi[] { return results.map(result => { const { score, path, basename, foundWords, matches, content } = result - const excerpt = makeExcerpt(content, matches[0]?.offset ?? -1) + const excerpt = plugin.textProcessor.makeExcerpt( + content, + matches[0]?.offset ?? -1 + ) const res: ResultNoteApi = { score, - vault: app.vault.getName(), + vault: plugin.app.vault.getName(), path, basename, foundWords, @@ -54,27 +56,52 @@ function mapResults(results: ResultNote[]): ResultNoteApi[] { }) } -async function search(q: string): Promise { - const query = new Query(q) - const raw = await searchEngine.getSuggestions(query) - return mapResults(raw) -} - -function registerOnIndexed(cb: () => void): void { - onIndexedCallbacks.push(cb) - // Immediately call the callback if the indexing is already ready done - if (notified) { - cb() - } -} - -function unregisterOnIndexed(cb: () => void): void { - onIndexedCallbacks = onIndexedCallbacks.filter(o => o !== cb) -} - export function notifyOnIndexed(): void { notified = true onIndexedCallbacks.forEach(cb => cb()) } -export default { search, registerOnIndexed, unregisterOnIndexed, refreshIndex } +let registed = false + +export function registerAPI(plugin: OmnisearchPlugin): void { + if (registed) { + return + } + registed = true + + // Url scheme for obsidian://omnisearch?query=foobar + plugin.registerObsidianProtocolHandler('omnisearch', params => { + new OmnisearchVaultModal(plugin, params.query).open() + }) + + const api = getApi(plugin) + + // Public api + // @ts-ignore + globalThis['omnisearch'] = api + // Deprecated + ;(plugin.app as any).plugins.plugins.omnisearch.api = api +} + +export function getApi(plugin: OmnisearchPlugin) { + return { + async search(q: string): Promise { + const query = new Query(q, { + ignoreDiacritics: plugin.settings.ignoreDiacritics, + }) + const raw = await plugin.searchEngine.getSuggestions(query) + return mapResults(plugin, raw) + }, + registerOnIndexed(cb: () => void): void { + onIndexedCallbacks.push(cb) + // Immediately call the callback if the indexing is already ready done + if (notified) { + cb() + } + }, + unregisterOnIndexed(cb: () => void): void { + onIndexedCallbacks = onIndexedCallbacks.filter(o => o !== cb) + }, + refreshIndex: plugin.notesIndexer.refreshIndex, + } +} diff --git a/src/tools/notes.ts b/src/tools/notes.ts index 6081d60..270b90a 100644 --- a/src/tools/notes.ts +++ b/src/tools/notes.ts @@ -1,10 +1,8 @@ -import { type CachedMetadata, MarkdownView, TFile } from 'obsidian' +import { type App, type CachedMetadata, MarkdownView, TFile } from 'obsidian' import type { ResultNote } from '../globals' -import { getObsidianApp } from '../stores/obsidian-app' - -const app = getObsidianApp() export async function openNote( + app: App, item: ResultNote, offset = 0, newPane = false, @@ -47,7 +45,11 @@ export async function openNote( }) } -export async function createNote(name: string, newLeaf = false): Promise { +export async function createNote( + app: App, + name: string, + newLeaf = false +): Promise { try { let pathPrefix: string switch (app.vault.getConfig('newFileLocation')) { @@ -77,6 +79,7 @@ export async function createNote(name: string, newLeaf = false): Promise { * @returns */ export function getNonExistingNotes( + app: App, file: TFile, metadata: CachedMetadata ): string[] { diff --git a/src/tools/text-processing.ts b/src/tools/text-processing.ts index 481ea3d..64574f3 100644 --- a/src/tools/text-processing.ts +++ b/src/tools/text-processing.ts @@ -1,83 +1,206 @@ -import { - highlightClass, - type SearchMatch, - regexLineSplit, - regexYaml, - regexStripQuotes, - excerptAfter, - excerptBefore, -} from 'src/globals' -import { settings } from 'src/settings' +import { excerptAfter, excerptBefore, type SearchMatch } from 'src/globals' import { removeDiacritics, warnDebug } from './utils' import type { Query } from 'src/search/query' import { Notice } from 'obsidian' import { escapeRegExp } from 'lodash-es' +import type OmnisearchPlugin from '../main' -/** - * Wraps the matches in the text with a element and a highlight class - * @param text - * @param matches - * @returns The html string with the matches highlighted - */ -export function highlightText(text: string, matches: SearchMatch[]): string { - if (!matches.length) { - return text - } - try { - // Text to highlight - const smartMatches = new RegExp( - matches - .map( - // This regex will match the word (with \b word boundary) - // \b doesn't detect non-alphabetical character's word boundary, so we need to escape it - matchItem => { - const escaped = escapeRegExp(matchItem.match) - return `\\b${escaped}\\b${ - !/[a-zA-Z]/.test(matchItem.match) ? `|${escaped}` : '' - }` - } - ) - .join('|'), - 'giu' - ) +export class TextProcessor { + constructor(private plugin: OmnisearchPlugin) {} - // Replacer function that will highlight the matches - const replacer = (match: string) => { - const matchInfo = matches.find(info => - match.match( - new RegExp( - `\\b${escapeRegExp(info.match)}\\b${ - !/[a-zA-Z]/.test(info.match) ? `|${escapeRegExp(info.match)}` : '' - }`, - 'giu' - ) - ) - ) - if (matchInfo) { - return `${match}` - } - return match + /** + * Wraps the matches in the text with a element and a highlight class + * @param text + * @param matches + * @returns The html string with the matches highlighted + */ + public highlightText(text: string, matches: SearchMatch[]): string { + const highlightClass = `suggestion-highlight omnisearch-highlight ${ + this.plugin.settings.highlight ? 'omnisearch-default-highlight' : '' + }` + + if (!matches.length) { + return text } - - // Effectively highlight the text - let newText = text.replace(smartMatches, replacer) - - // If the text didn't change (= nothing to highlight), re-run the regex but just replace the matches without the word boundary - if (newText === text) { - const dumbMatches = new RegExp( - matches.map(matchItem => escapeRegExp(matchItem.match)).join('|'), + try { + // Text to highlight + const smartMatches = new RegExp( + matches + .map( + // This regex will match the word (with \b word boundary) + // \b doesn't detect non-alphabetical character's word boundary, so we need to escape it + matchItem => { + const escaped = escapeRegExp(matchItem.match) + return `\\b${escaped}\\b${ + !/[a-zA-Z]/.test(matchItem.match) ? `|${escaped}` : '' + }` + } + ) + .join('|'), 'giu' ) - newText = text.replace(dumbMatches, replacer) + + // Replacer function that will highlight the matches + const replacer = (match: string) => { + const matchInfo = matches.find(info => + match.match( + new RegExp( + `\\b${escapeRegExp(info.match)}\\b${ + !/[a-zA-Z]/.test(info.match) + ? `|${escapeRegExp(info.match)}` + : '' + }`, + 'giu' + ) + ) + ) + if (matchInfo) { + return `${match}` + } + return match + } + + // Effectively highlight the text + let newText = text.replace(smartMatches, replacer) + + // If the text didn't change (= nothing to highlight), re-run the regex but just replace the matches without the word boundary + if (newText === text) { + const dumbMatches = new RegExp( + matches.map(matchItem => escapeRegExp(matchItem.match)).join('|'), + 'giu' + ) + newText = text.replace(dumbMatches, replacer) + } + return newText + } catch (e) { + console.error('Omnisearch - Error in highlightText()', e) + return text + } + } + + escapeHTML(html: string): string { + return html + .replaceAll('&', '&') + .replaceAll('<', '<') + .replaceAll('>', '>') + .replaceAll('"', '"') + .replaceAll("'", ''') + } + + /** + * Converts a list of strings to a list of words, using the \b word boundary. + * Used to find excerpts in a note body, or select which words to highlight. + */ + public stringsToRegex(strings: string[]): RegExp { + if (!strings.length) return /^$/g + + // sort strings by decreasing length, so that longer strings are matched first + strings.sort((a, b) => b.length - a.length) + + const joined = `(${strings + .map(s => `\\b${escapeRegExp(s)}\\b|${escapeRegExp(s)}`) + .join('|')})` + + return new RegExp(`${joined}`, 'gui') + } + + /** + * Returns an array of matches in the text, using the provided regex + * @param text + * @param reg + * @param query + */ + public getMatches(text: string, words: string[], query?: Query): SearchMatch[] { + const reg = this.stringsToRegex(words) + const originalText = text + // text = text.toLowerCase().replace(new RegExp(SEPARATORS, 'gu'), ' ') + if (this.plugin.settings.ignoreDiacritics) { + text = removeDiacritics(text) + } + const startTime = new Date().getTime() + let match: RegExpExecArray | null = null + let matches: SearchMatch[] = [] + let count = 0 + while ((match = reg.exec(text)) !== null) { + // Avoid infinite loops, stop looking after 100 matches or if we're taking too much time + if (++count >= 100 || new Date().getTime() - startTime > 50) { + warnDebug('Stopped getMatches at', count, 'results') + break + } + const matchStartIndex = match.index + const matchEndIndex = matchStartIndex + match[0].length + const originalMatch = originalText + .substring(matchStartIndex, matchEndIndex) + .trim() + if (originalMatch && match.index >= 0) { + matches.push({ match: originalMatch, offset: match.index }) + } + } + + // If the query is more than 1 token and can be found "as is" in the text, put this match first + if ( + query && + (query.query.text.length > 1 || query.getExactTerms().length > 0) + ) { + const best = text.indexOf(query.getBestStringForExcerpt()) + if (best > -1 && matches.find(m => m.offset === best)) { + matches.unshift({ + offset: best, + match: query.getBestStringForExcerpt(), + }) + } + } + return matches + } + + public makeExcerpt(content: string, offset: number): string { + const settings = this.plugin.settings + try { + const pos = offset ?? -1 + const from = Math.max(0, pos - excerptBefore) + const to = Math.min(content.length, pos + excerptAfter) + if (pos > -1) { + content = + (from > 0 ? '…' : '') + + content.slice(from, to).trim() + + (to < content.length - 1 ? '…' : '') + } else { + content = content.slice(0, excerptAfter) + } + if (settings.renderLineReturnInExcerpts) { + const lineReturn = new RegExp(/(?:\r\n|\r|\n)/g) + // Remove multiple line returns + content = content + .split(lineReturn) + .filter(l => l) + .join('\n') + + const last = content.lastIndexOf('\n', pos - from) + + if (last > 0) { + content = content.slice(last) + } + } + + content = escapeHTML(content) + + if (settings.renderLineReturnInExcerpts) { + content = content.trim().replaceAll('\n', '
') + } + + return content + } catch (e) { + new Notice( + 'Omnisearch - Error while creating excerpt, see developer console' + ) + console.error(`Omnisearch - Error while creating excerpt`) + console.error(e) + return '' } - return newText - } catch (e) { - console.error('Omnisearch - Error in highlightText()', e) - return text } } -export function escapeHTML(html: string): string { +function escapeHTML(html: string): string { return html .replaceAll('&', '&') .replaceAll('<', '<') @@ -86,143 +209,3 @@ export function escapeHTML(html: string): string { .replaceAll("'", ''') } -export function splitLines(text: string): string[] { - return text.split(regexLineSplit).filter(l => !!l && l.length > 2) -} - -export function removeFrontMatter(text: string): string { - // Regex to recognize YAML Front Matter (at beginning of file, 3 hyphens, than any character, including newlines, then 3 hyphens). - return text.replace(regexYaml, '') -} - -/** - * Converts a list of strings to a list of words, using the \b word boundary. - * Used to find excerpts in a note body, or select which words to highlight. - */ -export function stringsToRegex(strings: string[]): RegExp { - if (!strings.length) return /^$/g - - // sort strings by decreasing length, so that longer strings are matched first - strings.sort((a, b) => b.length - a.length) - - const joined = `(${strings - .map(s => `\\b${escapeRegExp(s)}\\b|${escapeRegExp(s)}`) - .join('|')})` - - return new RegExp(`${joined}`, 'gui') -} - -/** - * Returns an array of matches in the text, using the provided regex - * @param text - * @param reg - * @param query - */ -export function getMatches( - text: string, - reg: RegExp, - query?: Query -): SearchMatch[] { - const originalText = text - // text = text.toLowerCase().replace(new RegExp(SEPARATORS, 'gu'), ' ') - if (settings.ignoreDiacritics) { - text = removeDiacritics(text) - } - const startTime = new Date().getTime() - let match: RegExpExecArray | null = null - let matches: SearchMatch[] = [] - let count = 0 - while ((match = reg.exec(text)) !== null) { - // Avoid infinite loops, stop looking after 100 matches or if we're taking too much time - if (++count >= 100 || new Date().getTime() - startTime > 50) { - warnDebug('Stopped getMatches at', count, 'results') - break - } - const matchStartIndex = match.index - const matchEndIndex = matchStartIndex + match[0].length - const originalMatch = originalText - .substring(matchStartIndex, matchEndIndex) - .trim() - if (originalMatch && match.index >= 0) { - matches.push({ match: originalMatch, offset: match.index }) - } - } - - // If the query is more than 1 token and can be found "as is" in the text, put this match first - if ( - query && - (query.query.text.length > 1 || query.getExactTerms().length > 0) - ) { - const best = text.indexOf(query.getBestStringForExcerpt()) - if (best > -1 && matches.find(m => m.offset === best)) { - matches.unshift({ - offset: best, - match: query.getBestStringForExcerpt(), - }) - } - } - return matches -} - -export function makeExcerpt(content: string, offset: number): string { - try { - const pos = offset ?? -1 - const from = Math.max(0, pos - excerptBefore) - const to = Math.min(content.length, pos + excerptAfter) - if (pos > -1) { - content = - (from > 0 ? '…' : '') + - content.slice(from, to).trim() + - (to < content.length - 1 ? '…' : '') - } else { - content = content.slice(0, excerptAfter) - } - if (settings.renderLineReturnInExcerpts) { - const lineReturn = new RegExp(/(?:\r\n|\r|\n)/g) - // Remove multiple line returns - content = content - .split(lineReturn) - .filter(l => l) - .join('\n') - - const last = content.lastIndexOf('\n', pos - from) - - if (last > 0) { - content = content.slice(last) - } - } - - content = escapeHTML(content) - - if (settings.renderLineReturnInExcerpts) { - content = content.trim().replaceAll('\n', '
') - } - - return content - } catch (e) { - new Notice( - 'Omnisearch - Error while creating excerpt, see developer console' - ) - console.error(`Omnisearch - Error while creating excerpt`) - console.error(e) - return '' - } -} - -/** - * splits a string in words or "expressions in quotes" - * @param str - * @returns - */ -export function splitQuotes(str: string): string[] { - return ( - str - .match(/"(.*?)"/g) - ?.map(s => s.replace(/"/g, '')) - .filter(q => !!q) ?? [] - ) -} - -export function stripSurroundingQuotes(str: string): string { - return str.replace(regexStripQuotes, '') -} diff --git a/src/tools/utils.ts b/src/tools/utils.ts index d2f66dd..664d1de 100644 --- a/src/tools/utils.ts +++ b/src/tools/utils.ts @@ -4,8 +4,7 @@ import { parseFrontMatterAliases, Platform, } from 'obsidian' -import { getTextExtractor, isSearchMatch, type SearchMatch } from '../globals' -import { canIndexUnsupportedFiles, settings } from '../settings' +import { isSearchMatch, type SearchMatch } from '../globals' import { type BinaryLike, createHash } from 'crypto' import { md5 } from 'pure-md5' @@ -135,32 +134,6 @@ export function getCtrlKeyLabel(): 'ctrl' | '⌘' { return Platform.isMacOS ? '⌘' : 'ctrl' } -export function isContentIndexable(path: string): boolean { - const hasTextExtractor = !!getTextExtractor() - const canIndexPDF = hasTextExtractor && settings.PDFIndexing - const canIndexImages = hasTextExtractor && settings.imagesIndexing - return ( - isFilePlaintext(path) || - isFileCanvas(path) || - isFileFromDataloomPlugin(path) || - (canIndexPDF && isFilePDF(path)) || - (canIndexImages && isFileImage(path)) - ) -} - -export function isFilenameIndexable(path: string): boolean { - return ( - canIndexUnsupportedFiles() || - isFilePlaintext(path) || - isFileCanvas(path) || - isFileFromDataloomPlugin(path) - ) -} - -export function isFileIndexable(path: string): boolean { - return isFilenameIndexable(path) || isContentIndexable(path) -} - export function isFileImage(path: string): boolean { const ext = getExtension(path) return ext === 'png' || ext === 'jpg' || ext === 'jpeg' || ext === 'webp' @@ -175,10 +148,6 @@ export function isFileOffice(path: string): boolean { return ext === 'docx' || ext === 'xlsx' } -export function isFilePlaintext(path: string): boolean { - return [...settings.indexedFileTypes, 'md'].some(t => path.endsWith(`.${t}`)) -} - export function isFileCanvas(path: string): boolean { return path.endsWith('.canvas') } @@ -250,8 +219,13 @@ export function warnDebug(...args: any[]): void { printDebug(console.warn, ...args) } +let printDebugEnabled= false +export function enablePrintDebug(enable: boolean): void { + printDebugEnabled = enable +} + function printDebug(fn: (...args: any[]) => any, ...args: any[]): void { - if (settings.verboseLogging) { + if (printDebugEnabled) { const t = new Date() const ts = `${t.getMinutes()}:${t.getSeconds()}:${t.getMilliseconds()}` fn(...['Omnisearch -', ts + ' -', ...args]) diff --git a/tsconfig.json b/tsconfig.json index cea71ac..e1731f6 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -19,7 +19,10 @@ "lib": [ "DOM", "ES2021" - ] + ], + "paths": { + "minisearch": ["node_modules/minisearch/src/MiniSearch.ts"] + } }, "include": [ "**/*.ts", diff --git a/versions.json b/versions.json index 04fb520..94aa108 100644 --- a/versions.json +++ b/versions.json @@ -140,5 +140,6 @@ "1.23.0-beta.2": "1.3.0", "1.23.0-beta.3": "1.3.0", "1.23.0-beta.4": "1.3.0", - "1.23.0-beta.5": "1.3.0" + "1.23.0-beta.5": "1.3.0", + "1.23.0": "1.3.0" } \ No newline at end of file