├── .gitignore ├── LICENSE ├── LICENSE.txt ├── README.md ├── github-grid-demo.jpg ├── gulpfile.js ├── package.json ├── pnpm-lock.yaml ├── src ├── grid │ ├── .DS_Store │ ├── agGridSolid.tsx │ ├── cellRenderer │ │ ├── detailCellRenderer.tsx │ │ └── groupCellRenderer.tsx │ ├── cells │ │ ├── cellComp.tsx │ │ ├── common.tsx │ │ ├── popupEditorComp.tsx │ │ ├── showEditDetails.tsx │ │ └── showRenderDetails.tsx │ ├── core │ │ ├── beansContext.tsx │ │ ├── portalManager.tsx │ │ ├── solidCompWrapper.tsx │ │ ├── solidCompWrapperFactory.tsx │ │ ├── solidFrameworkOverrides.tsx │ │ └── utils.tsx │ ├── gridBodyComp.tsx │ ├── gridComp.tsx │ ├── header │ │ ├── gridHeaderComp.tsx │ │ ├── headerCellComp.tsx │ │ ├── headerFilterCellComp.tsx │ │ ├── headerGroupCellComp.tsx │ │ ├── headerRowComp.tsx │ │ └── headerRowContainerComp.tsx │ ├── rows │ │ ├── rowComp.tsx │ │ └── rowContainerComp.tsx │ ├── tabGuardComp.tsx │ └── userComps │ │ ├── jsUserComp.tsx │ │ ├── solidUserComp.tsx │ │ └── userComp.tsx └── index.tsx ├── tsconfig.json └── tsup.config.ts /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | .env 77 | .env.development.local 78 | .env.test.local 79 | .env.production.local 80 | .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | dist 93 | 94 | # Gatsby files 95 | .cache/ 96 | # Comment in the public line in if your project uses Gatsby and not Next.js 97 | # https://nextjs.org/blog/next-9-1#public-directory-support 98 | # public 99 | 100 | # vuepress build output 101 | .vuepress/dist 102 | 103 | # vuepress v2.x temp and cache directory 104 | .temp 105 | .cache 106 | 107 | # Docusaurus cache and generated files 108 | .docusaurus 109 | 110 | # Serverless directories 111 | .serverless/ 112 | 113 | # FuseBox cache 114 | .fusebox/ 115 | 116 | # DynamoDB Local files 117 | .dynamodb/ 118 | 119 | # TernJS port file 120 | .tern-port 121 | 122 | # Stores VSCode versions used for testing VSCode extensions 123 | .vscode-test 124 | 125 | # yarn v2 126 | .yarn/cache 127 | .yarn/unplugged 128 | .yarn/build-state.yml 129 | .yarn/install-state.gz 130 | .pnp.* 131 | /.DS_Store 132 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 {{me}} 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License 2 | 3 | Copyright (c) 2015-2019 AG GRID LTD 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | solid-ag-grid 3 |

4 | 5 | > [!NOTE] 6 | > This project doesn't currently have an active maintainer and may be behind on recent AG-Grid updates. If you have an interest in leading or pariticipatibg please join [Solid Discord](https://discord.com/invite/solidjs) to inquire further. 7 | 8 | ## AG Grid Solid Component 9 | 10 | Solid AG Grid is a fully-featured and highly customizable JavaScript data grid. 11 | It delivers [outstanding performance](https://www.ag-grid.com/example?utm_source=solid-ag-grid-readme&utm_medium=repository&utm_campaign=github#/performance/1), has no 3rd party dependencies and integrates smoothly with Solid as Solid Component. Here's how our grid looks like with multiple filters and grouping enabled: 12 | 13 | ![Image of AG Grid showing filtering and grouping enabled.](./github-grid-demo.jpg "AG Grid demo") 14 | 15 | When using AG Grid with Solid, all of the grid's core rendering (headers, rows, cells etc) is rendered using Solid. AG Grid Solid shares the same 'business logic layer' as the other AG Grid versions (React, Angular, Vue, or just JavaScript). This means the features of AG Grid Solid are identical to the features in AG Grid's other framework flavours. However because the rendering is done 100% in Solid, the grid works as a native Solid Component. 16 | 17 | AG Grid Solid is NOT a JavaScript component with a thin Solid wrapper. AG Grid is the Real Deal when it comes to a Data Grid Implementation for SolidJS. 18 | 19 | ## Features 20 | 21 | Besides the standard set of features you'd expect from any grid: 22 | 23 | - Column Interactions (resize, reorder, and pin columns) 24 | - Pagination 25 | - Sorting 26 | - Row Selection 27 | 28 | Here are some of the features that make AG Grid stand out: 29 | 30 | - Grouping / Aggregation \* 31 | - Accessibility support 32 | - Custom Filtering 33 | - In-place Cell Editing 34 | - Records Lazy Loading \* 35 | - Server-Side Records Operations \* 36 | - Live Stream Updates 37 | - Hierarchical Data Support & Tree View \* 38 | - Customizable Appearance 39 | - Customizable Cell Contents 40 | - State Persistence 41 | - Keyboard Navigation 42 | - Data Export to CSV 43 | - Data Export to Excel \* 44 | - Excel-like Pivoting \* 45 | - Row Reordering 46 | - Copy / Paste 47 | - Column Spanning 48 | - Pinned Rows 49 | - Full Width Rows 50 | - Integrated Charting 51 | - Sparklines 52 | 53 | \* The features marked with an asterisk are available in the [enterprise version](https://www.ag-grid.com/license-pricing?utm_source=solid-ag-gridct-readme&utm_medium=repository&utm_campaign=github) only. 54 | 55 | Check out [developers documentation](https://www.ag-grid.com/react-data-grid/solidjs/) for a complete list of features or visit [our official docs](https://www.ag-grid.com/features-overview?utm_source=solid-ag-grid-readme&utm_medium=repository&utm_campaign=github) for tutorials and feature demos. 56 | 57 | You may also read the [Solid specific documentation](https://ag-grid.com/react-data-grid/solidjs/). 58 | 59 | ## Usage Overview 60 | 61 | Use the setup instructions below or go through [a 5-minute-quickstart guide](https://www.ag-grid.com/react-grid?utm_source=ag-grid-react-readme&utm_medium=repository&utm_campaign=github). 62 | 63 | #### Installation 64 | 65 | ``` 66 | npm i --save ag-grid-community solid-ag-grid 67 | // or 68 | yarn add ag-grid-community solid-ag-grid 69 | // or 70 | pnpm add ag-grid-community solid-ag-grid 71 | ``` 72 | 73 | #### Import the grid and styles 74 | 75 | ```ts 76 | import type { Component } from "solid-js"; 77 | import AgGridSolid from "solid-ag-grid"; 78 | 79 | import "ag-grid-community/styles/ag-grid.css"; 80 | import "ag-grid-community/styles/ag-theme-alpine.css"; 81 | ``` 82 | 83 | ### Render the grid as the `AgGridSolid` child component 84 | 85 | ```ts 86 | const App: Component = () => { 87 | const columnDefs = [ 88 | { field: 'make' }, 89 | { field: 'model' }, 90 | { field: 'price' }, 91 | ]; 92 | const rowData = [ 93 | { make: 'Toyota', model: 'Celica', price: 35000 }, 94 | { make: 'Ford', model: 'Mondeo', price: 32000 }, 95 | { make: 'Porsche', model: 'Boxster', price: 72000 }, 96 | ]; 97 | const defaultColDef = { 98 | flex: 1, 99 | }; 100 | return ( 101 |
102 | 107 |
108 | ); 109 | }; 110 | 111 | export default App; 112 | ``` 113 | 114 | ## Grid Component 115 | 116 | Once the Solid grid component is imported, it can then be inserted into the Solid application using JSX. 117 | 118 | ```jsx 119 | 123 | ``` 124 | 125 | It's best to place the grid component inside another DOM element that has a set size. The grid will then fill the size of the parent element. You also need to import CSS files for a) the core CSS which is mandatory and b) a grid theme which is optional. The theme also needs to be specified as a CSS class in a parent element to the grid. 126 | 127 | ```jsx 128 | import AgGridSolid from 'solid-ag-grid'; 129 | 130 | import 'ag-grid-community/styles/ag-grid.css'; // grid core CSS 131 | import "ag-grid-community/styles/ag-theme-quartz.css"; // optional theme 132 | 133 | const MySolidApp = ()=> { 134 | return ( 135 | // set fixed size to parent div, and apply grid theme ag-theme-quartz 136 |
137 | 141 |
142 | ); 143 | }; 144 | 145 | ``` 146 | 147 | ## Binding Properties 148 | 149 | You can use [Grid Properties](./grid-options/), either bind Solid Signals (for changing properties) or directly (if static properties). [Grid Events](./grid-events/) are also bound via properties. 150 | 151 | ```jsx 152 | import AgGridSolid from "solid-ag-grid"; 153 | 154 | import "ag-grid-community/styles/ag-grid.css"; // grid core CSS 155 | import "ag-grid-community/styles/ag-theme-quartz.css"; // optional theme 156 | 157 | const MySolidApp = () => { 158 | // use signal, as row data will change 159 | const [rowData, setRowData] = createSignal(); 160 | // if columns will change, best use a signal, however if column definitions 161 | // are static, we don't need to use a signal 162 | const columnDefs = [{ field: "name" }, { field: "age" }]; 163 | // event listener 164 | const selectionChangedCallback = (e) => { 165 | console.log("selection has changed", e); 166 | }; 167 | return ( 168 |
169 | 175 |
176 | ); 177 | }; 178 | ``` 179 | 180 | ## Grid API 181 | 182 | The grid API is accessed as a Solid Ref. 183 | 184 | ```jsx 185 | const MySolidApp = ()=> { 186 | let grid; // ref for the grid 187 | const myAction = ()=> { 188 | // use grid api 189 | gridRef.api.selectAll(); 190 | // use grid column api 191 | gridRef.api.applyColumnState(...); 192 | }; 193 | return ( 194 |
195 | 200 |
201 | ); 202 | }; 203 | ``` 204 | 205 | If using TypeScript, the type to use is `AgGridSolidRef`. 206 | 207 | ```jsx 208 | import AgGridSolid, {AgGridSolidRef} from 'solid-ag-grid'; 209 | 210 | const MySolidApp = ()=> { 211 | let grid: AgGridSolidRef; 212 | // ... 213 | }; 214 | ``` 215 | 216 | ## Examples 217 | 218 | ### Custom Cells 219 | 220 | The Custom Cells examples demonstrates using [Cell Renderer](./component-cell-renderer/) to customise the cells in the Age Column. Note that the Cell Renderer is a standard Solid Component and is set onto the grid using the Column Definitions. 221 | 222 | [Open in StackBlitz](https://stackblitz.com/edit/solidjs-template-z3ncqk?embed=1&file=src/App.tsx) 223 | 224 | See [Cell Renderers](./component-cell-renderer/) for full details on creating React Cell Renderers and then apply this knowledge to Solid. 225 | 226 | ### Using Cell Editors 227 | 228 | Below is an example showing different types of Solid [Cell Editors](./cell-editors/). Edit any cell by double clicking the mouse. The Gold and Silver Columns use custom Solid Components. Gold edits inside the cell and and Silver edits in a popup (`cellEditorPopup=true`). 229 | 230 | A custom Cell Editor component requires the component to expose an API from the componet to the grid. Using React this is done using an Imperative Handle. In Solid this is done by calling `ref(api)` on the props. 231 | 232 | ```jsx 233 | const api = { 234 | ... 235 | }; 236 | 237 | props.ref(api); 238 | ``` 239 | 240 | [Open in StackBlitz](https://stackblitz.com/edit/solidjs-template-bhhxsm?embed=1&file=src/App.tsx) 241 | 242 | See [Cell Editors](./cell-editors/) for full details on creating React Cell Editors and then apply this knowledge to Solid. 243 | 244 | ### Customising Headers 245 | 246 | This example demonstrates custom Column Headers and Column Group Headers using Solid components. 247 | 248 | [Open in StackBlitz](https://stackblitz.com/edit/solidjs-template-wnpr7s?embed=1&file=src/App.tsx) 249 | 250 | See Column Headers and Column Group Headers for full details on creating these components with React and then apply this knowledge to Solid. 251 | 252 | ### Advanced Grid Features 253 | 254 | Below is an example of AG Grid Solid showing more advanced features such as [Row Grouping](./grouping/), [Range Selection](./range-selection/) and [Integrated Charting](./integrated-charts/). 255 | 256 | [Open in StackBlitz](https://stackblitz.com/edit/solidjs-template-qsmpa3?embed=1&file=src/App.tsx) 257 | 258 | ### Master Detail 259 | 260 | When the master grid is AG Grid Solid, then the detail grids also use AG Grid Solid. In the example both Master and Detail grids are using Solid Cell Renderers. 261 | 262 | [Open in StackBlitz](https://stackblitz.com/edit/solidjs-template-vt3cco?embed=1&file=src/App.tsx) 263 | 264 | ### Modules 265 | 266 | If using [AG Grid Modules](./modules/), the dependencies will be different. 267 | 268 | ```jsx 269 | "dependencies": { 270 | "@ag-grid-community/core": "~{% $agGridVersion %}", 271 | "@ag-grid-community/client-side-row-model": "~{% $agGridVersion %}", 272 | "@ag-grid-community/solid": "~{% $agGridVersion %}", 273 | ... 274 | ``` 275 | 276 | And the import will also be different. 277 | 278 | ```jsx 279 | import AgGridSolid from "@ag-grid-community/solid"; 280 | ``` 281 | 282 | The example below shows an AG Grid Solid example using modules. 283 | 284 | ## Contributing 285 | 286 | AG Grid is developed by a team of co-located developers in London. If you want to join the team check out our [jobs listing](https://www.ag-grid.com/ag-grid-jobs-board?utm_source=solid-ag-grid-readme&utm_medium=repository&utm_campaign=github) or send your application to info@ag-grid.com. 287 | 288 | ## License 289 | 290 | This project is licensed under the MIT license. See the [LICENSE file](./LICENSE.txt) for more info. 291 | -------------------------------------------------------------------------------- /github-grid-demo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solidjs-community/solid-ag-grid/3aab2158415385f42991cfc6a4b3bd8057817f14/github-grid-demo.jpg -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | import gulp from 'gulp'; 2 | import replace from 'gulp-replace'; 3 | 4 | const copyFromModuleSource = () => { 5 | return gulp.src( 6 | [ 7 | "**/*", 8 | '!**/__tests__*/**/*', 9 | '!**/*Test*' 10 | ], {cwd: '../../grid-community-modules/solid/src'}) 11 | .pipe(replace('@ag-grid-community/core', 'ag-grid-community')) 12 | .pipe(gulp.dest("./src"), {cwd: '.'}); 13 | }; 14 | 15 | gulp.task('copy-from-module-source', copyFromModuleSource); 16 | gulp.task('default', gulp.series('copy-from-module-source')); 17 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "solid-ag-grid", 3 | "version": "0.0.230", 4 | "description": "AG Grid SolidJS Component", 5 | "license": "MIT", 6 | "author": "Niall Crosby ", 7 | "contributors": [ 8 | { 9 | "name": "David Di Biase", 10 | "email": "dave.dibiase@gmail.com", 11 | "url": "https://github.com/davedbase" 12 | } 13 | ], 14 | "repository": { 15 | "type": "git", 16 | "url": "https://github.com/solidjs-community/solid-ag-grid" 17 | }, 18 | "homepage": "https://github.com/solidjs-community/solid-ag-grid", 19 | "bugs": { 20 | "url": "https://github.com/solidjs-community/solid-ag-grid/issues" 21 | }, 22 | "type": "module", 23 | "files": [ 24 | "dist" 25 | ], 26 | "main": "./dist/server.cjs", 27 | "module": "./dist/server.js", 28 | "types": "./dist/index.d.ts", 29 | "exports": { 30 | "worker": { 31 | "solid": "./dist/server.jsx", 32 | "import": { 33 | "types": "./dist/index.d.ts", 34 | "default": "./dist/server.js" 35 | }, 36 | "require": { 37 | "types": "./dist/index.d.cts", 38 | "default": "./dist/server.cjs" 39 | } 40 | }, 41 | "browser": { 42 | "solid": "./dist/index.jsx", 43 | "import": { 44 | "types": "./dist/index.d.ts", 45 | "default": "./dist/index.js" 46 | }, 47 | "require": { 48 | "types": "./dist/index.d.cts", 49 | "default": "./dist/index.cjs" 50 | } 51 | }, 52 | "deno": { 53 | "solid": "./dist/server.jsx", 54 | "import": { 55 | "types": "./dist/index.d.ts", 56 | "default": "./dist/server.js" 57 | }, 58 | "require": { 59 | "types": "./dist/index.d.cts", 60 | "default": "./dist/server.cjs" 61 | } 62 | }, 63 | "node": { 64 | "solid": "./dist/server.jsx", 65 | "import": { 66 | "types": "./dist/index.d.ts", 67 | "default": "./dist/server.js" 68 | }, 69 | "require": { 70 | "types": "./dist/index.d.cts", 71 | "default": "./dist/server.cjs" 72 | } 73 | }, 74 | "solid": "./dist/index.jsx", 75 | "import": { 76 | "types": "./dist/index.d.ts", 77 | "default": "./dist/index.js" 78 | }, 79 | "require": { 80 | "types": "./dist/index.d.cts", 81 | "default": "./dist/index.cjs" 82 | } 83 | }, 84 | "scripts": { 85 | "dev": "vite serve dev", 86 | "clean": "rimraf bundles dist", 87 | "build": "tsup", 88 | "build-prod": "npm run build", 89 | "format": "prettier -w \"src/**/*.{js,ts,json,css,tsx,jsx}\" \"dev/**/*.{js,ts,json,css,tsx,jsx}\"", 90 | "update-deps": "taze -w && pnpm i", 91 | "typecheck": "tsc --noEmit" 92 | }, 93 | "dependencies": { 94 | "ag-grid-community": "31.1.1" 95 | }, 96 | "peerDependencies": { 97 | "solid-js": ">=1.0.0" 98 | }, 99 | "devDependencies": { 100 | "ag-grid-community": "31.1.1", 101 | "ag-grid-enterprise": "31.1.1", 102 | "prettier": "^3.4.2", 103 | "solid-js": "^1.9.4", 104 | "taze": "^18.3.0", 105 | "tsup": "^8.3.5", 106 | "tsup-preset-solid": "^2.2.0", 107 | "typescript": "^5.7.3", 108 | "vite": "^6.0.11", 109 | "vite-plugin-solid": "^2.11.0" 110 | }, 111 | "keywords": [ 112 | "solid" 113 | ], 114 | "packageManager": "pnpm@9.0.0", 115 | "browser": { 116 | "./dist/server.js": "./dist/index.js", 117 | "./dist/server.cjs": "./dist/index.cjs" 118 | }, 119 | "typesVersions": {} 120 | } 121 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | ag-grid-community: 12 | specifier: 31.1.1 13 | version: 31.1.1 14 | devDependencies: 15 | ag-grid-enterprise: 16 | specifier: 31.1.1 17 | version: 31.1.1 18 | prettier: 19 | specifier: ^3.4.2 20 | version: 3.4.2 21 | solid-js: 22 | specifier: ^1.9.4 23 | version: 1.9.4 24 | taze: 25 | specifier: ^18.3.0 26 | version: 18.3.0 27 | tsup: 28 | specifier: ^8.3.5 29 | version: 8.3.5(jiti@2.4.2)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.7.3) 30 | tsup-preset-solid: 31 | specifier: ^2.2.0 32 | version: 2.2.0(esbuild@0.24.2)(solid-js@1.9.4)(tsup@8.3.5(jiti@2.4.2)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.7.3)) 33 | typescript: 34 | specifier: ^5.7.3 35 | version: 5.7.3 36 | vite: 37 | specifier: ^6.0.11 38 | version: 6.0.11(jiti@2.4.2)(tsx@4.19.2) 39 | vite-plugin-solid: 40 | specifier: ^2.11.0 41 | version: 2.11.0(solid-js@1.9.4)(vite@6.0.11(jiti@2.4.2)(tsx@4.19.2)) 42 | 43 | packages: 44 | 45 | '@ampproject/remapping@2.3.0': 46 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 47 | engines: {node: '>=6.0.0'} 48 | 49 | '@antfu/ni@23.2.0': 50 | resolution: {integrity: sha512-PsqWG9QcgTQ0eyEMxYaaJMxoCaCmy8InPkToC7MQuOHHUPQknMZtCrnzZSZDXk+X9Z93eGFh+v0mE2X6FWNtuw==} 51 | hasBin: true 52 | 53 | '@antfu/utils@8.1.0': 54 | resolution: {integrity: sha512-XPR7Jfwp0FFl/dFYPX8ZjpmU4/1mIXTjnZ1ba48BLMyKOV62/tiRjdsFcPs2hsYcSud4tzk7w3a3LjX8Fu3huA==} 55 | 56 | '@babel/code-frame@7.26.2': 57 | resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} 58 | engines: {node: '>=6.9.0'} 59 | 60 | '@babel/compat-data@7.26.3': 61 | resolution: {integrity: sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==} 62 | engines: {node: '>=6.9.0'} 63 | 64 | '@babel/core@7.26.0': 65 | resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} 66 | engines: {node: '>=6.9.0'} 67 | 68 | '@babel/generator@7.26.3': 69 | resolution: {integrity: sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==} 70 | engines: {node: '>=6.9.0'} 71 | 72 | '@babel/helper-annotate-as-pure@7.25.9': 73 | resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} 74 | engines: {node: '>=6.9.0'} 75 | 76 | '@babel/helper-compilation-targets@7.25.9': 77 | resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} 78 | engines: {node: '>=6.9.0'} 79 | 80 | '@babel/helper-create-class-features-plugin@7.25.9': 81 | resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==} 82 | engines: {node: '>=6.9.0'} 83 | peerDependencies: 84 | '@babel/core': ^7.0.0 85 | 86 | '@babel/helper-member-expression-to-functions@7.25.9': 87 | resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} 88 | engines: {node: '>=6.9.0'} 89 | 90 | '@babel/helper-module-imports@7.18.6': 91 | resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} 92 | engines: {node: '>=6.9.0'} 93 | 94 | '@babel/helper-module-imports@7.25.9': 95 | resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} 96 | engines: {node: '>=6.9.0'} 97 | 98 | '@babel/helper-module-transforms@7.26.0': 99 | resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} 100 | engines: {node: '>=6.9.0'} 101 | peerDependencies: 102 | '@babel/core': ^7.0.0 103 | 104 | '@babel/helper-optimise-call-expression@7.25.9': 105 | resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} 106 | engines: {node: '>=6.9.0'} 107 | 108 | '@babel/helper-plugin-utils@7.25.9': 109 | resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} 110 | engines: {node: '>=6.9.0'} 111 | 112 | '@babel/helper-replace-supers@7.25.9': 113 | resolution: {integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==} 114 | engines: {node: '>=6.9.0'} 115 | peerDependencies: 116 | '@babel/core': ^7.0.0 117 | 118 | '@babel/helper-skip-transparent-expression-wrappers@7.25.9': 119 | resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} 120 | engines: {node: '>=6.9.0'} 121 | 122 | '@babel/helper-string-parser@7.25.9': 123 | resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} 124 | engines: {node: '>=6.9.0'} 125 | 126 | '@babel/helper-validator-identifier@7.25.9': 127 | resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} 128 | engines: {node: '>=6.9.0'} 129 | 130 | '@babel/helper-validator-option@7.25.9': 131 | resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} 132 | engines: {node: '>=6.9.0'} 133 | 134 | '@babel/helpers@7.26.0': 135 | resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} 136 | engines: {node: '>=6.9.0'} 137 | 138 | '@babel/parser@7.26.3': 139 | resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} 140 | engines: {node: '>=6.0.0'} 141 | hasBin: true 142 | 143 | '@babel/plugin-syntax-jsx@7.25.9': 144 | resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} 145 | engines: {node: '>=6.9.0'} 146 | peerDependencies: 147 | '@babel/core': ^7.0.0-0 148 | 149 | '@babel/plugin-syntax-typescript@7.25.9': 150 | resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} 151 | engines: {node: '>=6.9.0'} 152 | peerDependencies: 153 | '@babel/core': ^7.0.0-0 154 | 155 | '@babel/plugin-transform-modules-commonjs@7.26.3': 156 | resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} 157 | engines: {node: '>=6.9.0'} 158 | peerDependencies: 159 | '@babel/core': ^7.0.0-0 160 | 161 | '@babel/plugin-transform-typescript@7.26.3': 162 | resolution: {integrity: sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA==} 163 | engines: {node: '>=6.9.0'} 164 | peerDependencies: 165 | '@babel/core': ^7.0.0-0 166 | 167 | '@babel/preset-typescript@7.26.0': 168 | resolution: {integrity: sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==} 169 | engines: {node: '>=6.9.0'} 170 | peerDependencies: 171 | '@babel/core': ^7.0.0-0 172 | 173 | '@babel/template@7.25.9': 174 | resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} 175 | engines: {node: '>=6.9.0'} 176 | 177 | '@babel/traverse@7.26.4': 178 | resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==} 179 | engines: {node: '>=6.9.0'} 180 | 181 | '@babel/types@7.26.3': 182 | resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} 183 | engines: {node: '>=6.9.0'} 184 | 185 | '@esbuild/aix-ppc64@0.23.1': 186 | resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} 187 | engines: {node: '>=18'} 188 | cpu: [ppc64] 189 | os: [aix] 190 | 191 | '@esbuild/aix-ppc64@0.24.2': 192 | resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} 193 | engines: {node: '>=18'} 194 | cpu: [ppc64] 195 | os: [aix] 196 | 197 | '@esbuild/android-arm64@0.23.1': 198 | resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} 199 | engines: {node: '>=18'} 200 | cpu: [arm64] 201 | os: [android] 202 | 203 | '@esbuild/android-arm64@0.24.2': 204 | resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} 205 | engines: {node: '>=18'} 206 | cpu: [arm64] 207 | os: [android] 208 | 209 | '@esbuild/android-arm@0.23.1': 210 | resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} 211 | engines: {node: '>=18'} 212 | cpu: [arm] 213 | os: [android] 214 | 215 | '@esbuild/android-arm@0.24.2': 216 | resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} 217 | engines: {node: '>=18'} 218 | cpu: [arm] 219 | os: [android] 220 | 221 | '@esbuild/android-x64@0.23.1': 222 | resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} 223 | engines: {node: '>=18'} 224 | cpu: [x64] 225 | os: [android] 226 | 227 | '@esbuild/android-x64@0.24.2': 228 | resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} 229 | engines: {node: '>=18'} 230 | cpu: [x64] 231 | os: [android] 232 | 233 | '@esbuild/darwin-arm64@0.23.1': 234 | resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} 235 | engines: {node: '>=18'} 236 | cpu: [arm64] 237 | os: [darwin] 238 | 239 | '@esbuild/darwin-arm64@0.24.2': 240 | resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} 241 | engines: {node: '>=18'} 242 | cpu: [arm64] 243 | os: [darwin] 244 | 245 | '@esbuild/darwin-x64@0.23.1': 246 | resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} 247 | engines: {node: '>=18'} 248 | cpu: [x64] 249 | os: [darwin] 250 | 251 | '@esbuild/darwin-x64@0.24.2': 252 | resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} 253 | engines: {node: '>=18'} 254 | cpu: [x64] 255 | os: [darwin] 256 | 257 | '@esbuild/freebsd-arm64@0.23.1': 258 | resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} 259 | engines: {node: '>=18'} 260 | cpu: [arm64] 261 | os: [freebsd] 262 | 263 | '@esbuild/freebsd-arm64@0.24.2': 264 | resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} 265 | engines: {node: '>=18'} 266 | cpu: [arm64] 267 | os: [freebsd] 268 | 269 | '@esbuild/freebsd-x64@0.23.1': 270 | resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} 271 | engines: {node: '>=18'} 272 | cpu: [x64] 273 | os: [freebsd] 274 | 275 | '@esbuild/freebsd-x64@0.24.2': 276 | resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} 277 | engines: {node: '>=18'} 278 | cpu: [x64] 279 | os: [freebsd] 280 | 281 | '@esbuild/linux-arm64@0.23.1': 282 | resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} 283 | engines: {node: '>=18'} 284 | cpu: [arm64] 285 | os: [linux] 286 | 287 | '@esbuild/linux-arm64@0.24.2': 288 | resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} 289 | engines: {node: '>=18'} 290 | cpu: [arm64] 291 | os: [linux] 292 | 293 | '@esbuild/linux-arm@0.23.1': 294 | resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} 295 | engines: {node: '>=18'} 296 | cpu: [arm] 297 | os: [linux] 298 | 299 | '@esbuild/linux-arm@0.24.2': 300 | resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} 301 | engines: {node: '>=18'} 302 | cpu: [arm] 303 | os: [linux] 304 | 305 | '@esbuild/linux-ia32@0.23.1': 306 | resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} 307 | engines: {node: '>=18'} 308 | cpu: [ia32] 309 | os: [linux] 310 | 311 | '@esbuild/linux-ia32@0.24.2': 312 | resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} 313 | engines: {node: '>=18'} 314 | cpu: [ia32] 315 | os: [linux] 316 | 317 | '@esbuild/linux-loong64@0.23.1': 318 | resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} 319 | engines: {node: '>=18'} 320 | cpu: [loong64] 321 | os: [linux] 322 | 323 | '@esbuild/linux-loong64@0.24.2': 324 | resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} 325 | engines: {node: '>=18'} 326 | cpu: [loong64] 327 | os: [linux] 328 | 329 | '@esbuild/linux-mips64el@0.23.1': 330 | resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} 331 | engines: {node: '>=18'} 332 | cpu: [mips64el] 333 | os: [linux] 334 | 335 | '@esbuild/linux-mips64el@0.24.2': 336 | resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} 337 | engines: {node: '>=18'} 338 | cpu: [mips64el] 339 | os: [linux] 340 | 341 | '@esbuild/linux-ppc64@0.23.1': 342 | resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} 343 | engines: {node: '>=18'} 344 | cpu: [ppc64] 345 | os: [linux] 346 | 347 | '@esbuild/linux-ppc64@0.24.2': 348 | resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} 349 | engines: {node: '>=18'} 350 | cpu: [ppc64] 351 | os: [linux] 352 | 353 | '@esbuild/linux-riscv64@0.23.1': 354 | resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} 355 | engines: {node: '>=18'} 356 | cpu: [riscv64] 357 | os: [linux] 358 | 359 | '@esbuild/linux-riscv64@0.24.2': 360 | resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} 361 | engines: {node: '>=18'} 362 | cpu: [riscv64] 363 | os: [linux] 364 | 365 | '@esbuild/linux-s390x@0.23.1': 366 | resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} 367 | engines: {node: '>=18'} 368 | cpu: [s390x] 369 | os: [linux] 370 | 371 | '@esbuild/linux-s390x@0.24.2': 372 | resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} 373 | engines: {node: '>=18'} 374 | cpu: [s390x] 375 | os: [linux] 376 | 377 | '@esbuild/linux-x64@0.23.1': 378 | resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} 379 | engines: {node: '>=18'} 380 | cpu: [x64] 381 | os: [linux] 382 | 383 | '@esbuild/linux-x64@0.24.2': 384 | resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} 385 | engines: {node: '>=18'} 386 | cpu: [x64] 387 | os: [linux] 388 | 389 | '@esbuild/netbsd-arm64@0.24.2': 390 | resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} 391 | engines: {node: '>=18'} 392 | cpu: [arm64] 393 | os: [netbsd] 394 | 395 | '@esbuild/netbsd-x64@0.23.1': 396 | resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} 397 | engines: {node: '>=18'} 398 | cpu: [x64] 399 | os: [netbsd] 400 | 401 | '@esbuild/netbsd-x64@0.24.2': 402 | resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} 403 | engines: {node: '>=18'} 404 | cpu: [x64] 405 | os: [netbsd] 406 | 407 | '@esbuild/openbsd-arm64@0.23.1': 408 | resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} 409 | engines: {node: '>=18'} 410 | cpu: [arm64] 411 | os: [openbsd] 412 | 413 | '@esbuild/openbsd-arm64@0.24.2': 414 | resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} 415 | engines: {node: '>=18'} 416 | cpu: [arm64] 417 | os: [openbsd] 418 | 419 | '@esbuild/openbsd-x64@0.23.1': 420 | resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} 421 | engines: {node: '>=18'} 422 | cpu: [x64] 423 | os: [openbsd] 424 | 425 | '@esbuild/openbsd-x64@0.24.2': 426 | resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} 427 | engines: {node: '>=18'} 428 | cpu: [x64] 429 | os: [openbsd] 430 | 431 | '@esbuild/sunos-x64@0.23.1': 432 | resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} 433 | engines: {node: '>=18'} 434 | cpu: [x64] 435 | os: [sunos] 436 | 437 | '@esbuild/sunos-x64@0.24.2': 438 | resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} 439 | engines: {node: '>=18'} 440 | cpu: [x64] 441 | os: [sunos] 442 | 443 | '@esbuild/win32-arm64@0.23.1': 444 | resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} 445 | engines: {node: '>=18'} 446 | cpu: [arm64] 447 | os: [win32] 448 | 449 | '@esbuild/win32-arm64@0.24.2': 450 | resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} 451 | engines: {node: '>=18'} 452 | cpu: [arm64] 453 | os: [win32] 454 | 455 | '@esbuild/win32-ia32@0.23.1': 456 | resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} 457 | engines: {node: '>=18'} 458 | cpu: [ia32] 459 | os: [win32] 460 | 461 | '@esbuild/win32-ia32@0.24.2': 462 | resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} 463 | engines: {node: '>=18'} 464 | cpu: [ia32] 465 | os: [win32] 466 | 467 | '@esbuild/win32-x64@0.23.1': 468 | resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} 469 | engines: {node: '>=18'} 470 | cpu: [x64] 471 | os: [win32] 472 | 473 | '@esbuild/win32-x64@0.24.2': 474 | resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} 475 | engines: {node: '>=18'} 476 | cpu: [x64] 477 | os: [win32] 478 | 479 | '@isaacs/cliui@8.0.2': 480 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 481 | engines: {node: '>=12'} 482 | 483 | '@jridgewell/gen-mapping@0.3.8': 484 | resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} 485 | engines: {node: '>=6.0.0'} 486 | 487 | '@jridgewell/resolve-uri@3.1.2': 488 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 489 | engines: {node: '>=6.0.0'} 490 | 491 | '@jridgewell/set-array@1.2.1': 492 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 493 | engines: {node: '>=6.0.0'} 494 | 495 | '@jridgewell/sourcemap-codec@1.5.0': 496 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 497 | 498 | '@jridgewell/trace-mapping@0.3.25': 499 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 500 | 501 | '@pkgjs/parseargs@0.11.0': 502 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 503 | engines: {node: '>=14'} 504 | 505 | '@rollup/rollup-android-arm-eabi@4.29.1': 506 | resolution: {integrity: sha512-ssKhA8RNltTZLpG6/QNkCSge+7mBQGUqJRisZ2MDQcEGaK93QESEgWK2iOpIDZ7k9zPVkG5AS3ksvD5ZWxmItw==} 507 | cpu: [arm] 508 | os: [android] 509 | 510 | '@rollup/rollup-android-arm64@4.29.1': 511 | resolution: {integrity: sha512-CaRfrV0cd+NIIcVVN/jx+hVLN+VRqnuzLRmfmlzpOzB87ajixsN/+9L5xNmkaUUvEbI5BmIKS+XTwXsHEb65Ew==} 512 | cpu: [arm64] 513 | os: [android] 514 | 515 | '@rollup/rollup-darwin-arm64@4.29.1': 516 | resolution: {integrity: sha512-2ORr7T31Y0Mnk6qNuwtyNmy14MunTAMx06VAPI6/Ju52W10zk1i7i5U3vlDRWjhOI5quBcrvhkCHyF76bI7kEw==} 517 | cpu: [arm64] 518 | os: [darwin] 519 | 520 | '@rollup/rollup-darwin-x64@4.29.1': 521 | resolution: {integrity: sha512-j/Ej1oanzPjmN0tirRd5K2/nncAhS9W6ICzgxV+9Y5ZsP0hiGhHJXZ2JQ53iSSjj8m6cRY6oB1GMzNn2EUt6Ng==} 522 | cpu: [x64] 523 | os: [darwin] 524 | 525 | '@rollup/rollup-freebsd-arm64@4.29.1': 526 | resolution: {integrity: sha512-91C//G6Dm/cv724tpt7nTyP+JdN12iqeXGFM1SqnljCmi5yTXriH7B1r8AD9dAZByHpKAumqP1Qy2vVNIdLZqw==} 527 | cpu: [arm64] 528 | os: [freebsd] 529 | 530 | '@rollup/rollup-freebsd-x64@4.29.1': 531 | resolution: {integrity: sha512-hEioiEQ9Dec2nIRoeHUP6hr1PSkXzQaCUyqBDQ9I9ik4gCXQZjJMIVzoNLBRGet+hIUb3CISMh9KXuCcWVW/8w==} 532 | cpu: [x64] 533 | os: [freebsd] 534 | 535 | '@rollup/rollup-linux-arm-gnueabihf@4.29.1': 536 | resolution: {integrity: sha512-Py5vFd5HWYN9zxBv3WMrLAXY3yYJ6Q/aVERoeUFwiDGiMOWsMs7FokXihSOaT/PMWUty/Pj60XDQndK3eAfE6A==} 537 | cpu: [arm] 538 | os: [linux] 539 | 540 | '@rollup/rollup-linux-arm-musleabihf@4.29.1': 541 | resolution: {integrity: sha512-RiWpGgbayf7LUcuSNIbahr0ys2YnEERD4gYdISA06wa0i8RALrnzflh9Wxii7zQJEB2/Eh74dX4y/sHKLWp5uQ==} 542 | cpu: [arm] 543 | os: [linux] 544 | 545 | '@rollup/rollup-linux-arm64-gnu@4.29.1': 546 | resolution: {integrity: sha512-Z80O+taYxTQITWMjm/YqNoe9d10OX6kDh8X5/rFCMuPqsKsSyDilvfg+vd3iXIqtfmp+cnfL1UrYirkaF8SBZA==} 547 | cpu: [arm64] 548 | os: [linux] 549 | 550 | '@rollup/rollup-linux-arm64-musl@4.29.1': 551 | resolution: {integrity: sha512-fOHRtF9gahwJk3QVp01a/GqS4hBEZCV1oKglVVq13kcK3NeVlS4BwIFzOHDbmKzt3i0OuHG4zfRP0YoG5OF/rA==} 552 | cpu: [arm64] 553 | os: [linux] 554 | 555 | '@rollup/rollup-linux-loongarch64-gnu@4.29.1': 556 | resolution: {integrity: sha512-5a7q3tnlbcg0OodyxcAdrrCxFi0DgXJSoOuidFUzHZ2GixZXQs6Tc3CHmlvqKAmOs5eRde+JJxeIf9DonkmYkw==} 557 | cpu: [loong64] 558 | os: [linux] 559 | 560 | '@rollup/rollup-linux-powerpc64le-gnu@4.29.1': 561 | resolution: {integrity: sha512-9b4Mg5Yfz6mRnlSPIdROcfw1BU22FQxmfjlp/CShWwO3LilKQuMISMTtAu/bxmmrE6A902W2cZJuzx8+gJ8e9w==} 562 | cpu: [ppc64] 563 | os: [linux] 564 | 565 | '@rollup/rollup-linux-riscv64-gnu@4.29.1': 566 | resolution: {integrity: sha512-G5pn0NChlbRM8OJWpJFMX4/i8OEU538uiSv0P6roZcbpe/WfhEO+AT8SHVKfp8qhDQzaz7Q+1/ixMy7hBRidnQ==} 567 | cpu: [riscv64] 568 | os: [linux] 569 | 570 | '@rollup/rollup-linux-s390x-gnu@4.29.1': 571 | resolution: {integrity: sha512-WM9lIkNdkhVwiArmLxFXpWndFGuOka4oJOZh8EP3Vb8q5lzdSCBuhjavJsw68Q9AKDGeOOIHYzYm4ZFvmWez5g==} 572 | cpu: [s390x] 573 | os: [linux] 574 | 575 | '@rollup/rollup-linux-x64-gnu@4.29.1': 576 | resolution: {integrity: sha512-87xYCwb0cPGZFoGiErT1eDcssByaLX4fc0z2nRM6eMtV9njAfEE6OW3UniAoDhX4Iq5xQVpE6qO9aJbCFumKYQ==} 577 | cpu: [x64] 578 | os: [linux] 579 | 580 | '@rollup/rollup-linux-x64-musl@4.29.1': 581 | resolution: {integrity: sha512-xufkSNppNOdVRCEC4WKvlR1FBDyqCSCpQeMMgv9ZyXqqtKBfkw1yfGMTUTs9Qsl6WQbJnsGboWCp7pJGkeMhKA==} 582 | cpu: [x64] 583 | os: [linux] 584 | 585 | '@rollup/rollup-win32-arm64-msvc@4.29.1': 586 | resolution: {integrity: sha512-F2OiJ42m77lSkizZQLuC+jiZ2cgueWQL5YC9tjo3AgaEw+KJmVxHGSyQfDUoYR9cci0lAywv2Clmckzulcq6ig==} 587 | cpu: [arm64] 588 | os: [win32] 589 | 590 | '@rollup/rollup-win32-ia32-msvc@4.29.1': 591 | resolution: {integrity: sha512-rYRe5S0FcjlOBZQHgbTKNrqxCBUmgDJem/VQTCcTnA2KCabYSWQDrytOzX7avb79cAAweNmMUb/Zw18RNd4mng==} 592 | cpu: [ia32] 593 | os: [win32] 594 | 595 | '@rollup/rollup-win32-x64-msvc@4.29.1': 596 | resolution: {integrity: sha512-+10CMg9vt1MoHj6x1pxyjPSMjHTIlqs8/tBztXvPAx24SKs9jwVnKqHJumlH/IzhaPUaj3T6T6wfZr8okdXaIg==} 597 | cpu: [x64] 598 | os: [win32] 599 | 600 | '@types/babel__core@7.20.5': 601 | resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} 602 | 603 | '@types/babel__generator@7.6.8': 604 | resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} 605 | 606 | '@types/babel__template@7.4.4': 607 | resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 608 | 609 | '@types/babel__traverse@7.20.6': 610 | resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} 611 | 612 | '@types/estree@1.0.6': 613 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 614 | 615 | ag-grid-community@31.1.1: 616 | resolution: {integrity: sha512-tiQZ7VQ07yJScTMIQpaYoUMPgiyXMwYDcwTxe4riRrcYGTg0e258XEihoPUZFejR60P1fYWMxdJaR2JUnyhGrg==} 617 | 618 | ag-grid-enterprise@31.1.1: 619 | resolution: {integrity: sha512-hAy8x+P2KzpRb8RONvCj/FqLL0AJ4FEIEJsEuOEiZAEgi64TAhZv/FzIhIbAElPXf+OhCMKHIAKTD765vzCMOQ==} 620 | 621 | ansi-regex@5.0.1: 622 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 623 | engines: {node: '>=8'} 624 | 625 | ansi-regex@6.1.0: 626 | resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} 627 | engines: {node: '>=12'} 628 | 629 | ansi-styles@4.3.0: 630 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 631 | engines: {node: '>=8'} 632 | 633 | ansi-styles@6.2.1: 634 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 635 | engines: {node: '>=12'} 636 | 637 | any-promise@1.3.0: 638 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 639 | 640 | argparse@2.0.1: 641 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 642 | 643 | babel-plugin-jsx-dom-expressions@0.39.3: 644 | resolution: {integrity: sha512-6RzmSu21zYPlV2gNwzjGG9FgODtt9hIWnx7L//OIioIEuRcnpDZoY8Tr+I81Cy1SrH4qoDyKpwHHo6uAMAeyPA==} 645 | peerDependencies: 646 | '@babel/core': ^7.20.12 647 | 648 | babel-preset-solid@1.9.3: 649 | resolution: {integrity: sha512-jvlx5wDp8s+bEF9sGFw/84SInXOA51ttkUEroQziKMbxplXThVKt83qB6bDTa1HuLNatdU9FHpFOiQWs1tLQIg==} 650 | peerDependencies: 651 | '@babel/core': ^7.0.0 652 | 653 | balanced-match@1.0.2: 654 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 655 | 656 | brace-expansion@2.0.1: 657 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 658 | 659 | browserslist@4.24.3: 660 | resolution: {integrity: sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==} 661 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 662 | hasBin: true 663 | 664 | bundle-require@5.1.0: 665 | resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} 666 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 667 | peerDependencies: 668 | esbuild: '>=0.18' 669 | 670 | cac@6.7.14: 671 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 672 | engines: {node: '>=8'} 673 | 674 | caniuse-lite@1.0.30001690: 675 | resolution: {integrity: sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==} 676 | 677 | chokidar@4.0.3: 678 | resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} 679 | engines: {node: '>= 14.16.0'} 680 | 681 | cliui@8.0.1: 682 | resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} 683 | engines: {node: '>=12'} 684 | 685 | color-convert@2.0.1: 686 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 687 | engines: {node: '>=7.0.0'} 688 | 689 | color-name@1.1.4: 690 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 691 | 692 | commander@4.1.1: 693 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 694 | engines: {node: '>= 6'} 695 | 696 | consola@3.3.1: 697 | resolution: {integrity: sha512-GyKnPG3/I+a4RtJxgHquJXWr70g9I3c4NT3dvqh0LPHQP2nZFQBOBszb7a5u/pGzqr40AKplQA6UxM1BSynSXg==} 698 | engines: {node: ^14.18.0 || >=16.10.0} 699 | 700 | convert-source-map@2.0.0: 701 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 702 | 703 | cross-spawn@7.0.6: 704 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 705 | engines: {node: '>= 8'} 706 | 707 | csstype@3.1.3: 708 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 709 | 710 | debug@4.4.0: 711 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 712 | engines: {node: '>=6.0'} 713 | peerDependencies: 714 | supports-color: '*' 715 | peerDependenciesMeta: 716 | supports-color: 717 | optional: true 718 | 719 | defu@6.1.4: 720 | resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} 721 | 722 | destr@2.0.3: 723 | resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} 724 | 725 | eastasianwidth@0.2.0: 726 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 727 | 728 | electron-to-chromium@1.5.76: 729 | resolution: {integrity: sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==} 730 | 731 | emoji-regex@8.0.0: 732 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 733 | 734 | emoji-regex@9.2.2: 735 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 736 | 737 | entities@4.5.0: 738 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 739 | engines: {node: '>=0.12'} 740 | 741 | esbuild-plugin-solid@0.5.0: 742 | resolution: {integrity: sha512-ITK6n+0ayGFeDVUZWNMxX+vLsasEN1ILrg4pISsNOQ+mq4ljlJJiuXotInd+HE0MzwTcA9wExT1yzDE2hsqPsg==} 743 | peerDependencies: 744 | esbuild: '>=0.12' 745 | solid-js: '>= 1.0' 746 | 747 | esbuild@0.23.1: 748 | resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} 749 | engines: {node: '>=18'} 750 | hasBin: true 751 | 752 | esbuild@0.24.2: 753 | resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} 754 | engines: {node: '>=18'} 755 | hasBin: true 756 | 757 | escalade@3.2.0: 758 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 759 | engines: {node: '>=6'} 760 | 761 | fdir@6.4.2: 762 | resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} 763 | peerDependencies: 764 | picomatch: ^3 || ^4 765 | peerDependenciesMeta: 766 | picomatch: 767 | optional: true 768 | 769 | foreground-child@3.3.0: 770 | resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} 771 | engines: {node: '>=14'} 772 | 773 | fsevents@2.3.3: 774 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 775 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 776 | os: [darwin] 777 | 778 | gensync@1.0.0-beta.2: 779 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 780 | engines: {node: '>=6.9.0'} 781 | 782 | get-caller-file@2.0.5: 783 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 784 | engines: {node: 6.* || 8.* || >= 10.*} 785 | 786 | get-tsconfig@4.10.0: 787 | resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} 788 | 789 | glob@10.4.5: 790 | resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} 791 | hasBin: true 792 | 793 | globals@11.12.0: 794 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 795 | engines: {node: '>=4'} 796 | 797 | html-entities@2.3.3: 798 | resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} 799 | 800 | importx@0.5.1: 801 | resolution: {integrity: sha512-YrRaigAec1sC2CdIJjf/hCH1Wp9Ii8Cq5ROw4k5nJ19FVl2FcJUHZ5gGIb1vs8+JNYIyOJpc2fcufS2330bxDw==} 802 | 803 | is-fullwidth-code-point@3.0.0: 804 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 805 | engines: {node: '>=8'} 806 | 807 | is-what@4.1.16: 808 | resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} 809 | engines: {node: '>=12.13'} 810 | 811 | isexe@2.0.0: 812 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 813 | 814 | jackspeak@3.4.3: 815 | resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} 816 | 817 | jiti@2.4.2: 818 | resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} 819 | hasBin: true 820 | 821 | joycon@3.1.1: 822 | resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} 823 | engines: {node: '>=10'} 824 | 825 | js-tokens@4.0.0: 826 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 827 | 828 | js-yaml@4.1.0: 829 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 830 | hasBin: true 831 | 832 | jsesc@3.1.0: 833 | resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} 834 | engines: {node: '>=6'} 835 | hasBin: true 836 | 837 | json5@2.2.3: 838 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 839 | engines: {node: '>=6'} 840 | hasBin: true 841 | 842 | lilconfig@3.1.3: 843 | resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} 844 | engines: {node: '>=14'} 845 | 846 | lines-and-columns@1.2.4: 847 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 848 | 849 | load-tsconfig@0.2.5: 850 | resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} 851 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 852 | 853 | lodash.sortby@4.7.0: 854 | resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} 855 | 856 | lru-cache@10.4.3: 857 | resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 858 | 859 | lru-cache@5.1.1: 860 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 861 | 862 | merge-anything@5.1.7: 863 | resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==} 864 | engines: {node: '>=12.13'} 865 | 866 | minimatch@9.0.5: 867 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 868 | engines: {node: '>=16 || 14 >=14.17'} 869 | 870 | minipass@7.1.2: 871 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 872 | engines: {node: '>=16 || 14 >=14.17'} 873 | 874 | ms@2.1.3: 875 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 876 | 877 | mz@2.7.0: 878 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 879 | 880 | nanoid@3.3.8: 881 | resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} 882 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 883 | hasBin: true 884 | 885 | node-fetch-native@1.6.6: 886 | resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==} 887 | 888 | node-releases@2.0.19: 889 | resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} 890 | 891 | object-assign@4.1.1: 892 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 893 | engines: {node: '>=0.10.0'} 894 | 895 | ofetch@1.4.1: 896 | resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} 897 | 898 | package-json-from-dist@1.0.1: 899 | resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} 900 | 901 | package-manager-detector@0.2.8: 902 | resolution: {integrity: sha512-ts9KSdroZisdvKMWVAVCXiKqnqNfXz4+IbrBG8/BWx/TR5le+jfenvoBuIZ6UWM9nz47W7AbD9qYfAwfWMIwzA==} 903 | 904 | parse5@7.2.1: 905 | resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} 906 | 907 | path-key@3.1.1: 908 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 909 | engines: {node: '>=8'} 910 | 911 | path-scurry@1.11.1: 912 | resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} 913 | engines: {node: '>=16 || 14 >=14.18'} 914 | 915 | pathe@1.1.2: 916 | resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} 917 | 918 | picocolors@1.1.1: 919 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 920 | 921 | picomatch@4.0.2: 922 | resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} 923 | engines: {node: '>=12'} 924 | 925 | pirates@4.0.6: 926 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 927 | engines: {node: '>= 6'} 928 | 929 | postcss-load-config@6.0.1: 930 | resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} 931 | engines: {node: '>= 18'} 932 | peerDependencies: 933 | jiti: '>=1.21.0' 934 | postcss: '>=8.0.9' 935 | tsx: ^4.8.1 936 | yaml: ^2.4.2 937 | peerDependenciesMeta: 938 | jiti: 939 | optional: true 940 | postcss: 941 | optional: true 942 | tsx: 943 | optional: true 944 | yaml: 945 | optional: true 946 | 947 | postcss@8.4.49: 948 | resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} 949 | engines: {node: ^10 || ^12 || >=14} 950 | 951 | prettier@3.4.2: 952 | resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} 953 | engines: {node: '>=14'} 954 | hasBin: true 955 | 956 | punycode@2.3.1: 957 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 958 | engines: {node: '>=6'} 959 | 960 | readdirp@4.0.2: 961 | resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} 962 | engines: {node: '>= 14.16.0'} 963 | 964 | require-directory@2.1.1: 965 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 966 | engines: {node: '>=0.10.0'} 967 | 968 | resolve-from@5.0.0: 969 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 970 | engines: {node: '>=8'} 971 | 972 | resolve-pkg-maps@1.0.0: 973 | resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 974 | 975 | rollup@4.29.1: 976 | resolution: {integrity: sha512-RaJ45M/kmJUzSWDs1Nnd5DdV4eerC98idtUOVr6FfKcgxqvjwHmxc5upLF9qZU9EpsVzzhleFahrT3shLuJzIw==} 977 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 978 | hasBin: true 979 | 980 | semver@6.3.1: 981 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 982 | hasBin: true 983 | 984 | seroval-plugins@1.1.1: 985 | resolution: {integrity: sha512-qNSy1+nUj7hsCOon7AO4wdAIo9P0jrzAMp18XhiOzA6/uO5TKtP7ScozVJ8T293oRIvi5wyCHSM4TrJo/c/GJA==} 986 | engines: {node: '>=10'} 987 | peerDependencies: 988 | seroval: ^1.0 989 | 990 | seroval@1.1.1: 991 | resolution: {integrity: sha512-rqEO6FZk8mv7Hyv4UCj3FD3b6Waqft605TLfsCe/BiaylRpyyMC0b+uA5TJKawX3KzMrdi3wsLbCaLplrQmBvQ==} 992 | engines: {node: '>=10'} 993 | 994 | shebang-command@2.0.0: 995 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 996 | engines: {node: '>=8'} 997 | 998 | shebang-regex@3.0.0: 999 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1000 | engines: {node: '>=8'} 1001 | 1002 | signal-exit@4.1.0: 1003 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1004 | engines: {node: '>=14'} 1005 | 1006 | solid-js@1.9.4: 1007 | resolution: {integrity: sha512-ipQl8FJ31bFUoBNScDQTG3BjN6+9Rg+Q+f10bUbnO6EOTTf5NGerJeHc7wyu5I4RMHEl/WwZwUmy/PTRgxxZ8g==} 1008 | 1009 | solid-refresh@0.6.3: 1010 | resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==} 1011 | peerDependencies: 1012 | solid-js: ^1.3 1013 | 1014 | source-map-js@1.2.1: 1015 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1016 | engines: {node: '>=0.10.0'} 1017 | 1018 | source-map@0.8.0-beta.0: 1019 | resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} 1020 | engines: {node: '>= 8'} 1021 | 1022 | string-width@4.2.3: 1023 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1024 | engines: {node: '>=8'} 1025 | 1026 | string-width@5.1.2: 1027 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1028 | engines: {node: '>=12'} 1029 | 1030 | strip-ansi@6.0.1: 1031 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1032 | engines: {node: '>=8'} 1033 | 1034 | strip-ansi@7.1.0: 1035 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1036 | engines: {node: '>=12'} 1037 | 1038 | sucrase@3.35.0: 1039 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 1040 | engines: {node: '>=16 || 14 >=14.17'} 1041 | hasBin: true 1042 | 1043 | taze@18.3.0: 1044 | resolution: {integrity: sha512-x5akxPGBWSn+QSu2RSNZantKp7ufaPNz+cPPVjgzchNzicxuL7rnUuMXBeQufivyu4Uy6RaafHv7YzUpM74RzQ==} 1045 | hasBin: true 1046 | 1047 | thenify-all@1.6.0: 1048 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 1049 | engines: {node: '>=0.8'} 1050 | 1051 | thenify@3.3.1: 1052 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 1053 | 1054 | tinyexec@0.3.1: 1055 | resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} 1056 | 1057 | tinyexec@0.3.2: 1058 | resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 1059 | 1060 | tinyglobby@0.2.10: 1061 | resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} 1062 | engines: {node: '>=12.0.0'} 1063 | 1064 | tr46@1.0.1: 1065 | resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} 1066 | 1067 | tree-kill@1.2.2: 1068 | resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} 1069 | hasBin: true 1070 | 1071 | ts-interface-checker@0.1.13: 1072 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 1073 | 1074 | tsup-preset-solid@2.2.0: 1075 | resolution: {integrity: sha512-sPAzeArmYkVAZNRN+m4tkiojdd0GzW/lCwd4+TQDKMENe8wr2uAuro1s0Z59ASmdBbkXoxLgCiNcuQMyiidMZg==} 1076 | peerDependencies: 1077 | tsup: ^8.0.0 1078 | 1079 | tsup@8.3.5: 1080 | resolution: {integrity: sha512-Tunf6r6m6tnZsG9GYWndg0z8dEV7fD733VBFzFJ5Vcm1FtlXB8xBD/rtrBi2a3YKEV7hHtxiZtW5EAVADoe1pA==} 1081 | engines: {node: '>=18'} 1082 | hasBin: true 1083 | peerDependencies: 1084 | '@microsoft/api-extractor': ^7.36.0 1085 | '@swc/core': ^1 1086 | postcss: ^8.4.12 1087 | typescript: '>=4.5.0' 1088 | peerDependenciesMeta: 1089 | '@microsoft/api-extractor': 1090 | optional: true 1091 | '@swc/core': 1092 | optional: true 1093 | postcss: 1094 | optional: true 1095 | typescript: 1096 | optional: true 1097 | 1098 | tsx@4.19.2: 1099 | resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==} 1100 | engines: {node: '>=18.0.0'} 1101 | hasBin: true 1102 | 1103 | typescript@5.7.3: 1104 | resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} 1105 | engines: {node: '>=14.17'} 1106 | hasBin: true 1107 | 1108 | ufo@1.5.4: 1109 | resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} 1110 | 1111 | unconfig@0.6.1: 1112 | resolution: {integrity: sha512-cVU+/sPloZqOyJEAfNwnQSFCzFrZm85vcVkryH7lnlB/PiTycUkAjt5Ds79cfIshGOZ+M5v3PBDnKgpmlE5DtA==} 1113 | 1114 | update-browserslist-db@1.1.1: 1115 | resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} 1116 | hasBin: true 1117 | peerDependencies: 1118 | browserslist: '>= 4.21.0' 1119 | 1120 | validate-html-nesting@1.2.2: 1121 | resolution: {integrity: sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==} 1122 | 1123 | vite-plugin-solid@2.11.0: 1124 | resolution: {integrity: sha512-G+NiwDj4EAeUE0wt3Ur9f+Lt9oMUuLd0FIxYuqwJSqRacKQRteCwUFzNy8zMEt88xWokngQhiFjfJMhjc1fDXw==} 1125 | peerDependencies: 1126 | '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* 1127 | solid-js: ^1.7.2 1128 | vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 1129 | peerDependenciesMeta: 1130 | '@testing-library/jest-dom': 1131 | optional: true 1132 | 1133 | vite@6.0.11: 1134 | resolution: {integrity: sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==} 1135 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1136 | hasBin: true 1137 | peerDependencies: 1138 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 1139 | jiti: '>=1.21.0' 1140 | less: '*' 1141 | lightningcss: ^1.21.0 1142 | sass: '*' 1143 | sass-embedded: '*' 1144 | stylus: '*' 1145 | sugarss: '*' 1146 | terser: ^5.16.0 1147 | tsx: ^4.8.1 1148 | yaml: ^2.4.2 1149 | peerDependenciesMeta: 1150 | '@types/node': 1151 | optional: true 1152 | jiti: 1153 | optional: true 1154 | less: 1155 | optional: true 1156 | lightningcss: 1157 | optional: true 1158 | sass: 1159 | optional: true 1160 | sass-embedded: 1161 | optional: true 1162 | stylus: 1163 | optional: true 1164 | sugarss: 1165 | optional: true 1166 | terser: 1167 | optional: true 1168 | tsx: 1169 | optional: true 1170 | yaml: 1171 | optional: true 1172 | 1173 | vitefu@1.0.4: 1174 | resolution: {integrity: sha512-y6zEE3PQf6uu/Mt6DTJ9ih+kyJLr4XcSgHR2zUkM8SWDhuixEJxfJ6CZGMHh1Ec3vPLoEA0IHU5oWzVqw8ulow==} 1175 | peerDependencies: 1176 | vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 1177 | peerDependenciesMeta: 1178 | vite: 1179 | optional: true 1180 | 1181 | webidl-conversions@4.0.2: 1182 | resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} 1183 | 1184 | whatwg-url@7.1.0: 1185 | resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} 1186 | 1187 | which@2.0.2: 1188 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1189 | engines: {node: '>= 8'} 1190 | hasBin: true 1191 | 1192 | wrap-ansi@7.0.0: 1193 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1194 | engines: {node: '>=10'} 1195 | 1196 | wrap-ansi@8.1.0: 1197 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 1198 | engines: {node: '>=12'} 1199 | 1200 | y18n@5.0.8: 1201 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 1202 | engines: {node: '>=10'} 1203 | 1204 | yallist@3.1.1: 1205 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 1206 | 1207 | yargs-parser@21.1.1: 1208 | resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 1209 | engines: {node: '>=12'} 1210 | 1211 | yargs@17.7.2: 1212 | resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} 1213 | engines: {node: '>=12'} 1214 | 1215 | snapshots: 1216 | 1217 | '@ampproject/remapping@2.3.0': 1218 | dependencies: 1219 | '@jridgewell/gen-mapping': 0.3.8 1220 | '@jridgewell/trace-mapping': 0.3.25 1221 | 1222 | '@antfu/ni@23.2.0': {} 1223 | 1224 | '@antfu/utils@8.1.0': {} 1225 | 1226 | '@babel/code-frame@7.26.2': 1227 | dependencies: 1228 | '@babel/helper-validator-identifier': 7.25.9 1229 | js-tokens: 4.0.0 1230 | picocolors: 1.1.1 1231 | 1232 | '@babel/compat-data@7.26.3': {} 1233 | 1234 | '@babel/core@7.26.0': 1235 | dependencies: 1236 | '@ampproject/remapping': 2.3.0 1237 | '@babel/code-frame': 7.26.2 1238 | '@babel/generator': 7.26.3 1239 | '@babel/helper-compilation-targets': 7.25.9 1240 | '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) 1241 | '@babel/helpers': 7.26.0 1242 | '@babel/parser': 7.26.3 1243 | '@babel/template': 7.25.9 1244 | '@babel/traverse': 7.26.4 1245 | '@babel/types': 7.26.3 1246 | convert-source-map: 2.0.0 1247 | debug: 4.4.0 1248 | gensync: 1.0.0-beta.2 1249 | json5: 2.2.3 1250 | semver: 6.3.1 1251 | transitivePeerDependencies: 1252 | - supports-color 1253 | 1254 | '@babel/generator@7.26.3': 1255 | dependencies: 1256 | '@babel/parser': 7.26.3 1257 | '@babel/types': 7.26.3 1258 | '@jridgewell/gen-mapping': 0.3.8 1259 | '@jridgewell/trace-mapping': 0.3.25 1260 | jsesc: 3.1.0 1261 | 1262 | '@babel/helper-annotate-as-pure@7.25.9': 1263 | dependencies: 1264 | '@babel/types': 7.26.3 1265 | 1266 | '@babel/helper-compilation-targets@7.25.9': 1267 | dependencies: 1268 | '@babel/compat-data': 7.26.3 1269 | '@babel/helper-validator-option': 7.25.9 1270 | browserslist: 4.24.3 1271 | lru-cache: 5.1.1 1272 | semver: 6.3.1 1273 | 1274 | '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.0)': 1275 | dependencies: 1276 | '@babel/core': 7.26.0 1277 | '@babel/helper-annotate-as-pure': 7.25.9 1278 | '@babel/helper-member-expression-to-functions': 7.25.9 1279 | '@babel/helper-optimise-call-expression': 7.25.9 1280 | '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) 1281 | '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 1282 | '@babel/traverse': 7.26.4 1283 | semver: 6.3.1 1284 | transitivePeerDependencies: 1285 | - supports-color 1286 | 1287 | '@babel/helper-member-expression-to-functions@7.25.9': 1288 | dependencies: 1289 | '@babel/traverse': 7.26.4 1290 | '@babel/types': 7.26.3 1291 | transitivePeerDependencies: 1292 | - supports-color 1293 | 1294 | '@babel/helper-module-imports@7.18.6': 1295 | dependencies: 1296 | '@babel/types': 7.26.3 1297 | 1298 | '@babel/helper-module-imports@7.25.9': 1299 | dependencies: 1300 | '@babel/traverse': 7.26.4 1301 | '@babel/types': 7.26.3 1302 | transitivePeerDependencies: 1303 | - supports-color 1304 | 1305 | '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': 1306 | dependencies: 1307 | '@babel/core': 7.26.0 1308 | '@babel/helper-module-imports': 7.25.9 1309 | '@babel/helper-validator-identifier': 7.25.9 1310 | '@babel/traverse': 7.26.4 1311 | transitivePeerDependencies: 1312 | - supports-color 1313 | 1314 | '@babel/helper-optimise-call-expression@7.25.9': 1315 | dependencies: 1316 | '@babel/types': 7.26.3 1317 | 1318 | '@babel/helper-plugin-utils@7.25.9': {} 1319 | 1320 | '@babel/helper-replace-supers@7.25.9(@babel/core@7.26.0)': 1321 | dependencies: 1322 | '@babel/core': 7.26.0 1323 | '@babel/helper-member-expression-to-functions': 7.25.9 1324 | '@babel/helper-optimise-call-expression': 7.25.9 1325 | '@babel/traverse': 7.26.4 1326 | transitivePeerDependencies: 1327 | - supports-color 1328 | 1329 | '@babel/helper-skip-transparent-expression-wrappers@7.25.9': 1330 | dependencies: 1331 | '@babel/traverse': 7.26.4 1332 | '@babel/types': 7.26.3 1333 | transitivePeerDependencies: 1334 | - supports-color 1335 | 1336 | '@babel/helper-string-parser@7.25.9': {} 1337 | 1338 | '@babel/helper-validator-identifier@7.25.9': {} 1339 | 1340 | '@babel/helper-validator-option@7.25.9': {} 1341 | 1342 | '@babel/helpers@7.26.0': 1343 | dependencies: 1344 | '@babel/template': 7.25.9 1345 | '@babel/types': 7.26.3 1346 | 1347 | '@babel/parser@7.26.3': 1348 | dependencies: 1349 | '@babel/types': 7.26.3 1350 | 1351 | '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': 1352 | dependencies: 1353 | '@babel/core': 7.26.0 1354 | '@babel/helper-plugin-utils': 7.25.9 1355 | 1356 | '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)': 1357 | dependencies: 1358 | '@babel/core': 7.26.0 1359 | '@babel/helper-plugin-utils': 7.25.9 1360 | 1361 | '@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.26.0)': 1362 | dependencies: 1363 | '@babel/core': 7.26.0 1364 | '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) 1365 | '@babel/helper-plugin-utils': 7.25.9 1366 | transitivePeerDependencies: 1367 | - supports-color 1368 | 1369 | '@babel/plugin-transform-typescript@7.26.3(@babel/core@7.26.0)': 1370 | dependencies: 1371 | '@babel/core': 7.26.0 1372 | '@babel/helper-annotate-as-pure': 7.25.9 1373 | '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) 1374 | '@babel/helper-plugin-utils': 7.25.9 1375 | '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 1376 | '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) 1377 | transitivePeerDependencies: 1378 | - supports-color 1379 | 1380 | '@babel/preset-typescript@7.26.0(@babel/core@7.26.0)': 1381 | dependencies: 1382 | '@babel/core': 7.26.0 1383 | '@babel/helper-plugin-utils': 7.25.9 1384 | '@babel/helper-validator-option': 7.25.9 1385 | '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) 1386 | '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.0) 1387 | '@babel/plugin-transform-typescript': 7.26.3(@babel/core@7.26.0) 1388 | transitivePeerDependencies: 1389 | - supports-color 1390 | 1391 | '@babel/template@7.25.9': 1392 | dependencies: 1393 | '@babel/code-frame': 7.26.2 1394 | '@babel/parser': 7.26.3 1395 | '@babel/types': 7.26.3 1396 | 1397 | '@babel/traverse@7.26.4': 1398 | dependencies: 1399 | '@babel/code-frame': 7.26.2 1400 | '@babel/generator': 7.26.3 1401 | '@babel/parser': 7.26.3 1402 | '@babel/template': 7.25.9 1403 | '@babel/types': 7.26.3 1404 | debug: 4.4.0 1405 | globals: 11.12.0 1406 | transitivePeerDependencies: 1407 | - supports-color 1408 | 1409 | '@babel/types@7.26.3': 1410 | dependencies: 1411 | '@babel/helper-string-parser': 7.25.9 1412 | '@babel/helper-validator-identifier': 7.25.9 1413 | 1414 | '@esbuild/aix-ppc64@0.23.1': 1415 | optional: true 1416 | 1417 | '@esbuild/aix-ppc64@0.24.2': 1418 | optional: true 1419 | 1420 | '@esbuild/android-arm64@0.23.1': 1421 | optional: true 1422 | 1423 | '@esbuild/android-arm64@0.24.2': 1424 | optional: true 1425 | 1426 | '@esbuild/android-arm@0.23.1': 1427 | optional: true 1428 | 1429 | '@esbuild/android-arm@0.24.2': 1430 | optional: true 1431 | 1432 | '@esbuild/android-x64@0.23.1': 1433 | optional: true 1434 | 1435 | '@esbuild/android-x64@0.24.2': 1436 | optional: true 1437 | 1438 | '@esbuild/darwin-arm64@0.23.1': 1439 | optional: true 1440 | 1441 | '@esbuild/darwin-arm64@0.24.2': 1442 | optional: true 1443 | 1444 | '@esbuild/darwin-x64@0.23.1': 1445 | optional: true 1446 | 1447 | '@esbuild/darwin-x64@0.24.2': 1448 | optional: true 1449 | 1450 | '@esbuild/freebsd-arm64@0.23.1': 1451 | optional: true 1452 | 1453 | '@esbuild/freebsd-arm64@0.24.2': 1454 | optional: true 1455 | 1456 | '@esbuild/freebsd-x64@0.23.1': 1457 | optional: true 1458 | 1459 | '@esbuild/freebsd-x64@0.24.2': 1460 | optional: true 1461 | 1462 | '@esbuild/linux-arm64@0.23.1': 1463 | optional: true 1464 | 1465 | '@esbuild/linux-arm64@0.24.2': 1466 | optional: true 1467 | 1468 | '@esbuild/linux-arm@0.23.1': 1469 | optional: true 1470 | 1471 | '@esbuild/linux-arm@0.24.2': 1472 | optional: true 1473 | 1474 | '@esbuild/linux-ia32@0.23.1': 1475 | optional: true 1476 | 1477 | '@esbuild/linux-ia32@0.24.2': 1478 | optional: true 1479 | 1480 | '@esbuild/linux-loong64@0.23.1': 1481 | optional: true 1482 | 1483 | '@esbuild/linux-loong64@0.24.2': 1484 | optional: true 1485 | 1486 | '@esbuild/linux-mips64el@0.23.1': 1487 | optional: true 1488 | 1489 | '@esbuild/linux-mips64el@0.24.2': 1490 | optional: true 1491 | 1492 | '@esbuild/linux-ppc64@0.23.1': 1493 | optional: true 1494 | 1495 | '@esbuild/linux-ppc64@0.24.2': 1496 | optional: true 1497 | 1498 | '@esbuild/linux-riscv64@0.23.1': 1499 | optional: true 1500 | 1501 | '@esbuild/linux-riscv64@0.24.2': 1502 | optional: true 1503 | 1504 | '@esbuild/linux-s390x@0.23.1': 1505 | optional: true 1506 | 1507 | '@esbuild/linux-s390x@0.24.2': 1508 | optional: true 1509 | 1510 | '@esbuild/linux-x64@0.23.1': 1511 | optional: true 1512 | 1513 | '@esbuild/linux-x64@0.24.2': 1514 | optional: true 1515 | 1516 | '@esbuild/netbsd-arm64@0.24.2': 1517 | optional: true 1518 | 1519 | '@esbuild/netbsd-x64@0.23.1': 1520 | optional: true 1521 | 1522 | '@esbuild/netbsd-x64@0.24.2': 1523 | optional: true 1524 | 1525 | '@esbuild/openbsd-arm64@0.23.1': 1526 | optional: true 1527 | 1528 | '@esbuild/openbsd-arm64@0.24.2': 1529 | optional: true 1530 | 1531 | '@esbuild/openbsd-x64@0.23.1': 1532 | optional: true 1533 | 1534 | '@esbuild/openbsd-x64@0.24.2': 1535 | optional: true 1536 | 1537 | '@esbuild/sunos-x64@0.23.1': 1538 | optional: true 1539 | 1540 | '@esbuild/sunos-x64@0.24.2': 1541 | optional: true 1542 | 1543 | '@esbuild/win32-arm64@0.23.1': 1544 | optional: true 1545 | 1546 | '@esbuild/win32-arm64@0.24.2': 1547 | optional: true 1548 | 1549 | '@esbuild/win32-ia32@0.23.1': 1550 | optional: true 1551 | 1552 | '@esbuild/win32-ia32@0.24.2': 1553 | optional: true 1554 | 1555 | '@esbuild/win32-x64@0.23.1': 1556 | optional: true 1557 | 1558 | '@esbuild/win32-x64@0.24.2': 1559 | optional: true 1560 | 1561 | '@isaacs/cliui@8.0.2': 1562 | dependencies: 1563 | string-width: 5.1.2 1564 | string-width-cjs: string-width@4.2.3 1565 | strip-ansi: 7.1.0 1566 | strip-ansi-cjs: strip-ansi@6.0.1 1567 | wrap-ansi: 8.1.0 1568 | wrap-ansi-cjs: wrap-ansi@7.0.0 1569 | 1570 | '@jridgewell/gen-mapping@0.3.8': 1571 | dependencies: 1572 | '@jridgewell/set-array': 1.2.1 1573 | '@jridgewell/sourcemap-codec': 1.5.0 1574 | '@jridgewell/trace-mapping': 0.3.25 1575 | 1576 | '@jridgewell/resolve-uri@3.1.2': {} 1577 | 1578 | '@jridgewell/set-array@1.2.1': {} 1579 | 1580 | '@jridgewell/sourcemap-codec@1.5.0': {} 1581 | 1582 | '@jridgewell/trace-mapping@0.3.25': 1583 | dependencies: 1584 | '@jridgewell/resolve-uri': 3.1.2 1585 | '@jridgewell/sourcemap-codec': 1.5.0 1586 | 1587 | '@pkgjs/parseargs@0.11.0': 1588 | optional: true 1589 | 1590 | '@rollup/rollup-android-arm-eabi@4.29.1': 1591 | optional: true 1592 | 1593 | '@rollup/rollup-android-arm64@4.29.1': 1594 | optional: true 1595 | 1596 | '@rollup/rollup-darwin-arm64@4.29.1': 1597 | optional: true 1598 | 1599 | '@rollup/rollup-darwin-x64@4.29.1': 1600 | optional: true 1601 | 1602 | '@rollup/rollup-freebsd-arm64@4.29.1': 1603 | optional: true 1604 | 1605 | '@rollup/rollup-freebsd-x64@4.29.1': 1606 | optional: true 1607 | 1608 | '@rollup/rollup-linux-arm-gnueabihf@4.29.1': 1609 | optional: true 1610 | 1611 | '@rollup/rollup-linux-arm-musleabihf@4.29.1': 1612 | optional: true 1613 | 1614 | '@rollup/rollup-linux-arm64-gnu@4.29.1': 1615 | optional: true 1616 | 1617 | '@rollup/rollup-linux-arm64-musl@4.29.1': 1618 | optional: true 1619 | 1620 | '@rollup/rollup-linux-loongarch64-gnu@4.29.1': 1621 | optional: true 1622 | 1623 | '@rollup/rollup-linux-powerpc64le-gnu@4.29.1': 1624 | optional: true 1625 | 1626 | '@rollup/rollup-linux-riscv64-gnu@4.29.1': 1627 | optional: true 1628 | 1629 | '@rollup/rollup-linux-s390x-gnu@4.29.1': 1630 | optional: true 1631 | 1632 | '@rollup/rollup-linux-x64-gnu@4.29.1': 1633 | optional: true 1634 | 1635 | '@rollup/rollup-linux-x64-musl@4.29.1': 1636 | optional: true 1637 | 1638 | '@rollup/rollup-win32-arm64-msvc@4.29.1': 1639 | optional: true 1640 | 1641 | '@rollup/rollup-win32-ia32-msvc@4.29.1': 1642 | optional: true 1643 | 1644 | '@rollup/rollup-win32-x64-msvc@4.29.1': 1645 | optional: true 1646 | 1647 | '@types/babel__core@7.20.5': 1648 | dependencies: 1649 | '@babel/parser': 7.26.3 1650 | '@babel/types': 7.26.3 1651 | '@types/babel__generator': 7.6.8 1652 | '@types/babel__template': 7.4.4 1653 | '@types/babel__traverse': 7.20.6 1654 | 1655 | '@types/babel__generator@7.6.8': 1656 | dependencies: 1657 | '@babel/types': 7.26.3 1658 | 1659 | '@types/babel__template@7.4.4': 1660 | dependencies: 1661 | '@babel/parser': 7.26.3 1662 | '@babel/types': 7.26.3 1663 | 1664 | '@types/babel__traverse@7.20.6': 1665 | dependencies: 1666 | '@babel/types': 7.26.3 1667 | 1668 | '@types/estree@1.0.6': {} 1669 | 1670 | ag-grid-community@31.1.1: {} 1671 | 1672 | ag-grid-enterprise@31.1.1: 1673 | dependencies: 1674 | ag-grid-community: 31.1.1 1675 | 1676 | ansi-regex@5.0.1: {} 1677 | 1678 | ansi-regex@6.1.0: {} 1679 | 1680 | ansi-styles@4.3.0: 1681 | dependencies: 1682 | color-convert: 2.0.1 1683 | 1684 | ansi-styles@6.2.1: {} 1685 | 1686 | any-promise@1.3.0: {} 1687 | 1688 | argparse@2.0.1: {} 1689 | 1690 | babel-plugin-jsx-dom-expressions@0.39.3(@babel/core@7.26.0): 1691 | dependencies: 1692 | '@babel/core': 7.26.0 1693 | '@babel/helper-module-imports': 7.18.6 1694 | '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) 1695 | '@babel/types': 7.26.3 1696 | html-entities: 2.3.3 1697 | parse5: 7.2.1 1698 | validate-html-nesting: 1.2.2 1699 | 1700 | babel-preset-solid@1.9.3(@babel/core@7.26.0): 1701 | dependencies: 1702 | '@babel/core': 7.26.0 1703 | babel-plugin-jsx-dom-expressions: 0.39.3(@babel/core@7.26.0) 1704 | 1705 | balanced-match@1.0.2: {} 1706 | 1707 | brace-expansion@2.0.1: 1708 | dependencies: 1709 | balanced-match: 1.0.2 1710 | 1711 | browserslist@4.24.3: 1712 | dependencies: 1713 | caniuse-lite: 1.0.30001690 1714 | electron-to-chromium: 1.5.76 1715 | node-releases: 2.0.19 1716 | update-browserslist-db: 1.1.1(browserslist@4.24.3) 1717 | 1718 | bundle-require@5.1.0(esbuild@0.24.2): 1719 | dependencies: 1720 | esbuild: 0.24.2 1721 | load-tsconfig: 0.2.5 1722 | 1723 | cac@6.7.14: {} 1724 | 1725 | caniuse-lite@1.0.30001690: {} 1726 | 1727 | chokidar@4.0.3: 1728 | dependencies: 1729 | readdirp: 4.0.2 1730 | 1731 | cliui@8.0.1: 1732 | dependencies: 1733 | string-width: 4.2.3 1734 | strip-ansi: 6.0.1 1735 | wrap-ansi: 7.0.0 1736 | 1737 | color-convert@2.0.1: 1738 | dependencies: 1739 | color-name: 1.1.4 1740 | 1741 | color-name@1.1.4: {} 1742 | 1743 | commander@4.1.1: {} 1744 | 1745 | consola@3.3.1: {} 1746 | 1747 | convert-source-map@2.0.0: {} 1748 | 1749 | cross-spawn@7.0.6: 1750 | dependencies: 1751 | path-key: 3.1.1 1752 | shebang-command: 2.0.0 1753 | which: 2.0.2 1754 | 1755 | csstype@3.1.3: {} 1756 | 1757 | debug@4.4.0: 1758 | dependencies: 1759 | ms: 2.1.3 1760 | 1761 | defu@6.1.4: {} 1762 | 1763 | destr@2.0.3: {} 1764 | 1765 | eastasianwidth@0.2.0: {} 1766 | 1767 | electron-to-chromium@1.5.76: {} 1768 | 1769 | emoji-regex@8.0.0: {} 1770 | 1771 | emoji-regex@9.2.2: {} 1772 | 1773 | entities@4.5.0: {} 1774 | 1775 | esbuild-plugin-solid@0.5.0(esbuild@0.24.2)(solid-js@1.9.4): 1776 | dependencies: 1777 | '@babel/core': 7.26.0 1778 | '@babel/preset-typescript': 7.26.0(@babel/core@7.26.0) 1779 | babel-preset-solid: 1.9.3(@babel/core@7.26.0) 1780 | esbuild: 0.24.2 1781 | solid-js: 1.9.4 1782 | transitivePeerDependencies: 1783 | - supports-color 1784 | 1785 | esbuild@0.23.1: 1786 | optionalDependencies: 1787 | '@esbuild/aix-ppc64': 0.23.1 1788 | '@esbuild/android-arm': 0.23.1 1789 | '@esbuild/android-arm64': 0.23.1 1790 | '@esbuild/android-x64': 0.23.1 1791 | '@esbuild/darwin-arm64': 0.23.1 1792 | '@esbuild/darwin-x64': 0.23.1 1793 | '@esbuild/freebsd-arm64': 0.23.1 1794 | '@esbuild/freebsd-x64': 0.23.1 1795 | '@esbuild/linux-arm': 0.23.1 1796 | '@esbuild/linux-arm64': 0.23.1 1797 | '@esbuild/linux-ia32': 0.23.1 1798 | '@esbuild/linux-loong64': 0.23.1 1799 | '@esbuild/linux-mips64el': 0.23.1 1800 | '@esbuild/linux-ppc64': 0.23.1 1801 | '@esbuild/linux-riscv64': 0.23.1 1802 | '@esbuild/linux-s390x': 0.23.1 1803 | '@esbuild/linux-x64': 0.23.1 1804 | '@esbuild/netbsd-x64': 0.23.1 1805 | '@esbuild/openbsd-arm64': 0.23.1 1806 | '@esbuild/openbsd-x64': 0.23.1 1807 | '@esbuild/sunos-x64': 0.23.1 1808 | '@esbuild/win32-arm64': 0.23.1 1809 | '@esbuild/win32-ia32': 0.23.1 1810 | '@esbuild/win32-x64': 0.23.1 1811 | 1812 | esbuild@0.24.2: 1813 | optionalDependencies: 1814 | '@esbuild/aix-ppc64': 0.24.2 1815 | '@esbuild/android-arm': 0.24.2 1816 | '@esbuild/android-arm64': 0.24.2 1817 | '@esbuild/android-x64': 0.24.2 1818 | '@esbuild/darwin-arm64': 0.24.2 1819 | '@esbuild/darwin-x64': 0.24.2 1820 | '@esbuild/freebsd-arm64': 0.24.2 1821 | '@esbuild/freebsd-x64': 0.24.2 1822 | '@esbuild/linux-arm': 0.24.2 1823 | '@esbuild/linux-arm64': 0.24.2 1824 | '@esbuild/linux-ia32': 0.24.2 1825 | '@esbuild/linux-loong64': 0.24.2 1826 | '@esbuild/linux-mips64el': 0.24.2 1827 | '@esbuild/linux-ppc64': 0.24.2 1828 | '@esbuild/linux-riscv64': 0.24.2 1829 | '@esbuild/linux-s390x': 0.24.2 1830 | '@esbuild/linux-x64': 0.24.2 1831 | '@esbuild/netbsd-arm64': 0.24.2 1832 | '@esbuild/netbsd-x64': 0.24.2 1833 | '@esbuild/openbsd-arm64': 0.24.2 1834 | '@esbuild/openbsd-x64': 0.24.2 1835 | '@esbuild/sunos-x64': 0.24.2 1836 | '@esbuild/win32-arm64': 0.24.2 1837 | '@esbuild/win32-ia32': 0.24.2 1838 | '@esbuild/win32-x64': 0.24.2 1839 | 1840 | escalade@3.2.0: {} 1841 | 1842 | fdir@6.4.2(picomatch@4.0.2): 1843 | optionalDependencies: 1844 | picomatch: 4.0.2 1845 | 1846 | foreground-child@3.3.0: 1847 | dependencies: 1848 | cross-spawn: 7.0.6 1849 | signal-exit: 4.1.0 1850 | 1851 | fsevents@2.3.3: 1852 | optional: true 1853 | 1854 | gensync@1.0.0-beta.2: {} 1855 | 1856 | get-caller-file@2.0.5: {} 1857 | 1858 | get-tsconfig@4.10.0: 1859 | dependencies: 1860 | resolve-pkg-maps: 1.0.0 1861 | 1862 | glob@10.4.5: 1863 | dependencies: 1864 | foreground-child: 3.3.0 1865 | jackspeak: 3.4.3 1866 | minimatch: 9.0.5 1867 | minipass: 7.1.2 1868 | package-json-from-dist: 1.0.1 1869 | path-scurry: 1.11.1 1870 | 1871 | globals@11.12.0: {} 1872 | 1873 | html-entities@2.3.3: {} 1874 | 1875 | importx@0.5.1: 1876 | dependencies: 1877 | bundle-require: 5.1.0(esbuild@0.24.2) 1878 | debug: 4.4.0 1879 | esbuild: 0.24.2 1880 | jiti: 2.4.2 1881 | pathe: 1.1.2 1882 | tsx: 4.19.2 1883 | transitivePeerDependencies: 1884 | - supports-color 1885 | 1886 | is-fullwidth-code-point@3.0.0: {} 1887 | 1888 | is-what@4.1.16: {} 1889 | 1890 | isexe@2.0.0: {} 1891 | 1892 | jackspeak@3.4.3: 1893 | dependencies: 1894 | '@isaacs/cliui': 8.0.2 1895 | optionalDependencies: 1896 | '@pkgjs/parseargs': 0.11.0 1897 | 1898 | jiti@2.4.2: {} 1899 | 1900 | joycon@3.1.1: {} 1901 | 1902 | js-tokens@4.0.0: {} 1903 | 1904 | js-yaml@4.1.0: 1905 | dependencies: 1906 | argparse: 2.0.1 1907 | 1908 | jsesc@3.1.0: {} 1909 | 1910 | json5@2.2.3: {} 1911 | 1912 | lilconfig@3.1.3: {} 1913 | 1914 | lines-and-columns@1.2.4: {} 1915 | 1916 | load-tsconfig@0.2.5: {} 1917 | 1918 | lodash.sortby@4.7.0: {} 1919 | 1920 | lru-cache@10.4.3: {} 1921 | 1922 | lru-cache@5.1.1: 1923 | dependencies: 1924 | yallist: 3.1.1 1925 | 1926 | merge-anything@5.1.7: 1927 | dependencies: 1928 | is-what: 4.1.16 1929 | 1930 | minimatch@9.0.5: 1931 | dependencies: 1932 | brace-expansion: 2.0.1 1933 | 1934 | minipass@7.1.2: {} 1935 | 1936 | ms@2.1.3: {} 1937 | 1938 | mz@2.7.0: 1939 | dependencies: 1940 | any-promise: 1.3.0 1941 | object-assign: 4.1.1 1942 | thenify-all: 1.6.0 1943 | 1944 | nanoid@3.3.8: {} 1945 | 1946 | node-fetch-native@1.6.6: {} 1947 | 1948 | node-releases@2.0.19: {} 1949 | 1950 | object-assign@4.1.1: {} 1951 | 1952 | ofetch@1.4.1: 1953 | dependencies: 1954 | destr: 2.0.3 1955 | node-fetch-native: 1.6.6 1956 | ufo: 1.5.4 1957 | 1958 | package-json-from-dist@1.0.1: {} 1959 | 1960 | package-manager-detector@0.2.8: {} 1961 | 1962 | parse5@7.2.1: 1963 | dependencies: 1964 | entities: 4.5.0 1965 | 1966 | path-key@3.1.1: {} 1967 | 1968 | path-scurry@1.11.1: 1969 | dependencies: 1970 | lru-cache: 10.4.3 1971 | minipass: 7.1.2 1972 | 1973 | pathe@1.1.2: {} 1974 | 1975 | picocolors@1.1.1: {} 1976 | 1977 | picomatch@4.0.2: {} 1978 | 1979 | pirates@4.0.6: {} 1980 | 1981 | postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.4.49)(tsx@4.19.2): 1982 | dependencies: 1983 | lilconfig: 3.1.3 1984 | optionalDependencies: 1985 | jiti: 2.4.2 1986 | postcss: 8.4.49 1987 | tsx: 4.19.2 1988 | 1989 | postcss@8.4.49: 1990 | dependencies: 1991 | nanoid: 3.3.8 1992 | picocolors: 1.1.1 1993 | source-map-js: 1.2.1 1994 | 1995 | prettier@3.4.2: {} 1996 | 1997 | punycode@2.3.1: {} 1998 | 1999 | readdirp@4.0.2: {} 2000 | 2001 | require-directory@2.1.1: {} 2002 | 2003 | resolve-from@5.0.0: {} 2004 | 2005 | resolve-pkg-maps@1.0.0: {} 2006 | 2007 | rollup@4.29.1: 2008 | dependencies: 2009 | '@types/estree': 1.0.6 2010 | optionalDependencies: 2011 | '@rollup/rollup-android-arm-eabi': 4.29.1 2012 | '@rollup/rollup-android-arm64': 4.29.1 2013 | '@rollup/rollup-darwin-arm64': 4.29.1 2014 | '@rollup/rollup-darwin-x64': 4.29.1 2015 | '@rollup/rollup-freebsd-arm64': 4.29.1 2016 | '@rollup/rollup-freebsd-x64': 4.29.1 2017 | '@rollup/rollup-linux-arm-gnueabihf': 4.29.1 2018 | '@rollup/rollup-linux-arm-musleabihf': 4.29.1 2019 | '@rollup/rollup-linux-arm64-gnu': 4.29.1 2020 | '@rollup/rollup-linux-arm64-musl': 4.29.1 2021 | '@rollup/rollup-linux-loongarch64-gnu': 4.29.1 2022 | '@rollup/rollup-linux-powerpc64le-gnu': 4.29.1 2023 | '@rollup/rollup-linux-riscv64-gnu': 4.29.1 2024 | '@rollup/rollup-linux-s390x-gnu': 4.29.1 2025 | '@rollup/rollup-linux-x64-gnu': 4.29.1 2026 | '@rollup/rollup-linux-x64-musl': 4.29.1 2027 | '@rollup/rollup-win32-arm64-msvc': 4.29.1 2028 | '@rollup/rollup-win32-ia32-msvc': 4.29.1 2029 | '@rollup/rollup-win32-x64-msvc': 4.29.1 2030 | fsevents: 2.3.3 2031 | 2032 | semver@6.3.1: {} 2033 | 2034 | seroval-plugins@1.1.1(seroval@1.1.1): 2035 | dependencies: 2036 | seroval: 1.1.1 2037 | 2038 | seroval@1.1.1: {} 2039 | 2040 | shebang-command@2.0.0: 2041 | dependencies: 2042 | shebang-regex: 3.0.0 2043 | 2044 | shebang-regex@3.0.0: {} 2045 | 2046 | signal-exit@4.1.0: {} 2047 | 2048 | solid-js@1.9.4: 2049 | dependencies: 2050 | csstype: 3.1.3 2051 | seroval: 1.1.1 2052 | seroval-plugins: 1.1.1(seroval@1.1.1) 2053 | 2054 | solid-refresh@0.6.3(solid-js@1.9.4): 2055 | dependencies: 2056 | '@babel/generator': 7.26.3 2057 | '@babel/helper-module-imports': 7.25.9 2058 | '@babel/types': 7.26.3 2059 | solid-js: 1.9.4 2060 | transitivePeerDependencies: 2061 | - supports-color 2062 | 2063 | source-map-js@1.2.1: {} 2064 | 2065 | source-map@0.8.0-beta.0: 2066 | dependencies: 2067 | whatwg-url: 7.1.0 2068 | 2069 | string-width@4.2.3: 2070 | dependencies: 2071 | emoji-regex: 8.0.0 2072 | is-fullwidth-code-point: 3.0.0 2073 | strip-ansi: 6.0.1 2074 | 2075 | string-width@5.1.2: 2076 | dependencies: 2077 | eastasianwidth: 0.2.0 2078 | emoji-regex: 9.2.2 2079 | strip-ansi: 7.1.0 2080 | 2081 | strip-ansi@6.0.1: 2082 | dependencies: 2083 | ansi-regex: 5.0.1 2084 | 2085 | strip-ansi@7.1.0: 2086 | dependencies: 2087 | ansi-regex: 6.1.0 2088 | 2089 | sucrase@3.35.0: 2090 | dependencies: 2091 | '@jridgewell/gen-mapping': 0.3.8 2092 | commander: 4.1.1 2093 | glob: 10.4.5 2094 | lines-and-columns: 1.2.4 2095 | mz: 2.7.0 2096 | pirates: 4.0.6 2097 | ts-interface-checker: 0.1.13 2098 | 2099 | taze@18.3.0: 2100 | dependencies: 2101 | '@antfu/ni': 23.2.0 2102 | js-yaml: 4.1.0 2103 | ofetch: 1.4.1 2104 | package-manager-detector: 0.2.8 2105 | tinyexec: 0.3.2 2106 | unconfig: 0.6.1 2107 | yargs: 17.7.2 2108 | transitivePeerDependencies: 2109 | - supports-color 2110 | 2111 | thenify-all@1.6.0: 2112 | dependencies: 2113 | thenify: 3.3.1 2114 | 2115 | thenify@3.3.1: 2116 | dependencies: 2117 | any-promise: 1.3.0 2118 | 2119 | tinyexec@0.3.1: {} 2120 | 2121 | tinyexec@0.3.2: {} 2122 | 2123 | tinyglobby@0.2.10: 2124 | dependencies: 2125 | fdir: 6.4.2(picomatch@4.0.2) 2126 | picomatch: 4.0.2 2127 | 2128 | tr46@1.0.1: 2129 | dependencies: 2130 | punycode: 2.3.1 2131 | 2132 | tree-kill@1.2.2: {} 2133 | 2134 | ts-interface-checker@0.1.13: {} 2135 | 2136 | tsup-preset-solid@2.2.0(esbuild@0.24.2)(solid-js@1.9.4)(tsup@8.3.5(jiti@2.4.2)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.7.3)): 2137 | dependencies: 2138 | esbuild-plugin-solid: 0.5.0(esbuild@0.24.2)(solid-js@1.9.4) 2139 | tsup: 8.3.5(jiti@2.4.2)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.7.3) 2140 | transitivePeerDependencies: 2141 | - esbuild 2142 | - solid-js 2143 | - supports-color 2144 | 2145 | tsup@8.3.5(jiti@2.4.2)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.7.3): 2146 | dependencies: 2147 | bundle-require: 5.1.0(esbuild@0.24.2) 2148 | cac: 6.7.14 2149 | chokidar: 4.0.3 2150 | consola: 3.3.1 2151 | debug: 4.4.0 2152 | esbuild: 0.24.2 2153 | joycon: 3.1.1 2154 | picocolors: 1.1.1 2155 | postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.4.49)(tsx@4.19.2) 2156 | resolve-from: 5.0.0 2157 | rollup: 4.29.1 2158 | source-map: 0.8.0-beta.0 2159 | sucrase: 3.35.0 2160 | tinyexec: 0.3.1 2161 | tinyglobby: 0.2.10 2162 | tree-kill: 1.2.2 2163 | optionalDependencies: 2164 | postcss: 8.4.49 2165 | typescript: 5.7.3 2166 | transitivePeerDependencies: 2167 | - jiti 2168 | - supports-color 2169 | - tsx 2170 | - yaml 2171 | 2172 | tsx@4.19.2: 2173 | dependencies: 2174 | esbuild: 0.23.1 2175 | get-tsconfig: 4.10.0 2176 | optionalDependencies: 2177 | fsevents: 2.3.3 2178 | 2179 | typescript@5.7.3: {} 2180 | 2181 | ufo@1.5.4: {} 2182 | 2183 | unconfig@0.6.1: 2184 | dependencies: 2185 | '@antfu/utils': 8.1.0 2186 | defu: 6.1.4 2187 | importx: 0.5.1 2188 | transitivePeerDependencies: 2189 | - supports-color 2190 | 2191 | update-browserslist-db@1.1.1(browserslist@4.24.3): 2192 | dependencies: 2193 | browserslist: 4.24.3 2194 | escalade: 3.2.0 2195 | picocolors: 1.1.1 2196 | 2197 | validate-html-nesting@1.2.2: {} 2198 | 2199 | vite-plugin-solid@2.11.0(solid-js@1.9.4)(vite@6.0.11(jiti@2.4.2)(tsx@4.19.2)): 2200 | dependencies: 2201 | '@babel/core': 7.26.0 2202 | '@types/babel__core': 7.20.5 2203 | babel-preset-solid: 1.9.3(@babel/core@7.26.0) 2204 | merge-anything: 5.1.7 2205 | solid-js: 1.9.4 2206 | solid-refresh: 0.6.3(solid-js@1.9.4) 2207 | vite: 6.0.11(jiti@2.4.2)(tsx@4.19.2) 2208 | vitefu: 1.0.4(vite@6.0.11(jiti@2.4.2)(tsx@4.19.2)) 2209 | transitivePeerDependencies: 2210 | - supports-color 2211 | 2212 | vite@6.0.11(jiti@2.4.2)(tsx@4.19.2): 2213 | dependencies: 2214 | esbuild: 0.24.2 2215 | postcss: 8.4.49 2216 | rollup: 4.29.1 2217 | optionalDependencies: 2218 | fsevents: 2.3.3 2219 | jiti: 2.4.2 2220 | tsx: 4.19.2 2221 | 2222 | vitefu@1.0.4(vite@6.0.11(jiti@2.4.2)(tsx@4.19.2)): 2223 | optionalDependencies: 2224 | vite: 6.0.11(jiti@2.4.2)(tsx@4.19.2) 2225 | 2226 | webidl-conversions@4.0.2: {} 2227 | 2228 | whatwg-url@7.1.0: 2229 | dependencies: 2230 | lodash.sortby: 4.7.0 2231 | tr46: 1.0.1 2232 | webidl-conversions: 4.0.2 2233 | 2234 | which@2.0.2: 2235 | dependencies: 2236 | isexe: 2.0.0 2237 | 2238 | wrap-ansi@7.0.0: 2239 | dependencies: 2240 | ansi-styles: 4.3.0 2241 | string-width: 4.2.3 2242 | strip-ansi: 6.0.1 2243 | 2244 | wrap-ansi@8.1.0: 2245 | dependencies: 2246 | ansi-styles: 6.2.1 2247 | string-width: 5.1.2 2248 | strip-ansi: 7.1.0 2249 | 2250 | y18n@5.0.8: {} 2251 | 2252 | yallist@3.1.1: {} 2253 | 2254 | yargs-parser@21.1.1: {} 2255 | 2256 | yargs@17.7.2: 2257 | dependencies: 2258 | cliui: 8.0.1 2259 | escalade: 3.2.0 2260 | get-caller-file: 2.0.5 2261 | require-directory: 2.1.1 2262 | string-width: 4.2.3 2263 | y18n: 5.0.8 2264 | yargs-parser: 21.1.1 2265 | -------------------------------------------------------------------------------- /src/grid/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solidjs-community/solid-ag-grid/3aab2158415385f42991cfc6a4b3bd8057817f14/src/grid/.DS_Store -------------------------------------------------------------------------------- /src/grid/agGridSolid.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | ColumnApi, 3 | ComponentUtil, 4 | Context, 5 | CtrlsService, 6 | GridApi, 7 | GridCoreCreator, 8 | GridOptions, 9 | GridParams, 10 | Module, 11 | } from "ag-grid-community"; 12 | import { createEffect, createSignal, For, onCleanup, onMount } from "solid-js"; 13 | import { Portal } from "solid-js/web"; 14 | import SolidCompWrapperFactory from "./core/solidCompWrapperFactory"; 15 | import { SolidFrameworkOverrides } from "./core/solidFrameworkOverrides"; 16 | import GridComp from "./gridComp"; 17 | import { memoObj } from "./core/utils"; 18 | 19 | export interface AgGridSolidRef { 20 | api: GridApi; 21 | /** @deprecated v31 - The `columnApi` has been deprecated and all the methods are now present of the `api`. */ 22 | columnApi: ColumnApi; 23 | } 24 | 25 | export interface AgGridSolidProps extends GridOptions { 26 | gridOptions?: GridOptions; 27 | ref?: AgGridSolidRef | ((ref: AgGridSolidRef) => void); 28 | modules?: Module[]; 29 | class?: string; 30 | } 31 | 32 | export interface PortalInfo { 33 | mount: HTMLElement; 34 | SolidClass: any; 35 | props: any; 36 | ref: (instance: any) => void; 37 | } 38 | 39 | export interface PortalManager { 40 | addPortal(info: PortalInfo): void; 41 | 42 | removePortal(info: PortalInfo): void; 43 | } 44 | 45 | const AgGridSolid = function (props: AgGridSolidProps) { 46 | let eGui: HTMLDivElement; 47 | let api: GridApi; 48 | 49 | const [context, setContext] = createSignal(); 50 | const [getPortals, setPortals] = createSignal([]); 51 | 52 | const destroyFuncs: (() => void)[] = []; 53 | onCleanup(() => { 54 | destroyFuncs.forEach((f) => f()); 55 | destroyFuncs.length = 0; 56 | }); 57 | 58 | onMount(() => { 59 | const modules = props.modules || []; 60 | 61 | const portalManager: PortalManager = { 62 | addPortal: (info) => { 63 | setPortals([...getPortals(), info]); 64 | }, 65 | removePortal: (info) => { 66 | setPortals(getPortals().filter((item) => item != info)); 67 | }, 68 | }; 69 | 70 | const gridParams: GridParams = { 71 | providedBeanInstances: { 72 | frameworkComponentWrapper: new SolidCompWrapperFactory(portalManager), 73 | }, 74 | modules, 75 | frameworkOverrides: new SolidFrameworkOverrides(), 76 | }; 77 | 78 | const gridOptions = ComponentUtil.combineAttributesAndGridOptions( 79 | props.gridOptions, 80 | props, 81 | ); 82 | 83 | const createUiCallback = (context: Context) => { 84 | setContext(context); 85 | // because React is Async, we need to wait for the UI to be initialised before exposing the API's 86 | const ctrlsService = context.getBean(CtrlsService.NAME) as CtrlsService; 87 | ctrlsService.whenReady(() => { 88 | const refCallback = 89 | props.ref && (props.ref as (ref: AgGridSolidRef) => void); 90 | if (refCallback) { 91 | const gridRef: AgGridSolidRef = { 92 | api: api!, 93 | columnApi: new ColumnApi(api!), 94 | }; 95 | refCallback(gridRef); 96 | } 97 | destroyFuncs.push(() => api!.destroy()); 98 | }); 99 | }; 100 | 101 | const acceptChangesCallback = () => { 102 | // todo, what goes here? 103 | }; 104 | 105 | const gridCoreCreator = new GridCoreCreator(); 106 | api = gridCoreCreator.create( 107 | // @ts-ignore 108 | eGui, 109 | gridOptions, 110 | createUiCallback, 111 | acceptChangesCallback, 112 | gridParams, 113 | ); 114 | }); 115 | 116 | // we check for property changes. to get things started, we take a copy 117 | // of all the properties at the start, and then compare against this for 118 | // changes. 119 | const propsCopy: any = {}; 120 | Object.keys(props).forEach((key) => (propsCopy[key] = (props as any)[key])); 121 | 122 | // we memoize the values of the properties to optimize and prevent unwanted notifications 123 | const memo = memoObj(props); 124 | 125 | createEffect(() => { 126 | const props = memo(); 127 | const keys = Object.keys(props); 128 | const changes: { 129 | [key: string]: { currentValue: any; previousValue: any }; 130 | } = {}; 131 | let changesExist = false; 132 | 133 | keys.forEach((key) => { 134 | // this line reads from the prop, which in turn makes 135 | // this prop a dependency for the effect. 136 | const currentValue = (props as any)[key]; 137 | 138 | const previousValue = propsCopy[key]; 139 | if (previousValue !== currentValue) { 140 | changes[key] = currentValue; 141 | propsCopy[key] = currentValue; 142 | changesExist = true; 143 | } 144 | }); 145 | 146 | if (changesExist) { 147 | ComponentUtil.processOnChange(changes, api!); 148 | } 149 | }); 150 | 151 | return ( 152 |
153 | {context() && ( 154 | 155 | )} 156 | 157 | {(info, i) => ( 158 | 159 | 160 | 161 | )} 162 | 163 |
164 | ); 165 | }; 166 | 167 | export default AgGridSolid; 168 | -------------------------------------------------------------------------------- /src/grid/cellRenderer/detailCellRenderer.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | GridOptions, 3 | IDetailCellRenderer, 4 | IDetailCellRendererCtrl, 5 | IDetailCellRendererParams, 6 | } from "ag-grid-community"; 7 | import { createMemo, createSignal, onMount, useContext } from "solid-js"; 8 | import AgGridSolid, { AgGridSolidRef } from "../agGridSolid"; 9 | import { BeansContext } from "../core/beansContext"; 10 | import { CssClasses } from "../core/utils"; 11 | 12 | const DetailCellRenderer = (props: IDetailCellRendererParams) => { 13 | const { 14 | ctrlsFactory, 15 | context, 16 | gridOptionsService, 17 | resizeObserverService, 18 | clientSideRowModel, 19 | serverSideRowModel, 20 | } = useContext(BeansContext); 21 | 22 | const [getCssClasses, setCssClasses] = createSignal(new CssClasses()); 23 | const [getGridCssClasses, setGridCssClasses] = createSignal(new CssClasses()); 24 | const [getDetailGridOptions, setDetailGridOptions] = createSignal(); 25 | const [getDetailRowData, setDetailRowData] = createSignal(); 26 | 27 | let ctrl: IDetailCellRendererCtrl; 28 | let eGuiRef!: HTMLDivElement; 29 | 30 | const getCssClassesStr = createMemo(() => getCssClasses().toString() + " ag-details-row"); 31 | const getGridCssClassesStr = createMemo( 32 | () => getGridCssClasses().toString() + " ag-details-grid", 33 | ); 34 | 35 | (props as any).ref(() => ({ 36 | // force new instance when grid tries to refresh 37 | refresh() { 38 | return ctrl.refresh(); 39 | }, 40 | })); 41 | 42 | onMount(() => { 43 | if (props.template && typeof props.template === "string") { 44 | console.warn( 45 | "AG Grid: detailCellRendererParams.template is not supported by Solid - this only works with frameworks that work against String templates. To change the template, please provide your own Solid Detail Cell Renderer.", 46 | ); 47 | } 48 | 49 | const compProxy: IDetailCellRenderer = { 50 | addOrRemoveCssClass: (name: string, on: boolean) => 51 | setCssClasses(getCssClasses().setClass(name, on)), 52 | addOrRemoveDetailGridCssClass: (name: string, on: boolean) => 53 | setGridCssClasses(getGridCssClasses().setClass(name, on)), 54 | setDetailGrid: (gridOptions) => setDetailGridOptions(gridOptions), 55 | setRowData: (rowData) => setDetailRowData(rowData), 56 | getGui: () => eGuiRef, 57 | }; 58 | 59 | ctrl = ctrlsFactory.getInstance("detailCellRenderer") as IDetailCellRendererCtrl; 60 | if (!ctrl) { 61 | return; 62 | } // should never happen, means master/detail module not loaded 63 | context.createBean(ctrl); 64 | 65 | ctrl.init(compProxy, props); 66 | 67 | let resizeObserverDestroyFunc: () => void; 68 | 69 | if (gridOptionsService.get("detailRowAutoHeight")) { 70 | const checkRowSizeFunc = () => { 71 | // when disposed, current is null, so nothing to do, and the resize observer will 72 | // be disposed of soon 73 | if (eGuiRef == null) { 74 | return; 75 | } 76 | 77 | const clientHeight = eGuiRef.clientHeight; 78 | 79 | // if the UI is not ready, the height can be 0, which we ignore, as otherwise a flicker will occur 80 | // as UI goes from the default height, to 0, then to the real height as UI becomes ready. this means 81 | // it's not possible for have 0 as auto-height, however this is an improbable use case, as even an 82 | // empty detail grid would still have some styling around it giving at least a few pixels. 83 | if (clientHeight != null && clientHeight > 0) { 84 | // we do the update in a timeout, to make sure we are not calling from inside the grid 85 | // doing another update 86 | const updateRowHeightFunc = () => { 87 | props.node.setRowHeight(clientHeight); 88 | if (clientSideRowModel) { 89 | clientSideRowModel.onRowHeightChanged(); 90 | } else if (serverSideRowModel) { 91 | serverSideRowModel.onRowHeightChanged(); 92 | } 93 | }; 94 | setTimeout(updateRowHeightFunc, 0); 95 | } 96 | }; 97 | 98 | resizeObserverDestroyFunc = resizeObserverService.observeResize(eGuiRef, checkRowSizeFunc); 99 | checkRowSizeFunc(); 100 | } 101 | 102 | return () => { 103 | context.destroyBean(ctrl); 104 | if (resizeObserverDestroyFunc) { 105 | resizeObserverDestroyFunc(); 106 | } 107 | }; 108 | }); 109 | 110 | const setRef = (ref: AgGridSolidRef) => { 111 | ctrl.registerDetailWithMaster(ref.api, ref.columnApi); 112 | }; 113 | 114 | return ( 115 |
116 | {getDetailGridOptions() && ( 117 | 123 | )} 124 |
125 | ); 126 | }; 127 | 128 | export default DetailCellRenderer; 129 | -------------------------------------------------------------------------------- /src/grid/cellRenderer/groupCellRenderer.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | GroupCellRendererCtrl, 3 | GroupCellRendererParams, 4 | IGroupCellRenderer, 5 | UserCompDetails, 6 | _, 7 | } from "ag-grid-community"; 8 | import { createMemo, createSignal, onMount, useContext } from "solid-js"; 9 | import { BeansContext } from "../core/beansContext"; 10 | import { CssClasses } from "../core/utils"; 11 | import UserComp from "../userComps/userComp"; 12 | 13 | const GroupCellRenderer = (props: GroupCellRendererParams) => { 14 | const context = useContext(BeansContext).context!; 15 | 16 | let eGui!: HTMLElement; 17 | let eValueRef!: HTMLElement; 18 | let eCheckboxRef!: HTMLElement; 19 | let eExpandedRef!: HTMLElement; 20 | let eContractedRef!: HTMLElement; 21 | let role: any = "gridcell"; 22 | 23 | const [getInnerCompDetails, setInnerCompDetails] = createSignal(); 24 | const [getChildCount, setChildCount] = createSignal(); 25 | const [getValue, setValue] = createSignal(); 26 | const [getCssClasses, setCssClasses] = createSignal(new CssClasses()); 27 | const [getExpandedCssClasses, setExpandedCssClasses] = createSignal( 28 | new CssClasses("ag-hidden"), 29 | ); 30 | const [getContractedCssClasses, setContractedCssClasses] = createSignal( 31 | new CssClasses("ag-hidden"), 32 | ); 33 | const [getCheckboxCssClasses, setCheckboxCssClasses] = createSignal( 34 | new CssClasses("ag-invisible"), 35 | ); 36 | 37 | (props as any).ref(() => ({ 38 | // force new instance when grid tries to refresh 39 | refresh() { 40 | return false; 41 | }, 42 | })); 43 | 44 | onMount(() => { 45 | const compProxy: IGroupCellRenderer = { 46 | setInnerRenderer: (details, valueToDisplay) => { 47 | setInnerCompDetails(details); 48 | const escapedValue = _.escapeString(valueToDisplay, true); 49 | setValue(escapedValue); 50 | }, 51 | setChildCount: (count) => setChildCount(count), 52 | addOrRemoveCssClass: (name, on) => setCssClasses(getCssClasses().setClass(name, on)), 53 | setContractedDisplayed: (displayed) => 54 | setContractedCssClasses(getContractedCssClasses().setClass("ag-hidden", !displayed)), 55 | setExpandedDisplayed: (displayed) => 56 | setExpandedCssClasses(getExpandedCssClasses().setClass("ag-hidden", !displayed)), 57 | setCheckboxVisible: (visible) => 58 | setCheckboxCssClasses(getCheckboxCssClasses().setClass("ag-invisible", !visible)), 59 | }; 60 | 61 | const ctrl = context.createBean(new GroupCellRendererCtrl()); 62 | ctrl.init( 63 | compProxy, 64 | eGui, 65 | eCheckboxRef, 66 | eExpandedRef, 67 | eContractedRef, 68 | GroupCellRenderer, 69 | props, 70 | ); 71 | eGui.setAttribute("role", ctrl.getCellAriaRole()); 72 | role = ctrl.getCellAriaRole(); 73 | 74 | return () => { 75 | context.destroyBean(ctrl); 76 | }; 77 | }); 78 | 79 | const getClassName = createMemo(() => `ag-cell-wrapper ${getCssClasses().toString()}`); 80 | const getExpandedClassName = createMemo( 81 | () => `ag-group-expanded ${getExpandedCssClasses().toString()}`, 82 | ); 83 | const getContractedClassName = createMemo( 84 | () => `ag-group-contracted ${getContractedCssClasses().toString()}`, 85 | ); 86 | const getCheckboxClassName = createMemo( 87 | () => `ag-group-checkbox ${getCheckboxCssClasses().toString()}`, 88 | ); 89 | 90 | const isShowUserComp = () => getInnerCompDetails() != null; 91 | const isShowValue = () => getInnerCompDetails() == null && getValue() != null; 92 | 93 | return ( 94 | 95 | 96 | 97 | 98 | 99 | {isShowUserComp() && } 100 | {isShowValue() && <>{getValue()}} 101 | 102 | {getChildCount()} 103 | 104 | ); 105 | }; 106 | 107 | // we do not memo() here, as it would stop the forwardRef working 108 | export default GroupCellRenderer; 109 | -------------------------------------------------------------------------------- /src/grid/cells/cellComp.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | CellCtrl, 3 | CellStyle, 4 | CssClassManager, 5 | ICellComp, 6 | ICellEditor, 7 | ICellRenderer, 8 | _, 9 | } from "ag-grid-community"; 10 | import { createEffect, createMemo, createSignal, For, JSX, onMount } from "solid-js"; 11 | import { EditDetails, RenderDetails } from "./common"; 12 | import ShowEditDetails from "./showEditDetails"; 13 | import ShowRenderDetails from "./showRenderDetails"; 14 | 15 | const checkCellEditorDeprecations = ( 16 | popup: boolean, 17 | cellEditor: ICellEditor, 18 | cellCtrl: CellCtrl, 19 | ) => { 20 | const col = cellCtrl.getColumn(); 21 | 22 | // cellEditor is written to be a popup editor, however colDef.cellEditorPopup is not set 23 | if (!popup && cellEditor.isPopup && cellEditor.isPopup()) { 24 | const msg = `AG Grid: Found an issue in column ${col.getColId()}. If using SolidJS, specify an editor is a popup using colDef.cellEditorPopup=true. AG Grid SolidJS cannot depend on the editor component specifying if it's in a popup (via the isPopup() method on the editor), as SolidJS needs to know this information BEFORE the component is created.`; 25 | _.doOnce(() => console.warn(msg), "jsEditorComp-isPopup-" + cellCtrl.getColumn().getColId()); 26 | } 27 | 28 | // cellEditor is a popup and is trying to position itself the deprecated way 29 | if (popup && cellEditor.getPopupPosition && cellEditor.getPopupPosition() != null) { 30 | const msg = `AG Grid: Found an issue in column ${col.getColId()}. If using SolidJS, specify an editor popup position using colDef.cellEditorPopupPosition=true. AG Grid SolidJS cannot depend on the editor component specifying it's position (via the getPopupPosition() method on the editor), as SolidJS needs to know this information BEFORE the component is created.`; 31 | _.doOnce( 32 | () => console.warn(msg), 33 | "jsEditorComp-getPopupPosition-" + cellCtrl.getColumn().getColId(), 34 | ); 35 | } 36 | }; 37 | 38 | const CellComp = (props: { cellCtrl: CellCtrl; printLayout: boolean; editingRow: boolean }) => { 39 | const { cellCtrl, printLayout, editingRow } = props; 40 | 41 | const [renderDetails, setRenderDetails] = createSignal(); 42 | const [editDetails, setEditDetails] = createSignal(); 43 | 44 | let renderCompVersion = 0; 45 | const [renderCompVersionList, setRenderCompVersionList] = createSignal([ 46 | renderCompVersion, 47 | ]); 48 | 49 | const [userStyles, setUserStyles] = createSignal(); 50 | 51 | const [tabIndex, setTabIndex] = createSignal(cellCtrl.getTabIndex()); 52 | const [colId, setColId] = createSignal(cellCtrl.getColumnIdSanitised()); 53 | const [selectionCheckboxId, setSelectionCheckboxId] = createSignal(); 54 | const [includeSelection, setIncludeSelection] = createSignal(false); 55 | const [includeRowDrag, setIncludeRowDrag] = createSignal(false); 56 | const [includeDndSource, setIncludeDndSource] = createSignal(false); 57 | 58 | const forceWrapper = cellCtrl.isForceWrapper(); 59 | 60 | let eGui!: HTMLDivElement; 61 | let eCellWrapper!: HTMLDivElement; 62 | let eCellValue!: HTMLElement; 63 | let cellRenderer: ICellRenderer | null = null; 64 | let cellEditor: ICellEditor | null = null; 65 | 66 | const setECellValue = (val: HTMLElement) => { 67 | eCellValue = val; 68 | }; 69 | 70 | const setEditorRef = (popup: boolean, ref: ICellEditor) => { 71 | cellEditor = ref; 72 | if (!cellEditor) { 73 | return; 74 | } 75 | 76 | checkCellEditorDeprecations(popup, cellEditor, cellCtrl); 77 | 78 | const editingCancelledByUserComp = 79 | cellEditor.isCancelBeforeStart && cellEditor.isCancelBeforeStart(); 80 | if (editingCancelledByUserComp) { 81 | // we cannot set state inside render, so hack is to do it in next VM turn 82 | setTimeout(() => { 83 | cellCtrl.stopEditing(true); 84 | cellCtrl.focusCell(true); 85 | }); 86 | } 87 | 88 | const refAny = ref as any; 89 | if (refAny.afterGuiAttached) { 90 | setTimeout(() => refAny.afterGuiAttached(), 0); 91 | } 92 | }; 93 | const setPopupEditorRef = (ref: ICellEditor) => setEditorRef(true, ref); 94 | const setInlineEditorRef = (ref: ICellEditor) => setEditorRef(false, ref); 95 | 96 | const cssClassManager = new CssClassManager(() => eGui); 97 | 98 | const showTools = createMemo( 99 | () => renderDetails() != null && (includeSelection() || includeDndSource() || includeRowDrag()), 100 | ); 101 | const showCellWrapper = createMemo(() => forceWrapper || showTools()); 102 | 103 | const cellInstanceId = cellCtrl.getInstanceId(); 104 | 105 | onMount(() => { 106 | if (!cellCtrl) { 107 | return; 108 | } 109 | 110 | const compProxy: ICellComp = { 111 | addOrRemoveCssClass: (name, on) => cssClassManager.addOrRemoveCssClass(name, on), 112 | setUserStyles: (styles: CellStyle) => setUserStyles(styles), 113 | getFocusableElement: () => eGui, 114 | setIncludeSelection: (include) => setIncludeSelection(include), 115 | setIncludeRowDrag: (include) => setIncludeRowDrag(include), 116 | setIncludeDndSource: (include) => setIncludeDndSource(include), 117 | 118 | getCellEditor: () => cellEditor, 119 | getCellRenderer: () => (cellRenderer ? cellRenderer : null), 120 | getParentOfValue: () => (eCellValue ? eCellValue : eCellWrapper ? eCellWrapper : eGui), 121 | 122 | setRenderDetails: (compDetails, value, force) => { 123 | setRenderDetails({ 124 | value, 125 | compDetails, 126 | force, 127 | }); 128 | }, 129 | 130 | setEditDetails: (compDetails, popup, popupPosition) => { 131 | if (compDetails) { 132 | // start editing 133 | setEditDetails({ 134 | compDetails: compDetails!, 135 | popup, 136 | popupPosition, 137 | }); 138 | if (!popup) { 139 | setRenderDetails(undefined); 140 | } 141 | } else { 142 | // stop editing 143 | setEditDetails(undefined); 144 | } 145 | }, 146 | }; 147 | 148 | cellCtrl.setComp(compProxy, eGui, eCellWrapper, printLayout, editingRow); 149 | }); 150 | 151 | createEffect(() => { 152 | const isEditing = !!editDetails(); 153 | const isPopup = isEditing && !!editDetails()?.popup; 154 | 155 | cssClassManager.addOrRemoveCssClass("ag-cell-value", !showCellWrapper()); 156 | cssClassManager.addOrRemoveCssClass("ag-cell-inline-editing", isEditing && !isPopup); 157 | cssClassManager.addOrRemoveCssClass("ag-cell-popup-editing", isEditing && isPopup); 158 | cssClassManager.addOrRemoveCssClass("ag-cell-not-inline-editing", !isEditing || isPopup); 159 | cellCtrl.getRowCtrl()?.setInlineEditingCss(isEditing); 160 | }); 161 | 162 | // we only do refreshing for JS Comps. for SolidJS, the props will change for the cell renderer. 163 | let readyForRefresh = false; 164 | 165 | createEffect(() => { 166 | const details = renderDetails(); 167 | 168 | const isJsCellRenderer = 169 | details != null && details.compDetails != null && !details.compDetails.componentFromFramework; 170 | if (!isJsCellRenderer) { 171 | readyForRefresh = false; 172 | return; 173 | } 174 | if (!readyForRefresh) { 175 | readyForRefresh = true; 176 | return; 177 | } 178 | 179 | if (!cellRenderer) { 180 | return; 181 | } 182 | 183 | const params = details.compDetails!.params; 184 | const result = "refresh" in cellRenderer? (cellRenderer as ICellRenderer).refresh(params) : false; 185 | 186 | if (result != true) { 187 | // increasing the render key forces a new instance of ShowRenderDetails, 188 | // as we iteration through renderCompVersion, if the contents of 189 | // renderCompVersion changes, that maps to a new ShowRenderDetails instance. 190 | renderCompVersion++; 191 | setRenderCompVersionList([renderCompVersion]); 192 | } 193 | }); 194 | 195 | // we pass in eGui as a function below as eGui is not ready 196 | // when the template is built, only after it. so we defer 197 | // reading eGui variable until it's needed, after ShowEditDetails 198 | // is created. 199 | const eGuiFn = () => eGui; 200 | 201 | const bodyJsxFunc = () => ( 202 | <> 203 | 204 | {() => ( 205 | <> 206 | {renderDetails() && ( 207 | 220 | )} 221 | 222 | )} 223 | 224 | {editDetails() && ( 225 | 232 | )} 233 | 234 | ); 235 | 236 | return ( 237 |
244 | {" "} 245 | {showCellWrapper() ? ( 246 | 249 | ) : ( 250 | bodyJsxFunc() 251 | )} 252 |
253 | ); 254 | }; 255 | 256 | export default CellComp; 257 | -------------------------------------------------------------------------------- /src/grid/cells/common.tsx: -------------------------------------------------------------------------------- 1 | import { UserCompDetails } from "ag-grid-community"; 2 | 3 | export interface RenderDetails { 4 | compDetails: UserCompDetails | undefined; 5 | value?: any; 6 | force?: boolean; 7 | } 8 | 9 | export interface EditDetails { 10 | compDetails: UserCompDetails; 11 | popup?: boolean; 12 | popupPosition?: "over" | "under"; 13 | } 14 | -------------------------------------------------------------------------------- /src/grid/cells/popupEditorComp.tsx: -------------------------------------------------------------------------------- 1 | import { CellCtrl, PopupEditorWrapper } from "ag-grid-community"; 2 | import { JSX, onCleanup, useContext } from "solid-js"; 3 | import { Portal } from "solid-js/web"; 4 | import { BeansContext } from "../core/beansContext"; 5 | import { EditDetails } from "./common"; 6 | 7 | const PopupEditorComp = (props: { 8 | editDetails: EditDetails; 9 | cellCtrl: CellCtrl; 10 | eParentCell: HTMLElement; 11 | children?: JSX.Element; 12 | }) => { 13 | const { context, popupService, localeService, gridOptionsService } = useContext(BeansContext); 14 | 15 | const { editDetails, cellCtrl, eParentCell } = props; 16 | const { compDetails } = editDetails; 17 | 18 | const useModelPopup = gridOptionsService.get("stopEditingWhenCellsLoseFocus"); 19 | 20 | const wrapper = context.createBean(new PopupEditorWrapper(compDetails.params)); 21 | const ePopupGui = wrapper.getGui(); 22 | 23 | const positionParams = { 24 | column: cellCtrl.getColumn(), 25 | rowNode: cellCtrl.getRowNode(), 26 | type: "popupCellEditor", 27 | eventSource: eParentCell, 28 | ePopup: ePopupGui, 29 | position: editDetails!.popupPosition, 30 | keepWithinBounds: true, 31 | }; 32 | 33 | const positionCallback = popupService.positionPopupByComponent.bind(popupService, positionParams); 34 | 35 | const translate = localeService.getLocaleTextFunc(); 36 | 37 | const addPopupRes = popupService.addPopup({ 38 | modal: useModelPopup, 39 | eChild: ePopupGui, 40 | closeOnEsc: true, 41 | closedCallback: () => { 42 | cellCtrl.onPopupEditorClosed(); 43 | }, 44 | anchorToElement: eParentCell, 45 | positionCallback, 46 | ariaLabel: translate("ariaLabelCellEditor", "Cell Editor"), 47 | }); 48 | 49 | const hideEditorPopup: (() => void) | undefined = addPopupRes ? addPopupRes.hideFunc : undefined; 50 | 51 | onCleanup(() => { 52 | if (hideEditorPopup != null) { 53 | hideEditorPopup(); 54 | } 55 | context.destroyBean(wrapper); 56 | }); 57 | 58 | return {props.children}; 59 | }; 60 | 61 | export default PopupEditorComp; 62 | -------------------------------------------------------------------------------- /src/grid/cells/showEditDetails.tsx: -------------------------------------------------------------------------------- 1 | import { CellCtrl, ICellEditor } from "ag-grid-community"; 2 | import { createMemo } from "solid-js"; 3 | import UserComp from "../userComps/userComp"; 4 | import { EditDetails } from "./common"; 5 | import PopupEditorComp from "./popupEditorComp"; 6 | 7 | const ShowEditDetails = (props: { 8 | editDetails: EditDetails; 9 | cellCtrl: CellCtrl; 10 | eGuiFn: () => HTMLDivElement; 11 | setInlineRef: (ref: ICellEditor) => void; 12 | setPopupRef: (ref: ICellEditor) => void; 13 | }) => { 14 | const getCompDetails = createMemo(() => props.editDetails.compDetails); 15 | const compDetails = props.editDetails.compDetails; 16 | 17 | // when editing, we must have a comp, otherwise doesn't work 18 | if (!compDetails) { 19 | return <>; 20 | } 21 | 22 | const inPopup = props.editDetails.popup; 23 | const eGui = props.eGuiFn(); 24 | 25 | return ( 26 | <> 27 | {inPopup && ( 28 | 33 | 34 | 35 | )} 36 | {!inPopup && } 37 | 38 | ); 39 | }; 40 | 41 | export default ShowEditDetails; 42 | -------------------------------------------------------------------------------- /src/grid/cells/showRenderDetails.tsx: -------------------------------------------------------------------------------- 1 | import { CellCtrl, Component } from "ag-grid-community"; 2 | import { createMemo, onCleanup, Setter, useContext } from "solid-js"; 3 | import { BeansContext } from "../core/beansContext"; 4 | import UserComp from "../userComps/userComp"; 5 | import { RenderDetails } from "./common"; 6 | 7 | const ToolsComp = (props: { 8 | includeSelection: boolean; 9 | includeDndSource: boolean; 10 | includeRowDrag: boolean; 11 | setSelectionCheckboxId: Setter; 12 | cellCtrl: CellCtrl; 13 | }) => { 14 | const { context } = useContext(BeansContext); 15 | 16 | const CompWrapper = (innerProps: { createFn: () => Component | undefined }) => { 17 | const comp = innerProps.createFn(); 18 | if (!comp) { 19 | return <>; 20 | } 21 | 22 | onCleanup(() => context.destroyBean(comp)); 23 | return <>{comp.getGui()}; 24 | }; 25 | 26 | return ( 27 | <> 28 | {props.includeSelection && ( 29 | { 31 | const checkboxSelectionComp = props.cellCtrl.createSelectionCheckbox(); 32 | props.setSelectionCheckboxId(checkboxSelectionComp.getCheckboxId()); 33 | return checkboxSelectionComp; 34 | }} 35 | /> 36 | )} 37 | {props.includeDndSource && props.cellCtrl.createDndSource()} />} 38 | {props.includeRowDrag && props.cellCtrl.createRowDragComp()} />} 39 | 40 | ); 41 | }; 42 | 43 | const ShowRenderDetails = (props: { 44 | showDetails: RenderDetails; 45 | ref: any; 46 | showCellWrapper: boolean; 47 | showTools: boolean; 48 | includeDndSource: boolean; 49 | includeRowDrag: boolean; 50 | includeSelection: boolean; 51 | setSelectionCheckboxId: Setter; 52 | cellCtrl: CellCtrl; 53 | cellInstanceId: string; 54 | setECellValue: (eCellValue: HTMLElement) => void; 55 | }) => { 56 | const getCompDetails = createMemo(() => props.showDetails.compDetails); 57 | const isNoCompDetails = createMemo(() => props.showDetails.compDetails == null); 58 | 59 | // if we didn't do this, objects would cause error. we depend on objects for things 60 | // like the aggregation functions avg and count, which return objects and depend on toString() 61 | // getting called. 62 | const valueForNoCellRenderer = () => { 63 | const value = props.showDetails.value; 64 | return value && value.toString ? value.toString() : value; 65 | }; 66 | 67 | const bodyJsxFunc = () => ( 68 | <> 69 | {isNoCompDetails() && <>{valueForNoCellRenderer()}} 70 | {getCompDetails() && } 71 | 72 | ); 73 | 74 | return ( 75 | <> 76 | {props.showTools && ( 77 | 84 | )} 85 | {props.showCellWrapper ? ( 86 | 92 | {bodyJsxFunc()} 93 | 94 | ) : ( 95 | bodyJsxFunc() 96 | )} 97 | 98 | ); 99 | }; 100 | 101 | export default ShowRenderDetails; 102 | -------------------------------------------------------------------------------- /src/grid/core/beansContext.tsx: -------------------------------------------------------------------------------- 1 | import { Beans } from "ag-grid-community"; 2 | import { createContext } from "solid-js"; 3 | 4 | export const BeansContext = createContext({} as Beans); 5 | -------------------------------------------------------------------------------- /src/grid/core/portalManager.tsx: -------------------------------------------------------------------------------- 1 | export class PortalManager {} 2 | -------------------------------------------------------------------------------- /src/grid/core/solidCompWrapper.tsx: -------------------------------------------------------------------------------- 1 | import { WrappableInterface } from "ag-grid-community"; 2 | import { PortalInfo, PortalManager } from "../agGridSolid"; 3 | 4 | export default class SolidCompWrapper implements WrappableInterface { 5 | private eGui?: HTMLElement; 6 | private SolidCompClass: any; 7 | 8 | private portalManager: PortalManager; 9 | private portalInfo?: PortalInfo; 10 | 11 | private instance: any; 12 | 13 | constructor(SolidCompClass: any, portalManager: PortalManager) { 14 | this.SolidCompClass = SolidCompClass; 15 | this.portalManager = portalManager; 16 | } 17 | 18 | public init(props: any): void { 19 | this.eGui = document.createElement("div"); 20 | this.eGui.className = "ag-solid-container"; 21 | this.portalInfo = { 22 | mount: this.eGui, 23 | SolidClass: this.SolidCompClass, 24 | props, 25 | ref: (instance) => { 26 | this.instance = instance; 27 | }, 28 | }; 29 | this.portalManager.addPortal(this.portalInfo); 30 | } 31 | 32 | public destroy(): void { 33 | this.portalInfo && this.portalManager.removePortal(this.portalInfo); 34 | } 35 | 36 | public getGui(): HTMLElement { 37 | return this.eGui!; 38 | } 39 | 40 | public hasMethod(name: string): boolean { 41 | return this.instance[name] != null; 42 | } 43 | 44 | public getFrameworkComponentInstance(): any { 45 | return this.instance; 46 | } 47 | 48 | public callMethod(name: string, args: IArguments): void { 49 | return this.instance[name].apply(this.instance, args); 50 | } 51 | 52 | public addMethod(name: string, callback: Function): void { 53 | (this as any)[name] = callback; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/grid/core/solidCompWrapperFactory.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | BaseComponentWrapper, 3 | FrameworkComponentWrapper, 4 | WrappableInterface, 5 | } from "ag-grid-community"; 6 | import { PortalManager } from "../agGridSolid"; 7 | import SolidCompWrapper from "./solidCompWrapper"; 8 | 9 | export default class SolidCompWrapperFactory 10 | extends BaseComponentWrapper 11 | implements FrameworkComponentWrapper 12 | { 13 | private portalManager: PortalManager; 14 | 15 | constructor(portalManager: PortalManager) { 16 | super(); 17 | this.portalManager = portalManager; 18 | } 19 | 20 | createWrapper(SolidComponentClass: any): WrappableInterface { 21 | return new SolidCompWrapper(SolidComponentClass, this.portalManager); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/grid/core/solidFrameworkOverrides.tsx: -------------------------------------------------------------------------------- 1 | import { VanillaFrameworkOverrides } from "ag-grid-community"; 2 | import DetailCellRenderer from "../cellRenderer/detailCellRenderer"; 3 | import GroupCellRenderer from "../cellRenderer/groupCellRenderer"; 4 | 5 | export class SolidFrameworkOverrides extends VanillaFrameworkOverrides { 6 | constructor() { 7 | super("solid"); 8 | } 9 | 10 | private frameworkComponents: any = { 11 | agGroupCellRenderer: GroupCellRenderer, 12 | agGroupRowRenderer: GroupCellRenderer, 13 | agDetailCellRenderer: DetailCellRenderer, 14 | }; 15 | 16 | public frameworkComponent(name: string): any { 17 | return this.frameworkComponents[name]; 18 | } 19 | 20 | isFrameworkComponent(comp: any): boolean { 21 | if (!comp) { 22 | return false; 23 | } 24 | const prototype = comp.prototype; 25 | const isJsComp = prototype && "getGui" in prototype; 26 | return !isJsComp; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/grid/core/utils.tsx: -------------------------------------------------------------------------------- 1 | import { Accessor, createMemo, on } from "solid-js"; 2 | 3 | export const classesList = (...list: (string | null | undefined)[]): string => { 4 | const filtered = list.filter((s) => s != null && s !== ""); 5 | 6 | return filtered.join(" "); 7 | }; 8 | 9 | export class CssClasses { 10 | private classesMap: { [name: string]: boolean } = {}; 11 | 12 | constructor(...initialClasses: string[]) { 13 | initialClasses.forEach((className) => { 14 | this.classesMap[className] = true; 15 | }); 16 | } 17 | 18 | public setClass(className: string, on: boolean): CssClasses { 19 | // important to not make a copy if nothing has changed, so react 20 | // won't trigger a render cycle on new object instance 21 | const nothingHasChanged = !!this.classesMap[className] == on; 22 | if (nothingHasChanged) { 23 | return this; 24 | } 25 | 26 | const res = new CssClasses(); 27 | res.classesMap = { ...this.classesMap }; 28 | res.classesMap[className] = on; 29 | return res; 30 | } 31 | 32 | public toString(): string { 33 | const res = Object.keys(this.classesMap) 34 | .filter((key) => this.classesMap[key]) 35 | .join(" "); 36 | return res; 37 | } 38 | } 39 | 40 | export const isComponentStateless = (Component: any) => { 41 | const hasSymbol = () => typeof Symbol === "function" && Symbol.for; 42 | const getMemoType = () => (hasSymbol() ? Symbol.for("react.memo") : 0xead3); 43 | 44 | return ( 45 | (typeof Component === "function" && 46 | !(Component.prototype && Component.prototype.isReactComponent)) || 47 | (typeof Component === "object" && Component.$$typeof === getMemoType()) 48 | ); 49 | }; 50 | 51 | /** 52 | * Memoizes the props of an object 53 | * @param obj The object to memoize 54 | * @returns A reactive {@link Accessor} that gets updated when properties get added/removed from {@link obj} 55 | */ 56 | export const memoObj = (obj: T): Accessor => { 57 | const keys = createMemo( 58 | () => Object.keys(obj) as (string & keyof T)[], 59 | undefined, 60 | { equals: compareList }, 61 | ); 62 | return createMemo( 63 | on(keys, (list) => { 64 | const out: T = {} as any; 65 | for (const key of list) { 66 | Object.defineProperty(out, key, { 67 | enumerable: true, 68 | configurable: true, 69 | get: createMemo(() => obj[key]), 70 | }); 71 | } 72 | return out; 73 | }), 74 | ); 75 | }; 76 | 77 | /** 78 | * Checks whether two lists are equals 79 | * @param prev The previous list 80 | * @param next The next list 81 | */ 82 | const compareList = (prev: T[], next: T[]) => { 83 | return prev.length === next.length && prev.every((x, i) => x === next[i]); 84 | }; 85 | 86 | export interface RefPointer { 87 | instance?: T; 88 | afterSet?: (ref: T) => void; 89 | } 90 | -------------------------------------------------------------------------------- /src/grid/gridBodyComp.tsx: -------------------------------------------------------------------------------- 1 | import { GridBodyCtrl, IGridBodyComp, RowContainerName } from "ag-grid-community"; 2 | import { createMemo, createSignal, onCleanup, onMount, useContext } from "solid-js"; 3 | import { BeansContext } from "./core/beansContext"; 4 | import { classesList } from "./core/utils"; 5 | import GridHeaderComp from "./header/gridHeaderComp"; 6 | import RowContainerComp from "./rows/rowContainerComp"; 7 | 8 | const GridBodyComp = () => { 9 | const { context, agStackComponentsRegistry, resizeObserverService } = useContext(BeansContext); 10 | 11 | const [getRowAnimationClass, setRowAnimationClass] = createSignal(""); 12 | const [getAriaColCount, setAriaColCount] = createSignal(0); 13 | const [getAriaRowCount, setAriaRowCount] = createSignal(0); 14 | const [getTopHeight, setTopHeight] = createSignal(0); 15 | const [getBottomHeight, setBottomHeight] = createSignal(0); 16 | const [getStickyTopHeight, setStickyTopHeight] = createSignal("0px"); 17 | const [getStickyTopTop, setStickyTopTop] = createSignal("0px"); 18 | const [getStickyTopWidth, setStickyTopWidth] = createSignal("100%"); 19 | const [getTopDisplay, setTopDisplay] = createSignal(""); 20 | const [getBottomDisplay, setBottomDisplay] = createSignal(""); 21 | const [getBodyViewportWidth, setBodyViewportWidth] = createSignal(""); 22 | 23 | const [getMovingCss, setMovingCss] = createSignal(null); 24 | const [getForceVerticalScrollClass, setForceVerticalScrollClass] = createSignal( 25 | null, 26 | ); 27 | const [getTopAndBottomOverflowY, setTopAndBottomOverflowY] = createSignal< 28 | "scroll" | "hidden" | null 29 | >(null); 30 | const [getCellSelectableCss, setCellSelectableCss] = createSignal(null); 31 | 32 | // we initialise layoutClass to 'ag-layout-normal', because if we don't, the comp will initially 33 | // render with no width (as ag-layout-normal sets width to 0, which is needed for flex) which 34 | // gives the grid a massive width, which then renders a massive amount of columns. this problem 35 | // is due to React been async, for the non-async version (ie when not using React) this is not a 36 | // problem as the UI will finish initialising before we set data. 37 | const [getLayoutClass, setLayoutClass] = createSignal("ag-layout-normal"); 38 | 39 | let eRoot!: HTMLDivElement; 40 | let eTop!: HTMLDivElement; 41 | let eStickyTop!: HTMLDivElement; 42 | let eBody!: HTMLDivElement; 43 | let eBodyViewport!: HTMLDivElement; 44 | let eBottom!: HTMLDivElement; 45 | 46 | const destroyFuncs: (() => void)[] = []; 47 | onCleanup(() => { 48 | destroyFuncs.forEach((f) => f()); 49 | destroyFuncs.length = 0; 50 | }); 51 | 52 | onMount(() => { 53 | if (!context) { 54 | return; 55 | } 56 | 57 | const newComp = (tag: string) => { 58 | const CompClass = agStackComponentsRegistry.getComponentClass(tag); 59 | const comp = context.createBean(new CompClass()); 60 | onCleanup(() => context.destroyBean(comp)); 61 | return comp; 62 | }; 63 | 64 | eRoot.appendChild(newComp("AG-FAKE-HORIZONTAL-SCROLL").getGui()); 65 | eRoot.appendChild(newComp("AG-OVERLAY-WRAPPER").getGui()); 66 | eBody.appendChild(newComp("AG-FAKE-VERTICAL-SCROLL").getGui()); 67 | 68 | const compProxy: IGridBodyComp = { 69 | setRowAnimationCssOnBodyViewport: setRowAnimationClass, 70 | setColumnCount: setAriaColCount, 71 | setRowCount: setAriaRowCount, 72 | setTopHeight, 73 | setBottomHeight, 74 | setStickyTopHeight, 75 | setStickyTopTop, 76 | setStickyTopWidth, 77 | setTopDisplay, 78 | setBottomDisplay, 79 | setColumnMovingCss: setMovingCss, 80 | updateLayoutClasses: setLayoutClass, 81 | setAlwaysVerticalScrollClass: setForceVerticalScrollClass, 82 | setPinnedTopBottomOverflowY: setTopAndBottomOverflowY, 83 | setCellSelectableCss: (cssClass: string | null, flag: boolean) => 84 | setCellSelectableCss(flag ? cssClass : null), 85 | setBodyViewportWidth: setBodyViewportWidth, 86 | 87 | registerBodyViewportResizeListener: (listener: () => void) => { 88 | const unsubscribeFromResize = resizeObserverService.observeResize(eBodyViewport!, listener); 89 | destroyFuncs.push(() => unsubscribeFromResize()); 90 | }, 91 | }; 92 | 93 | const ctrl = context.createBean(new GridBodyCtrl()); 94 | onCleanup(() => context.destroyBean(ctrl)); 95 | 96 | // fixme - should not be in a timeout, 97 | // was because we need GridHeaderComp to be created first 98 | setTimeout(() => ctrl.setComp(compProxy, eRoot, eBodyViewport, eTop, eBottom, eStickyTop), 0); 99 | }); 100 | 101 | const getRootClasses = createMemo(() => 102 | classesList("ag-root", "ag-unselectable", getMovingCss(), getLayoutClass()), 103 | ); 104 | const getBodyClasses = createMemo(() => classesList("ag-body", getLayoutClass())); 105 | const getBodyViewportClasses = createMemo(() => 106 | classesList( 107 | "ag-body-viewport", 108 | getRowAnimationClass(), 109 | getLayoutClass(), 110 | getForceVerticalScrollClass(), 111 | getCellSelectableCss(), 112 | ), 113 | ); 114 | const getTopClasses = createMemo(() => classesList("ag-floating-top", getCellSelectableCss())); 115 | const getStickyTopClasses = createMemo(() => 116 | classesList("ag-sticky-top", getCellSelectableCss()), 117 | ); 118 | const getBottomClasses = createMemo(() => 119 | classesList("ag-floating-bottom", getCellSelectableCss()), 120 | ); 121 | 122 | const getTopStyle: any = createMemo(() => ({ 123 | height: `${getTopHeight()}px`, 124 | "min-height": `${getTopHeight()}px`, 125 | display: getTopDisplay(), 126 | "overflow-y": getTopAndBottomOverflowY(), 127 | })); 128 | 129 | const getStickyTopStyle = createMemo(() => ({ 130 | height: getStickyTopHeight(), 131 | top: getStickyTopTop(), 132 | width: getStickyTopWidth(), 133 | })); 134 | 135 | const getBottomStyle: any = createMemo(() => ({ 136 | height: `${getBottomHeight()}px`, 137 | "min-height": `${getBottomHeight()}px`, 138 | display: getBottomDisplay(), 139 | "overflow-y": getTopAndBottomOverflowY(), 140 | })); 141 | 142 | const getBodyViewportStyle = createMemo(() => ({ 143 | width: getBodyViewportWidth(), 144 | })); 145 | 146 | return ( 147 |
154 | 155 | 161 | 174 | 185 | 191 |
192 | ); 193 | }; 194 | 195 | export default GridBodyComp; 196 | -------------------------------------------------------------------------------- /src/grid/gridComp.tsx: -------------------------------------------------------------------------------- 1 | import { Context, FocusService, GridCtrl, IGridComp } from "ag-grid-community"; 2 | import { createMemo, createSignal, onCleanup, onMount } from "solid-js"; 3 | import { BeansContext } from "./core/beansContext"; 4 | import { classesList } from "./core/utils"; 5 | import GridBodyComp from "./gridBodyComp"; 6 | import TabGuardComp, { TabGuardRef } from "./tabGuardComp"; 7 | 8 | const GridComp = (props: { context: Context; class?: string }) => { 9 | const [rtlClass, setRtlClass] = createSignal(""); 10 | const [keyboardFocusClass, setKeyboardFocusClass] = createSignal(""); 11 | const [layoutClass, setLayoutClass] = createSignal(""); 12 | const [cursor, setCursor] = createSignal(null); 13 | const [userSelect, setUserSelect] = createSignal(null); 14 | const [initialised, setInitialised] = createSignal(false); 15 | 16 | const { context } = props; 17 | const beans = context.getBean("beans"); 18 | 19 | let tabGuardRef: TabGuardRef; 20 | const setTabGuardRef = (newRef: TabGuardRef) => { 21 | tabGuardRef = newRef; 22 | tabGuardRef && tabGuardReady(); 23 | }; 24 | 25 | let eGui!: HTMLDivElement; 26 | let eBody!: HTMLDivElement; 27 | let gridCtrl: GridCtrl; 28 | 29 | const onTabKeyDown = () => undefined; 30 | 31 | const destroyFuncs: (() => void)[] = []; 32 | onCleanup(() => { 33 | destroyFuncs.forEach((f) => f()); 34 | destroyFuncs.length = 0; 35 | }); 36 | 37 | const tabGuardReady = () => { 38 | const beansToDestroy: any[] = []; 39 | 40 | const { agStackComponentsRegistry } = beans; 41 | 42 | const HeaderDropZonesClass = agStackComponentsRegistry.getComponentClass( 43 | "AG-GRID-HEADER-DROP-ZONES", 44 | ); 45 | const SideBarClass = agStackComponentsRegistry.getComponentClass("AG-SIDE-BAR"); 46 | const StatusBarClass = agStackComponentsRegistry.getComponentClass("AG-STATUS-BAR"); 47 | const WatermarkClass = agStackComponentsRegistry.getComponentClass("AG-WATERMARK"); 48 | const PaginationClass = agStackComponentsRegistry.getComponentClass("AG-PAGINATION"); 49 | const additionalEls: HTMLDivElement[] = []; 50 | 51 | if (gridCtrl.showDropZones() && HeaderDropZonesClass) { 52 | const headerDropZonesComp = context.createBean(new HeaderDropZonesClass()); 53 | const el = headerDropZonesComp.getGui(); 54 | eGui.insertAdjacentElement("afterbegin", el); 55 | additionalEls.push(el); 56 | beansToDestroy.push(headerDropZonesComp); 57 | } 58 | 59 | if (gridCtrl.showSideBar() && SideBarClass) { 60 | const sideBarComp = context.createBean(new SideBarClass()); 61 | const el = sideBarComp.getGui(); 62 | const bottomTabGuard = eBody.querySelector(".ag-tab-guard-bottom"); 63 | if (bottomTabGuard) { 64 | bottomTabGuard.insertAdjacentElement("beforebegin", el); 65 | additionalEls.push(el); 66 | } 67 | 68 | beansToDestroy.push(sideBarComp); 69 | } 70 | 71 | if (gridCtrl.showStatusBar() && StatusBarClass) { 72 | const statusBarComp = context.createBean(new StatusBarClass()); 73 | const el = statusBarComp.getGui(); 74 | eGui.insertAdjacentElement("beforeend", el); 75 | additionalEls.push(el); 76 | beansToDestroy.push(statusBarComp); 77 | } 78 | 79 | if (PaginationClass) { 80 | const paginationComp = context.createBean(new PaginationClass()); 81 | const el = paginationComp.getGui(); 82 | eGui.insertAdjacentElement("beforeend", el); 83 | additionalEls.push(el); 84 | beansToDestroy.push(paginationComp); 85 | } 86 | 87 | if (gridCtrl.showWatermark() && WatermarkClass) { 88 | const watermarkComp = context.createBean(new WatermarkClass()); 89 | const el = watermarkComp.getGui(); 90 | eGui.insertAdjacentElement("beforeend", el); 91 | additionalEls.push(el); 92 | beansToDestroy.push(watermarkComp); 93 | } 94 | 95 | destroyFuncs.push(() => { 96 | context.destroyBeans(beansToDestroy); 97 | additionalEls.forEach((el) => { 98 | if (el.parentElement) { 99 | el.parentElement.removeChild(el); 100 | } 101 | }); 102 | }); 103 | }; 104 | 105 | onMount(() => { 106 | gridCtrl = context.createBean(new GridCtrl()); 107 | destroyFuncs.push(() => context.destroyBean(gridCtrl)); 108 | 109 | const compProxy: IGridComp = { 110 | destroyGridUi: () => {}, // do nothing, as framework users destroy grid by removing the comp 111 | setRtlClass: setRtlClass, 112 | forceFocusOutOfContainer: (up?: boolean) => { 113 | tabGuardRef && tabGuardRef.forceFocusOutOfContainer(up); 114 | }, 115 | updateLayoutClasses: setLayoutClass, 116 | getFocusableContainers: () => { 117 | const els: HTMLElement[] = []; 118 | 119 | const gridBodyCompEl = eGui.querySelector(".ag-root"); 120 | const sideBarEl = eGui.querySelector(".ag-side-bar:not(.ag-hidden)"); 121 | 122 | if (gridBodyCompEl) { 123 | els.push(gridBodyCompEl as HTMLElement); 124 | } 125 | 126 | if (sideBarEl) { 127 | els.push(sideBarEl as HTMLElement); 128 | } 129 | 130 | return els; 131 | }, 132 | setCursor, 133 | setUserSelect, 134 | }; 135 | 136 | gridCtrl.setComp(compProxy, eGui, eGui); 137 | setInitialised(true); 138 | }); 139 | 140 | const cssClasses = createMemo(() => 141 | classesList("ag-root-wrapper", rtlClass(), keyboardFocusClass(), layoutClass(), props.class), 142 | ); 143 | const bodyCssClasses = createMemo(() => 144 | classesList("ag-root-wrapper-body", "ag-focus-managed", layoutClass()), 145 | ); 146 | 147 | const topStyle: any = createMemo(() => ({ 148 | userSelect: userSelect != null ? userSelect() : "", 149 | WebkitUserSelect: userSelect != null ? userSelect() : "", 150 | cursor: cursor != null ? cursor() : "", 151 | })); 152 | 153 | return ( 154 |
155 |
156 | {initialised() && ( 157 | // we wait for initialised before rending the children, so GridComp has created and registered with it's 158 | // GridCtrl before we create the child GridBodyComp. Otherwise the GridBodyComp would initialise first, 159 | // before we have set the the Layout CSS classes, causing the GridBodyComp to render rows to a grid that 160 | // doesn't have it's height specified, which would result if all the rows getting rendered (and if many rows, 161 | // hangs the UI) 162 | 163 | 170 | 171 | 172 | 173 | )} 174 |
175 |
176 | ); 177 | }; 178 | 179 | export default GridComp; 180 | -------------------------------------------------------------------------------- /src/grid/header/gridHeaderComp.tsx: -------------------------------------------------------------------------------- 1 | import { GridHeaderCtrl, IGridHeaderComp } from "ag-grid-community"; 2 | import { createMemo, createSignal, onCleanup, onMount, useContext } from "solid-js"; 3 | import { BeansContext } from "../core/beansContext"; 4 | import { CssClasses } from "../core/utils"; 5 | import HeaderRowContainerComp from "./headerRowContainerComp"; 6 | 7 | const GridHeaderComp = () => { 8 | const [getCssClasses, setCssClasses] = createSignal(new CssClasses()); 9 | const [getHeight, setHeight] = createSignal(); 10 | 11 | const { context } = useContext(BeansContext); 12 | let eGui!: HTMLDivElement; 13 | 14 | const destroyFuncs: (() => void)[] = []; 15 | onCleanup(() => { 16 | destroyFuncs.forEach((f) => f()); 17 | destroyFuncs.length = 0; 18 | }); 19 | 20 | onMount(() => { 21 | const compProxy: IGridHeaderComp = { 22 | addOrRemoveCssClass: (name, on) => setCssClasses(getCssClasses().setClass(name, on)), 23 | setHeightAndMinHeight: (height) => setHeight(height), 24 | }; 25 | 26 | const ctrl = context.createBean(new GridHeaderCtrl()); 27 | ctrl.setComp(compProxy, eGui, eGui); 28 | 29 | destroyFuncs.push(() => context.destroyBean(ctrl)); 30 | }); 31 | 32 | const className = createMemo(() => { 33 | let res = getCssClasses().toString(); 34 | return "ag-header " + res; 35 | }); 36 | 37 | const style = createMemo(() => ({ 38 | height: getHeight(), 39 | "min-height": getHeight(), 40 | })); 41 | 42 | return ( 43 | 48 | ); 49 | }; 50 | 51 | export default GridHeaderComp; 52 | -------------------------------------------------------------------------------- /src/grid/header/headerCellComp.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | ColumnSortState, 3 | CssClassManager, 4 | HeaderCellCtrl, 5 | IHeader, 6 | IHeaderCellComp, 7 | UserCompDetails, 8 | } from "ag-grid-community"; 9 | import { createMemo, createSignal, onMount } from "solid-js"; 10 | import UserComp from "../userComps/userComp"; 11 | 12 | const HeaderCellComp = (props: { ctrl: HeaderCellCtrl }) => { 13 | const { ctrl } = props; 14 | 15 | const [getWidth, setWidth] = createSignal(); 16 | const [getColId, setColId] = createSignal(ctrl.getColId()); 17 | const [getAriaSort, setAriaSort] = createSignal(); 18 | const [getUserCompDetails, setUserCompDetails] = createSignal(); 19 | 20 | let eGui!: HTMLDivElement; 21 | let eResize!: HTMLDivElement; 22 | let eHeaderCompWrapper!: HTMLDivElement; 23 | 24 | let userComp: IHeader | undefined; 25 | 26 | const setRef = (ref: any) => { 27 | userComp = ref; 28 | }; 29 | 30 | const cssClassManager = new CssClassManager(() => eGui); 31 | 32 | onMount(() => { 33 | const compProxy: IHeaderCellComp = { 34 | setWidth: (width) => setWidth(width), 35 | addOrRemoveCssClass: (name, on) => cssClassManager.addOrRemoveCssClass(name, on), 36 | setAriaSort: (sort) => setAriaSort(sort), 37 | setUserCompDetails: (compDetails) => setUserCompDetails(compDetails), 38 | getUserCompInstance: () => userComp, 39 | }; 40 | 41 | ctrl.setComp(compProxy, eGui, eResize, eHeaderCompWrapper); 42 | 43 | const selectAllGui = ctrl.getSelectAllGui(); 44 | eResize.insertAdjacentElement("afterend", selectAllGui); 45 | ctrl.setDragSource(eGui); 46 | }); 47 | 48 | const style = createMemo(() => ({ width: getWidth() })); 49 | 50 | return ( 51 |
59 | 60 | 63 |
64 | ); 65 | }; 66 | 67 | export default HeaderCellComp; 68 | -------------------------------------------------------------------------------- /src/grid/header/headerFilterCellComp.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | AgPromise, 3 | HeaderFilterCellCtrl, 4 | IFloatingFilter, 5 | IHeaderFilterCellComp, 6 | UserCompDetails, 7 | } from "ag-grid-community"; 8 | import { createMemo, createSignal, onMount } from "solid-js"; 9 | import { CssClasses } from "../core/utils"; 10 | import UserComp from "../userComps/userComp"; 11 | 12 | const HeaderFilterCellComp = (props: { ctrl: HeaderFilterCellCtrl }) => { 13 | const [getCssClasses, setCssClasses] = createSignal(new CssClasses()); 14 | const [getCssBodyClasses, setBodyCssClasses] = createSignal(new CssClasses()); 15 | const [getCssButtonWrapperClasses, setButtonWrapperCssClasses] = createSignal( 16 | new CssClasses(), 17 | ); 18 | const [getButtonWrapperAriaHidden, setButtonWrapperAriaHidden] = createSignal<"true" | "false">( 19 | "false", 20 | ); 21 | const [getWidth, setWidth] = createSignal(); 22 | const [getUserCompDetails, setUserCompDetails] = createSignal< 23 | UserCompDetails | null | undefined 24 | >(); 25 | 26 | let eGui!: HTMLDivElement; 27 | let eFloatingFilterBody!: HTMLDivElement; 28 | let eButtonWrapper!: HTMLDivElement; 29 | let eButtonShowMainFilter!: HTMLButtonElement; 30 | 31 | let alreadyResolved = false; 32 | let userCompResolve: (value: IFloatingFilter) => void; 33 | let userCompPromise: AgPromise; 34 | onMount(() => { 35 | userCompPromise = new AgPromise((resolve) => { 36 | userCompResolve = resolve; 37 | }); 38 | }); 39 | 40 | const setRef = (value: IFloatingFilter) => { 41 | // i don't know why, but react was calling this method multiple 42 | // times, thus un-setting, them immediately setting the reference again. 43 | // because we are resolving a promise, it's not good to be resolving 44 | // the promise multiple times, so we only resolve the first time. 45 | if (alreadyResolved) { 46 | return; 47 | } 48 | // we also skip when it's un-setting 49 | if (value == null) { 50 | return; 51 | } 52 | 53 | userCompResolve && userCompResolve(value); 54 | alreadyResolved = true; 55 | }; 56 | 57 | const { ctrl } = props; 58 | 59 | onMount(() => { 60 | const compProxy: IHeaderFilterCellComp = { 61 | addOrRemoveCssClass: (name, on) => setCssClasses((prev) => prev.setClass(name, on)), 62 | addOrRemoveBodyCssClass: (name, on) => setBodyCssClasses((prev) => prev.setClass(name, on)), 63 | setButtonWrapperDisplayed: (displayed) => { 64 | setButtonWrapperCssClasses((prev) => prev.setClass("ag-hidden", !displayed)); 65 | setButtonWrapperAriaHidden(!displayed ? "true" : "false"); 66 | }, 67 | setWidth: (width) => setWidth(width), 68 | setCompDetails: (compDetails) => setUserCompDetails(compDetails), 69 | getFloatingFilterComp: () => userCompPromise, 70 | setMenuIcon: (eIcon) => eButtonShowMainFilter.appendChild(eIcon), 71 | }; 72 | 73 | ctrl.setComp(compProxy, eGui, eButtonShowMainFilter, eFloatingFilterBody); 74 | }); 75 | 76 | const getStyle = createMemo(() => ({ 77 | width: getWidth(), 78 | })); 79 | 80 | const getCssClassesString = createMemo( 81 | () => "ag-header-cell ag-floating-filter " + getCssClasses().toString(), 82 | ); 83 | const getBodyCssClassesString = createMemo(() => getCssBodyClasses().toString()); 84 | const getButtonWrapperCssClassesString = createMemo( 85 | () => "ag-floating-filter-button " + getCssButtonWrapperClasses().toString(), 86 | ); 87 | 88 | return ( 89 |
90 | 93 | 106 |
107 | ); 108 | }; 109 | 110 | export default HeaderFilterCellComp; 111 | -------------------------------------------------------------------------------- /src/grid/header/headerGroupCellComp.tsx: -------------------------------------------------------------------------------- 1 | import { HeaderGroupCellCtrl, IHeaderGroupCellComp, IHeaderGroupComp, UserCompDetails } from "ag-grid-community"; 2 | import { createEffect, createMemo, createSignal, onMount } from "solid-js"; 3 | import { CssClasses } from "../core/utils"; 4 | import UserComp from "../userComps/userComp"; 5 | 6 | const HeaderGroupCellComp = (props: { ctrl: HeaderGroupCellCtrl }) => { 7 | const { ctrl } = props; 8 | 9 | const [getCssClasses, setCssClasses] = createSignal(new CssClasses()); 10 | const [getCssResizableClasses, setResizableCssClasses] = createSignal( 11 | new CssClasses(), 12 | ); 13 | const [getResizableAriaHidden, setResizableAriaHidden] = createSignal<"true" | "false">("false"); 14 | const [getWidth, setWidth] = createSignal(); 15 | const [getColId, setColId] = createSignal(ctrl.getColId()); 16 | const [getAriaExpanded, setAriaExpanded] = createSignal<"true" | "false" | undefined>(); 17 | const [getUserCompDetails, setUserCompDetails] = createSignal(); 18 | 19 | let eGui!: HTMLDivElement; 20 | let eResize!: HTMLDivElement; 21 | let userCompRef!: IHeaderGroupComp; 22 | 23 | onMount(() => { 24 | const compProxy: IHeaderGroupCellComp = { 25 | setWidth: (width) => setWidth(width), 26 | addOrRemoveCssClass: (name, on) => setCssClasses(getCssClasses().setClass(name, on)), 27 | setUserCompDetails: (compDetails) => setUserCompDetails(compDetails), 28 | setResizableDisplayed: (displayed) => { 29 | setResizableCssClasses((prev) => prev.setClass("ag-hidden", !displayed)); 30 | setResizableAriaHidden(!displayed ? "true" : "false"); 31 | }, 32 | setAriaExpanded: (expanded) => setAriaExpanded(expanded), 33 | getUserCompInstance: () => userCompRef 34 | }; 35 | 36 | ctrl.setComp(compProxy, eGui, eResize); 37 | }); 38 | 39 | // add drag handling, must be done after component is added to the dom 40 | createEffect(() => { 41 | const userCompDetails = getUserCompDetails(); 42 | if (userCompDetails == null) { 43 | return; 44 | } 45 | 46 | ctrl.setDragSource(eGui); 47 | }); 48 | 49 | const style = createMemo(() => ({ 50 | width: getWidth(), 51 | })); 52 | 53 | const getClassName = createMemo(() => "ag-header-group-cell " + getCssClasses().toString()); 54 | const getResizableClassName = createMemo( 55 | () => "ag-header-cell-resize " + getCssResizableClasses().toString(), 56 | ); 57 | 58 | return ( 59 |
67 | {getUserCompDetails() && } 68 |
73 |
74 | ); 75 | }; 76 | 77 | export default HeaderGroupCellComp; 78 | -------------------------------------------------------------------------------- /src/grid/header/headerRowComp.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | AbstractHeaderCellCtrl, 3 | HeaderCellCtrl, 4 | HeaderFilterCellCtrl, 5 | HeaderGroupCellCtrl, 6 | HeaderRowCtrl, 7 | HeaderRowType, 8 | IHeaderRowComp, 9 | _, 10 | } from "ag-grid-community"; 11 | import { createMemo, createSignal, For, onMount, useContext } from "solid-js"; 12 | import { BeansContext } from "../core/beansContext"; 13 | import HeaderCellComp from "./headerCellComp"; 14 | import HeaderFilterCellComp from "./headerFilterCellComp"; 15 | import HeaderGroupCellComp from "./headerGroupCellComp"; 16 | 17 | const HeaderRowComp = (props: { ctrl: HeaderRowCtrl }) => { 18 | const { gridOptionsService } = useContext(BeansContext); 19 | const { ctrl } = props; 20 | 21 | const [getHeight, setHeight] = createSignal(); 22 | const [getTop, setTop] = createSignal(); 23 | const [getWidth, setWidth] = createSignal(); 24 | const [getAriaRowIndex, setAriaRowIndex] = createSignal(ctrl.getAriaRowIndex()); 25 | const [getCellCtrls, setCellCtrls] = createSignal([]); 26 | 27 | let eGui: HTMLDivElement; 28 | 29 | const setCellCtrlsMaintainOrder = (next: AbstractHeaderCellCtrl[]) => { 30 | const prev = getCellCtrls(); 31 | const isEnsureDomOrder = gridOptionsService.get("ensureDomOrder"); 32 | const isPrintLayout = gridOptionsService.isDomLayout("print"); 33 | 34 | // if we are ensuring dom order, we set the ctrls into the dom in the same order they appear on screen 35 | if (isEnsureDomOrder || isPrintLayout) { 36 | return next; 37 | } 38 | 39 | // if not maintaining order, we want to keep the dom elements we have and add new ones to the end, 40 | // otherwise we will loose transition effects as elements are placed in different dom locations 41 | const prevMap = _.mapById(prev, (c) => c.getInstanceId()); 42 | const nextMap = _.mapById(next, (c) => c.getInstanceId()); 43 | 44 | const oldCtrlsWeAreKeeping = prev.filter((c) => nextMap.has(c.getInstanceId())); 45 | const newCtrls = next.filter((c) => !prevMap.has(c.getInstanceId())); 46 | 47 | const nextOrderMaintained = [...oldCtrlsWeAreKeeping, ...newCtrls]; 48 | setCellCtrls(nextOrderMaintained); 49 | }; 50 | 51 | onMount(() => { 52 | const compProxy: IHeaderRowComp = { 53 | setHeight: (height) => setHeight(height), 54 | setTop: (top) => setTop(top), 55 | setHeaderCtrls: (ctrls) => setCellCtrlsMaintainOrder(ctrls), 56 | setWidth: (width) => setWidth(width), 57 | }; 58 | ctrl.setComp(compProxy); 59 | }); 60 | 61 | const style = createMemo(() => ({ 62 | height: getHeight(), 63 | top: getTop(), 64 | width: getWidth(), 65 | })); 66 | 67 | const cssClasses = ctrl.getHeaderRowClass(); 68 | 69 | const createCellJsx = (cellCtrl: AbstractHeaderCellCtrl) => { 70 | switch (ctrl.getType()) { 71 | case HeaderRowType.COLUMN_GROUP: 72 | return ; 73 | 74 | case HeaderRowType.FLOATING_FILTER: 75 | return ; 76 | 77 | default: 78 | return ; 79 | } 80 | }; 81 | 82 | // below, we are not doing floating filters, not yet 83 | return ( 84 |
91 | {(cellCtrl, i) => createCellJsx(cellCtrl)} 92 |
93 | ); 94 | }; 95 | 96 | export default HeaderRowComp; 97 | -------------------------------------------------------------------------------- /src/grid/header/headerRowContainerComp.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | ColumnPinnedType, 3 | HeaderRowContainerCtrl, 4 | HeaderRowCtrl, 5 | IHeaderRowContainerComp, 6 | } from "ag-grid-community"; 7 | import { 8 | createEffect, 9 | createMemo, 10 | createSignal, 11 | For, 12 | onCleanup, 13 | onMount, 14 | useContext, 15 | } from "solid-js"; 16 | import { BeansContext } from "../core/beansContext"; 17 | import { CssClasses } from "../core/utils"; 18 | import HeaderRowComp from "./headerRowComp"; 19 | 20 | const HeaderRowContainerComp = (props: { pinned: ColumnPinnedType | null }) => { 21 | const [getCssClasses, setCssClasses] = createSignal(new CssClasses()); 22 | const [getAriaHidden, setAriaHidden] = createSignal(false); 23 | const [getCenterContainerWidth, setCenterContainerWidth] = createSignal(); 24 | const [getPinnedContainerWidth, setPinnedContainerWidth] = createSignal(); 25 | const [getHeaderRowCtrls, setHeaderRowCtrls] = createSignal([]); 26 | 27 | const { context } = useContext(BeansContext); 28 | let eGui!: HTMLDivElement; 29 | 30 | const pinnedLeft = props.pinned === "left"; 31 | const pinnedRight = props.pinned === "right"; 32 | const centre = !pinnedLeft && !pinnedRight; 33 | 34 | const destroyFuncs: (() => void)[] = []; 35 | 36 | onCleanup(() => { 37 | destroyFuncs.forEach((f) => f()); 38 | destroyFuncs.length = 0; 39 | }); 40 | 41 | onMount(() => { 42 | const compProxy: IHeaderRowContainerComp = { 43 | setDisplayed: (displayed) => { 44 | setCssClasses(getCssClasses().setClass("ag-hidden", !displayed)); 45 | setAriaHidden(!displayed); 46 | }, 47 | setCtrls: (ctrls) => setHeaderRowCtrls(ctrls), 48 | 49 | // centre only 50 | setCenterWidth: (width) => setCenterContainerWidth(width), 51 | setViewportScrollLeft: (left) => (eGui.scrollLeft = left), 52 | 53 | // pinned only 54 | setPinnedContainerWidth: (width) => setPinnedContainerWidth(width), 55 | }; 56 | 57 | const ctrl = context.createBean(new HeaderRowContainerCtrl(props.pinned)); 58 | ctrl.setComp(compProxy, eGui); 59 | 60 | destroyFuncs.push(() => context.destroyBean(ctrl)); 61 | }); 62 | 63 | const getClassName = createMemo(() => getCssClasses().toString()); 64 | 65 | const insertRowsJsx = () => ( 66 | {(ctrl) => } 67 | ); 68 | 69 | const eCenterContainerStyle = createMemo(() => ({ 70 | width: getCenterContainerWidth(), 71 | })); 72 | 73 | const ePinnedStyle = createMemo(() => ({ 74 | width: getPinnedContainerWidth(), 75 | "min-width": getPinnedContainerWidth(), 76 | "max-width": getPinnedContainerWidth(), 77 | })); 78 | 79 | return ( 80 | <> 81 | {pinnedLeft && ( 82 |
89 | {insertRowsJsx()} 90 |
91 | )} 92 | {pinnedRight && ( 93 |
100 | {insertRowsJsx()} 101 |
102 | )} 103 | {centre && ( 104 | 109 | )} 110 | 111 | ); 112 | }; 113 | 114 | export default HeaderRowContainerComp; 115 | -------------------------------------------------------------------------------- /src/grid/rows/rowComp.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | CellCtrl, 3 | CssClassManager, 4 | ICellRenderer, 5 | IRowComp, 6 | RowContainerType, 7 | RowCtrl, 8 | RowStyle, 9 | UserCompDetails, 10 | } from "ag-grid-community"; 11 | import { createEffect, createMemo, createSignal, For, onCleanup, onMount } from "solid-js"; 12 | import CellComp from "../cells/cellComp"; 13 | import UserComp from "../userComps/userComp"; 14 | 15 | interface CellCtrls { 16 | list: CellCtrl[]; 17 | instanceIdMap: Map; 18 | } 19 | 20 | const maintainOrderOnColumns = ( 21 | prev: CellCtrls, 22 | next: CellCtrl[], 23 | domOrder: boolean, 24 | ): CellCtrls => { 25 | if (domOrder) { 26 | const res: CellCtrls = { list: next, instanceIdMap: new Map() }; 27 | next.forEach((c) => res.instanceIdMap.set(c.getInstanceId(), c)); 28 | 29 | return res; 30 | } 31 | 32 | // if dom order not important, we don't want to change the order 33 | // of the elements in the dom, as this would break transition styles 34 | const oldCellCtrls: CellCtrl[] = []; 35 | const newCellCtrls: CellCtrl[] = []; 36 | const newInstanceIdMap: Map = new Map(); 37 | const tempMap: Map = new Map(); 38 | 39 | next.forEach((c) => tempMap.set(c.getInstanceId(), c)); 40 | 41 | prev.list.forEach((c) => { 42 | const instanceId = c.getInstanceId(); 43 | if (tempMap.has(instanceId)) { 44 | oldCellCtrls.push(c); 45 | newInstanceIdMap.set(instanceId, c); 46 | } 47 | }); 48 | 49 | next.forEach((c) => { 50 | const instanceId = c.getInstanceId(); 51 | if (!prev.instanceIdMap.has(instanceId)) { 52 | newCellCtrls.push(c); 53 | newInstanceIdMap.set(instanceId, c); 54 | } 55 | }); 56 | 57 | const res: CellCtrls = { 58 | list: [...oldCellCtrls, ...newCellCtrls], 59 | instanceIdMap: newInstanceIdMap, 60 | }; 61 | 62 | return res; 63 | }; 64 | 65 | const RowComp = (params: { rowCtrl: RowCtrl; containerType: RowContainerType }) => { 66 | const { rowCtrl, containerType } = params; 67 | 68 | const [getRowIndex, setRowIndex] = createSignal(); 69 | const [getRowId, setRowId] = createSignal(); 70 | const [getRowBusinessKey, setRowBusinessKey] = createSignal(); 71 | const [getTabIndex, setTabIndex] = createSignal(rowCtrl.getTabIndex()); 72 | const [getUserStyles, setUserStyles] = createSignal(); 73 | const [getCellCtrls, setCellCtrls] = createSignal({ 74 | list: [], 75 | instanceIdMap: new Map(), 76 | }); 77 | const [getFullWidthCompDetails, setFullWidthCompDetails] = createSignal(); 78 | const [getDomOrder, setDomOrder] = createSignal(false); 79 | 80 | // these styles have initial values, so element is placed into the DOM with them, 81 | // rather than an transition getting applied. 82 | const [getTop, setTop] = createSignal( 83 | rowCtrl.getInitialRowTop(containerType), 84 | ); 85 | const [getTransform, setTransform] = createSignal( 86 | rowCtrl.getInitialTransform(containerType), 87 | ); 88 | 89 | let eGui!: HTMLDivElement; 90 | let fullWidthCompRef: ICellRenderer; 91 | 92 | const setFullWidthRef = (newRef: ICellRenderer) => { 93 | fullWidthCompRef = newRef; 94 | }; 95 | 96 | createEffect(() => { 97 | const compDetails = getFullWidthCompDetails(); 98 | if (!compDetails) { 99 | return; 100 | } 101 | 102 | let tryCount = 0; 103 | 104 | // puts autoHeight onto full with detail rows. this needs trickery, as we need 105 | // the HTMLElement for the provided Detail Cell Renderer. this pattern was copied 106 | // from React, it's possible it's not needed here, however given it's hard to be 107 | // sure on Solid's async behavious, keeping the patter here. 108 | const trySetup = () => { 109 | const eChild = eGui.firstChild as HTMLElement; 110 | if (eChild) { 111 | rowCtrl.setupDetailRowAutoHeight(eChild); 112 | return; 113 | } 114 | 115 | if (tryCount >= 10) { 116 | return; 117 | } 118 | 119 | tryCount++; 120 | setTimeout(trySetup, 0); 121 | }; 122 | 123 | trySetup(); 124 | }); 125 | 126 | onMount(() => { 127 | // because React is asychronous, it's possible the RowCtrl is no longer a valid RowCtrl. This can 128 | // happen if user calls two API methods one after the other, with the second API invalidating the rows 129 | // the first call created. Thus the rows for the first call could still get created even though no longer needed. 130 | if (!rowCtrl.isAlive()) { 131 | return; 132 | } 133 | 134 | const cssClassManager = new CssClassManager(() => eGui); 135 | 136 | const compProxy: IRowComp = { 137 | // the rowTop is managed by state, instead of direct style manipulation by rowCtrl (like all the other styles) 138 | // as we need to have an initial value when it's placed into he DOM for the first time, for animation to work. 139 | setTop: (value) => setTop(value), 140 | setTransform: (value) => setTransform(value), 141 | 142 | // i found using React for managing classes at the row level was to slow, as modifying classes caused a lot of 143 | // React code to execute, so avoiding React for managing CSS Classes made the grid go much faster. 144 | addOrRemoveCssClass: (name, on) => cssClassManager.addOrRemoveCssClass(name, on), 145 | 146 | setDomOrder: (domOrder) => setDomOrder(domOrder), 147 | setRowIndex: (value) => setRowIndex(value), 148 | setRowId: (value) => setRowId(value), 149 | setRowBusinessKey: (value) => setRowBusinessKey(value), 150 | setUserStyles: (styles: RowStyle) => setUserStyles(styles), 151 | // if we don't maintain the order, then cols will be ripped out and into the dom 152 | // when cols reordered, which would stop the CSS transitions from working 153 | setCellCtrls: (next) => 154 | setCellCtrls(maintainOrderOnColumns(getCellCtrls(), next, getDomOrder())), 155 | showFullWidth: (compDetails) => setFullWidthCompDetails(compDetails), 156 | getFullWidthCellRenderer: () => fullWidthCompRef, 157 | refreshFullWidth: (getUpdatedParams) => { 158 | if (!fullWidthCompRef || !fullWidthCompRef.refresh) { 159 | return false; 160 | } 161 | return fullWidthCompRef.refresh(getUpdatedParams()); 162 | }, 163 | }; 164 | rowCtrl.setComp(compProxy, eGui, containerType); 165 | onCleanup(() => rowCtrl.unsetComp(containerType)); 166 | }); 167 | 168 | const getRowStyles = createMemo(() => { 169 | const res = { 170 | top: getTop(), 171 | transform: getTransform(), 172 | }; 173 | 174 | Object.assign(res, getUserStyles()); 175 | return res; 176 | }); 177 | 178 | const isShowCells = createMemo(() => getCellCtrls() != null); 179 | const isShowFullWidth = createMemo(() => getFullWidthCompDetails() != null); 180 | 181 | const showCellsJsx = () => ( 182 | 183 | {(cellCtrl) => ( 184 | 189 | )} 190 | 191 | ); 192 | 193 | const showFullWidthJsx = () => ( 194 | 195 | ); 196 | 197 | return ( 198 |
207 | {isShowFullWidth() && showFullWidthJsx()} 208 | {isShowCells() && showCellsJsx()} 209 |
210 | ); 211 | }; 212 | 213 | export default RowComp; 214 | -------------------------------------------------------------------------------- /src/grid/rows/rowContainerComp.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | getRowContainerTypeForName, 3 | IRowContainerComp, 4 | RowContainerCtrl, 5 | RowContainerName, 6 | RowCtrl, 7 | } from "ag-grid-community"; 8 | import { 9 | createEffect, 10 | createMemo, 11 | createSignal, 12 | For, 13 | onCleanup, 14 | onMount, 15 | useContext, 16 | } from "solid-js"; 17 | import { BeansContext } from "../core/beansContext"; 18 | import { classesList } from "../core/utils"; 19 | import RowComp from "./rowComp"; 20 | 21 | const RowContainerComp = (props: { name: RowContainerName }) => { 22 | const { context } = useContext(BeansContext); 23 | 24 | const [viewportHeight, setViewportHeight] = createSignal(""); 25 | const [rowCtrlsOrdered, setRowCtrlsOrdered] = createSignal([]); 26 | const [rowCtrls, setRowCtrls] = createSignal([]); 27 | const [domOrder, setDomOrder] = createSignal(false); 28 | 29 | const { name } = props; 30 | const containerType = createMemo(() => getRowContainerTypeForName(name)); 31 | 32 | let eViewport!: HTMLDivElement; 33 | let eContainer!: HTMLDivElement; 34 | 35 | const cssClasses = createMemo(() => RowContainerCtrl.getRowContainerCssClasses(name)); 36 | const viewportClasses = createMemo(() => classesList(cssClasses().viewport)); 37 | const containerClasses = createMemo(() => classesList(cssClasses().container)); 38 | 39 | // no need to useMemo for boolean types 40 | const centerTemplate = 41 | name === RowContainerName.CENTER || 42 | name === RowContainerName.TOP_CENTER || 43 | name === RowContainerName.BOTTOM_CENTER || 44 | name === RowContainerName.STICKY_TOP_CENTER; 45 | 46 | // if domOrder=true, then we just copy rowCtrls into rowCtrlsOrdered observing order, 47 | // however if false, then we need to keep the order as they are in the dom, otherwise rowAnimation breaks 48 | let rowCtrlsOrderedCopy: RowCtrl[] = []; 49 | createEffect(() => { 50 | if (domOrder()) { 51 | setRowCtrlsOrdered(rowCtrls()); 52 | return; 53 | } 54 | // if dom order not important, we don't want to change the order 55 | // of the elements in the dom, as this would break transition styles 56 | // 57 | // we use the rowCtrlsOrderedCopy, to avoid this effect depending on and 58 | // setting the same value, hence causing an infinite loop 59 | const prev = rowCtrlsOrderedCopy; 60 | const oldRows = prev.filter((r) => rowCtrls().indexOf(r) >= 0); 61 | const newRows = rowCtrls().filter((r) => oldRows.indexOf(r) < 0); 62 | const next = [...oldRows, ...newRows]; 63 | setRowCtrlsOrdered(next); 64 | rowCtrlsOrderedCopy = next; 65 | }); 66 | 67 | onMount(() => { 68 | const compProxy: IRowContainerComp = { 69 | setViewportHeight: setViewportHeight, 70 | setRowCtrls: ({ rowCtrls }) => setRowCtrls(rowCtrls), 71 | setDomOrder: (domOrder) => setDomOrder(domOrder), 72 | setContainerWidth: (width) => { 73 | if (eContainer) { 74 | eContainer.style.width = width; 75 | } 76 | }, 77 | }; 78 | 79 | const ctrl = context.createBean(new RowContainerCtrl(name)); 80 | onCleanup(() => context.destroyBean(ctrl)); 81 | 82 | ctrl.setComp(compProxy, eContainer, eViewport); 83 | }); 84 | 85 | const viewportStyle = createMemo(() => ({ 86 | height: viewportHeight(), 87 | })); 88 | 89 | const buildContainer = () => ( 90 |
91 | 92 | {(rowCtrl, i) => } 93 | 94 |
95 | ); 96 | 97 | return ( 98 | <> 99 | {centerTemplate ? ( 100 | 103 | ) : ( 104 | buildContainer() 105 | )} 106 | 107 | ); 108 | }; 109 | 110 | export default RowContainerComp; 111 | -------------------------------------------------------------------------------- /src/grid/tabGuardComp.tsx: -------------------------------------------------------------------------------- 1 | import { GridCtrl, ITabGuard, TabGuardClassNames, TabGuardCtrl } from "ag-grid-community"; 2 | import { createSignal, JSX, onCleanup, onMount, useContext } from "solid-js"; 3 | import { BeansContext } from "./core/beansContext"; 4 | 5 | interface TabGuardProps { 6 | children: JSX.Element; 7 | eFocusableElement: HTMLDivElement; 8 | gridCtrl: GridCtrl; 9 | forceFocusOutWhenTabGuardsAreEmpty?: boolean; 10 | onTabKeyDown: (e: KeyboardEvent) => void; 11 | ref: (ref: TabGuardRef) => void; 12 | } 13 | 14 | export interface TabGuardRef { 15 | forceFocusOutOfContainer(up?: boolean): void; 16 | } 17 | 18 | const TabGuardComp = (props: TabGuardProps) => { 19 | const { 20 | children, 21 | eFocusableElement, 22 | onTabKeyDown, 23 | gridCtrl, 24 | forceFocusOutWhenTabGuardsAreEmpty, 25 | } = props; 26 | const [tabIndex, setTabIndex] = createSignal(); 27 | 28 | let eTopGuard!: HTMLDivElement; 29 | let eBottomGuard!: HTMLDivElement; 30 | let ctrl: TabGuardCtrl; 31 | 32 | const { context } = useContext(BeansContext); 33 | 34 | onMount(() => { 35 | const compProxy: ITabGuard = { 36 | setTabIndex: (value) => 37 | value == null ? setTabIndex(undefined) : setTabIndex(parseInt(value, 10)), 38 | }; 39 | 40 | ctrl = context.createBean( 41 | new TabGuardCtrl({ 42 | comp: compProxy, 43 | eTopGuard: eTopGuard, 44 | eBottomGuard: eBottomGuard, 45 | eFocusableElement: eFocusableElement, 46 | onTabKeyDown: onTabKeyDown, 47 | forceFocusOutWhenTabGuardsAreEmpty: forceFocusOutWhenTabGuardsAreEmpty, 48 | focusInnerElement: (fromBottom) => gridCtrl.focusInnerElement(fromBottom), 49 | }), 50 | ); 51 | 52 | props.ref({ 53 | forceFocusOutOfContainer(up?: boolean) { 54 | ctrl.forceFocusOutOfContainer(up); 55 | }, 56 | }); 57 | }); 58 | 59 | onCleanup(() => context.destroyBean(ctrl)); 60 | 61 | return ( 62 | <> 63 | 69 | 70 | {children} 71 | 72 | 78 | 79 | ); 80 | }; 81 | 82 | export default TabGuardComp; 83 | -------------------------------------------------------------------------------- /src/grid/userComps/jsUserComp.tsx: -------------------------------------------------------------------------------- 1 | import { UserCompDetails } from "ag-grid-community"; 2 | import { onCleanup, useContext } from "solid-js"; 3 | import { BeansContext } from "../core/beansContext"; 4 | 5 | const JsUserComp = (p: { compDetails: UserCompDetails; ref?: (ref: any) => void }) => { 6 | const { context } = useContext(BeansContext); 7 | 8 | const promise = p.compDetails.newAgStackInstance(); 9 | if (!promise) { 10 | return <>; 11 | } 12 | 13 | const comp = promise.resolveNow(null, (x: any) => x); // js comps are never async 14 | if (!comp) { 15 | return <>; 16 | } 17 | p.ref && p.ref(comp); 18 | 19 | const gui = comp.getGui(); 20 | 21 | onCleanup(() => { 22 | comp && context.destroyBean(comp); 23 | p.ref && p.ref(undefined); 24 | }); 25 | 26 | return <>{gui}; 27 | }; 28 | 29 | export default JsUserComp; 30 | -------------------------------------------------------------------------------- /src/grid/userComps/solidUserComp.tsx: -------------------------------------------------------------------------------- 1 | import { UserCompDetails } from "ag-grid-community"; 2 | import { onCleanup } from "solid-js"; 3 | 4 | const SolidUserComp = (props: { compDetails: UserCompDetails; ref?: any }) => { 5 | const SolidClass = props.compDetails.componentClass; 6 | 7 | let refSet = false; 8 | 9 | const setRef = (ref: any) => { 10 | if (!props.ref) { 11 | return; 12 | } 13 | props.ref(ref); 14 | refSet = true; 15 | }; 16 | 17 | onCleanup(() => { 18 | if (refSet) { 19 | props.ref && props.ref(undefined); 20 | } 21 | }); 22 | 23 | return ; 24 | }; 25 | 26 | export default SolidUserComp; 27 | -------------------------------------------------------------------------------- /src/grid/userComps/userComp.tsx: -------------------------------------------------------------------------------- 1 | import { UserCompDetails } from "ag-grid-community"; 2 | import { createMemo } from "solid-js"; 3 | import JsUserComp from "./jsUserComp"; 4 | import SolidUserComp from "./solidUserComp"; 5 | 6 | const UserComp = (p: { compDetails: UserCompDetails; ref?: any }) => { 7 | const showSolidComp = createMemo(() => { 8 | const details = p.compDetails; 9 | if (!details) { 10 | return false; 11 | } 12 | return details.componentFromFramework; 13 | }); 14 | 15 | const showJsComp = createMemo(() => { 16 | const details = p.compDetails; 17 | if (!details) { 18 | return false; 19 | } 20 | return !details.componentFromFramework; 21 | }); 22 | 23 | return ( 24 | <> 25 | {showSolidComp() && } 26 | {showJsComp() && } 27 | 28 | ); 29 | }; 30 | 31 | export default UserComp; 32 | -------------------------------------------------------------------------------- /src/index.tsx: -------------------------------------------------------------------------------- 1 | import AgGridSolid from "./grid/agGridSolid"; 2 | export default AgGridSolid; 3 | 4 | export * from "./grid/agGridSolid"; 5 | 6 | // /* @refresh reload */ 7 | // import { render } from 'solid-js/web'; 8 | // 9 | // import './index.css'; 10 | // import App from './sampleApp/App'; 11 | // 12 | // render(() => , document.getElementById('root') as HTMLElement); 13 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "strict": true, 4 | "target": "ESNext", 5 | "module": "ESNext", 6 | "lib": ["DOM", "DOM.Iterable", "ESNext"], 7 | "moduleResolution": "node", 8 | "allowSyntheticDefaultImports": true, 9 | "resolveJsonModule": true, 10 | "esModuleInterop": true, 11 | "jsx": "preserve", 12 | "jsxImportSource": "solid-js", 13 | "noEmit": true, 14 | "isolatedModules": true, 15 | "skipLibCheck": true, 16 | "types": [], 17 | "baseUrl": "." 18 | }, 19 | "include": ["src"], 20 | "exclude": ["node_modules", "dist"] 21 | } 22 | -------------------------------------------------------------------------------- /tsup.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'tsup' 2 | import * as preset from 'tsup-preset-solid' 3 | import pkg from './package.json' 4 | 5 | const preset_options: preset.PresetOptions = { 6 | entries: [ 7 | { 8 | entry: 'src/index.tsx', 9 | server_entry: true, 10 | } 11 | ], 12 | drop_console: true, 13 | cjs: true, 14 | } 15 | 16 | export default defineConfig(config => { 17 | const watching = !!config.watch 18 | const parsedOptions = preset.parsePresetOptions(preset_options, watching) 19 | 20 | if (!watching) { 21 | const package_fields = preset.generatePackageExports(parsedOptions) 22 | console.log(`\npackage.json: \n${JSON.stringify(package_fields, null, 2)}\n\n`) 23 | preset.writePackageJson(package_fields) 24 | } 25 | 26 | const tsupOptions = preset 27 | .generateTsupOptions(parsedOptions) 28 | .map((tsupOption) => ({ 29 | ...tsupOption, 30 | name: pkg.name, 31 | dts: !tsupOption.dts ? undefined : { 32 | footer: `declare module '${pkg.name}'`, 33 | }, 34 | })); 35 | 36 | return tsupOptions; 37 | }); 38 | --------------------------------------------------------------------------------