diff --git a/.changeset/cold-groups-search.md b/.changeset/cold-groups-search.md new file mode 100644 index 0000000..079d964 --- /dev/null +++ b/.changeset/cold-groups-search.md @@ -0,0 +1,5 @@ +--- +"sqlseal": minor +--- + +added ability to manually define column types diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1ed31e5..0ae672f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -36,9 +36,8 @@ jobs: with: publish: pnpm run ci:publish version: pnpm run ci:version - title: "Release: $VERSION" - commit: "release: Release $VERSION" + title: "[Release] Next Release" + commit: "automated release" createGithubReleases: false # this is handled inside ci:publish script - setupGitUser: false # this is handled inside ci:publish script env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 6cd74d3..40c5fd1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,22 +1,24 @@ -# 0.36.0 (2025-05-06) +# Releases + +## 0.36.0 (2025-05-06) - fix: deleting columns and renaming columns works again - chore: updated dependencies to the latest versions -# 0.35.0 (2025-05-02) +## 0.35.0 (2025-05-02) - fix: fixed issue with CSV files edits not being saved -# 0.34.0 (2025-04-30) +## 0.34.0 (2025-04-30) - feat: you can now navigate to linked CSV and JSON file sources - feat: improved support for minimal theme custom classes -# 0.33.0 (2025-04-09) +## 0.33.0 (2025-04-09) - fix: better text links for images (by @satkowski) - fix: lists are now rendered properly (by @satkowski) - chore: exposing filename in the renderer (by @satkowski) - fix: numbers are now properly handled (by @satkowski) - fix: SQLSeal results are now properly rendered on canvas -# 0.32.0 (2025-04-02) +## 0.32.0 (2025-04-02) - feat: added text rendering for links, images and checkboxes (for MARKDOWN renderer) - fix: fixed issue with rendering numbers - fix: fixed how grid renders columns - now they automatically match content and don't truncate the text @@ -24,35 +26,35 @@ - fix: columns with dots in the name render properly in grid view - chore: now external plugins can use cellRenderer from the main plugin -# 0.31.0 (2025-03-31) +## 0.31.0 (2025-03-31) - feat: TEMPLATE renderer can now use checkboxes, links and images like other views. -# 0.30.1 (2025-03-27) +## 0.30.1 (2025-03-27) - feat: added basename and parent SQL variables -# 0.30.0 (2025-03-26) +## 0.30.0 (2025-03-26) - feat: added ability to reference tables from the other files in `table()` functions - feat: added ability to reference tables by their header name - feat: new heading and heading_level columns in tasks table (by @kDCYorke) -# 0.29.0 (2025-03-19) +## 0.29.0 (2025-03-19) - feat: LIST views with single column are rendered as a regular list (rather than nested one) (by @kDCYorke) - feat: files table now contains tags column with tags defined directly in properties (by @sksizer) - feat: frontmatter links are now exposed in links table (by @kDCYorke) - feat: added checkbox field to tasks which adds **interactive** checkbox so you can mark tasks as completed directly from the SQLSeal -# 0.28.4 (2025-03-15) +## 0.28.4 (2025-03-15) - Feat: Template view can now access file properties -# 0.28.3 (2025-03-15) +## 0.28.3 (2025-03-15) - Fix: Filename field in files column no longer truncates name after dot -# 0.28.2 (2025-03-14) +## 0.28.2 (2025-03-14) - Added ability to define default view (Grid, HTML or Markdown) - Added ability to configure default page size for the GRID view -# 0.28.1 (2025-03-14) +## 0.28.1 (2025-03-14) - Adding syntax highlighting for javascript (to be used with GRAPH view) -# 0.28.0 (2025-03-14) +## 0.28.0 (2025-03-14) - Added TEMPLATE view that allow to render your template with custom Handlebars template. - Improved syntax highlighting - now lines with errors will get highlighted with appropriate colour to indicate the issue - Added @path, @fileName and @extension variables you can use inside your SQL alongside other Frontmatter properties @@ -63,16 +65,16 @@ Fixes: Technical: - Other plugins can now register flags to allow for extra configuration -# 0.27.0 (2025-02-17) +## 0.27.0 (2025-02-17) - Better syntax highlighting! Now it highlights SQL query parts - Support for comments. You can now add comments like `--` and `/* */` to you queries -# 0.26.0 (2025-02-16) +## 0.26.0 (2025-02-16) - Better language parser! Reworked from the ground up, now SQLSeal uses Ohm.js parser which works much better and opens much more possibilities (like syntax highlighting also introduced in this version). - Syntax highlighting! Your SQLSeal text is now being highlighted helping you spot potential syntax issues quickly. The highlighting will be iterated on so please join discussion on our Discord! - fix: database did not load properly when vault name consisted spaces or was in the subfolder (mostly causing issue on mobile) -# 0.25.0 (2025-02-06) +## 0.25.0 (2025-02-06) - feat: you can now generate list of links - feat: lists are now properly rendered - feat: ability to edit column names in CSV files @@ -80,125 +82,125 @@ Technical: - fix: empty links no longer generate errors - fix: fixed how lists behave when you refresh the file -# 0.24.2 (2025-02-05) +## 0.24.2 (2025-02-05) - Fixed how links are displayed. Now you can use links as `a(href)` or `a(href, name)`. -# 0.24.1 (2025-02-05) +## 0.24.1 (2025-02-05) - Added `path` columns to `tags` and `tasks` tables. Thanks to that you can use `NATURAL JOIN`s now to connect join them. -# 0.24.0 (2025-02-05) +## 0.24.0 (2025-02-05) - Better column names! Now non-latin characters are being romanised so you can access your properties (and other column names) easier: geändert becomes geandert, 类别 becomes lei_bie, ノートタイプ becomes nototaipu, etc. -# 0.23.2 (2025-02-04) +## 0.23.2 (2025-02-04) - No longer captalising renderer options (it was breaking SQLSeal Charts integration) -# 0.23.1 (2025-02-04) +## 0.23.1 (2025-02-04) - SQLSeal now works with multiple vaults open. It registers database with unique filename to avoid conflicts. -# 0.23.0 (2025-02-04) +## 0.23.0 (2025-02-04) - Added support for wikilinks in the `a` function. You can now use markdown links in your queries. - Improved how links are being rendered. Now using native links with the preview on hover -# 0.22.3 (2025-02-04) +## 0.22.3 (2025-02-04) - Ability to enable / disable query refreshing individually for each query (REFRESH / NO REFRESH statement) - (Advanced) Added ability to show SQL execution plan for the query -# 0.22.2 (2025-02-01) +## 0.22.2 (2025-02-01) - Added index to tags.tag which was missed in the last release -# 0.22.1 (2025-02-01) +## 0.22.1 (2025-02-01) - Added indexes to the `files`, `tags`, `links` and `tasks` tables. This should speed up a lot of common queries performed agains these tables. -# 0.22.0 (2025-01-31) +## 0.22.0 (2025-01-31) Breaking change: `created_at` and `modified_at` has been changed from JS unix epoch to ISO 8601 dates (human readable). Thanks to that many of date operations are now easier to perform. Example, extracting year from the creation date: Before: `strftime("%Y", datetime(ROUND(created_at / 1000), 'unixepoch'))` Now: `strftime("%Y", created_at)` -# 0.21.3 (2025-01-31) +## 0.21.3 (2025-01-31) - fix: fixed issue with inline queries breaking rendering -# 0.21.2 (2025-01-30) +## 0.21.2 (2025-01-30) - feat: now dynamic refreshing of the views can be disabled in the settings -# 0.21.1 (2025-01-30) +## 0.21.1 (2025-01-30) - feat: ability to register new tables from other plugins -# 0.21.0 (2025-01-30) +## 0.21.0 (2025-01-30) - feat: other plugins can now register custom database functions - feat: improved API for other plugins - chore: added subproject to release types for other plugins to use. See [`@hypersphere/sqlseal` package in NPM](https://www.npmjs.com/package/@hypersphere/sqlseal) for more info. -# 0.20.0 (2025-01-28) +## 0.20.0 (2025-01-28) Added `links` table containing all the references between files. [Read more about the file structure in our documentation](https://hypersphere.blog/sql-seal/data-sources/vault-data.html#links-table) -# 0.19.2 (2025-01-27) +## 0.19.2 (2025-01-27) Fixed issue with files and folders containing dots in them. -# 0.19.1 (2025-01-27) +## 0.19.1 (2025-01-27) Added logging for unprocessable data to help reporting. -# 0.19.0 (2025-01-24) +## 0.19.0 (2025-01-24) Adding support for JSON and JSON5 files. You can now query these data types and create tables based on them. You can use JSONPath to traverse the JSON files and extract data from it. [See more in the documentation](http://hypersphere.blog/sql-seal/data-sources/json-and-json5.html). Added support for viewing JSON files. For now it is very simple preview with plans to expand in the future. You can disable this preview in the settings. -# 0.18.1 (2025-01-23) +## 0.18.1 (2025-01-23) Adding created_at, modified_at and file_size field to files table. Also added documentation and fixed issue with files not refreshing already visible views. -# 0.18.0 (2025-01-23) +## 0.18.0 (2025-01-23) Synchronisation code has been greatly refactored. Thanks to that many common issue with files not being refreshed or pointing to the wrong file occasionally should be fixed. Also fixed many instances of potential memory leaks. Now plugin should be more stable and reliable. -# 0.17.0 (2025-01-20) +## 0.17.0 (2025-01-20) Adding support for `LIST` view. You can now set custom classes for `HTML` (table) view. -# 0.16.1 (2025-01-17) +## 0.16.1 (2025-01-17) Fixed issue with variables causing error. Now you can pass variables from your frontmatter with no problem. -# 0.16.0 (2025-01-16) +## 0.16.0 (2025-01-16) Now you can query tables in your note and use them as data source! [Check more information in the documentation](http://hypersphere.blog/sql-seal/query-markdown-tables.html). -# 0.15.0 (2025-01-15) +## 0.15.0 (2025-01-15) This version brings plenty of the bugfixes - fix: fix issue with local links not being clickable - fix: query is now less case sensitive. You can use keywords like `TABLE`, `HTML`, `MARKDOWN` in any casing you want - fix: improved SQL parser - now more complex syntax like recursive CTE, window functions, etc. should work properly. Migrated from `node-sql-parser` to `sql-parser-cst` - fix: codeblocks now observe only the tables that are relevant to them instead of all. This should fix some tables refresh too often -# 0.14.1 (2025-01-13) +## 0.14.1 (2025-01-13) - fix: fixed the issue where rows with extra data in them (rows with more columns that a header) were not synchronised correctly - fix: fixed the issue where queries with lowercase SELECT would not work in certain cases. -# 0.14.0 (2025-01-10) +## 0.14.0 (2025-01-10) Added support for inline code blocks. Create a codeblock (backtick `) and use prefix S> to indicate it's SQLSeal query. -# 0.13.0 (2025-01-09) +## 0.13.0 (2025-01-09) Huge upgrade to the code codebase. SQLSeal should be now much faster and more reliable thanks to the following: - Rewritten how files are synched - now each CSV file creates AT MOST one table in the database (synchronisations are being reused accross files) - Rewritten SQL parser - this enables using more advanced SQLite functionality like recursive CTEs, UNIONS and `json_each`! - (minor, technical): code got restructured and fixed so it's easier to contribute. -# 0.12.4 (2025-01-09) +## 0.12.4 (2025-01-09) - added "Create CSV file" option in context menu in file explorer. -# 0.12.3 (2024-12-20) +## 0.12.3 (2024-12-20) - fix: Fixing completed flag in tasks being reversed -# 0.12.2 (2024-12-20) +## 0.12.2 (2024-12-20) fix: Fixed issue with CTE table names being incorrectly processed causing error -# 0.12.1 (2024-12-20) +## 0.12.1 (2024-12-20) fix: Fixed issue with the library on mobile - now it should load properly. -# 0.12.0 (2024-12-19) +## 0.12.0 (2024-12-19) This update does not bring any functionality changes yet but it fixes some problems with underlying architecture, helping to make SQLSeal more efficient in the future. If you work with many datasets, you might see slightly smaller memory usage as the database is now persisted in the IndexedDb (tech comment: as block storage). Technical update: Database has been moved to WebWorker, making data loading and retrieval slightly more efficient. Also integrated with [Absurd-SQL](https://github.com/jlongster/absurd-sql) which allows to store SQLite inside IndexedDb block storage, meaning it can be persisted and offloaded from the memory. Due to Obsidian API limitations, we still need to load huge files CSV to the memory instead of streaming their content but once the content is loaded, the memory usage should significantly go down now. More changes using this update to come soon! -# 0.11.0 (2024-11-24) +## 0.11.0 (2024-11-24) The biggest update yet with plenty of exciting features: Added CSV Viewer! Now you can see all your CSV files in your vault in the file explorer and open it to preview the data. You can also edit the data in place (remember always to backup your files!) @@ -208,7 +210,7 @@ Now the files in the queries are resolved relatively to the file they are in. Yo Added more lax parser implementation for now Minor: updated dependencies to the latest versions -# 0.10.1 (2024-11-07) +## 0.10.1 (2024-11-07) Many small fixes: - Changed how parsing is done to simplify code greatly - Grid now supports dark mode @@ -216,48 +218,48 @@ Many small fixes: - Restored ability to have `TABLE` syntax without select. -# 0.10.0 (2024-11-06) +## 0.10.0 (2024-11-06) SQLSeal is now compatible with mobile! Plugin now uses SQL.JS instead of better-sqlite3 which is written in Web Assembly so no longer native binaries are needed. This makes plugin portable. Also reworked implementation of the parser from Antlr4TS into Antlr4. -# 0.9.2 (2024-11-03) +## 0.9.2 (2024-11-03) Adding checkbox method to display boolean values as checkboxes Fixing how updates are parsed -# 0.9.1 (2024-11-03) +## 0.9.1 (2024-11-03) Turning off verbose mode -# 0.9.0 (2024-11-03) +## 0.9.0 (2024-11-03) We now use proper grid library to render data. This allow for many great features like pagination, sorting and more visally pleasing UI out of the box. Rewritten internal communication to use Signals. -# 0.8.0 (2024-09-05) +## 0.8.0 (2024-09-05) Now you can embed links and images (both local and external). Introduced `a` and `img` custom SQL functions. -# 0.7.0 (2024-09-02) +## 0.7.0 (2024-09-02) A lot of changes packed in this one! Now SQLSeal is parsing the input using proper language parser (thanks to ANTLR4) rather than relying on RegExes. This finally allows for proper support of CTE statements (WITH) and fixes a lot of other minor problems with the syntax. Also improved the way files are being observed and updated which should lead to performance improvements. -# 0.6.0 (2024-09-01) +## 0.6.0 (2024-09-01) - fixing CSV loading when names has been converted to camelCase - Fixing constantly reloading files when modifying sql inside the same block that has table declaration in - Auto-parsing JSON values with JSON5 - Better errors when error occurs in select statement -# 0.5.0 (2024-08-25) +## 0.5.0 (2024-08-25) - Adding support for JSON objects! Automatically detecting JSON in the frontmatter and converting it to JSON type in SQLite. You can query fields using built-in SQLite functions like `json_extract`, `json_array_length`, etc. More about SQlite functionality [can be found here.](https://www.sqlite.org/json1.html). - Fixed issue with bookean types not being saved properly. -# 0.4.1 (2024-08-25) +## 0.4.1 (2024-08-25) - Fixed issue with potential duplicate column sql error when two different fields resolve to the same uppercase structure -# 0.4.0 (2024-08-23) +## 0.4.0 (2024-08-23) - Fixed issue with better_sqlite3 not loading on different systems and architectures -# 0.3.0 (2024-08-23) +## 0.3.0 (2024-08-23) - Added ability to query files in the fault directly. - Added observability - when CSV or file in the vault is changed, all SELECTS that uses it should update too - Added custom class to sqlseal tables and ability to scroll vertically when the data is overflowing horizontally. -# 0.1.0 (2024-06-23) +## 0.1.0 (2024-06-23) - Initial release. Allows to create tables based on CSV files in your vault and query them using SQL. diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index 961e3a5..6615491 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -37,6 +37,7 @@ export default defineConfig({ { text: 'Links and Images', link: '/links-and-images' }, { text: 'CSV Viewer', link: '/csv-viewer' }, { text: 'Query Configuration', link: '/query-configuration' }, + { text: 'Define Column Types', link: '/define-column-types' }, { text: 'Troubleshooting', link: '/troubleshooting' }, { text: 'Future Plans', link: '/future-plans' }, { text: 'Changelog', link: '/changelog' } diff --git a/docs/define-column-types.md b/docs/define-column-types.md new file mode 100644 index 0000000..beb3cfc --- /dev/null +++ b/docs/define-column-types.md @@ -0,0 +1,7 @@ +# Define Column Types (CSV files) + +SQLSeal sets types of your data automatically. This is the mechanism which for most of the cases works perfectly, but for more advanced use-cases, you might want to force specific type of the column (for example you might have ids which you want to treat like text, even if they consist of just the numbers). To enforce a specific type, you can set individual types inside the CSV Viewer: + +![Setting Column Type](./setting-column-type.png) + +Changing data type enables corresponding controls. \ No newline at end of file diff --git a/docs/setting-column-type.png b/docs/setting-column-type.png new file mode 100644 index 0000000..1b632a3 Binary files /dev/null and b/docs/setting-column-type.png differ diff --git a/package.json b/package.json index 8759f3a..e775a44 100644 --- a/package.json +++ b/package.json @@ -31,11 +31,11 @@ "@types/estraverse": "^5.1.7", "@types/jest": "^29.5.14", "@types/lodash": "^4.17.16", - "@types/node": "^22.15.12", - "@types/papaparse": "^5.3.15", + "@types/node": "^22.15.18", + "@types/papaparse": "^5.3.16", "@types/sql.js": "^1.4.9", - "@typescript-eslint/eslint-plugin": "8.32.0", - "@typescript-eslint/parser": "8.32.0", + "@typescript-eslint/eslint-plugin": "8.32.1", + "@typescript-eslint/parser": "8.32.1", "builtin-modules": "5.0.0", "electron-rebuild": "^3.2.9", "esbuild": "0.25.4", @@ -44,23 +44,23 @@ "jest": "^29.7.0", "obsidian": "^1.8.7", "prettier": "3.5.3", - "ts-jest": "^29.3.2", + "ts-jest": "^29.3.4", "tslib": "2.8.1", "typescript": "5.8.3", "vitepress": "^1.6.3", - "vue": "^3.5.13" + "vue": "^3.5.14" }, "dependencies": { "@ag-grid-community/theming": "^32.3.5", "@codemirror/language": "^6.11.0", "@codemirror/state": "^6.5.2", - "@codemirror/view": "^6.36.7", + "@codemirror/view": "^6.36.8", "@hypersphere/omnibus": "^0.1.6", "@jlongster/sql.js": "^1.6.7", "@types/jsonpath": "^0.2.4", "@vanakat/plugin-api": "^0.2.1", "absurd-sql": "^0.0.54", - "ag-grid-community": "^33.2.4", + "ag-grid-community": "^33.3.0", "comlink": "^4.4.2", "esbuild-plugin-polyfill-node": "^0.3.0", "esprima": "^4.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 38d68b4..8fced50 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,8 +18,8 @@ importers: specifier: ^6.5.2 version: 6.5.2 '@codemirror/view': - specifier: ^6.36.7 - version: 6.36.7 + specifier: ^6.36.8 + version: 6.36.8 '@hypersphere/omnibus': specifier: ^0.1.6 version: 0.1.6 @@ -31,13 +31,13 @@ importers: version: 0.2.4 '@vanakat/plugin-api': specifier: ^0.2.1 - version: 0.2.1(@codemirror/state@6.5.2)(@codemirror/view@6.36.7)(eslint@9.15.0) + version: 0.2.1(@codemirror/state@6.5.2)(@codemirror/view@6.36.8)(eslint@9.15.0) absurd-sql: specifier: ^0.0.54 version: 0.0.54 ag-grid-community: - specifier: ^33.2.4 - version: 33.2.4 + specifier: ^33.3.0 + version: 33.3.0 comlink: specifier: ^4.4.2 version: 4.4.2 @@ -100,20 +100,20 @@ importers: specifier: ^4.17.16 version: 4.17.16 '@types/node': - specifier: ^22.15.12 - version: 22.15.12 + specifier: ^22.15.18 + version: 22.15.18 '@types/papaparse': - specifier: ^5.3.15 - version: 5.3.15 + specifier: ^5.3.16 + version: 5.3.16 '@types/sql.js': specifier: ^1.4.9 version: 1.4.9 '@typescript-eslint/eslint-plugin': - specifier: 8.32.0 - version: 8.32.0(@typescript-eslint/parser@8.32.0(eslint@9.15.0)(typescript@5.8.3))(eslint@9.15.0)(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.15.0)(typescript@5.8.3))(eslint@9.15.0)(typescript@5.8.3) '@typescript-eslint/parser': - specifier: 8.32.0 - version: 8.32.0(eslint@9.15.0)(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.15.0)(typescript@5.8.3) builtin-modules: specifier: 5.0.0 version: 5.0.0 @@ -131,16 +131,16 @@ importers: version: 3.3.1(esbuild@0.25.4)(sass-embedded@1.89.0) jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@22.15.12) + version: 29.7.0(@types/node@22.15.18) obsidian: specifier: ^1.8.7 - version: 1.8.7(@codemirror/state@6.5.2)(@codemirror/view@6.36.7) + version: 1.8.7(@codemirror/state@6.5.2)(@codemirror/view@6.36.8) prettier: specifier: 3.5.3 version: 3.5.3 ts-jest: - specifier: ^29.3.2 - version: 29.3.2(@babel/core@7.27.1)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.1))(esbuild@0.25.4)(jest@29.7.0(@types/node@22.15.12))(typescript@5.8.3) + specifier: ^29.3.4 + version: 29.3.4(@babel/core@7.27.1)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.1))(esbuild@0.25.4)(jest@29.7.0(@types/node@22.15.18))(typescript@5.8.3) tslib: specifier: 2.8.1 version: 2.8.1 @@ -149,10 +149,10 @@ importers: version: 5.8.3 vitepress: specifier: ^1.6.3 - version: 1.6.3(@algolia/client-search@5.24.0)(@types/node@22.15.12)(postcss@8.5.3)(sass-embedded@1.89.0)(sass@1.89.0)(search-insights@2.17.3)(typescript@5.8.3) + version: 1.6.3(@algolia/client-search@5.25.0)(@types/node@22.15.18)(postcss@8.5.3)(sass-embedded@1.89.0)(sass@1.89.0)(search-insights@2.17.3)(typescript@5.8.3) vue: - specifier: ^3.5.13 - version: 3.5.13(typescript@5.8.3) + specifier: ^3.5.14 + version: 3.5.14(typescript@5.8.3) packages: @@ -182,56 +182,56 @@ packages: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' - '@algolia/client-abtesting@5.24.0': - resolution: {integrity: sha512-pNTIB5YqVVwu6UogvdX8TqsRZENaflqMMjdY7/XIPMNGrBoNH9tewINLI7+qc9tIaOLcAp3ZldqoEwAihZZ3ig==} + '@algolia/client-abtesting@5.25.0': + resolution: {integrity: sha512-1pfQulNUYNf1Tk/svbfjfkLBS36zsuph6m+B6gDkPEivFmso/XnRgwDvjAx80WNtiHnmeNjIXdF7Gos8+OLHqQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-analytics@5.24.0': - resolution: {integrity: sha512-IF+r9RRQsIf0ylIBNFxo7c6hDxxuhIfIbffhBXEF1HD13rjhP5AVfiaea9RzbsAZoySkm318plDpH/nlGIjbRA==} + '@algolia/client-analytics@5.25.0': + resolution: {integrity: sha512-AFbG6VDJX/o2vDd9hqncj1B6B4Tulk61mY0pzTtzKClyTDlNP0xaUiEKhl6E7KO9I/x0FJF5tDCm0Hn6v5x18A==} engines: {node: '>= 14.0.0'} - '@algolia/client-common@5.24.0': - resolution: {integrity: sha512-p8K6tiXQTebRBxbrzWIfGCvfkT+Umml+2lzI92acZjHsvl6KYH6igOfVstKqXJRei9pvRzEEvVDNDLXDVleGTA==} + '@algolia/client-common@5.25.0': + resolution: {integrity: sha512-il1zS/+Rc6la6RaCdSZ2YbJnkQC6W1wiBO8+SH+DE6CPMWBU6iDVzH0sCKSAtMWl9WBxoN6MhNjGBnCv9Yy2bA==} engines: {node: '>= 14.0.0'} - '@algolia/client-insights@5.24.0': - resolution: {integrity: sha512-jOHF0+tixR3IZJMhZPquFNdCVPzwzzXoiqVsbTvfKojeaY6ZXybgUiTSB8JNX+YpsUT8Ebhu3UvRy4mw2PbEzw==} + '@algolia/client-insights@5.25.0': + resolution: {integrity: sha512-blbjrUH1siZNfyCGeq0iLQu00w3a4fBXm0WRIM0V8alcAPo7rWjLbMJMrfBtzL9X5ic6wgxVpDADXduGtdrnkw==} engines: {node: '>= 14.0.0'} - '@algolia/client-personalization@5.24.0': - resolution: {integrity: sha512-Fx/Fp6d8UmDBHecTt0XYF8C9TAaA3qeCQortfGSZzWp4gVmtrUCFNZ1SUwb8ULREnO9DanVrM5hGE8R8C4zZTQ==} + '@algolia/client-personalization@5.25.0': + resolution: {integrity: sha512-aywoEuu1NxChBcHZ1pWaat0Plw7A8jDMwjgRJ00Mcl7wGlwuPt5dJ/LTNcg3McsEUbs2MBNmw0ignXBw9Tbgow==} engines: {node: '>= 14.0.0'} - '@algolia/client-query-suggestions@5.24.0': - resolution: {integrity: sha512-F8ypOedSMhz6W7zuT5O1SXXsdXSOVhY2U6GkRbYk/mzrhs3jWFR3uQIfeQVWmsJjUwIGZmPoAr9E+T/Zm2M4wA==} + '@algolia/client-query-suggestions@5.25.0': + resolution: {integrity: sha512-a/W2z6XWKjKjIW1QQQV8PTTj1TXtaKx79uR3NGBdBdGvVdt24KzGAaN7sCr5oP8DW4D3cJt44wp2OY/fZcPAVA==} engines: {node: '>= 14.0.0'} - '@algolia/client-search@5.24.0': - resolution: {integrity: sha512-k+nuciQuq7WERNNE+hsx3DX636zIy+9R4xdtvW3PANT2a2BDGOv3fv2mta8+QUMcVTVcGe/Mo3QCb4pc1HNoxA==} + '@algolia/client-search@5.25.0': + resolution: {integrity: sha512-9rUYcMIBOrCtYiLX49djyzxqdK9Dya/6Z/8sebPn94BekT+KLOpaZCuc6s0Fpfq7nx5J6YY5LIVFQrtioK9u0g==} engines: {node: '>= 14.0.0'} - '@algolia/ingestion@1.24.0': - resolution: {integrity: sha512-/lqVxmrvwoA+OyVK4XLMdz/PJaCTW4qYchX1AZ+98fdnH3K6XM/kMydQLfP0bUNGBQbmVrF88MqhqZRnZEn/MA==} + '@algolia/ingestion@1.25.0': + resolution: {integrity: sha512-jJeH/Hk+k17Vkokf02lkfYE4A+EJX+UgnMhTLR/Mb+d1ya5WhE+po8p5a/Nxb6lo9OLCRl6w3Hmk1TX1e9gVbQ==} engines: {node: '>= 14.0.0'} - '@algolia/monitoring@1.24.0': - resolution: {integrity: sha512-cRisDXQJhvfZCXL4hD22qca2CmW52TniOx6L7pvkaBDx0oQk1k9o+3w11fgfcCG+47OndMeNx5CMpu+K+COMzg==} + '@algolia/monitoring@1.25.0': + resolution: {integrity: sha512-Ls3i1AehJ0C6xaHe7kK9vPmzImOn5zBg7Kzj8tRYIcmCWVyuuFwCIsbuIIz/qzUf1FPSWmw0TZrGeTumk2fqXg==} engines: {node: '>= 14.0.0'} - '@algolia/recommend@5.24.0': - resolution: {integrity: sha512-JTMz0JqN2gidvKa2QCF/rMe8LNtdHaght03px2cluZaZfBRYy8TgHgkCeBspKKvV/abWJwl7J0FzWThCshqT3w==} + '@algolia/recommend@5.25.0': + resolution: {integrity: sha512-79sMdHpiRLXVxSjgw7Pt4R1aNUHxFLHiaTDnN2MQjHwJ1+o3wSseb55T9VXU4kqy3m7TUme3pyRhLk5ip/S4Mw==} engines: {node: '>= 14.0.0'} - '@algolia/requester-browser-xhr@5.24.0': - resolution: {integrity: sha512-B2Gc+iSxct1WSza5CF6AgfNgmLvVb61d5bqmIWUZixtJIhyAC6lSQZuF+nvt+lmKhQwuY2gYjGGClil8onQvKQ==} + '@algolia/requester-browser-xhr@5.25.0': + resolution: {integrity: sha512-JLaF23p1SOPBmfEqozUAgKHQrGl3z/Z5RHbggBu6s07QqXXcazEsub5VLonCxGVqTv6a61AAPr8J1G5HgGGjEw==} engines: {node: '>= 14.0.0'} - '@algolia/requester-fetch@5.24.0': - resolution: {integrity: sha512-6E5+hliqGc5w8ZbyTAQ+C3IGLZ/GiX623Jl2bgHA974RPyFWzVSj4rKqkboUAxQmrFY7Z02ybJWVZS5OhPQocA==} + '@algolia/requester-fetch@5.25.0': + resolution: {integrity: sha512-rtzXwqzFi1edkOF6sXxq+HhmRKDy7tz84u0o5t1fXwz0cwx+cjpmxu/6OQKTdOJFS92JUYHsG51Iunie7xbqfQ==} engines: {node: '>= 14.0.0'} - '@algolia/requester-node-http@5.24.0': - resolution: {integrity: sha512-zM+nnqZpiQj20PyAh6uvgdSz+hD7Rj7UfAZwizqNP+bLvcbGXZwABERobuilkCQqyDBBH4uv0yqIcPRl8dSBEg==} + '@algolia/requester-node-http@5.25.0': + resolution: {integrity: sha512-ZO0UKvDyEFvyeJQX0gmZDQEvhLZ2X10K+ps6hViMo1HgE2V8em00SwNsQ+7E/52a+YiBkVWX61pJJJE44juDMQ==} engines: {node: '>= 14.0.0'} '@ampproject/remapping@2.3.0': @@ -242,8 +242,8 @@ packages: resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.27.1': - resolution: {integrity: sha512-Q+E+rd/yBzNQhXkG+zQnF58e4zoZfBedaxwzPmicKsiK3nt8iJYrSrDbjwFFDGC4f+rPafqRaPH6TsDoSvMf7A==} + '@babel/compat-data@7.27.2': + resolution: {integrity: sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==} engines: {node: '>=6.9.0'} '@babel/core@7.27.1': @@ -254,8 +254,8 @@ packages: resolution: {integrity: sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.27.1': - resolution: {integrity: sha512-2YaDd/Rd9E598B5+WIc8wJPmWETiiJXFYVE60oX8FDohv7rAUU3CQj+A1MgeEmcsk2+dQuEjIe/GDvig0SqL4g==} + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.27.1': @@ -288,8 +288,8 @@ packages: resolution: {integrity: sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==} engines: {node: '>=6.9.0'} - '@babel/parser@7.27.1': - resolution: {integrity: sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ==} + '@babel/parser@7.27.2': + resolution: {integrity: sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==} engines: {node: '>=6.0.0'} hasBin: true @@ -388,8 +388,8 @@ packages: resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} engines: {node: '>=6.9.0'} - '@babel/template@7.27.1': - resolution: {integrity: sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg==} + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} '@babel/traverse@7.27.1': @@ -467,8 +467,8 @@ packages: '@codemirror/state@6.5.2': resolution: {integrity: sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==} - '@codemirror/view@6.36.7': - resolution: {integrity: sha512-kCWGW/chWGPgZqfZ36Um9Iz0X2IVpmCjg1P/qY6B6a2ecXtWRRAigmpJ6YgUQ5lTWXMyyVdfmpzhLZmsZQMbtg==} + '@codemirror/view@6.36.8': + resolution: {integrity: sha512-yoRo4f+FdnD01fFt4XpfpMCcCAo9QvZOtbrXExn4SqzH32YC6LgzqxfLZw/r6Ge65xyY03mK/UfUqrVw1gFiFg==} '@docsearch/css@3.8.2': resolution: {integrity: sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==} @@ -838,15 +838,15 @@ packages: resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.2': - resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} '@hypersphere/omnibus@0.1.6': resolution: {integrity: sha512-agZuKyhdW0n1JoLYZUuA6Du1QoQn39/LapFgRtbJs7fyRM62C9O2PWISHUCwAKnC1Splshpd8glQgx5pA2zkCg==} - '@iconify-json/simple-icons@1.2.33': - resolution: {integrity: sha512-nL5/UmI9x5PQ/AHv6bOaL2pH6twEdEz4pI89efB/K7HFn5etQnxMtGx9DFlOg/sRA2/yFpX8KXvc95CSDv5bJA==} + '@iconify-json/simple-icons@1.2.34': + resolution: {integrity: sha512-1FRWEA94hSl5zmBogRh6lQL36l7bVTfrl0n5+QJ+WmXmw70RccPT5phqeiSynwo3IhUWKoW2LiajyUMeweXW8g==} '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} @@ -1297,11 +1297,11 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@22.15.12': - resolution: {integrity: sha512-K0fpC/ZVeb8G9rm7bH7vI0KAec4XHEhBam616nVJCV51bKzJ6oA3luG4WdKoaztxe70QaNjS/xBmcDLmr4PiGw==} + '@types/node@22.15.18': + resolution: {integrity: sha512-v1DKRfUdyW+jJhZNEI1PYy29S2YRxMV5AOO/x/SjKmW0acCIOqmbj6Haf9eHAhsPmrhlHSxEhv/1WszcLWV4cg==} - '@types/papaparse@5.3.15': - resolution: {integrity: sha512-JHe6vF6x/8Z85nCX4yFdDslN11d+1pr12E526X8WAfhadOeaOTx5AuIkvDKIBopfvlzpzkdMx4YyvSKCM9oqtw==} + '@types/papaparse@5.3.16': + resolution: {integrity: sha512-T3VuKMC2H0lgsjI9buTB3uuKj3EMD2eap1MOuEQuBQ44EnDx/IkGhU6EwiTf9zG3za4SKlmwKAImdDKdNnCsXg==} '@types/responselike@1.0.3': resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} @@ -1338,8 +1338,8 @@ packages: typescript: optional: true - '@typescript-eslint/eslint-plugin@8.32.0': - resolution: {integrity: sha512-/jU9ettcntkBFmWUzzGgsClEi2ZFiikMX5eEQsmxIAWMOn4H3D4rvHssstmAHGVvrYnaMqdWWWg0b5M6IN/MTQ==} + '@typescript-eslint/eslint-plugin@8.32.1': + resolution: {integrity: sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 @@ -1356,8 +1356,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.32.0': - resolution: {integrity: sha512-B2MdzyWxCE2+SqiZHAjPphft+/2x2FlO9YBx7eKE1BCb+rqBlQdhtAEhzIEdozHd55DXPmxBdpMygFJjfjjA9A==} + '@typescript-eslint/parser@8.32.1': + resolution: {integrity: sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -1367,8 +1367,8 @@ packages: resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/scope-manager@8.32.0': - resolution: {integrity: sha512-jc/4IxGNedXkmG4mx4nJTILb6TMjL66D41vyeaPWvDUmeYQzF3lKtN15WsAeTr65ce4mPxwopPSo1yUUAWw0hQ==} + '@typescript-eslint/scope-manager@8.32.1': + resolution: {integrity: sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/type-utils@7.18.0': @@ -1381,8 +1381,8 @@ packages: typescript: optional: true - '@typescript-eslint/type-utils@8.32.0': - resolution: {integrity: sha512-t2vouuYQKEKSLtJaa5bB4jHeha2HJczQ6E5IXPDPgIty9EqcJxpr1QHQ86YyIPwDwxvUmLfP2YADQ5ZY4qddZg==} + '@typescript-eslint/type-utils@8.32.1': + resolution: {integrity: sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -1392,8 +1392,8 @@ packages: resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/types@8.32.0': - resolution: {integrity: sha512-O5Id6tGadAZEMThM6L9HmVf5hQUXNSxLVKeGJYWNhhVseps/0LddMkp7//VDkzwJ69lPL0UmZdcZwggj9akJaA==} + '@typescript-eslint/types@8.32.1': + resolution: {integrity: sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@7.18.0': @@ -1405,8 +1405,8 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@8.32.0': - resolution: {integrity: sha512-pU9VD7anSCOIoBFnhTGfOzlVFQIA1XXiQpH/CezqOBaDppRwTglJzCC6fUQGpfwey4T183NKhF1/mfatYmjRqQ==} + '@typescript-eslint/typescript-estree@8.32.1': + resolution: {integrity: sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' @@ -1417,8 +1417,8 @@ packages: peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/utils@8.32.0': - resolution: {integrity: sha512-8S9hXau6nQ/sYVtC3D6ISIDoJzS1NsCK+gluVhLN2YkBPX+/1wkwyUiDKnxRh15579WoOIyVWnoyIf3yGI9REw==} + '@typescript-eslint/utils@8.32.1': + resolution: {integrity: sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -1428,8 +1428,8 @@ packages: resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/visitor-keys@8.32.0': - resolution: {integrity: sha512-1rYQTCLFFzOI5Nl0c8LUpJT8HxpwVRn9E4CkMsYfuN6ctmQqExjSTzzSk0Tz2apmXy7WU6/6fyaZVVA/thPN+w==} + '@typescript-eslint/visitor-keys@8.32.1': + resolution: {integrity: sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.3.0': @@ -1438,24 +1438,24 @@ packages: '@vanakat/plugin-api@0.2.1': resolution: {integrity: sha512-m2gVJFTPoIG+fUDAWYPPW/XoywBXrGtYOZFZdQHZmL62Zoc9NntCID76/Wu17DAanQ4aiZN8yRHHXlfq6sPvsQ==} - '@vitejs/plugin-vue@5.2.3': - resolution: {integrity: sha512-IYSLEQj4LgZZuoVpdSUCw3dIynTWQgPlaRP6iAvMle4My0HdYwr5g5wQAfwOeHQBmYwEkqF70nRpSilr6PoUDg==} + '@vitejs/plugin-vue@5.2.4': + resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: vite: ^5.0.0 || ^6.0.0 vue: ^3.2.25 - '@vue/compiler-core@3.5.13': - resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} + '@vue/compiler-core@3.5.14': + resolution: {integrity: sha512-k7qMHMbKvoCXIxPhquKQVw3Twid3Kg4s7+oYURxLGRd56LiuHJVrvFKI4fm2AM3c8apqODPfVJGoh8nePbXMRA==} - '@vue/compiler-dom@3.5.13': - resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} + '@vue/compiler-dom@3.5.14': + resolution: {integrity: sha512-1aOCSqxGOea5I80U2hQJvXYpPm/aXo95xL/m/mMhgyPUsKe9jhjwWpziNAw7tYRnbz1I61rd9Mld4W9KmmRoug==} - '@vue/compiler-sfc@3.5.13': - resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} + '@vue/compiler-sfc@3.5.14': + resolution: {integrity: sha512-9T6m/9mMr81Lj58JpzsiSIjBgv2LiVoWjIVa7kuXHICUi8LiDSIotMpPRXYJsXKqyARrzjT24NAwttrMnMaCXA==} - '@vue/compiler-ssr@3.5.13': - resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} + '@vue/compiler-ssr@3.5.14': + resolution: {integrity: sha512-Y0G7PcBxr1yllnHuS/NxNCSPWnRGH4Ogrp0tsLA5QemDZuJLs99YjAKQ7KqkHE0vCg4QTKlQzXLKCMF7WPSl7Q==} '@vue/devtools-api@7.7.6': resolution: {integrity: sha512-b2Xx0KvXZObePpXPYHvBRRJLDQn5nhKjXh7vUhMEtWxz1AYNFOVIsh5+HLP8xDGL7sy+Q7hXeUxPHB/KgbtsPw==} @@ -1466,22 +1466,22 @@ packages: '@vue/devtools-shared@7.7.6': resolution: {integrity: sha512-yFEgJZ/WblEsojQQceuyK6FzpFDx4kqrz2ohInxNj5/DnhoX023upTv4OD6lNPLAA5LLkbwPVb10o/7b+Y4FVA==} - '@vue/reactivity@3.5.13': - resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} + '@vue/reactivity@3.5.14': + resolution: {integrity: sha512-7cK1Hp343Fu/SUCCO52vCabjvsYu7ZkOqyYu7bXV9P2yyfjUMUXHZafEbq244sP7gf+EZEz+77QixBTuEqkQQw==} - '@vue/runtime-core@3.5.13': - resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} + '@vue/runtime-core@3.5.14': + resolution: {integrity: sha512-w9JWEANwHXNgieAhxPpEpJa+0V5G0hz3NmjAZwlOebtfKyp2hKxKF0+qSh0Xs6/PhfGihuSdqMprMVcQU/E6ag==} - '@vue/runtime-dom@3.5.13': - resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} + '@vue/runtime-dom@3.5.14': + resolution: {integrity: sha512-lCfR++IakeI35TVR80QgOelsUIdcKjd65rWAMfdSlCYnaEY5t3hYwru7vvcWaqmrK+LpI7ZDDYiGU5V3xjMacw==} - '@vue/server-renderer@3.5.13': - resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} + '@vue/server-renderer@3.5.14': + resolution: {integrity: sha512-Rf/ISLqokIvcySIYnv3tNWq40PLpNLDLSJwwVWzG6MNtyIhfbcrAxo5ZL9nARJhqjZyWWa40oRb2IDuejeuv6w==} peerDependencies: - vue: 3.5.13 + vue: 3.5.14 - '@vue/shared@3.5.13': - resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + '@vue/shared@3.5.14': + resolution: {integrity: sha512-oXTwNxVfc9EtP1zzXAlSlgARLXNC84frFYkS0HHz0h3E4WZSP9sywqjqzGCP9Y34M8ipNmd380pVgmMuwELDyQ==} '@vueuse/core@12.8.2': resolution: {integrity: sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==} @@ -1552,11 +1552,11 @@ packages: ag-charts-types@10.3.5: resolution: {integrity: sha512-DtvV+IS4RlocGV2IcaQOe/eM6eBGGCvkLnwxGkDxKa8ddxivv90fwlfPxK0O5XnVectiKtWFfOw35Cm0k+4vMw==} - ag-charts-types@11.2.4: - resolution: {integrity: sha512-a1aQjtQ9ZH+J8BF3YcWAIHUt9ZLiL9IVZ8R5h7z2CkTNu2TPq5UlsCcF0/YZKc1M8CM0CdSNLSGQuWUwDNxAcA==} + ag-charts-types@11.3.0: + resolution: {integrity: sha512-FXyk24PizYS4QoPTk7FVaFDgvmZYBQo6sgl5n3lkHugTNTZBtwBmN3i4JnBXgNjGDB6Q05MRkoBA2rvW8rPBag==} - ag-grid-community@33.2.4: - resolution: {integrity: sha512-7XT1+wxmMlMVXB27BJOzlft9ATB0C5HOJcCGMc8dCO2W17JXbNknVEEDGTBKoSvA4Cei8sARrRDxmPgY8mWopQ==} + ag-grid-community@33.3.0: + resolution: {integrity: sha512-Nr7Wd3Qc0tbR+BWZ4y8LgEwLkHTvrtJ4f4k5eb4zuoNZFM52MyLfu+m4OAplIm9nOVBdp5tg/ALWvu13jak+Nw==} agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} @@ -1573,8 +1573,8 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - algoliasearch@5.24.0: - resolution: {integrity: sha512-CkaUygzZ91Xbw11s0CsHMawrK3tl+Ue57725HGRgRzKgt2Z4wvXVXRCtQfvzh8K7Tp4Zp7f1pyHAtMROtTJHxg==} + algoliasearch@5.25.0: + resolution: {integrity: sha512-n73BVorL4HIwKlfJKb4SEzAYkR3Buwfwbh+MYxg2mloFph2fFGV58E90QTzdbfzWrLn4HE5Czx/WTjI8fcHaMg==} engines: {node: '>= 14.0.0'} ansi-colors@4.1.3: @@ -1738,8 +1738,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001717: - resolution: {integrity: sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw==} + caniuse-lite@1.0.30001718: + resolution: {integrity: sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -1851,8 +1851,8 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1940,8 +1940,8 @@ packages: deprecated: Please use @electron/rebuild moving forward. There is no API change, just a package name change hasBin: true - electron-to-chromium@1.5.150: - resolution: {integrity: sha512-rOOkP2ZUMx1yL4fCxXQKDHQ8ZXwisb2OycOQVKHgvB3ZI4CvehOd4y2tfnnLDieJ3Zs1RL1Dlp3cMkyIn7nnXA==} + electron-to-chromium@1.5.155: + resolution: {integrity: sha512-ps5KcGGmwL8VaeJlvlDlu4fORQpv3+GIcF5I3f9tUKUlJ/wsysh6HU8P5L1XWRYeXfA0oJd4PyM8ds8zTFf6Ng==} emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} @@ -2308,8 +2308,8 @@ packages: html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} http-proxy-agent@5.0.0: resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} @@ -2349,6 +2349,10 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + ignore@7.0.4: + resolution: {integrity: sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==} + engines: {node: '>= 4'} + immutable@5.1.2: resolution: {integrity: sha512-qHKXW1q6liAk1Oys6umoaZbDRqjcjgSrbnrifHsfsttza7zcvRAsL7mMV6xWcyhwQy7Xj5v4hhbr6b+iDYwlmQ==} @@ -3069,8 +3073,8 @@ packages: resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} - preact@10.26.5: - resolution: {integrity: sha512-fmpDkgfGU6JYux9teDWLhj9mKN55tyepwYbxHgQuIxbWQzgFg5vk7Mrrtfx7xRxq798ynkY4DDDxZr235Kk+4w==} + preact@10.26.6: + resolution: {integrity: sha512-5SRRBinwpwkaD+OqlBDeITlRgvd8I8QlxHJw9AxSdMNV6O+LodN9nUyYGpSF7sadHjs6RzeFShMexC6DbtWr9g==} prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} @@ -3110,8 +3114,8 @@ packages: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} - property-information@7.0.0: - resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} pump@3.0.2: resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} @@ -3372,8 +3376,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.1: - resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} engines: {node: '>=10'} hasBin: true @@ -3568,8 +3572,8 @@ packages: peerDependencies: typescript: '>=4.8.4' - ts-jest@29.3.2: - resolution: {integrity: sha512-bJJkrWc6PjFVz5g2DGCNUo8z7oFEYaz1xP1NpeDU7KNLMWPpEyV8Chbpkn8xjzgRDpQhnGMyvyldoL7h8JXyug==} + ts-jest@29.3.4: + resolution: {integrity: sha512-Iqbrm8IXOmV+ggWHOTEbjwyCf2xZlUMv5npExksXohL+tk8va4Fjhb+X2+Rt9NBmgO7bJ8WpnMLOwih/DnMlFA==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -3746,8 +3750,8 @@ packages: postcss: optional: true - vue@3.5.13: - resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} + vue@3.5.14: + resolution: {integrity: sha512-LbOm50/vZFG6Mhy6KscQYXZMQ0LMCC/y40HDJPPvGFQ+i/lUH+PJHR6C3assgOQiXdl6tAfsXHbXYVBZZu65ew==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -3830,110 +3834,110 @@ snapshots: '@ag-grid-community/core': 32.3.5 tslib: 2.8.1 - '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.24.0)(algoliasearch@5.24.0)(search-insights@2.17.3)': + '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.25.0)(algoliasearch@5.25.0)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.24.0)(algoliasearch@5.24.0)(search-insights@2.17.3) - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.24.0)(algoliasearch@5.24.0) + '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.25.0)(algoliasearch@5.25.0)(search-insights@2.17.3) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.25.0)(algoliasearch@5.25.0) transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - search-insights - '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.24.0)(algoliasearch@5.24.0)(search-insights@2.17.3)': + '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.25.0)(algoliasearch@5.25.0)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.24.0)(algoliasearch@5.24.0) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.25.0)(algoliasearch@5.25.0) search-insights: 2.17.3 transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.24.0)(algoliasearch@5.24.0)': + '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.25.0)(algoliasearch@5.25.0)': dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.24.0)(algoliasearch@5.24.0) - '@algolia/client-search': 5.24.0 - algoliasearch: 5.24.0 + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.25.0)(algoliasearch@5.25.0) + '@algolia/client-search': 5.25.0 + algoliasearch: 5.25.0 - '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.24.0)(algoliasearch@5.24.0)': + '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.25.0)(algoliasearch@5.25.0)': dependencies: - '@algolia/client-search': 5.24.0 - algoliasearch: 5.24.0 + '@algolia/client-search': 5.25.0 + algoliasearch: 5.25.0 - '@algolia/client-abtesting@5.24.0': + '@algolia/client-abtesting@5.25.0': dependencies: - '@algolia/client-common': 5.24.0 - '@algolia/requester-browser-xhr': 5.24.0 - '@algolia/requester-fetch': 5.24.0 - '@algolia/requester-node-http': 5.24.0 + '@algolia/client-common': 5.25.0 + '@algolia/requester-browser-xhr': 5.25.0 + '@algolia/requester-fetch': 5.25.0 + '@algolia/requester-node-http': 5.25.0 - '@algolia/client-analytics@5.24.0': + '@algolia/client-analytics@5.25.0': dependencies: - '@algolia/client-common': 5.24.0 - '@algolia/requester-browser-xhr': 5.24.0 - '@algolia/requester-fetch': 5.24.0 - '@algolia/requester-node-http': 5.24.0 + '@algolia/client-common': 5.25.0 + '@algolia/requester-browser-xhr': 5.25.0 + '@algolia/requester-fetch': 5.25.0 + '@algolia/requester-node-http': 5.25.0 - '@algolia/client-common@5.24.0': {} + '@algolia/client-common@5.25.0': {} - '@algolia/client-insights@5.24.0': + '@algolia/client-insights@5.25.0': dependencies: - '@algolia/client-common': 5.24.0 - '@algolia/requester-browser-xhr': 5.24.0 - '@algolia/requester-fetch': 5.24.0 - '@algolia/requester-node-http': 5.24.0 + '@algolia/client-common': 5.25.0 + '@algolia/requester-browser-xhr': 5.25.0 + '@algolia/requester-fetch': 5.25.0 + '@algolia/requester-node-http': 5.25.0 - '@algolia/client-personalization@5.24.0': + '@algolia/client-personalization@5.25.0': dependencies: - '@algolia/client-common': 5.24.0 - '@algolia/requester-browser-xhr': 5.24.0 - '@algolia/requester-fetch': 5.24.0 - '@algolia/requester-node-http': 5.24.0 + '@algolia/client-common': 5.25.0 + '@algolia/requester-browser-xhr': 5.25.0 + '@algolia/requester-fetch': 5.25.0 + '@algolia/requester-node-http': 5.25.0 - '@algolia/client-query-suggestions@5.24.0': + '@algolia/client-query-suggestions@5.25.0': dependencies: - '@algolia/client-common': 5.24.0 - '@algolia/requester-browser-xhr': 5.24.0 - '@algolia/requester-fetch': 5.24.0 - '@algolia/requester-node-http': 5.24.0 + '@algolia/client-common': 5.25.0 + '@algolia/requester-browser-xhr': 5.25.0 + '@algolia/requester-fetch': 5.25.0 + '@algolia/requester-node-http': 5.25.0 - '@algolia/client-search@5.24.0': + '@algolia/client-search@5.25.0': dependencies: - '@algolia/client-common': 5.24.0 - '@algolia/requester-browser-xhr': 5.24.0 - '@algolia/requester-fetch': 5.24.0 - '@algolia/requester-node-http': 5.24.0 + '@algolia/client-common': 5.25.0 + '@algolia/requester-browser-xhr': 5.25.0 + '@algolia/requester-fetch': 5.25.0 + '@algolia/requester-node-http': 5.25.0 - '@algolia/ingestion@1.24.0': + '@algolia/ingestion@1.25.0': dependencies: - '@algolia/client-common': 5.24.0 - '@algolia/requester-browser-xhr': 5.24.0 - '@algolia/requester-fetch': 5.24.0 - '@algolia/requester-node-http': 5.24.0 + '@algolia/client-common': 5.25.0 + '@algolia/requester-browser-xhr': 5.25.0 + '@algolia/requester-fetch': 5.25.0 + '@algolia/requester-node-http': 5.25.0 - '@algolia/monitoring@1.24.0': + '@algolia/monitoring@1.25.0': dependencies: - '@algolia/client-common': 5.24.0 - '@algolia/requester-browser-xhr': 5.24.0 - '@algolia/requester-fetch': 5.24.0 - '@algolia/requester-node-http': 5.24.0 + '@algolia/client-common': 5.25.0 + '@algolia/requester-browser-xhr': 5.25.0 + '@algolia/requester-fetch': 5.25.0 + '@algolia/requester-node-http': 5.25.0 - '@algolia/recommend@5.24.0': + '@algolia/recommend@5.25.0': dependencies: - '@algolia/client-common': 5.24.0 - '@algolia/requester-browser-xhr': 5.24.0 - '@algolia/requester-fetch': 5.24.0 - '@algolia/requester-node-http': 5.24.0 + '@algolia/client-common': 5.25.0 + '@algolia/requester-browser-xhr': 5.25.0 + '@algolia/requester-fetch': 5.25.0 + '@algolia/requester-node-http': 5.25.0 - '@algolia/requester-browser-xhr@5.24.0': + '@algolia/requester-browser-xhr@5.25.0': dependencies: - '@algolia/client-common': 5.24.0 + '@algolia/client-common': 5.25.0 - '@algolia/requester-fetch@5.24.0': + '@algolia/requester-fetch@5.25.0': dependencies: - '@algolia/client-common': 5.24.0 + '@algolia/client-common': 5.25.0 - '@algolia/requester-node-http@5.24.0': + '@algolia/requester-node-http@5.25.0': dependencies: - '@algolia/client-common': 5.24.0 + '@algolia/client-common': 5.25.0 '@ampproject/remapping@2.3.0': dependencies: @@ -3946,22 +3950,22 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.27.1': {} + '@babel/compat-data@7.27.2': {} '@babel/core@7.27.1': dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.27.1 '@babel/generator': 7.27.1 - '@babel/helper-compilation-targets': 7.27.1 + '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.1) '@babel/helpers': 7.27.1 - '@babel/parser': 7.27.1 - '@babel/template': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/template': 7.27.2 '@babel/traverse': 7.27.1 '@babel/types': 7.27.1 convert-source-map: 2.0.0 - debug: 4.4.0 + debug: 4.4.1 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -3970,15 +3974,15 @@ snapshots: '@babel/generator@7.27.1': dependencies: - '@babel/parser': 7.27.1 + '@babel/parser': 7.27.2 '@babel/types': 7.27.1 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 - '@babel/helper-compilation-targets@7.27.1': + '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.27.1 + '@babel/compat-data': 7.27.2 '@babel/helper-validator-option': 7.27.1 browserslist: 4.24.5 lru-cache: 5.1.1 @@ -4010,10 +4014,10 @@ snapshots: '@babel/helpers@7.27.1': dependencies: - '@babel/template': 7.27.1 + '@babel/template': 7.27.2 '@babel/types': 7.27.1 - '@babel/parser@7.27.1': + '@babel/parser@7.27.2': dependencies: '@babel/types': 7.27.1 @@ -4104,20 +4108,20 @@ snapshots: '@babel/runtime@7.27.1': {} - '@babel/template@7.27.1': + '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 - '@babel/parser': 7.27.1 + '@babel/parser': 7.27.2 '@babel/types': 7.27.1 '@babel/traverse@7.27.1': dependencies: '@babel/code-frame': 7.27.1 '@babel/generator': 7.27.1 - '@babel/parser': 7.27.1 - '@babel/template': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/template': 7.27.2 '@babel/types': 7.27.1 - debug: 4.4.0 + debug: 4.4.1 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -4145,7 +4149,7 @@ snapshots: outdent: 0.5.0 prettier: 2.8.8 resolve-from: 5.0.0 - semver: 7.7.1 + semver: 7.7.2 '@changesets/assemble-release-plan@6.0.8': dependencies: @@ -4154,7 +4158,7 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 - semver: 7.7.1 + semver: 7.7.2 '@changesets/changelog-git@0.2.1': dependencies: @@ -4187,7 +4191,7 @@ snapshots: package-manager-detector: 0.2.11 picocolors: 1.1.1 resolve-from: 5.0.0 - semver: 7.7.1 + semver: 7.7.2 spawndamnit: 3.0.1 term-size: 2.2.1 @@ -4210,7 +4214,7 @@ snapshots: '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 picocolors: 1.1.1 - semver: 7.7.1 + semver: 7.7.2 '@changesets/get-release-plan@4.0.12': dependencies: @@ -4276,7 +4280,7 @@ snapshots: '@codemirror/language@6.11.0': dependencies: '@codemirror/state': 6.5.2 - '@codemirror/view': 6.36.7 + '@codemirror/view': 6.36.8 '@lezer/common': 1.2.3 '@lezer/highlight': 1.2.1 '@lezer/lr': 1.4.2 @@ -4286,7 +4290,7 @@ snapshots: dependencies: '@marijn/find-cluster-break': 1.0.2 - '@codemirror/view@6.36.7': + '@codemirror/view@6.36.8': dependencies: '@codemirror/state': 6.5.2 style-mod: 4.1.2 @@ -4294,10 +4298,10 @@ snapshots: '@docsearch/css@3.8.2': {} - '@docsearch/js@3.8.2(@algolia/client-search@5.24.0)(search-insights@2.17.3)': + '@docsearch/js@3.8.2(@algolia/client-search@5.25.0)(search-insights@2.17.3)': dependencies: - '@docsearch/react': 3.8.2(@algolia/client-search@5.24.0)(search-insights@2.17.3) - preact: 10.26.5 + '@docsearch/react': 3.8.2(@algolia/client-search@5.25.0)(search-insights@2.17.3) + preact: 10.26.6 transitivePeerDependencies: - '@algolia/client-search' - '@types/react' @@ -4305,12 +4309,12 @@ snapshots: - react-dom - search-insights - '@docsearch/react@3.8.2(@algolia/client-search@5.24.0)(search-insights@2.17.3)': + '@docsearch/react@3.8.2(@algolia/client-search@5.25.0)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.24.0)(algoliasearch@5.24.0)(search-insights@2.17.3) - '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.24.0)(algoliasearch@5.24.0) + '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.25.0)(algoliasearch@5.25.0)(search-insights@2.17.3) + '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.25.0)(algoliasearch@5.25.0) '@docsearch/css': 3.8.2 - algoliasearch: 5.24.0 + algoliasearch: 5.25.0 optionalDependencies: search-insights: 2.17.3 transitivePeerDependencies: @@ -4470,7 +4474,7 @@ snapshots: '@eslint/config-array@0.19.2': dependencies: '@eslint/object-schema': 2.1.6 - debug: 4.4.0 + debug: 4.4.1 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -4486,7 +4490,7 @@ snapshots: '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.0 + debug: 4.4.1 espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 @@ -4519,11 +4523,11 @@ snapshots: '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.2': {} + '@humanwhocodes/retry@0.4.3': {} '@hypersphere/omnibus@0.1.6': {} - '@iconify-json/simple-icons@1.2.33': + '@iconify-json/simple-icons@1.2.34': dependencies: '@iconify/types': 2.0.0 @@ -4542,7 +4546,7 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 22.15.12 + '@types/node': 22.15.18 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -4555,14 +4559,14 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.12 + '@types/node': 22.15.18 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@22.15.12) + jest-config: 29.7.0(@types/node@22.15.18) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -4587,7 +4591,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.12 + '@types/node': 22.15.18 jest-mock: 29.7.0 '@jest/expect-utils@29.7.0': @@ -4605,7 +4609,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 22.15.12 + '@types/node': 22.15.18 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -4627,7 +4631,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 22.15.12 + '@types/node': 22.15.18 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -4697,7 +4701,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.15.12 + '@types/node': 22.15.18 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -4769,7 +4773,7 @@ snapshots: '@npmcli/fs@2.1.2': dependencies: '@gar/promisify': 1.1.3 - semver: 7.7.1 + semver: 7.7.2 '@npmcli/move-file@2.0.1': dependencies: @@ -4957,7 +4961,7 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.27.1 + '@babel/parser': 7.27.2 '@babel/types': 7.27.1 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 @@ -4969,7 +4973,7 @@ snapshots: '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.27.1 + '@babel/parser': 7.27.2 '@babel/types': 7.27.1 '@types/babel__traverse@7.20.7': @@ -4980,7 +4984,7 @@ snapshots: dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 22.15.12 + '@types/node': 22.15.18 '@types/responselike': 1.0.3 '@types/codemirror@5.60.8': @@ -5001,7 +5005,7 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 22.15.12 + '@types/node': 22.15.18 '@types/hast@3.0.4': dependencies: @@ -5030,7 +5034,7 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 22.15.12 + '@types/node': 22.15.18 '@types/linkify-it@5.0.0': {} @@ -5049,22 +5053,22 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@22.15.12': + '@types/node@22.15.18': dependencies: undici-types: 6.21.0 - '@types/papaparse@5.3.15': + '@types/papaparse@5.3.16': dependencies: - '@types/node': 22.15.12 + '@types/node': 22.15.18 '@types/responselike@1.0.3': dependencies: - '@types/node': 22.15.12 + '@types/node': 22.15.18 '@types/sql.js@1.4.9': dependencies: '@types/emscripten': 1.40.1 - '@types/node': 22.15.12 + '@types/node': 22.15.18 '@types/stack-utils@2.0.3': {} @@ -5100,17 +5104,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.32.0(@typescript-eslint/parser@8.32.0(eslint@9.15.0)(typescript@5.8.3))(eslint@9.15.0)(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.15.0)(typescript@5.8.3))(eslint@9.15.0)(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.32.0(eslint@9.15.0)(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.32.0 - '@typescript-eslint/type-utils': 8.32.0(eslint@9.15.0)(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.0(eslint@9.15.0)(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.32.0 + '@typescript-eslint/parser': 8.32.1(eslint@9.15.0)(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.32.1 + '@typescript-eslint/type-utils': 8.32.1(eslint@9.15.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.1(eslint@9.15.0)(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.32.1 eslint: 9.15.0 graphemer: 1.4.0 - ignore: 5.3.2 + ignore: 7.0.4 natural-compare: 1.4.0 ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 @@ -5123,20 +5127,20 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.4.5) '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.0 + debug: 4.4.1 eslint: 9.15.0 optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.32.0(eslint@9.15.0)(typescript@5.8.3)': + '@typescript-eslint/parser@8.32.1(eslint@9.15.0)(typescript@5.8.3)': dependencies: - '@typescript-eslint/scope-manager': 8.32.0 - '@typescript-eslint/types': 8.32.0 - '@typescript-eslint/typescript-estree': 8.32.0(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.32.0 - debug: 4.4.0 + '@typescript-eslint/scope-manager': 8.32.1 + '@typescript-eslint/types': 8.32.1 + '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.32.1 + debug: 4.4.1 eslint: 9.15.0 typescript: 5.8.3 transitivePeerDependencies: @@ -5147,16 +5151,16 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/scope-manager@8.32.0': + '@typescript-eslint/scope-manager@8.32.1': dependencies: - '@typescript-eslint/types': 8.32.0 - '@typescript-eslint/visitor-keys': 8.32.0 + '@typescript-eslint/types': 8.32.1 + '@typescript-eslint/visitor-keys': 8.32.1 '@typescript-eslint/type-utils@7.18.0(eslint@9.15.0)(typescript@5.4.5)': dependencies: '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.4.5) '@typescript-eslint/utils': 7.18.0(eslint@9.15.0)(typescript@5.4.5) - debug: 4.4.0 + debug: 4.4.1 eslint: 9.15.0 ts-api-utils: 1.4.3(typescript@5.4.5) optionalDependencies: @@ -5164,11 +5168,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.32.0(eslint@9.15.0)(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.32.1(eslint@9.15.0)(typescript@5.8.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.32.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.0(eslint@9.15.0)(typescript@5.8.3) - debug: 4.4.0 + '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.1(eslint@9.15.0)(typescript@5.8.3) + debug: 4.4.1 eslint: 9.15.0 ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 @@ -5177,32 +5181,32 @@ snapshots: '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/types@8.32.0': {} + '@typescript-eslint/types@8.32.1': {} '@typescript-eslint/typescript-estree@7.18.0(typescript@5.4.5)': dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.0 + debug: 4.4.1 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.1 + semver: 7.7.2 ts-api-utils: 1.4.3(typescript@5.4.5) optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.32.0(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.32.1(typescript@5.8.3)': dependencies: - '@typescript-eslint/types': 8.32.0 - '@typescript-eslint/visitor-keys': 8.32.0 - debug: 4.4.0 + '@typescript-eslint/types': 8.32.1 + '@typescript-eslint/visitor-keys': 8.32.1 + debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.1 + semver: 7.7.2 ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: @@ -5219,12 +5223,12 @@ snapshots: - supports-color - typescript - '@typescript-eslint/utils@8.32.0(eslint@9.15.0)(typescript@5.8.3)': + '@typescript-eslint/utils@8.32.1(eslint@9.15.0)(typescript@5.8.3)': dependencies: '@eslint-community/eslint-utils': 4.7.0(eslint@9.15.0) - '@typescript-eslint/scope-manager': 8.32.0 - '@typescript-eslint/types': 8.32.0 - '@typescript-eslint/typescript-estree': 8.32.0(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.32.1 + '@typescript-eslint/types': 8.32.1 + '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) eslint: 9.15.0 typescript: 5.8.3 transitivePeerDependencies: @@ -5235,18 +5239,18 @@ snapshots: '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.32.0': + '@typescript-eslint/visitor-keys@8.32.1': dependencies: - '@typescript-eslint/types': 8.32.0 + '@typescript-eslint/types': 8.32.1 eslint-visitor-keys: 4.2.0 '@ungap/structured-clone@1.3.0': {} - '@vanakat/plugin-api@0.2.1(@codemirror/state@6.5.2)(@codemirror/view@6.36.7)(eslint@9.15.0)': + '@vanakat/plugin-api@0.2.1(@codemirror/state@6.5.2)(@codemirror/view@6.36.8)(eslint@9.15.0)': dependencies: '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.15.0)(typescript@5.4.5))(eslint@9.15.0)(typescript@5.4.5) '@typescript-eslint/parser': 7.18.0(eslint@9.15.0)(typescript@5.4.5) - obsidian: 1.8.7(@codemirror/state@6.5.2)(@codemirror/view@6.36.7) + obsidian: 1.8.7(@codemirror/state@6.5.2)(@codemirror/view@6.36.8) typescript: 5.4.5 transitivePeerDependencies: - '@codemirror/state' @@ -5254,40 +5258,40 @@ snapshots: - eslint - supports-color - '@vitejs/plugin-vue@5.2.3(vite@5.4.19(@types/node@22.15.12)(sass-embedded@1.89.0)(sass@1.89.0))(vue@3.5.13(typescript@5.8.3))': + '@vitejs/plugin-vue@5.2.4(vite@5.4.19(@types/node@22.15.18)(sass-embedded@1.89.0)(sass@1.89.0))(vue@3.5.14(typescript@5.8.3))': dependencies: - vite: 5.4.19(@types/node@22.15.12)(sass-embedded@1.89.0)(sass@1.89.0) - vue: 3.5.13(typescript@5.8.3) + vite: 5.4.19(@types/node@22.15.18)(sass-embedded@1.89.0)(sass@1.89.0) + vue: 3.5.14(typescript@5.8.3) - '@vue/compiler-core@3.5.13': + '@vue/compiler-core@3.5.14': dependencies: - '@babel/parser': 7.27.1 - '@vue/shared': 3.5.13 + '@babel/parser': 7.27.2 + '@vue/shared': 3.5.14 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.5.13': + '@vue/compiler-dom@3.5.14': dependencies: - '@vue/compiler-core': 3.5.13 - '@vue/shared': 3.5.13 + '@vue/compiler-core': 3.5.14 + '@vue/shared': 3.5.14 - '@vue/compiler-sfc@3.5.13': + '@vue/compiler-sfc@3.5.14': dependencies: - '@babel/parser': 7.27.1 - '@vue/compiler-core': 3.5.13 - '@vue/compiler-dom': 3.5.13 - '@vue/compiler-ssr': 3.5.13 - '@vue/shared': 3.5.13 + '@babel/parser': 7.27.2 + '@vue/compiler-core': 3.5.14 + '@vue/compiler-dom': 3.5.14 + '@vue/compiler-ssr': 3.5.14 + '@vue/shared': 3.5.14 estree-walker: 2.0.2 magic-string: 0.30.17 postcss: 8.5.3 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.13': + '@vue/compiler-ssr@3.5.14': dependencies: - '@vue/compiler-dom': 3.5.13 - '@vue/shared': 3.5.13 + '@vue/compiler-dom': 3.5.14 + '@vue/shared': 3.5.14 '@vue/devtools-api@7.7.6': dependencies: @@ -5307,36 +5311,36 @@ snapshots: dependencies: rfdc: 1.4.1 - '@vue/reactivity@3.5.13': + '@vue/reactivity@3.5.14': dependencies: - '@vue/shared': 3.5.13 + '@vue/shared': 3.5.14 - '@vue/runtime-core@3.5.13': + '@vue/runtime-core@3.5.14': dependencies: - '@vue/reactivity': 3.5.13 - '@vue/shared': 3.5.13 + '@vue/reactivity': 3.5.14 + '@vue/shared': 3.5.14 - '@vue/runtime-dom@3.5.13': + '@vue/runtime-dom@3.5.14': dependencies: - '@vue/reactivity': 3.5.13 - '@vue/runtime-core': 3.5.13 - '@vue/shared': 3.5.13 + '@vue/reactivity': 3.5.14 + '@vue/runtime-core': 3.5.14 + '@vue/shared': 3.5.14 csstype: 3.1.3 - '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.8.3))': + '@vue/server-renderer@3.5.14(vue@3.5.14(typescript@5.8.3))': dependencies: - '@vue/compiler-ssr': 3.5.13 - '@vue/shared': 3.5.13 - vue: 3.5.13(typescript@5.8.3) + '@vue/compiler-ssr': 3.5.14 + '@vue/shared': 3.5.14 + vue: 3.5.14(typescript@5.8.3) - '@vue/shared@3.5.13': {} + '@vue/shared@3.5.14': {} '@vueuse/core@12.8.2(typescript@5.8.3)': dependencies: '@types/web-bluetooth': 0.0.21 '@vueuse/metadata': 12.8.2 '@vueuse/shared': 12.8.2(typescript@5.8.3) - vue: 3.5.13(typescript@5.8.3) + vue: 3.5.14(typescript@5.8.3) transitivePeerDependencies: - typescript @@ -5344,7 +5348,7 @@ snapshots: dependencies: '@vueuse/core': 12.8.2(typescript@5.8.3) '@vueuse/shared': 12.8.2(typescript@5.8.3) - vue: 3.5.13(typescript@5.8.3) + vue: 3.5.14(typescript@5.8.3) optionalDependencies: focus-trap: 7.6.4 transitivePeerDependencies: @@ -5354,7 +5358,7 @@ snapshots: '@vueuse/shared@12.8.2(typescript@5.8.3)': dependencies: - vue: 3.5.13(typescript@5.8.3) + vue: 3.5.14(typescript@5.8.3) transitivePeerDependencies: - typescript @@ -5372,15 +5376,15 @@ snapshots: ag-charts-types@10.3.5: {} - ag-charts-types@11.2.4: {} + ag-charts-types@11.3.0: {} - ag-grid-community@33.2.4: + ag-grid-community@33.3.0: dependencies: - ag-charts-types: 11.2.4 + ag-charts-types: 11.3.0 agent-base@6.0.2: dependencies: - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -5400,21 +5404,21 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - algoliasearch@5.24.0: + algoliasearch@5.25.0: dependencies: - '@algolia/client-abtesting': 5.24.0 - '@algolia/client-analytics': 5.24.0 - '@algolia/client-common': 5.24.0 - '@algolia/client-insights': 5.24.0 - '@algolia/client-personalization': 5.24.0 - '@algolia/client-query-suggestions': 5.24.0 - '@algolia/client-search': 5.24.0 - '@algolia/ingestion': 1.24.0 - '@algolia/monitoring': 1.24.0 - '@algolia/recommend': 5.24.0 - '@algolia/requester-browser-xhr': 5.24.0 - '@algolia/requester-fetch': 5.24.0 - '@algolia/requester-node-http': 5.24.0 + '@algolia/client-abtesting': 5.25.0 + '@algolia/client-analytics': 5.25.0 + '@algolia/client-common': 5.25.0 + '@algolia/client-insights': 5.25.0 + '@algolia/client-personalization': 5.25.0 + '@algolia/client-query-suggestions': 5.25.0 + '@algolia/client-search': 5.25.0 + '@algolia/ingestion': 1.25.0 + '@algolia/monitoring': 1.25.0 + '@algolia/recommend': 5.25.0 + '@algolia/requester-browser-xhr': 5.25.0 + '@algolia/requester-fetch': 5.25.0 + '@algolia/requester-node-http': 5.25.0 ansi-colors@4.1.3: {} @@ -5481,7 +5485,7 @@ snapshots: babel-plugin-jest-hoist@29.6.3: dependencies: - '@babel/template': 7.27.1 + '@babel/template': 7.27.2 '@babel/types': 7.27.1 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.7 @@ -5542,8 +5546,8 @@ snapshots: browserslist@4.24.5: dependencies: - caniuse-lite: 1.0.30001717 - electron-to-chromium: 1.5.150 + caniuse-lite: 1.0.30001718 + electron-to-chromium: 1.5.155 node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.24.5) @@ -5595,7 +5599,7 @@ snapshots: dependencies: clone-response: 1.0.3 get-stream: 5.2.0 - http-cache-semantics: 4.1.1 + http-cache-semantics: 4.2.0 keyv: 4.5.4 lowercase-keys: 2.0.0 normalize-url: 6.1.0 @@ -5624,7 +5628,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001717: {} + caniuse-lite@1.0.30001718: {} ccount@2.0.1: {} @@ -5699,13 +5703,13 @@ snapshots: dependencies: is-what: 4.1.16 - create-jest@29.7.0(@types/node@22.15.12): + create-jest@29.7.0(@types/node@22.15.18): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@22.15.12) + jest-config: 29.7.0(@types/node@22.15.18) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -5722,7 +5726,7 @@ snapshots: csstype@3.1.3: {} - debug@4.4.0: + debug@4.4.1: dependencies: ms: 2.1.3 @@ -5785,7 +5789,7 @@ snapshots: dependencies: '@malept/cross-spawn-promise': 2.0.0 chalk: 4.1.2 - debug: 4.4.0 + debug: 4.4.1 detect-libc: 2.0.4 fs-extra: 10.1.0 got: 11.8.6 @@ -5794,14 +5798,14 @@ snapshots: node-api-version: 0.1.4 node-gyp: 9.4.1 ora: 5.4.1 - semver: 7.7.1 + semver: 7.7.2 tar: 6.2.1 yargs: 17.7.2 transitivePeerDependencies: - bluebird - supports-color - electron-to-chromium@1.5.150: {} + electron-to-chromium@1.5.155: {} emittery@0.13.1: {} @@ -5948,13 +5952,13 @@ snapshots: '@eslint/plugin-kit': 0.2.8 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.2 + '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.7 '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0 + debug: 4.4.1 escape-string-regexp: 4.0.0 eslint-scope: 8.3.0 eslint-visitor-keys: 4.2.0 @@ -6257,7 +6261,7 @@ snapshots: hast-util-whitespace: 3.0.0 html-void-elements: 3.0.0 mdast-util-to-hast: 13.2.0 - property-information: 7.0.0 + property-information: 7.1.0 space-separated-tokens: 2.0.2 stringify-entities: 4.0.4 zwitch: 2.0.4 @@ -6272,13 +6276,13 @@ snapshots: html-void-elements@3.0.0: {} - http-cache-semantics@4.1.1: {} + http-cache-semantics@4.2.0: {} http-proxy-agent@5.0.0: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -6290,7 +6294,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -6315,6 +6319,8 @@ snapshots: ignore@5.3.2: {} + ignore@7.0.4: {} + immutable@5.1.2: {} import-fresh@3.3.1: @@ -6413,7 +6419,7 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.27.1 - '@babel/parser': 7.27.1 + '@babel/parser': 7.27.2 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -6423,10 +6429,10 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: '@babel/core': 7.27.1 - '@babel/parser': 7.27.1 + '@babel/parser': 7.27.2 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.7.1 + semver: 7.7.2 transitivePeerDependencies: - supports-color @@ -6438,7 +6444,7 @@ snapshots: istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.4.0 + debug: 4.4.1 istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -6468,7 +6474,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.12 + '@types/node': 22.15.18 chalk: 4.1.2 co: 4.6.0 dedent: 1.6.0 @@ -6488,16 +6494,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@22.15.12): + jest-cli@29.7.0(@types/node@22.15.18): dependencies: '@jest/core': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.15.12) + create-jest: 29.7.0(@types/node@22.15.18) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@22.15.12) + jest-config: 29.7.0(@types/node@22.15.18) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -6507,7 +6513,7 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@22.15.12): + jest-config@29.7.0(@types/node@22.15.18): dependencies: '@babel/core': 7.27.1 '@jest/test-sequencer': 29.7.0 @@ -6532,7 +6538,7 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 22.15.12 + '@types/node': 22.15.18 transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -6561,7 +6567,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.12 + '@types/node': 22.15.18 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -6571,7 +6577,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 22.15.12 + '@types/node': 22.15.18 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -6610,7 +6616,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.15.12 + '@types/node': 22.15.18 jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -6645,7 +6651,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.12 + '@types/node': 22.15.18 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -6673,7 +6679,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.12 + '@types/node': 22.15.18 chalk: 4.1.2 cjs-module-lexer: 1.4.3 collect-v8-coverage: 1.0.2 @@ -6712,14 +6718,14 @@ snapshots: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.7.1 + semver: 7.7.2 transitivePeerDependencies: - supports-color jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.15.12 + '@types/node': 22.15.18 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -6738,7 +6744,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.12 + '@types/node': 22.15.18 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -6747,17 +6753,17 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 22.15.12 + '@types/node': 22.15.18 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@22.15.12): + jest@29.7.0(@types/node@22.15.18): dependencies: '@jest/core': 29.7.0 '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@22.15.12) + jest-cli: 29.7.0(@types/node@22.15.18) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -6870,7 +6876,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.1 + semver: 7.7.2 make-error@1.3.6: {} @@ -6878,7 +6884,7 @@ snapshots: dependencies: agentkeepalive: 4.6.0 cacache: 16.1.3 - http-cache-semantics: 4.1.1 + http-cache-semantics: 4.2.0 http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 is-lambda: 1.0.1 @@ -7021,7 +7027,7 @@ snapshots: node-abi@3.75.0: dependencies: - semver: 7.7.1 + semver: 7.7.2 node-addon-api@3.2.1: {} @@ -7030,7 +7036,7 @@ snapshots: node-api-version@0.1.4: dependencies: - semver: 7.7.1 + semver: 7.7.2 node-gyp-build@4.8.4: {} @@ -7044,7 +7050,7 @@ snapshots: nopt: 6.0.0 npmlog: 6.0.2 rimraf: 3.0.2 - semver: 7.7.1 + semver: 7.7.2 tar: 6.2.1 which: 2.0.2 transitivePeerDependencies: @@ -7074,10 +7080,10 @@ snapshots: gauge: 4.0.4 set-blocking: 2.0.0 - obsidian@1.8.7(@codemirror/state@6.5.2)(@codemirror/view@6.36.7): + obsidian@1.8.7(@codemirror/state@6.5.2)(@codemirror/view@6.36.8): dependencies: '@codemirror/state': 6.5.2 - '@codemirror/view': 6.36.7 + '@codemirror/view': 6.36.8 '@types/codemirror': 5.60.8 moment: 2.29.4 @@ -7210,7 +7216,7 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - preact@10.26.5: {} + preact@10.26.6: {} prelude-ls@1.1.2: {} @@ -7238,7 +7244,7 @@ snapshots: kleur: 3.0.3 sisteransi: 1.0.5 - property-information@7.0.0: {} + property-information@7.1.0: {} pump@3.0.2: dependencies: @@ -7473,7 +7479,7 @@ snapshots: semver@6.3.1: {} - semver@7.7.1: {} + semver@7.7.2: {} set-blocking@2.0.0: {} @@ -7516,7 +7522,7 @@ snapshots: socks-proxy-agent@7.0.0: dependencies: agent-base: 6.0.2 - debug: 4.4.0 + debug: 4.4.1 socks: 2.8.4 transitivePeerDependencies: - supports-color @@ -7657,17 +7663,17 @@ snapshots: dependencies: typescript: 5.8.3 - ts-jest@29.3.2(@babel/core@7.27.1)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.1))(esbuild@0.25.4)(jest@29.7.0(@types/node@22.15.12))(typescript@5.8.3): + ts-jest@29.3.4(@babel/core@7.27.1)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.1))(esbuild@0.25.4)(jest@29.7.0(@types/node@22.15.18))(typescript@5.8.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@22.15.12) + jest: 29.7.0(@types/node@22.15.18) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.7.1 + semver: 7.7.2 type-fest: 4.41.0 typescript: 5.8.3 yargs-parser: 21.1.1 @@ -7782,37 +7788,37 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite@5.4.19(@types/node@22.15.12)(sass-embedded@1.89.0)(sass@1.89.0): + vite@5.4.19(@types/node@22.15.18)(sass-embedded@1.89.0)(sass@1.89.0): dependencies: esbuild: 0.21.5 postcss: 8.5.3 rollup: 4.40.2 optionalDependencies: - '@types/node': 22.15.12 + '@types/node': 22.15.18 fsevents: 2.3.3 sass: 1.89.0 sass-embedded: 1.89.0 - vitepress@1.6.3(@algolia/client-search@5.24.0)(@types/node@22.15.12)(postcss@8.5.3)(sass-embedded@1.89.0)(sass@1.89.0)(search-insights@2.17.3)(typescript@5.8.3): + vitepress@1.6.3(@algolia/client-search@5.25.0)(@types/node@22.15.18)(postcss@8.5.3)(sass-embedded@1.89.0)(sass@1.89.0)(search-insights@2.17.3)(typescript@5.8.3): dependencies: '@docsearch/css': 3.8.2 - '@docsearch/js': 3.8.2(@algolia/client-search@5.24.0)(search-insights@2.17.3) - '@iconify-json/simple-icons': 1.2.33 + '@docsearch/js': 3.8.2(@algolia/client-search@5.25.0)(search-insights@2.17.3) + '@iconify-json/simple-icons': 1.2.34 '@shikijs/core': 2.5.0 '@shikijs/transformers': 2.5.0 '@shikijs/types': 2.5.0 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 5.2.3(vite@5.4.19(@types/node@22.15.12)(sass-embedded@1.89.0)(sass@1.89.0))(vue@3.5.13(typescript@5.8.3)) + '@vitejs/plugin-vue': 5.2.4(vite@5.4.19(@types/node@22.15.18)(sass-embedded@1.89.0)(sass@1.89.0))(vue@3.5.14(typescript@5.8.3)) '@vue/devtools-api': 7.7.6 - '@vue/shared': 3.5.13 + '@vue/shared': 3.5.14 '@vueuse/core': 12.8.2(typescript@5.8.3) '@vueuse/integrations': 12.8.2(focus-trap@7.6.4)(typescript@5.8.3) focus-trap: 7.6.4 mark.js: 8.11.1 minisearch: 7.1.2 shiki: 2.5.0 - vite: 5.4.19(@types/node@22.15.12)(sass-embedded@1.89.0)(sass@1.89.0) - vue: 3.5.13(typescript@5.8.3) + vite: 5.4.19(@types/node@22.15.18)(sass-embedded@1.89.0)(sass@1.89.0) + vue: 3.5.14(typescript@5.8.3) optionalDependencies: postcss: 8.5.3 transitivePeerDependencies: @@ -7842,13 +7848,13 @@ snapshots: - typescript - universal-cookie - vue@3.5.13(typescript@5.8.3): + vue@3.5.14(typescript@5.8.3): dependencies: - '@vue/compiler-dom': 3.5.13 - '@vue/compiler-sfc': 3.5.13 - '@vue/runtime-dom': 3.5.13 - '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.8.3)) - '@vue/shared': 3.5.13 + '@vue/compiler-dom': 3.5.14 + '@vue/compiler-sfc': 3.5.14 + '@vue/runtime-dom': 3.5.14 + '@vue/server-renderer': 3.5.14(vue@3.5.14(typescript@5.8.3)) + '@vue/shared': 3.5.14 optionalDependencies: typescript: 5.8.3 diff --git a/src/database/database.ts b/src/database/database.ts index 5d08eba..987b695 100644 --- a/src/database/database.ts +++ b/src/database/database.ts @@ -4,6 +4,7 @@ import * as Comlink from 'comlink' import workerCode from 'virtual:worker-code' import { WorkerDatabase } from "./worker/database"; import { sanitise } from "../utils/sanitiseColumn"; +import { ColumnDefinition } from "../utils/types"; export class SqlSealDatabase { db: Comlink.Remote @@ -83,6 +84,10 @@ export class SqlSealDatabase { await this.db.createTableNoTypes(name, columns, noDrop) } + async createTable(name: string, columns: ColumnDefinition[], noDrop?: boolean) { + this.db.createTable(name, columns, noDrop) + } + async createIndex(indexName: string, tableName: string, columns: string[]) { await this.db.createIndex(indexName, tableName, columns) } diff --git a/src/database/worker/database.ts b/src/database/worker/database.ts index ef7b920..e5915d4 100644 --- a/src/database/worker/database.ts +++ b/src/database/worker/database.ts @@ -9,7 +9,8 @@ import { SQLiteFS } from 'absurd-sql'; import IndexedDBBackend from '../../../node_modules/absurd-sql/dist/indexeddb-backend.js'; import type { BindParams, Database, Statement } from "sql.js"; import { sanitise } from "../../utils/sanitiseColumn"; -import { uniq } from "lodash"; +import { uniq, uniqBy } from "lodash"; +import { ColumnDefinition } from "../../utils/types"; function toObjectArray(stmt: Statement) { @@ -131,6 +132,22 @@ export class WorkerDatabase { this.db.run(createStmt) } + async createTable(tableName: string, columns: ColumnDefinition[], noDrop: boolean = false) { + const fields = uniqBy(columns.map(c => ({ + ...c, + name: sanitise(c.name) + })), 'name') + + if (!noDrop) { + await this.dropTable(tableName) + } + + const fieldDefinitions = fields.map(c => c.name) // Setting type inside engine changes nothing for SQLite + + const createStmt = `CREATE TABLE IF NOT EXISTS ${tableName}(${fieldDefinitions.join(', ')})` + this.db.run(createStmt) + } + async clearTable(tableName: string) { this.db.run(`DELETE FROM ${tableName}`) diff --git a/src/datamodel/sync.ts b/src/datamodel/sync.ts index 3a86f77..d7422ee 100644 --- a/src/datamodel/sync.ts +++ b/src/datamodel/sync.ts @@ -92,7 +92,7 @@ export class Sync { const { data, columns } = await syncObject.returnData() const tableName = entry.table_name - await this.db.createTableNoTypes(tableName, columns) + await this.db.createTable(tableName, columns) await this.db.insertData(tableName, data) await this.tableDefinitionsRepo.update(entry.id, { file_hash: file.stat.mtime.toString() }) this.bus.trigger('change::' + tableName) diff --git a/src/datamodel/syncStrategy/CsvFileSyncStrategy.ts b/src/datamodel/syncStrategy/CsvFileSyncStrategy.ts index baf00a4..186e41b 100644 --- a/src/datamodel/syncStrategy/CsvFileSyncStrategy.ts +++ b/src/datamodel/syncStrategy/CsvFileSyncStrategy.ts @@ -5,6 +5,7 @@ import { FilepathHasher } from "../../utils/hasher"; import { TableDefinitionExternal } from "../repository/tableDefinitions"; import { ParserTableDefinition } from "./types"; import { App } from "obsidian"; +import { loadConfig } from "../../utils/csvConfig"; const DEFAULT_FILE_HASH = '' @@ -60,12 +61,12 @@ export class CsvFileSyncStrategy extends ISyncStrategy { skipEmptyLines: true, transformHeader: sanitise }) - // const typeStatements = toTypeStatements(parsed.meta.fields ?? [], parsed.data) - // const columns = Object.entries(typeStatements.types).map(([key, value]) => ({ - // name: key, - // type: value as FieldTypes - // })); - return { data: parsed.data, columns: parsed.meta.fields ?? [] } + const config = await loadConfig(file, this.app.vault) + + return { data: parsed.data, columns: parsed.meta.fields?.map(f => ({ + name: f, + type: config.columnDefinitions[f]?.type ?? 'auto' as const + })) ?? [] } } } \ No newline at end of file diff --git a/src/datamodel/syncStrategy/JSONFileSyncStrategy.ts b/src/datamodel/syncStrategy/JSONFileSyncStrategy.ts index a547339..b11fc1e 100644 --- a/src/datamodel/syncStrategy/JSONFileSyncStrategy.ts +++ b/src/datamodel/syncStrategy/JSONFileSyncStrategy.ts @@ -53,7 +53,7 @@ export class JsonFileSyncStrategy extends ISyncStrategy { throw new Error('Resulting data is not an array') } - const columns = uniq(data.map(d => Object.keys(d)).flat()) + const columns = uniq(data.map(d => Object.keys(d)).flat()).map(c => ({ name: c, type: 'auto' as const })) return { columns, data: data } } diff --git a/src/datamodel/syncStrategy/MarkdownTableSyncStrategy.ts b/src/datamodel/syncStrategy/MarkdownTableSyncStrategy.ts index f60b99a..6316d5c 100644 --- a/src/datamodel/syncStrategy/MarkdownTableSyncStrategy.ts +++ b/src/datamodel/syncStrategy/MarkdownTableSyncStrategy.ts @@ -171,7 +171,7 @@ export class MarkdownTableSyncStrategy extends ISyncStrategy { return { data, - columns: headers ?? [] + columns: headers.map(c => ({ name: c, type: 'auto' as const })) ?? [] }; } } \ No newline at end of file diff --git a/src/datamodel/syncStrategy/abstractSyncStrategy.ts b/src/datamodel/syncStrategy/abstractSyncStrategy.ts index d56ad57..d54172e 100644 --- a/src/datamodel/syncStrategy/abstractSyncStrategy.ts +++ b/src/datamodel/syncStrategy/abstractSyncStrategy.ts @@ -1,6 +1,7 @@ import { App } from "obsidian"; import { TableDefinitionExternal } from "../repository/tableDefinitions"; import { ParserTableDefinition } from "./types"; +import { ColumnDefinition } from "../../utils/types"; export abstract class ISyncStrategy { constructor(protected def: TableDefinitionExternal, protected app: App) { @@ -11,7 +12,7 @@ export abstract class ISyncStrategy { } abstract returnData(): Promise<{ data: Record[], - columns: string[] + columns: ColumnDefinition[] }>; static async fromParser(def: ParserTableDefinition, app: App): Promise { diff --git a/src/renderer/GridRenderer.ts b/src/renderer/GridRenderer.ts index bf0eaab..c21953e 100644 --- a/src/renderer/GridRenderer.ts +++ b/src/renderer/GridRenderer.ts @@ -26,13 +26,13 @@ const getAgGridTheme = (theme: 'dark' | 'light') => { } as const } -class GridRendererCommunicator { +export class GridRendererCommunicator { constructor( private el: HTMLElement, private config: Partial, private plugin: SqlSealPlugin | null, private app: App, - private cellParser: ModernCellParser + private cellParser?: ModernCellParser ) { this.initialize() this.setupLayoutObservers() @@ -105,11 +105,11 @@ class GridRendererCommunicator { theme: myTheme, defaultColDef: { resizable: false, - cellRendererSelector: () => { + cellRendererSelector: this.cellParser ? () => { return { - component: ({ value }: { value: string }) => this.cellParser.render(value) + component: ({ value }: { value: string }) => this.cellParser!.render(value) } - }, + } : undefined, autoHeight: true }, autoSizeStrategy: { @@ -137,10 +137,6 @@ class GridRendererCommunicator { if (!this.gridApi) { throw new Error('Grid has not been initiated') } - this.gridApi.setGridOption('columnDefs', columns.map((c: any) => ({ - headerName: c, - valueGetter: (params) => params.data[c] - }))) this.gridApi.setGridOption('rowData', data) this.gridApi.setGridOption('loading', false) } @@ -194,7 +190,8 @@ export class GridRenderer implements RendererConfig { cleanup: () => { communicator.cleanup() communicator.gridApi.destroy() - } + }, + communicator } } } \ No newline at end of file diff --git a/src/renderer/ListRenderer.ts b/src/renderer/ListRenderer.ts index 8db8067..4c72949 100644 --- a/src/renderer/ListRenderer.ts +++ b/src/renderer/ListRenderer.ts @@ -57,7 +57,7 @@ export class ListRenderer implements RendererConfig { text: createEl('span', { text: c, cls: 'sqlseal-column-name' }) as any, // FIXME: this should be properly typed cls: singleCol ? ['sqlseal-list-element', 'sqlseal-list-element-single'] : ['sqlseal-list-element-single'] }) - const val: any = cellParser.render(d[c]) + const val: any = cellParser!.render(d[c]) el.append(val) el.dataset.sqlsealColumn = c }) diff --git a/src/renderer/MarkdownRenderer.ts b/src/renderer/MarkdownRenderer.ts index a0bccb0..725a9c1 100644 --- a/src/renderer/MarkdownRenderer.ts +++ b/src/renderer/MarkdownRenderer.ts @@ -5,7 +5,6 @@ import { RendererConfig, RendererContext } from "../renderer/rendererRegistry"; import { displayError } from "../utils/ui"; import { ViewDefinition } from "../grammar/parser"; import { ParseResults } from "../cellParser/parseResults"; -import { ModernCellParser } from "../cellParser/ModernCellParser"; const mapDataFromHeaders = (columns: string[], data: Record[]) => { return data.map(d => columns.map(c => String(d[c]))) @@ -31,7 +30,7 @@ export class MarkdownRenderer implements RendererConfig { } render(config: ReturnType, el: HTMLElement, { cellParser } : RendererContext) { - const parseResult = new ParseResults(cellParser) + const parseResult = new ParseResults(cellParser!) return { render: ({ columns, data }: any) => { const tab = getMarkdownTable({ diff --git a/src/renderer/TableRenderer.ts b/src/renderer/TableRenderer.ts index 992e931..05eb9c4 100644 --- a/src/renderer/TableRenderer.ts +++ b/src/renderer/TableRenderer.ts @@ -3,7 +3,6 @@ import { App } from "obsidian"; import { RendererConfig, RendererContext } from "../renderer/rendererRegistry"; import { displayError } from "../utils/ui"; import { ViewDefinition } from "../grammar/parser"; -import { ModernCellParser } from "../cellParser/ModernCellParser"; interface HTMLRendererConfig { classNames: string[] @@ -73,7 +72,7 @@ export class TableRenderer implements RendererConfig { data.forEach((d: any) => { const row = body.createEl("tr") columns.forEach((c: any) => { - const parsed = cellParser.render(d[c]) as string + const parsed = cellParser!.render(d[c]) as string if (adjustLayout) { const td = row.createEl("td") td.createSpan({ text: parsed }) diff --git a/src/renderer/TemplateRenderer.ts b/src/renderer/TemplateRenderer.ts index 70286fd..157b1ef 100644 --- a/src/renderer/TemplateRenderer.ts +++ b/src/renderer/TemplateRenderer.ts @@ -42,7 +42,7 @@ export class TemplateRenderer implements RendererConfig { render: ({ columns, data, frontmatter }: any) => { el.empty() - const parser = new ParseResults(cellParser, (el) => new Handlebars.SafeString(el.outerHTML)) + const parser = new ParseResults(cellParser!, (el) => new Handlebars.SafeString(el.outerHTML)) // Seems to be the only way to render handlebars into DOM. Don't like it but what can we do. el.innerHTML = config.template({ diff --git a/src/renderer/rendererRegistry.ts b/src/renderer/rendererRegistry.ts index 016e24b..f853c8b 100644 --- a/src/renderer/rendererRegistry.ts +++ b/src/renderer/rendererRegistry.ts @@ -7,7 +7,7 @@ export interface DataFormat { } export interface RendererContext { - cellParser: ModernCellParser, + cellParser?: ModernCellParser, sourcePath: string } diff --git a/src/styles/agGrid.scss b/src/styles/agGrid.scss new file mode 100644 index 0000000..bb16c27 --- /dev/null +++ b/src/styles/agGrid.scss @@ -0,0 +1,4 @@ +/* AG GRID CUSTOMS */ +.ag-checkbox-input { + opacity: 1 !important; +} \ No newline at end of file diff --git a/src/styles/main.scss b/src/styles/main.scss index 7009b0f..cde0305 100644 --- a/src/styles/main.scss +++ b/src/styles/main.scss @@ -3,4 +3,5 @@ @use 'inlineQueries'; @use 'listView'; @use 'syntaxHighlight'; -@use 'obsidianMinimal'; \ No newline at end of file +@use 'obsidianMinimal'; +@use 'agGrid'; \ No newline at end of file diff --git a/src/utils/csvConfig.ts b/src/utils/csvConfig.ts new file mode 100644 index 0000000..dc5a014 --- /dev/null +++ b/src/utils/csvConfig.ts @@ -0,0 +1,46 @@ +import { TFile, Vault } from "obsidian" +import { parse as jsonParse, stringify as jsonStringify } from 'json5' + + +// export type ColumnType = 'auto' | 'number' | 'text' +export type ColumnType = string + +interface ColumnDefinition { + type: ColumnType +} + +export interface ConfigObject { + columnDefinitions: {[key: string]: ColumnDefinition } +} + +export const loadConfig = async (file: TFile, vault: Vault): Promise => { + const config = { + columnDefinitions: {} + } + + // Now loading saved one + const configPath = file!.path + '.sqlsealconfig' + const configFile = vault.getFileByPath(configPath) + if (!configFile) { + return config + } + const loadedConfig = await vault.read(configFile) + // decode + const decoded = jsonParse(loadedConfig) + return decoded +} + +export const saveConfig = async (file: TFile, content: Object, vault: Vault) => { + const serialised = jsonStringify(content, null, 2) + + // Check if exists + const configPath = file!.path + '.sqlsealconfig' + const configFile = vault.getFileByPath(configPath) + if (!configFile) { + // CREATE NEW + await vault.create(configPath, serialised) + return + } + + await vault.modify(configFile, serialised) +} \ No newline at end of file diff --git a/src/utils/types.ts b/src/utils/types.ts new file mode 100644 index 0000000..c5b16ba --- /dev/null +++ b/src/utils/types.ts @@ -0,0 +1,7 @@ +// export type ColumnType = 'auto' | 'text' | 'number' +export type ColumnType = string + +export interface ColumnDefinition { + name: string; + type: ColumnType +} \ No newline at end of file diff --git a/src/view/CSVView.ts b/src/view/CSVView.ts index 459c9d5..e1576b3 100644 --- a/src/view/CSVView.ts +++ b/src/view/CSVView.ts @@ -1,11 +1,15 @@ -import { WorkspaceLeaf, TextFileView, Menu, Notice } from 'obsidian'; +import { WorkspaceLeaf, TextFileView, Menu, Notice, MenuItem } from 'obsidian'; import { parse, unparse } from 'papaparse'; import { DeleteConfirmationModal } from '../modal/deleteConfirmationModal'; import { RenameColumnModal } from '../modal/renameColumnModal'; import { CodeSampleModal } from '../modal/showCodeSample'; -import { GridRenderer } from '../renderer/GridRenderer'; +import { GridRenderer, GridRendererCommunicator } from '../renderer/GridRenderer'; import { errorNotice } from '../utils/notice'; import { ModernCellParser } from '../cellParser/ModernCellParser'; +import { ConfigObject, loadConfig, saveConfig } from 'src/utils/csvConfig'; +import { ColumnType } from '../utils/types'; + +const delay = (n: number) => new Promise(resolve => setTimeout(resolve, n)) export const CSV_VIEW_TYPE = "csv-viewer" as const; export const CSV_VIEW_EXTENSIONS = ['csv']; @@ -13,6 +17,7 @@ export const CSV_VIEW_EXTENSIONS = ['csv']; export class CSVView extends TextFileView { private content: string; private table: HTMLTableElement; + private config: ConfigObject; constructor( leaf: WorkspaceLeaf, @@ -60,7 +65,7 @@ export class CSVView extends TextFileView { private result: any; updateRow(newRowData: Record) { this.result.data[parseInt(newRowData.__index, 10)] = newRowData; - this.saveData() + this.saveData(true) } deleteRow(idx: number) { @@ -102,6 +107,7 @@ export class CSVView extends TextFileView { return d }) this.saveData() + this.loadDataIntoGrid() } setIsEditable(newValue: boolean) { @@ -109,9 +115,25 @@ export class CSVView extends TextFileView { // FIXME: if there already rendered view, use this to rerender it? } - saveData() { - const output = unparse(this.result) + saveData(noRefresh: boolean = false) { + if (noRefresh) { + this.refreshSkip = Date.now() + 500 + } + + // Map results + const res = [...this.result.data].map(r => { + const r2 = {...r} + Object.keys(r).forEach(k => { + if (typeof r[k] === 'boolean') { + r2[k] = r[k] ? 1 : 0 + } + }) + return r2 + }) + + const output = unparse({ ...this.result, data: res }) this.app.vault.modify(this.file!, output) + this.refreshTypes() } createRow() { @@ -120,6 +142,66 @@ export class CSVView extends TextFileView { } + getColumnType(columnName: string) { + if (this.config.columnDefinitions[columnName]) { + return this.config.columnDefinitions[columnName].type + } + return 'auto' + } + + async changeColumnType(columnName: string, type: ColumnType) { + const prev = this.config.columnDefinitions[columnName] ?? {} + this.config.columnDefinitions[columnName] = { + ...prev, + type: type + } + await this.saveConfig() + } + + async loadConfig() { + while (!this.file) { + await delay(100) + } + this.config = await loadConfig(this.file, this.app.vault) + } + + async saveConfig() { + await saveConfig(this.file!, this.config, this.app.vault) + } + + private getColumnConfigurations(columns: string[]) { + return columns.map(f => { + if (!this.config) { + return { + field: f + } + } + const def = this.config.columnDefinitions[f]?.type + if (!def || def === 'auto') { + return { field: f } + } + if (def === 'date') { + return { + field: f, + cellDataType: 'dateString' + } + } + return { + field: f, + cellDataType: def + } + }) + } + + refreshTypes() { + if (this.gridCommunicator) { + const columns = this.result.fields + if (columns && columns.length) { + this.gridCommunicator.gridApi.setGridOption('columnDefs', this.getColumnConfigurations(columns)) + } + } + } + moveColumn(name: string, toIndex: number) { let fields = this.result.fields as Array fields = fields.filter(f => f !== name) @@ -133,42 +215,82 @@ export class CSVView extends TextFileView { } api: any = null; + gridCommunicator: GridRendererCommunicator | null = null + refreshSkip: number = 0 + + formatWithTypes(d: Record) { + Object.entries(this.config.columnDefinitions).forEach(([key, value]) => { + if (!d[key]) { + return + } + if (value.type === 'boolean') { + if (d[key] === 'false' || d[key] === '0') { + d[key] = false + } + d[key] = !!d[key] + } + if (value.type === 'number') { + if (d[key] === null || d[key] === '') { + d[key] = '' + } else { + d[key] = parseFloat(d[key] as string) + } + } + if (value.type === 'date') { + // try parsing + const val = d[key] as string + const date = new Date(val) + d[key] = date.toISOString().split('T')[0] + } + }) + return d + } + + prepareData() { + const result = parse(this.content, { + header: true, + skipEmptyLines: true, + }); + const data = result.data.map((d: any, i) => ({ + ...this.formatWithTypes(d), + __index: i.toString() + })) + return { + data: data, + fields: result.meta.fields + } + } loadDataIntoGrid() { + if (this.refreshSkip > Date.now()) { + return + } requestAnimationFrame(() => { - const result = parse(this.content, { - header: true, - skipEmptyLines: true, - }); - const data = result.data.map((d: any, i) => ({ - ...d, - __index: i.toString() - })) - this.result = { - data: data, - fields: result.meta.fields - } - - - this.api!.render({ - data: data, - columns: result.meta.fields - }) - + const result = this.prepareData() + this.result = result + this.refreshTypes() + this.api!.render(result) }) + } + isLoading: boolean = false + private async renderCSV() { - if (this.api) { - this.loadDataIntoGrid() + if (this.isLoading) { + if (this.api) { + this.loadDataIntoGrid() + } return } + this.isLoading = true this.contentEl.empty() const csvEditorDiv = this.contentEl.createDiv({ cls: 'sql-seal-csv-editor' }) const buttonsRow = csvEditorDiv.createDiv({ cls: 'sql-seal-csv-viewer-buttons' }) + await this.loadConfig() if (this.enableEditing) { const createColumn = buttonsRow.createEl('button', { text: 'Add Column' }) const createRow = buttonsRow.createEl('button', { text: 'Add Row' }) @@ -199,16 +321,14 @@ export class CSVView extends TextFileView { modal.open() }) - const grid = new GridRenderer(this.app, null) const csvView = this; + const data = this.prepareData() + this.result = data const api = grid.render({ + columnDefs: this.getColumnConfigurations(data.fields ?? []), defaultColDef: { editable: this.enableEditing, - valueSetter: (e) => { - e.data[e.column.getUserProvidedColDef()?.headerName!] = e.newValue - return e.newValue - }, headerComponentParams: { enableMenu: this.enableEditing, showColumnMenu: function (e: any) { @@ -219,7 +339,7 @@ export class CSVView extends TextFileView { item.onClick(() => { const modal = new RenameColumnModal(csvView.app, (res) => { csvView.renameColumn( - this.column.userProvidedColDef.headerName, res) + this.column.userProvidedColDef.field, res) }) modal.open() }) @@ -228,7 +348,7 @@ export class CSVView extends TextFileView { menu.addItem(item => { item.setTitle('Delete Column') item.onClick(() => { - const colName = this.column.userProvidedColDef.headerName + const colName = this.column.userProvidedColDef.field const modal = new DeleteConfirmationModal(csvView.app, `column ${colName}`, () => { csvView.deleteColumn(colName) }) @@ -236,7 +356,34 @@ export class CSVView extends TextFileView { }) }) - + + // FIXME: rework it to submenus. + menu.addSeparator() + menu.addItem(item => { + // item.setDisabled(true) + item.setTitle('Data Type') + // item.setIsLabel(true) + const ipfSubmenu = (item as any).setSubmenu(); + const types = ['auto', 'text', 'number', 'boolean', 'date'] as ColumnType[] + + + + const colName = this.column.userProvidedColDef.field + + const current = csvView.getColumnType(colName) + types.forEach(type => { + ipfSubmenu.addItem((subItem: MenuItem) => { + const checkbox = type === current ? '✓ ' : '' + subItem.setTitle(checkbox + type) + subItem.onClick(() => { + csvView.changeColumnType(colName, type) + csvView.refreshTypes() + csvView.loadDataIntoGrid() + }) + }) + }) + }) + const pos = e.getBoundingClientRect(); menu.showAtPosition({ x: pos.x, y: pos.y + 20 }) } @@ -254,7 +401,7 @@ export class CSVView extends TextFileView { if (!columnName) { return } - csvView.moveColumn(columnName?.headerName!, e.toIndex!) + csvView.moveColumn(columnName?.field!, e.toIndex!) }, domLayout: 'normal', getRowId: (p) => p.data.__index, @@ -280,9 +427,9 @@ export class CSVView extends TextFileView { }) menu.showAtMouseEvent(e.event as any) } - }, gridEl, { cellParser: this.cellParser, sourcePath: this.file?.path || '' }) - + }, gridEl, { sourcePath: this.file?.path || '' }) this.api = api; - this.loadDataIntoGrid() + this.gridCommunicator = api.communicator + api.render(data) } } \ No newline at end of file diff --git a/styles.css b/styles.css new file mode 100644 index 0000000..e6a7e2b --- /dev/null +++ b/styles.css @@ -0,0 +1,2 @@ +.sqlseal-table-container{overflow-y:scroll}.sqlseal-table-container table{width:100%;border-collapse:collapse}.sqlseal-grid-wrapper{height:auto;position:relative}.block-language-sqlseal{overflow-y:auto}.sqlseal-error{padding:1em;background:#b80f0f;color:#fff}.sqlseal-notice{padding:1em;background:#1f3f98;color:#fff}.sqlseal-grid-error-message{box-sizing:border-box;width:80%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center;background:#b80f0f;font-size:.8em;color:#fff;padding:.5em 2em}.sqlseal-grid-error-message-overlay{content:"";position:absolute;inset:0;background:#fffc;z-index:5}.sqlseal-grid-error-message-overlay.hidden{display:none}.edit-block-button{z-index:1000}.sqlseal-markdown-table{font-family:monospace;white-space:pre-wrap}.sqlseal-markdown-table.no-wrap{display:inline-block;overflow-x:scroll;width:fit-content}.sqlseal-parse-error{background:#b80f0f;color:#fff;padding:.2em;border-radius:2px}.sqlseal-notice-error{color:#f26464}.sqlseal-notice-error:before{content:"";width:16px;height:16px;display:inline-block;margin-right:8px;transform:translateY(3px);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23ff0000' d='M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z'/%3E%3C/svg%3E")}.sql-seal-csv-editor{display:flex;flex-direction:column;height:100%;gap:var(--size-4-4)}.sql-seal-csv-viewer{flex:1;display:flex;flex-direction:column}.sqlseal-grid-wrapper{height:100%;flex:1;display:flex;flex-direction:column}.ag-theme-quartz{flex:1}.sql-seal-csv-viewer-buttons{display:flex;gap:var(--size-4-4)}.sql-seal-modal-code{width:100%;font-family:monospace;padding:8px}.sqlseal-inline-result{display:inline-block;padding:0 4px;margin:0 2px;background-color:var(--background-secondary);border-radius:4px;font-size:.9em;cursor:pointer}.sqlseal-inline-result .error{color:var(--text-error);font-style:italic}.sqlseal-list-element-single .sqlseal-column-name{display:none}.sqlseal-list-element-single .sqlseal-column-name:after{content:": "}.sqlseal-list.show-column-names .sqlseal-list-element-single .sqlseal-column-name{display:inline}.sqlseal-element-inline-list{display:inline-block}.cm-sqlseal-block-query{--color: #297f30}.cm-sqlseal-block-view{--color: #c834dd}.cm-sqlseal-block-flag{--color: #d08306;font-weight:700;color:var(--color)}.cm-sqlseal-block-table{--color: #4985af}.cm-sqlseal-identifier{color:#2d7b33}.cm-sqlseal-function,.cm-sqlseal-parameter{color:#2c0e9b}.cm-sqlseal-comment{color:#7a7a7a;font-style:italic}.cm-sqlseal-keyword{color:var(--color);font-weight:700}.cm-sqlseal-literal{color:#03f}.cm-sqlseal-error{color:#eb2f2f;font-style:italic}.cm-sqlseal-template-keyword{color:#e3ab53}.theme-dark .cm-sqlseal-template-keyword{color:#dd8e10}.theme-dark .cm-sqlseal-block-error{color:red}.theme-dark .cm-sqlseal-block-query{--color: #5eff6a}.theme-dark .cm-sqlseal-comment{color:#898787}.theme-dark .cm-sqlseal-parameter{color:#95ed22}.theme-dark .cm-sqlseal-literal{color:#ff0}.theme-dark .cm-sqlseal-block-view{--color: #e945ff}.theme-dark .cm-sqlseal-block-flag{--color: #e3ab53}.theme-dark .cm-sqlseal-block-table{--color: #56b5fa}.theme-dark .cm-sqlseal-function{color:#c4b8ef}.theme-dark .cm-sqlseal-identifier{color:#6ff77a}:is(.cm-sqlseal-block-query,.cm-sqlseal-block-view,.cm-sqlseal-block-flag,.cm-sqlseal-block-table):before{background-color:var(--color);width:5px;top:-3px;bottom:-3px;left:0;content:"";display:block;position:absolute}.cm-indent+:is(.cm-sqlseal-block-query,.cm-sqlseal-block-view,.cm-sqlseal-block-flag,.cm-sqlseal-block-table):before{display:none}.markdown-source-view.mod-cm6.is-readable-line-width .cm-contentContainer.cm-contentContainer>.cm-content>:has(>.block-language-sqlseal table.dataview){width:var(--container-dataview-table-width);max-width:var(--container-table-max-width)}.ag-checkbox-input{opacity:1!important} +/*# sourceMappingURL=styles.css.map */