├── .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 |
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 | 
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 |
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 |
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 |
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 |
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 |
247 | {bodyJsxFunc()}
248 |
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 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
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 |
44 |
45 |
46 |
47 |
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 |
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 |
91 | {getUserCompDetails() && }
92 |
93 |
99 |
105 |
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 |
91 | )}
92 | {pinnedRight && (
93 |
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 |
101 | {buildContainer()}
102 |
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 |
--------------------------------------------------------------------------------