├── .gitignore
├── README.md
├── eslint.config.js
├── index.html
├── package.json
├── pnpm-lock.yaml
├── postcss.config.js
├── src
├── App.tsx
├── assets
│ ├── example.json
│ └── screenshot.png
├── components
│ ├── ApiClient.tsx
│ └── ApiClient
│ │ ├── RequestDetails.tsx
│ │ ├── RequestForm.tsx
│ │ ├── ResponseDisplay.tsx
│ │ ├── components
│ │ ├── CdnManager.tsx
│ │ ├── CodeEditor.tsx
│ │ ├── CollapsibleSection.tsx
│ │ ├── ConsoleOutput.tsx
│ │ ├── Layout.tsx
│ │ ├── LoadingSpinner.tsx
│ │ ├── RequestForm.tsx
│ │ ├── RequestNameEdit.tsx
│ │ ├── RequestPanel.tsx
│ │ ├── RequestSidebar.tsx
│ │ ├── ResizablePanel.tsx
│ │ ├── ResponseDetails.tsx
│ │ ├── ResponsePanel.tsx
│ │ ├── SnippetManager.tsx
│ │ ├── Tabs.tsx
│ │ ├── ThemeToggle.tsx
│ │ └── Timer.tsx
│ │ ├── hooks
│ │ ├── useApiClient.ts
│ │ ├── useCollapsible.ts
│ │ ├── useRequestManagement.ts
│ │ └── useTheme.ts
│ │ ├── index.tsx
│ │ ├── types.ts
│ │ └── utils
│ │ ├── codeFormatter.ts
│ │ ├── sandbox.ts
│ │ ├── snippetStorage.ts
│ │ └── storage.ts
├── index.css
├── main.tsx
└── vite-env.d.ts
├── tailwind.config.js
├── tsconfig.app.json
├── tsconfig.json
├── tsconfig.node.json
└── vite.config.ts
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Simple API Client
2 |
3 | 🚀 A lightning-fast API testing client that supercharges your development workflow. Stop switching between tools and writing boilerplate code - get everything you need in one place.
4 |
5 | 
6 | *Transform API responses into beautiful UIs with just a few lines of code*
7 |
8 | ## ⚡ Why Choose Simple API Client?
9 |
10 | ### Instant Productivity
11 | - **Try Example Button**: Get started in seconds with pre-built examples showcasing beautiful UI transformations
12 | - **Quick Import/Export**: Share your API collections with teammates or backup your work with one click
13 | - **Smart Defaults**: Common headers and configurations ready to go
14 |
15 | ### Powerful Transformations
16 | - **Live Code Execution**: Write and run JavaScript directly in the client
17 | - Pre-request scripts to modify requests
18 | - Post-response scripts to transform and visualize data
19 | - **Dynamic CDN Integration**: Add any npm package or library on the fly
20 | - No need to install dependencies
21 | - Access thousands of libraries instantly
22 | - Perfect for quick prototypes and experiments
23 |
24 | ### Beautiful Visualizations
25 | - Transform API responses into stunning UIs with built-in DOM manipulation
26 | - Create interactive dashboards and data visualizations
27 | - Preview HTML responses in real-time
28 |
29 | ### Time-Saving Features
30 | - **Session Management**: Never lose your work
31 | - Auto-save all requests
32 | - Import/export entire sessions
33 | - Share configurations with your team
34 | - **Code Snippets**: Save and reuse common transformations
35 | - **Smart Formatting**: Automatic code and JSON formatting
36 | - **Dark/Light Theme**: Easy on the eyes, day or night
37 |
38 | ## 🚀 Quick Start
39 |
40 | 1. Clone and install:
41 | ```bash
42 | pnpm install
43 | pnpm start
44 | ```
45 |
46 | 2. Click "Try Example" to see it in action!
47 |
48 | ## 💡 Perfect For
49 | - **API Development**: Test and debug your endpoints in real-time
50 | - **Prototyping**: Transform APIs into working UIs in minutes
51 | - **Data Visualization**: Create beautiful representations of your data
52 | - **Team Collaboration**: Share your API configurations effortlessly
53 | - **Learning & Exploration**: Experiment with APIs and transformations
54 |
55 | ## 🎯 Key Differentiators
56 | - **Code Execution Environment**: Run JavaScript directly in the client
57 | - **Dynamic CDN Loading**: Add any library on the fly
58 | - **DOM Manipulation**: Transform responses into rich UIs
59 | - **Real-time Preview**: See your changes instantly
60 | - **Zero Config**: Start testing APIs immediately
61 |
62 | ## 🌟 Support the Project
63 |
64 | If you find Simple API Client useful, consider:
65 |
66 | - **⭐ Star the Project**: Your star on [GitHub](https://github.com/IVainqueur/simple-api-client) helps others discover the project
67 | - **☕ Buy Me a Coffee**: Support development with a [small donation](https://www.buymeacoffee.com/ivainqueur)
68 |
69 | Your support helps keep this project active and growing!
70 |
71 | ## Contributing
72 |
73 | Love Simple API Client? Contributions are welcome! Feel free to submit a Pull Request.
--------------------------------------------------------------------------------
/eslint.config.js:
--------------------------------------------------------------------------------
1 | import js from '@eslint/js';
2 | import globals from 'globals';
3 | import reactHooks from 'eslint-plugin-react-hooks';
4 | import reactRefresh from 'eslint-plugin-react-refresh';
5 | import tseslint from 'typescript-eslint';
6 |
7 | export default tseslint.config(
8 | { ignores: ['dist'] },
9 | {
10 | extends: [js.configs.recommended, ...tseslint.configs.recommended],
11 | files: ['**/*.{ts,tsx}'],
12 | languageOptions: {
13 | ecmaVersion: 2020,
14 | globals: globals.browser,
15 | },
16 | plugins: {
17 | 'react-hooks': reactHooks,
18 | 'react-refresh': reactRefresh,
19 | },
20 | rules: {
21 | ...reactHooks.configs.recommended.rules,
22 | 'react-refresh/only-export-components': [
23 | 'warn',
24 | { allowConstantExport: true },
25 | ],
26 | '@typescript-eslint/no-explicit-any': 'off'
27 | },
28 | }
29 | );
30 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Simple Api Client by @IVainqueur
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vite-react-typescript-starter",
3 | "private": true,
4 | "version": "0.0.0",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "vite",
8 | "build": "vite build",
9 | "lint": "eslint .",
10 | "preview": "vite preview"
11 | },
12 | "dependencies": {
13 | "@codemirror/lang-javascript": "^6.2.1",
14 | "@codemirror/theme-one-dark": "^6.1.2",
15 | "@uiw/react-codemirror": "^4.21.21",
16 | "axios": "^1.6.7",
17 | "lucide-react": "^0.344.0",
18 | "prettier": "^3.4.2",
19 | "react": "^18.3.1",
20 | "react-dom": "^18.3.1"
21 | },
22 | "devDependencies": {
23 | "@eslint/js": "^9.9.1",
24 | "@types/react": "^18.3.5",
25 | "@types/react-dom": "^18.3.0",
26 | "@vitejs/plugin-react": "^4.3.1",
27 | "autoprefixer": "^10.4.18",
28 | "eslint": "^9.9.1",
29 | "eslint-plugin-react-hooks": "^5.1.0-rc.0",
30 | "eslint-plugin-react-refresh": "^0.4.11",
31 | "globals": "^15.9.0",
32 | "postcss": "^8.4.35",
33 | "tailwindcss": "^3.4.1",
34 | "typescript": "^5.5.3",
35 | "typescript-eslint": "^8.3.0",
36 | "vite": "^5.4.2"
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: '9.0'
2 |
3 | settings:
4 | autoInstallPeers: true
5 | excludeLinksFromLockfile: false
6 |
7 | importers:
8 |
9 | .:
10 | dependencies:
11 | '@codemirror/lang-javascript':
12 | specifier: ^6.2.1
13 | version: 6.2.2
14 | '@codemirror/theme-one-dark':
15 | specifier: ^6.1.2
16 | version: 6.1.2
17 | '@uiw/react-codemirror':
18 | specifier: ^4.21.21
19 | version: 4.23.7(@babel/runtime@7.26.0)(@codemirror/autocomplete@6.18.4)(@codemirror/language@6.10.8)(@codemirror/lint@6.8.4)(@codemirror/search@6.5.8)(@codemirror/state@6.5.0)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.36.1)(codemirror@6.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
20 | axios:
21 | specifier: ^1.6.7
22 | version: 1.7.9
23 | lucide-react:
24 | specifier: ^0.344.0
25 | version: 0.344.0(react@18.3.1)
26 | prettier:
27 | specifier: ^3.4.2
28 | version: 3.4.2
29 | react:
30 | specifier: ^18.3.1
31 | version: 18.3.1
32 | react-dom:
33 | specifier: ^18.3.1
34 | version: 18.3.1(react@18.3.1)
35 | devDependencies:
36 | '@eslint/js':
37 | specifier: ^9.9.1
38 | version: 9.17.0
39 | '@types/react':
40 | specifier: ^18.3.5
41 | version: 18.3.18
42 | '@types/react-dom':
43 | specifier: ^18.3.0
44 | version: 18.3.5(@types/react@18.3.18)
45 | '@vitejs/plugin-react':
46 | specifier: ^4.3.1
47 | version: 4.3.4(vite@5.4.11)
48 | autoprefixer:
49 | specifier: ^10.4.18
50 | version: 10.4.20(postcss@8.4.49)
51 | eslint:
52 | specifier: ^9.9.1
53 | version: 9.17.0(jiti@1.21.7)
54 | eslint-plugin-react-hooks:
55 | specifier: ^5.1.0-rc.0
56 | version: 5.1.0(eslint@9.17.0(jiti@1.21.7))
57 | eslint-plugin-react-refresh:
58 | specifier: ^0.4.11
59 | version: 0.4.16(eslint@9.17.0(jiti@1.21.7))
60 | globals:
61 | specifier: ^15.9.0
62 | version: 15.14.0
63 | postcss:
64 | specifier: ^8.4.35
65 | version: 8.4.49
66 | tailwindcss:
67 | specifier: ^3.4.1
68 | version: 3.4.17
69 | typescript:
70 | specifier: ^5.5.3
71 | version: 5.7.2
72 | typescript-eslint:
73 | specifier: ^8.3.0
74 | version: 8.19.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2)
75 | vite:
76 | specifier: ^5.4.2
77 | version: 5.4.11
78 |
79 | packages:
80 |
81 | '@alloc/quick-lru@5.2.0':
82 | resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
83 | engines: {node: '>=10'}
84 |
85 | '@ampproject/remapping@2.3.0':
86 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
87 | engines: {node: '>=6.0.0'}
88 |
89 | '@babel/code-frame@7.26.2':
90 | resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==}
91 | engines: {node: '>=6.9.0'}
92 |
93 | '@babel/compat-data@7.26.3':
94 | resolution: {integrity: sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==}
95 | engines: {node: '>=6.9.0'}
96 |
97 | '@babel/core@7.26.0':
98 | resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==}
99 | engines: {node: '>=6.9.0'}
100 |
101 | '@babel/generator@7.26.3':
102 | resolution: {integrity: sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==}
103 | engines: {node: '>=6.9.0'}
104 |
105 | '@babel/helper-compilation-targets@7.25.9':
106 | resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==}
107 | engines: {node: '>=6.9.0'}
108 |
109 | '@babel/helper-module-imports@7.25.9':
110 | resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==}
111 | engines: {node: '>=6.9.0'}
112 |
113 | '@babel/helper-module-transforms@7.26.0':
114 | resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==}
115 | engines: {node: '>=6.9.0'}
116 | peerDependencies:
117 | '@babel/core': ^7.0.0
118 |
119 | '@babel/helper-plugin-utils@7.25.9':
120 | resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==}
121 | engines: {node: '>=6.9.0'}
122 |
123 | '@babel/helper-string-parser@7.25.9':
124 | resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
125 | engines: {node: '>=6.9.0'}
126 |
127 | '@babel/helper-validator-identifier@7.25.9':
128 | resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
129 | engines: {node: '>=6.9.0'}
130 |
131 | '@babel/helper-validator-option@7.25.9':
132 | resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==}
133 | engines: {node: '>=6.9.0'}
134 |
135 | '@babel/helpers@7.26.0':
136 | resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==}
137 | engines: {node: '>=6.9.0'}
138 |
139 | '@babel/parser@7.26.3':
140 | resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==}
141 | engines: {node: '>=6.0.0'}
142 | hasBin: true
143 |
144 | '@babel/plugin-transform-react-jsx-self@7.25.9':
145 | resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==}
146 | engines: {node: '>=6.9.0'}
147 | peerDependencies:
148 | '@babel/core': ^7.0.0-0
149 |
150 | '@babel/plugin-transform-react-jsx-source@7.25.9':
151 | resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==}
152 | engines: {node: '>=6.9.0'}
153 | peerDependencies:
154 | '@babel/core': ^7.0.0-0
155 |
156 | '@babel/runtime@7.26.0':
157 | resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==}
158 | engines: {node: '>=6.9.0'}
159 |
160 | '@babel/template@7.25.9':
161 | resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==}
162 | engines: {node: '>=6.9.0'}
163 |
164 | '@babel/traverse@7.26.4':
165 | resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==}
166 | engines: {node: '>=6.9.0'}
167 |
168 | '@babel/types@7.26.3':
169 | resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==}
170 | engines: {node: '>=6.9.0'}
171 |
172 | '@codemirror/autocomplete@6.18.4':
173 | resolution: {integrity: sha512-sFAphGQIqyQZfP2ZBsSHV7xQvo9Py0rV0dW7W3IMRdS+zDuNb2l3no78CvUaWKGfzFjI4FTrLdUSj86IGb2hRA==}
174 |
175 | '@codemirror/commands@6.7.1':
176 | resolution: {integrity: sha512-llTrboQYw5H4THfhN4U3qCnSZ1SOJ60ohhz+SzU0ADGtwlc533DtklQP0vSFaQuCPDn3BPpOd1GbbnUtwNjsrw==}
177 |
178 | '@codemirror/lang-javascript@6.2.2':
179 | resolution: {integrity: sha512-VGQfY+FCc285AhWuwjYxQyUQcYurWlxdKYT4bqwr3Twnd5wP5WSeu52t4tvvuWmljT4EmgEgZCqSieokhtY8hg==}
180 |
181 | '@codemirror/language@6.10.8':
182 | resolution: {integrity: sha512-wcP8XPPhDH2vTqf181U8MbZnW+tDyPYy0UzVOa+oHORjyT+mhhom9vBd7dApJwoDz9Nb/a8kHjJIsuA/t8vNFw==}
183 |
184 | '@codemirror/lint@6.8.4':
185 | resolution: {integrity: sha512-u4q7PnZlJUojeRe8FJa/njJcMctISGgPQ4PnWsd9268R4ZTtU+tfFYmwkBvgcrK2+QQ8tYFVALVb5fVJykKc5A==}
186 |
187 | '@codemirror/search@6.5.8':
188 | resolution: {integrity: sha512-PoWtZvo7c1XFeZWmmyaOp2G0XVbOnm+fJzvghqGAktBW3cufwJUWvSCcNG0ppXiBEM05mZu6RhMtXPv2hpllig==}
189 |
190 | '@codemirror/state@6.5.0':
191 | resolution: {integrity: sha512-MwBHVK60IiIHDcoMet78lxt6iw5gJOGSbNbOIVBHWVXIH4/Nq1+GQgLLGgI1KlnN86WDXsPudVaqYHKBIx7Eyw==}
192 |
193 | '@codemirror/theme-one-dark@6.1.2':
194 | resolution: {integrity: sha512-F+sH0X16j/qFLMAfbciKTxVOwkdAS336b7AXTKOZhy8BR3eH/RelsnLgLFINrpST63mmN2OuwUt0W2ndUgYwUA==}
195 |
196 | '@codemirror/view@6.36.1':
197 | resolution: {integrity: sha512-miD1nyT4m4uopZaDdO2uXU/LLHliKNYL9kB1C1wJHrunHLm/rpkb5QVSokqgw9hFqEZakrdlb/VGWX8aYZTslQ==}
198 |
199 | '@esbuild/aix-ppc64@0.21.5':
200 | resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==}
201 | engines: {node: '>=12'}
202 | cpu: [ppc64]
203 | os: [aix]
204 |
205 | '@esbuild/android-arm64@0.21.5':
206 | resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==}
207 | engines: {node: '>=12'}
208 | cpu: [arm64]
209 | os: [android]
210 |
211 | '@esbuild/android-arm@0.21.5':
212 | resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==}
213 | engines: {node: '>=12'}
214 | cpu: [arm]
215 | os: [android]
216 |
217 | '@esbuild/android-x64@0.21.5':
218 | resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==}
219 | engines: {node: '>=12'}
220 | cpu: [x64]
221 | os: [android]
222 |
223 | '@esbuild/darwin-arm64@0.21.5':
224 | resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==}
225 | engines: {node: '>=12'}
226 | cpu: [arm64]
227 | os: [darwin]
228 |
229 | '@esbuild/darwin-x64@0.21.5':
230 | resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==}
231 | engines: {node: '>=12'}
232 | cpu: [x64]
233 | os: [darwin]
234 |
235 | '@esbuild/freebsd-arm64@0.21.5':
236 | resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==}
237 | engines: {node: '>=12'}
238 | cpu: [arm64]
239 | os: [freebsd]
240 |
241 | '@esbuild/freebsd-x64@0.21.5':
242 | resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==}
243 | engines: {node: '>=12'}
244 | cpu: [x64]
245 | os: [freebsd]
246 |
247 | '@esbuild/linux-arm64@0.21.5':
248 | resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==}
249 | engines: {node: '>=12'}
250 | cpu: [arm64]
251 | os: [linux]
252 |
253 | '@esbuild/linux-arm@0.21.5':
254 | resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==}
255 | engines: {node: '>=12'}
256 | cpu: [arm]
257 | os: [linux]
258 |
259 | '@esbuild/linux-ia32@0.21.5':
260 | resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==}
261 | engines: {node: '>=12'}
262 | cpu: [ia32]
263 | os: [linux]
264 |
265 | '@esbuild/linux-loong64@0.21.5':
266 | resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==}
267 | engines: {node: '>=12'}
268 | cpu: [loong64]
269 | os: [linux]
270 |
271 | '@esbuild/linux-mips64el@0.21.5':
272 | resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==}
273 | engines: {node: '>=12'}
274 | cpu: [mips64el]
275 | os: [linux]
276 |
277 | '@esbuild/linux-ppc64@0.21.5':
278 | resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==}
279 | engines: {node: '>=12'}
280 | cpu: [ppc64]
281 | os: [linux]
282 |
283 | '@esbuild/linux-riscv64@0.21.5':
284 | resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==}
285 | engines: {node: '>=12'}
286 | cpu: [riscv64]
287 | os: [linux]
288 |
289 | '@esbuild/linux-s390x@0.21.5':
290 | resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==}
291 | engines: {node: '>=12'}
292 | cpu: [s390x]
293 | os: [linux]
294 |
295 | '@esbuild/linux-x64@0.21.5':
296 | resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==}
297 | engines: {node: '>=12'}
298 | cpu: [x64]
299 | os: [linux]
300 |
301 | '@esbuild/netbsd-x64@0.21.5':
302 | resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==}
303 | engines: {node: '>=12'}
304 | cpu: [x64]
305 | os: [netbsd]
306 |
307 | '@esbuild/openbsd-x64@0.21.5':
308 | resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==}
309 | engines: {node: '>=12'}
310 | cpu: [x64]
311 | os: [openbsd]
312 |
313 | '@esbuild/sunos-x64@0.21.5':
314 | resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==}
315 | engines: {node: '>=12'}
316 | cpu: [x64]
317 | os: [sunos]
318 |
319 | '@esbuild/win32-arm64@0.21.5':
320 | resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==}
321 | engines: {node: '>=12'}
322 | cpu: [arm64]
323 | os: [win32]
324 |
325 | '@esbuild/win32-ia32@0.21.5':
326 | resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==}
327 | engines: {node: '>=12'}
328 | cpu: [ia32]
329 | os: [win32]
330 |
331 | '@esbuild/win32-x64@0.21.5':
332 | resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==}
333 | engines: {node: '>=12'}
334 | cpu: [x64]
335 | os: [win32]
336 |
337 | '@eslint-community/eslint-utils@4.4.1':
338 | resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==}
339 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
340 | peerDependencies:
341 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
342 |
343 | '@eslint-community/regexpp@4.12.1':
344 | resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
345 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
346 |
347 | '@eslint/config-array@0.19.1':
348 | resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==}
349 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
350 |
351 | '@eslint/core@0.9.1':
352 | resolution: {integrity: sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==}
353 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
354 |
355 | '@eslint/eslintrc@3.2.0':
356 | resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==}
357 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
358 |
359 | '@eslint/js@9.17.0':
360 | resolution: {integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==}
361 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
362 |
363 | '@eslint/object-schema@2.1.5':
364 | resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==}
365 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
366 |
367 | '@eslint/plugin-kit@0.2.4':
368 | resolution: {integrity: sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==}
369 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
370 |
371 | '@humanfs/core@0.19.1':
372 | resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
373 | engines: {node: '>=18.18.0'}
374 |
375 | '@humanfs/node@0.16.6':
376 | resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==}
377 | engines: {node: '>=18.18.0'}
378 |
379 | '@humanwhocodes/module-importer@1.0.1':
380 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
381 | engines: {node: '>=12.22'}
382 |
383 | '@humanwhocodes/retry@0.3.1':
384 | resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==}
385 | engines: {node: '>=18.18'}
386 |
387 | '@humanwhocodes/retry@0.4.1':
388 | resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==}
389 | engines: {node: '>=18.18'}
390 |
391 | '@isaacs/cliui@8.0.2':
392 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
393 | engines: {node: '>=12'}
394 |
395 | '@jridgewell/gen-mapping@0.3.8':
396 | resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==}
397 | engines: {node: '>=6.0.0'}
398 |
399 | '@jridgewell/resolve-uri@3.1.2':
400 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
401 | engines: {node: '>=6.0.0'}
402 |
403 | '@jridgewell/set-array@1.2.1':
404 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
405 | engines: {node: '>=6.0.0'}
406 |
407 | '@jridgewell/sourcemap-codec@1.5.0':
408 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
409 |
410 | '@jridgewell/trace-mapping@0.3.25':
411 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
412 |
413 | '@lezer/common@1.2.3':
414 | resolution: {integrity: sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==}
415 |
416 | '@lezer/highlight@1.2.1':
417 | resolution: {integrity: sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==}
418 |
419 | '@lezer/javascript@1.4.21':
420 | resolution: {integrity: sha512-lL+1fcuxWYPURMM/oFZLEDm0XuLN128QPV+VuGtKpeaOGdcl9F2LYC3nh1S9LkPqx9M0mndZFdXCipNAZpzIkQ==}
421 |
422 | '@lezer/lr@1.4.2':
423 | resolution: {integrity: sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==}
424 |
425 | '@marijn/find-cluster-break@1.0.2':
426 | resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==}
427 |
428 | '@nodelib/fs.scandir@2.1.5':
429 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
430 | engines: {node: '>= 8'}
431 |
432 | '@nodelib/fs.stat@2.0.5':
433 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
434 | engines: {node: '>= 8'}
435 |
436 | '@nodelib/fs.walk@1.2.8':
437 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
438 | engines: {node: '>= 8'}
439 |
440 | '@pkgjs/parseargs@0.11.0':
441 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
442 | engines: {node: '>=14'}
443 |
444 | '@rollup/rollup-android-arm-eabi@4.29.1':
445 | resolution: {integrity: sha512-ssKhA8RNltTZLpG6/QNkCSge+7mBQGUqJRisZ2MDQcEGaK93QESEgWK2iOpIDZ7k9zPVkG5AS3ksvD5ZWxmItw==}
446 | cpu: [arm]
447 | os: [android]
448 |
449 | '@rollup/rollup-android-arm64@4.29.1':
450 | resolution: {integrity: sha512-CaRfrV0cd+NIIcVVN/jx+hVLN+VRqnuzLRmfmlzpOzB87ajixsN/+9L5xNmkaUUvEbI5BmIKS+XTwXsHEb65Ew==}
451 | cpu: [arm64]
452 | os: [android]
453 |
454 | '@rollup/rollup-darwin-arm64@4.29.1':
455 | resolution: {integrity: sha512-2ORr7T31Y0Mnk6qNuwtyNmy14MunTAMx06VAPI6/Ju52W10zk1i7i5U3vlDRWjhOI5quBcrvhkCHyF76bI7kEw==}
456 | cpu: [arm64]
457 | os: [darwin]
458 |
459 | '@rollup/rollup-darwin-x64@4.29.1':
460 | resolution: {integrity: sha512-j/Ej1oanzPjmN0tirRd5K2/nncAhS9W6ICzgxV+9Y5ZsP0hiGhHJXZ2JQ53iSSjj8m6cRY6oB1GMzNn2EUt6Ng==}
461 | cpu: [x64]
462 | os: [darwin]
463 |
464 | '@rollup/rollup-freebsd-arm64@4.29.1':
465 | resolution: {integrity: sha512-91C//G6Dm/cv724tpt7nTyP+JdN12iqeXGFM1SqnljCmi5yTXriH7B1r8AD9dAZByHpKAumqP1Qy2vVNIdLZqw==}
466 | cpu: [arm64]
467 | os: [freebsd]
468 |
469 | '@rollup/rollup-freebsd-x64@4.29.1':
470 | resolution: {integrity: sha512-hEioiEQ9Dec2nIRoeHUP6hr1PSkXzQaCUyqBDQ9I9ik4gCXQZjJMIVzoNLBRGet+hIUb3CISMh9KXuCcWVW/8w==}
471 | cpu: [x64]
472 | os: [freebsd]
473 |
474 | '@rollup/rollup-linux-arm-gnueabihf@4.29.1':
475 | resolution: {integrity: sha512-Py5vFd5HWYN9zxBv3WMrLAXY3yYJ6Q/aVERoeUFwiDGiMOWsMs7FokXihSOaT/PMWUty/Pj60XDQndK3eAfE6A==}
476 | cpu: [arm]
477 | os: [linux]
478 |
479 | '@rollup/rollup-linux-arm-musleabihf@4.29.1':
480 | resolution: {integrity: sha512-RiWpGgbayf7LUcuSNIbahr0ys2YnEERD4gYdISA06wa0i8RALrnzflh9Wxii7zQJEB2/Eh74dX4y/sHKLWp5uQ==}
481 | cpu: [arm]
482 | os: [linux]
483 |
484 | '@rollup/rollup-linux-arm64-gnu@4.29.1':
485 | resolution: {integrity: sha512-Z80O+taYxTQITWMjm/YqNoe9d10OX6kDh8X5/rFCMuPqsKsSyDilvfg+vd3iXIqtfmp+cnfL1UrYirkaF8SBZA==}
486 | cpu: [arm64]
487 | os: [linux]
488 |
489 | '@rollup/rollup-linux-arm64-musl@4.29.1':
490 | resolution: {integrity: sha512-fOHRtF9gahwJk3QVp01a/GqS4hBEZCV1oKglVVq13kcK3NeVlS4BwIFzOHDbmKzt3i0OuHG4zfRP0YoG5OF/rA==}
491 | cpu: [arm64]
492 | os: [linux]
493 |
494 | '@rollup/rollup-linux-loongarch64-gnu@4.29.1':
495 | resolution: {integrity: sha512-5a7q3tnlbcg0OodyxcAdrrCxFi0DgXJSoOuidFUzHZ2GixZXQs6Tc3CHmlvqKAmOs5eRde+JJxeIf9DonkmYkw==}
496 | cpu: [loong64]
497 | os: [linux]
498 |
499 | '@rollup/rollup-linux-powerpc64le-gnu@4.29.1':
500 | resolution: {integrity: sha512-9b4Mg5Yfz6mRnlSPIdROcfw1BU22FQxmfjlp/CShWwO3LilKQuMISMTtAu/bxmmrE6A902W2cZJuzx8+gJ8e9w==}
501 | cpu: [ppc64]
502 | os: [linux]
503 |
504 | '@rollup/rollup-linux-riscv64-gnu@4.29.1':
505 | resolution: {integrity: sha512-G5pn0NChlbRM8OJWpJFMX4/i8OEU538uiSv0P6roZcbpe/WfhEO+AT8SHVKfp8qhDQzaz7Q+1/ixMy7hBRidnQ==}
506 | cpu: [riscv64]
507 | os: [linux]
508 |
509 | '@rollup/rollup-linux-s390x-gnu@4.29.1':
510 | resolution: {integrity: sha512-WM9lIkNdkhVwiArmLxFXpWndFGuOka4oJOZh8EP3Vb8q5lzdSCBuhjavJsw68Q9AKDGeOOIHYzYm4ZFvmWez5g==}
511 | cpu: [s390x]
512 | os: [linux]
513 |
514 | '@rollup/rollup-linux-x64-gnu@4.29.1':
515 | resolution: {integrity: sha512-87xYCwb0cPGZFoGiErT1eDcssByaLX4fc0z2nRM6eMtV9njAfEE6OW3UniAoDhX4Iq5xQVpE6qO9aJbCFumKYQ==}
516 | cpu: [x64]
517 | os: [linux]
518 |
519 | '@rollup/rollup-linux-x64-musl@4.29.1':
520 | resolution: {integrity: sha512-xufkSNppNOdVRCEC4WKvlR1FBDyqCSCpQeMMgv9ZyXqqtKBfkw1yfGMTUTs9Qsl6WQbJnsGboWCp7pJGkeMhKA==}
521 | cpu: [x64]
522 | os: [linux]
523 |
524 | '@rollup/rollup-win32-arm64-msvc@4.29.1':
525 | resolution: {integrity: sha512-F2OiJ42m77lSkizZQLuC+jiZ2cgueWQL5YC9tjo3AgaEw+KJmVxHGSyQfDUoYR9cci0lAywv2Clmckzulcq6ig==}
526 | cpu: [arm64]
527 | os: [win32]
528 |
529 | '@rollup/rollup-win32-ia32-msvc@4.29.1':
530 | resolution: {integrity: sha512-rYRe5S0FcjlOBZQHgbTKNrqxCBUmgDJem/VQTCcTnA2KCabYSWQDrytOzX7avb79cAAweNmMUb/Zw18RNd4mng==}
531 | cpu: [ia32]
532 | os: [win32]
533 |
534 | '@rollup/rollup-win32-x64-msvc@4.29.1':
535 | resolution: {integrity: sha512-+10CMg9vt1MoHj6x1pxyjPSMjHTIlqs8/tBztXvPAx24SKs9jwVnKqHJumlH/IzhaPUaj3T6T6wfZr8okdXaIg==}
536 | cpu: [x64]
537 | os: [win32]
538 |
539 | '@types/babel__core@7.20.5':
540 | resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
541 |
542 | '@types/babel__generator@7.6.8':
543 | resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==}
544 |
545 | '@types/babel__template@7.4.4':
546 | resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
547 |
548 | '@types/babel__traverse@7.20.6':
549 | resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==}
550 |
551 | '@types/estree@1.0.6':
552 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
553 |
554 | '@types/json-schema@7.0.15':
555 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
556 |
557 | '@types/prop-types@15.7.14':
558 | resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==}
559 |
560 | '@types/react-dom@18.3.5':
561 | resolution: {integrity: sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==}
562 | peerDependencies:
563 | '@types/react': ^18.0.0
564 |
565 | '@types/react@18.3.18':
566 | resolution: {integrity: sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==}
567 |
568 | '@typescript-eslint/eslint-plugin@8.19.0':
569 | resolution: {integrity: sha512-NggSaEZCdSrFddbctrVjkVZvFC6KGfKfNK0CU7mNK/iKHGKbzT4Wmgm08dKpcZECBu9f5FypndoMyRHkdqfT1Q==}
570 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
571 | peerDependencies:
572 | '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
573 | eslint: ^8.57.0 || ^9.0.0
574 | typescript: '>=4.8.4 <5.8.0'
575 |
576 | '@typescript-eslint/parser@8.19.0':
577 | resolution: {integrity: sha512-6M8taKyOETY1TKHp0x8ndycipTVgmp4xtg5QpEZzXxDhNvvHOJi5rLRkLr8SK3jTgD5l4fTlvBiRdfsuWydxBw==}
578 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
579 | peerDependencies:
580 | eslint: ^8.57.0 || ^9.0.0
581 | typescript: '>=4.8.4 <5.8.0'
582 |
583 | '@typescript-eslint/scope-manager@8.19.0':
584 | resolution: {integrity: sha512-hkoJiKQS3GQ13TSMEiuNmSCvhz7ujyqD1x3ShbaETATHrck+9RaDdUbt+osXaUuns9OFwrDTTrjtwsU8gJyyRA==}
585 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
586 |
587 | '@typescript-eslint/type-utils@8.19.0':
588 | resolution: {integrity: sha512-TZs0I0OSbd5Aza4qAMpp1cdCYVnER94IziudE3JU328YUHgWu9gwiwhag+fuLeJ2LkWLXI+F/182TbG+JaBdTg==}
589 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
590 | peerDependencies:
591 | eslint: ^8.57.0 || ^9.0.0
592 | typescript: '>=4.8.4 <5.8.0'
593 |
594 | '@typescript-eslint/types@8.19.0':
595 | resolution: {integrity: sha512-8XQ4Ss7G9WX8oaYvD4OOLCjIQYgRQxO+qCiR2V2s2GxI9AUpo7riNwo6jDhKtTcaJjT8PY54j2Yb33kWtSJsmA==}
596 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
597 |
598 | '@typescript-eslint/typescript-estree@8.19.0':
599 | resolution: {integrity: sha512-WW9PpDaLIFW9LCbucMSdYUuGeFUz1OkWYS/5fwZwTA+l2RwlWFdJvReQqMUMBw4yJWJOfqd7An9uwut2Oj8sLw==}
600 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
601 | peerDependencies:
602 | typescript: '>=4.8.4 <5.8.0'
603 |
604 | '@typescript-eslint/utils@8.19.0':
605 | resolution: {integrity: sha512-PTBG+0oEMPH9jCZlfg07LCB2nYI0I317yyvXGfxnvGvw4SHIOuRnQ3kadyyXY6tGdChusIHIbM5zfIbp4M6tCg==}
606 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
607 | peerDependencies:
608 | eslint: ^8.57.0 || ^9.0.0
609 | typescript: '>=4.8.4 <5.8.0'
610 |
611 | '@typescript-eslint/visitor-keys@8.19.0':
612 | resolution: {integrity: sha512-mCFtBbFBJDCNCWUl5y6sZSCHXw1DEFEk3c/M3nRK2a4XUB8StGFtmcEMizdjKuBzB6e/smJAAWYug3VrdLMr1w==}
613 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
614 |
615 | '@uiw/codemirror-extensions-basic-setup@4.23.7':
616 | resolution: {integrity: sha512-9/2EUa1Lck4kFKkR2BkxlZPpgD/EWuKHnOlysf1yHKZGraaZmZEaUw+utDK4QcuJc8Iz097vsLz4f4th5EU27g==}
617 | peerDependencies:
618 | '@codemirror/autocomplete': '>=6.0.0'
619 | '@codemirror/commands': '>=6.0.0'
620 | '@codemirror/language': '>=6.0.0'
621 | '@codemirror/lint': '>=6.0.0'
622 | '@codemirror/search': '>=6.0.0'
623 | '@codemirror/state': '>=6.0.0'
624 | '@codemirror/view': '>=6.0.0'
625 |
626 | '@uiw/react-codemirror@4.23.7':
627 | resolution: {integrity: sha512-Nh/0P6W+kWta+ARp9YpnKPD9ick5teEnwmtNoPQnyd6NPv0EQP3Ui4YmRVNj1nkUEo+QjrAUaEfcejJ2up/HZA==}
628 | peerDependencies:
629 | '@babel/runtime': '>=7.11.0'
630 | '@codemirror/state': '>=6.0.0'
631 | '@codemirror/theme-one-dark': '>=6.0.0'
632 | '@codemirror/view': '>=6.0.0'
633 | codemirror: '>=6.0.0'
634 | react: '>=16.8.0'
635 | react-dom: '>=16.8.0'
636 |
637 | '@vitejs/plugin-react@4.3.4':
638 | resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==}
639 | engines: {node: ^14.18.0 || >=16.0.0}
640 | peerDependencies:
641 | vite: ^4.2.0 || ^5.0.0 || ^6.0.0
642 |
643 | acorn-jsx@5.3.2:
644 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
645 | peerDependencies:
646 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
647 |
648 | acorn@8.14.0:
649 | resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==}
650 | engines: {node: '>=0.4.0'}
651 | hasBin: true
652 |
653 | ajv@6.12.6:
654 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
655 |
656 | ansi-regex@5.0.1:
657 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
658 | engines: {node: '>=8'}
659 |
660 | ansi-regex@6.1.0:
661 | resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==}
662 | engines: {node: '>=12'}
663 |
664 | ansi-styles@4.3.0:
665 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
666 | engines: {node: '>=8'}
667 |
668 | ansi-styles@6.2.1:
669 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
670 | engines: {node: '>=12'}
671 |
672 | any-promise@1.3.0:
673 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
674 |
675 | anymatch@3.1.3:
676 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
677 | engines: {node: '>= 8'}
678 |
679 | arg@5.0.2:
680 | resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
681 |
682 | argparse@2.0.1:
683 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
684 |
685 | asynckit@0.4.0:
686 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
687 |
688 | autoprefixer@10.4.20:
689 | resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==}
690 | engines: {node: ^10 || ^12 || >=14}
691 | hasBin: true
692 | peerDependencies:
693 | postcss: ^8.1.0
694 |
695 | axios@1.7.9:
696 | resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==}
697 |
698 | balanced-match@1.0.2:
699 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
700 |
701 | binary-extensions@2.3.0:
702 | resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
703 | engines: {node: '>=8'}
704 |
705 | brace-expansion@1.1.11:
706 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
707 |
708 | brace-expansion@2.0.1:
709 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
710 |
711 | braces@3.0.3:
712 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
713 | engines: {node: '>=8'}
714 |
715 | browserslist@4.24.3:
716 | resolution: {integrity: sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==}
717 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
718 | hasBin: true
719 |
720 | callsites@3.1.0:
721 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
722 | engines: {node: '>=6'}
723 |
724 | camelcase-css@2.0.1:
725 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
726 | engines: {node: '>= 6'}
727 |
728 | caniuse-lite@1.0.30001690:
729 | resolution: {integrity: sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==}
730 |
731 | chalk@4.1.2:
732 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
733 | engines: {node: '>=10'}
734 |
735 | chokidar@3.6.0:
736 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
737 | engines: {node: '>= 8.10.0'}
738 |
739 | codemirror@6.0.1:
740 | resolution: {integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==}
741 |
742 | color-convert@2.0.1:
743 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
744 | engines: {node: '>=7.0.0'}
745 |
746 | color-name@1.1.4:
747 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
748 |
749 | combined-stream@1.0.8:
750 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
751 | engines: {node: '>= 0.8'}
752 |
753 | commander@4.1.1:
754 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
755 | engines: {node: '>= 6'}
756 |
757 | concat-map@0.0.1:
758 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
759 |
760 | convert-source-map@2.0.0:
761 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
762 |
763 | crelt@1.0.6:
764 | resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==}
765 |
766 | cross-spawn@7.0.6:
767 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
768 | engines: {node: '>= 8'}
769 |
770 | cssesc@3.0.0:
771 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
772 | engines: {node: '>=4'}
773 | hasBin: true
774 |
775 | csstype@3.1.3:
776 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
777 |
778 | debug@4.4.0:
779 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==}
780 | engines: {node: '>=6.0'}
781 | peerDependencies:
782 | supports-color: '*'
783 | peerDependenciesMeta:
784 | supports-color:
785 | optional: true
786 |
787 | deep-is@0.1.4:
788 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
789 |
790 | delayed-stream@1.0.0:
791 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
792 | engines: {node: '>=0.4.0'}
793 |
794 | didyoumean@1.2.2:
795 | resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
796 |
797 | dlv@1.1.3:
798 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
799 |
800 | eastasianwidth@0.2.0:
801 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
802 |
803 | electron-to-chromium@1.5.76:
804 | resolution: {integrity: sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==}
805 |
806 | emoji-regex@8.0.0:
807 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
808 |
809 | emoji-regex@9.2.2:
810 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
811 |
812 | esbuild@0.21.5:
813 | resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==}
814 | engines: {node: '>=12'}
815 | hasBin: true
816 |
817 | escalade@3.2.0:
818 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
819 | engines: {node: '>=6'}
820 |
821 | escape-string-regexp@4.0.0:
822 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
823 | engines: {node: '>=10'}
824 |
825 | eslint-plugin-react-hooks@5.1.0:
826 | resolution: {integrity: sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==}
827 | engines: {node: '>=10'}
828 | peerDependencies:
829 | eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0
830 |
831 | eslint-plugin-react-refresh@0.4.16:
832 | resolution: {integrity: sha512-slterMlxAhov/DZO8NScf6mEeMBBXodFUolijDvrtTxyezyLoTQaa73FyYus/VbTdftd8wBgBxPMRk3poleXNQ==}
833 | peerDependencies:
834 | eslint: '>=8.40'
835 |
836 | eslint-scope@8.2.0:
837 | resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==}
838 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
839 |
840 | eslint-visitor-keys@3.4.3:
841 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
842 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
843 |
844 | eslint-visitor-keys@4.2.0:
845 | resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==}
846 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
847 |
848 | eslint@9.17.0:
849 | resolution: {integrity: sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==}
850 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
851 | hasBin: true
852 | peerDependencies:
853 | jiti: '*'
854 | peerDependenciesMeta:
855 | jiti:
856 | optional: true
857 |
858 | espree@10.3.0:
859 | resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==}
860 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
861 |
862 | esquery@1.6.0:
863 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
864 | engines: {node: '>=0.10'}
865 |
866 | esrecurse@4.3.0:
867 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
868 | engines: {node: '>=4.0'}
869 |
870 | estraverse@5.3.0:
871 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
872 | engines: {node: '>=4.0'}
873 |
874 | esutils@2.0.3:
875 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
876 | engines: {node: '>=0.10.0'}
877 |
878 | fast-deep-equal@3.1.3:
879 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
880 |
881 | fast-glob@3.3.2:
882 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
883 | engines: {node: '>=8.6.0'}
884 |
885 | fast-json-stable-stringify@2.1.0:
886 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
887 |
888 | fast-levenshtein@2.0.6:
889 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
890 |
891 | fastq@1.18.0:
892 | resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==}
893 |
894 | file-entry-cache@8.0.0:
895 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
896 | engines: {node: '>=16.0.0'}
897 |
898 | fill-range@7.1.1:
899 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
900 | engines: {node: '>=8'}
901 |
902 | find-up@5.0.0:
903 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
904 | engines: {node: '>=10'}
905 |
906 | flat-cache@4.0.1:
907 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
908 | engines: {node: '>=16'}
909 |
910 | flatted@3.3.2:
911 | resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==}
912 |
913 | follow-redirects@1.15.9:
914 | resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==}
915 | engines: {node: '>=4.0'}
916 | peerDependencies:
917 | debug: '*'
918 | peerDependenciesMeta:
919 | debug:
920 | optional: true
921 |
922 | foreground-child@3.3.0:
923 | resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==}
924 | engines: {node: '>=14'}
925 |
926 | form-data@4.0.1:
927 | resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==}
928 | engines: {node: '>= 6'}
929 |
930 | fraction.js@4.3.7:
931 | resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
932 |
933 | fsevents@2.3.3:
934 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
935 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
936 | os: [darwin]
937 |
938 | function-bind@1.1.2:
939 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
940 |
941 | gensync@1.0.0-beta.2:
942 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
943 | engines: {node: '>=6.9.0'}
944 |
945 | glob-parent@5.1.2:
946 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
947 | engines: {node: '>= 6'}
948 |
949 | glob-parent@6.0.2:
950 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
951 | engines: {node: '>=10.13.0'}
952 |
953 | glob@10.4.5:
954 | resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
955 | hasBin: true
956 |
957 | globals@11.12.0:
958 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
959 | engines: {node: '>=4'}
960 |
961 | globals@14.0.0:
962 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
963 | engines: {node: '>=18'}
964 |
965 | globals@15.14.0:
966 | resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==}
967 | engines: {node: '>=18'}
968 |
969 | graphemer@1.4.0:
970 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
971 |
972 | has-flag@4.0.0:
973 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
974 | engines: {node: '>=8'}
975 |
976 | hasown@2.0.2:
977 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
978 | engines: {node: '>= 0.4'}
979 |
980 | ignore@5.3.2:
981 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
982 | engines: {node: '>= 4'}
983 |
984 | import-fresh@3.3.0:
985 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
986 | engines: {node: '>=6'}
987 |
988 | imurmurhash@0.1.4:
989 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
990 | engines: {node: '>=0.8.19'}
991 |
992 | is-binary-path@2.1.0:
993 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
994 | engines: {node: '>=8'}
995 |
996 | is-core-module@2.16.1:
997 | resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
998 | engines: {node: '>= 0.4'}
999 |
1000 | is-extglob@2.1.1:
1001 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
1002 | engines: {node: '>=0.10.0'}
1003 |
1004 | is-fullwidth-code-point@3.0.0:
1005 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
1006 | engines: {node: '>=8'}
1007 |
1008 | is-glob@4.0.3:
1009 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
1010 | engines: {node: '>=0.10.0'}
1011 |
1012 | is-number@7.0.0:
1013 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
1014 | engines: {node: '>=0.12.0'}
1015 |
1016 | isexe@2.0.0:
1017 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
1018 |
1019 | jackspeak@3.4.3:
1020 | resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
1021 |
1022 | jiti@1.21.7:
1023 | resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==}
1024 | hasBin: true
1025 |
1026 | js-tokens@4.0.0:
1027 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
1028 |
1029 | js-yaml@4.1.0:
1030 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
1031 | hasBin: true
1032 |
1033 | jsesc@3.1.0:
1034 | resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
1035 | engines: {node: '>=6'}
1036 | hasBin: true
1037 |
1038 | json-buffer@3.0.1:
1039 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
1040 |
1041 | json-schema-traverse@0.4.1:
1042 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
1043 |
1044 | json-stable-stringify-without-jsonify@1.0.1:
1045 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
1046 |
1047 | json5@2.2.3:
1048 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
1049 | engines: {node: '>=6'}
1050 | hasBin: true
1051 |
1052 | keyv@4.5.4:
1053 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
1054 |
1055 | levn@0.4.1:
1056 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
1057 | engines: {node: '>= 0.8.0'}
1058 |
1059 | lilconfig@3.1.3:
1060 | resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==}
1061 | engines: {node: '>=14'}
1062 |
1063 | lines-and-columns@1.2.4:
1064 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
1065 |
1066 | locate-path@6.0.0:
1067 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
1068 | engines: {node: '>=10'}
1069 |
1070 | lodash.merge@4.6.2:
1071 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
1072 |
1073 | loose-envify@1.4.0:
1074 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
1075 | hasBin: true
1076 |
1077 | lru-cache@10.4.3:
1078 | resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
1079 |
1080 | lru-cache@5.1.1:
1081 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
1082 |
1083 | lucide-react@0.344.0:
1084 | resolution: {integrity: sha512-6YyBnn91GB45VuVT96bYCOKElbJzUHqp65vX8cDcu55MQL9T969v4dhGClpljamuI/+KMO9P6w9Acq1CVQGvIQ==}
1085 | peerDependencies:
1086 | react: ^16.5.1 || ^17.0.0 || ^18.0.0
1087 |
1088 | merge2@1.4.1:
1089 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
1090 | engines: {node: '>= 8'}
1091 |
1092 | micromatch@4.0.8:
1093 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
1094 | engines: {node: '>=8.6'}
1095 |
1096 | mime-db@1.52.0:
1097 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
1098 | engines: {node: '>= 0.6'}
1099 |
1100 | mime-types@2.1.35:
1101 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
1102 | engines: {node: '>= 0.6'}
1103 |
1104 | minimatch@3.1.2:
1105 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
1106 |
1107 | minimatch@9.0.5:
1108 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
1109 | engines: {node: '>=16 || 14 >=14.17'}
1110 |
1111 | minipass@7.1.2:
1112 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
1113 | engines: {node: '>=16 || 14 >=14.17'}
1114 |
1115 | ms@2.1.3:
1116 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
1117 |
1118 | mz@2.7.0:
1119 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
1120 |
1121 | nanoid@3.3.8:
1122 | resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==}
1123 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
1124 | hasBin: true
1125 |
1126 | natural-compare@1.4.0:
1127 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
1128 |
1129 | node-releases@2.0.19:
1130 | resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
1131 |
1132 | normalize-path@3.0.0:
1133 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
1134 | engines: {node: '>=0.10.0'}
1135 |
1136 | normalize-range@0.1.2:
1137 | resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
1138 | engines: {node: '>=0.10.0'}
1139 |
1140 | object-assign@4.1.1:
1141 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
1142 | engines: {node: '>=0.10.0'}
1143 |
1144 | object-hash@3.0.0:
1145 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
1146 | engines: {node: '>= 6'}
1147 |
1148 | optionator@0.9.4:
1149 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
1150 | engines: {node: '>= 0.8.0'}
1151 |
1152 | p-limit@3.1.0:
1153 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
1154 | engines: {node: '>=10'}
1155 |
1156 | p-locate@5.0.0:
1157 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
1158 | engines: {node: '>=10'}
1159 |
1160 | package-json-from-dist@1.0.1:
1161 | resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
1162 |
1163 | parent-module@1.0.1:
1164 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
1165 | engines: {node: '>=6'}
1166 |
1167 | path-exists@4.0.0:
1168 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
1169 | engines: {node: '>=8'}
1170 |
1171 | path-key@3.1.1:
1172 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
1173 | engines: {node: '>=8'}
1174 |
1175 | path-parse@1.0.7:
1176 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
1177 |
1178 | path-scurry@1.11.1:
1179 | resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
1180 | engines: {node: '>=16 || 14 >=14.18'}
1181 |
1182 | picocolors@1.1.1:
1183 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
1184 |
1185 | picomatch@2.3.1:
1186 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
1187 | engines: {node: '>=8.6'}
1188 |
1189 | pify@2.3.0:
1190 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
1191 | engines: {node: '>=0.10.0'}
1192 |
1193 | pirates@4.0.6:
1194 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
1195 | engines: {node: '>= 6'}
1196 |
1197 | postcss-import@15.1.0:
1198 | resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
1199 | engines: {node: '>=14.0.0'}
1200 | peerDependencies:
1201 | postcss: ^8.0.0
1202 |
1203 | postcss-js@4.0.1:
1204 | resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
1205 | engines: {node: ^12 || ^14 || >= 16}
1206 | peerDependencies:
1207 | postcss: ^8.4.21
1208 |
1209 | postcss-load-config@4.0.2:
1210 | resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==}
1211 | engines: {node: '>= 14'}
1212 | peerDependencies:
1213 | postcss: '>=8.0.9'
1214 | ts-node: '>=9.0.0'
1215 | peerDependenciesMeta:
1216 | postcss:
1217 | optional: true
1218 | ts-node:
1219 | optional: true
1220 |
1221 | postcss-nested@6.2.0:
1222 | resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==}
1223 | engines: {node: '>=12.0'}
1224 | peerDependencies:
1225 | postcss: ^8.2.14
1226 |
1227 | postcss-selector-parser@6.1.2:
1228 | resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
1229 | engines: {node: '>=4'}
1230 |
1231 | postcss-value-parser@4.2.0:
1232 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
1233 |
1234 | postcss@8.4.49:
1235 | resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==}
1236 | engines: {node: ^10 || ^12 || >=14}
1237 |
1238 | prelude-ls@1.2.1:
1239 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
1240 | engines: {node: '>= 0.8.0'}
1241 |
1242 | prettier@3.4.2:
1243 | resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==}
1244 | engines: {node: '>=14'}
1245 | hasBin: true
1246 |
1247 | proxy-from-env@1.1.0:
1248 | resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
1249 |
1250 | punycode@2.3.1:
1251 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
1252 | engines: {node: '>=6'}
1253 |
1254 | queue-microtask@1.2.3:
1255 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
1256 |
1257 | react-dom@18.3.1:
1258 | resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==}
1259 | peerDependencies:
1260 | react: ^18.3.1
1261 |
1262 | react-refresh@0.14.2:
1263 | resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==}
1264 | engines: {node: '>=0.10.0'}
1265 |
1266 | react@18.3.1:
1267 | resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
1268 | engines: {node: '>=0.10.0'}
1269 |
1270 | read-cache@1.0.0:
1271 | resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
1272 |
1273 | readdirp@3.6.0:
1274 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
1275 | engines: {node: '>=8.10.0'}
1276 |
1277 | regenerator-runtime@0.14.1:
1278 | resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
1279 |
1280 | resolve-from@4.0.0:
1281 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
1282 | engines: {node: '>=4'}
1283 |
1284 | resolve@1.22.10:
1285 | resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==}
1286 | engines: {node: '>= 0.4'}
1287 | hasBin: true
1288 |
1289 | reusify@1.0.4:
1290 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
1291 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
1292 |
1293 | rollup@4.29.1:
1294 | resolution: {integrity: sha512-RaJ45M/kmJUzSWDs1Nnd5DdV4eerC98idtUOVr6FfKcgxqvjwHmxc5upLF9qZU9EpsVzzhleFahrT3shLuJzIw==}
1295 | engines: {node: '>=18.0.0', npm: '>=8.0.0'}
1296 | hasBin: true
1297 |
1298 | run-parallel@1.2.0:
1299 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
1300 |
1301 | scheduler@0.23.2:
1302 | resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
1303 |
1304 | semver@6.3.1:
1305 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
1306 | hasBin: true
1307 |
1308 | semver@7.6.3:
1309 | resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==}
1310 | engines: {node: '>=10'}
1311 | hasBin: true
1312 |
1313 | shebang-command@2.0.0:
1314 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
1315 | engines: {node: '>=8'}
1316 |
1317 | shebang-regex@3.0.0:
1318 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
1319 | engines: {node: '>=8'}
1320 |
1321 | signal-exit@4.1.0:
1322 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
1323 | engines: {node: '>=14'}
1324 |
1325 | source-map-js@1.2.1:
1326 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
1327 | engines: {node: '>=0.10.0'}
1328 |
1329 | string-width@4.2.3:
1330 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
1331 | engines: {node: '>=8'}
1332 |
1333 | string-width@5.1.2:
1334 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
1335 | engines: {node: '>=12'}
1336 |
1337 | strip-ansi@6.0.1:
1338 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
1339 | engines: {node: '>=8'}
1340 |
1341 | strip-ansi@7.1.0:
1342 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
1343 | engines: {node: '>=12'}
1344 |
1345 | strip-json-comments@3.1.1:
1346 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
1347 | engines: {node: '>=8'}
1348 |
1349 | style-mod@4.1.2:
1350 | resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==}
1351 |
1352 | sucrase@3.35.0:
1353 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==}
1354 | engines: {node: '>=16 || 14 >=14.17'}
1355 | hasBin: true
1356 |
1357 | supports-color@7.2.0:
1358 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
1359 | engines: {node: '>=8'}
1360 |
1361 | supports-preserve-symlinks-flag@1.0.0:
1362 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
1363 | engines: {node: '>= 0.4'}
1364 |
1365 | tailwindcss@3.4.17:
1366 | resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==}
1367 | engines: {node: '>=14.0.0'}
1368 | hasBin: true
1369 |
1370 | thenify-all@1.6.0:
1371 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
1372 | engines: {node: '>=0.8'}
1373 |
1374 | thenify@3.3.1:
1375 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
1376 |
1377 | to-regex-range@5.0.1:
1378 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
1379 | engines: {node: '>=8.0'}
1380 |
1381 | ts-api-utils@1.4.3:
1382 | resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==}
1383 | engines: {node: '>=16'}
1384 | peerDependencies:
1385 | typescript: '>=4.2.0'
1386 |
1387 | ts-interface-checker@0.1.13:
1388 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
1389 |
1390 | type-check@0.4.0:
1391 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
1392 | engines: {node: '>= 0.8.0'}
1393 |
1394 | typescript-eslint@8.19.0:
1395 | resolution: {integrity: sha512-Ni8sUkVWYK4KAcTtPjQ/UTiRk6jcsuDhPpxULapUDi8A/l8TSBk+t1GtJA1RsCzIJg0q6+J7bf35AwQigENWRQ==}
1396 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1397 | peerDependencies:
1398 | eslint: ^8.57.0 || ^9.0.0
1399 | typescript: '>=4.8.4 <5.8.0'
1400 |
1401 | typescript@5.7.2:
1402 | resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==}
1403 | engines: {node: '>=14.17'}
1404 | hasBin: true
1405 |
1406 | update-browserslist-db@1.1.1:
1407 | resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==}
1408 | hasBin: true
1409 | peerDependencies:
1410 | browserslist: '>= 4.21.0'
1411 |
1412 | uri-js@4.4.1:
1413 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
1414 |
1415 | util-deprecate@1.0.2:
1416 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
1417 |
1418 | vite@5.4.11:
1419 | resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==}
1420 | engines: {node: ^18.0.0 || >=20.0.0}
1421 | hasBin: true
1422 | peerDependencies:
1423 | '@types/node': ^18.0.0 || >=20.0.0
1424 | less: '*'
1425 | lightningcss: ^1.21.0
1426 | sass: '*'
1427 | sass-embedded: '*'
1428 | stylus: '*'
1429 | sugarss: '*'
1430 | terser: ^5.4.0
1431 | peerDependenciesMeta:
1432 | '@types/node':
1433 | optional: true
1434 | less:
1435 | optional: true
1436 | lightningcss:
1437 | optional: true
1438 | sass:
1439 | optional: true
1440 | sass-embedded:
1441 | optional: true
1442 | stylus:
1443 | optional: true
1444 | sugarss:
1445 | optional: true
1446 | terser:
1447 | optional: true
1448 |
1449 | w3c-keyname@2.2.8:
1450 | resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==}
1451 |
1452 | which@2.0.2:
1453 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
1454 | engines: {node: '>= 8'}
1455 | hasBin: true
1456 |
1457 | word-wrap@1.2.5:
1458 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
1459 | engines: {node: '>=0.10.0'}
1460 |
1461 | wrap-ansi@7.0.0:
1462 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
1463 | engines: {node: '>=10'}
1464 |
1465 | wrap-ansi@8.1.0:
1466 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
1467 | engines: {node: '>=12'}
1468 |
1469 | yallist@3.1.1:
1470 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
1471 |
1472 | yaml@2.7.0:
1473 | resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==}
1474 | engines: {node: '>= 14'}
1475 | hasBin: true
1476 |
1477 | yocto-queue@0.1.0:
1478 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
1479 | engines: {node: '>=10'}
1480 |
1481 | snapshots:
1482 |
1483 | '@alloc/quick-lru@5.2.0': {}
1484 |
1485 | '@ampproject/remapping@2.3.0':
1486 | dependencies:
1487 | '@jridgewell/gen-mapping': 0.3.8
1488 | '@jridgewell/trace-mapping': 0.3.25
1489 |
1490 | '@babel/code-frame@7.26.2':
1491 | dependencies:
1492 | '@babel/helper-validator-identifier': 7.25.9
1493 | js-tokens: 4.0.0
1494 | picocolors: 1.1.1
1495 |
1496 | '@babel/compat-data@7.26.3': {}
1497 |
1498 | '@babel/core@7.26.0':
1499 | dependencies:
1500 | '@ampproject/remapping': 2.3.0
1501 | '@babel/code-frame': 7.26.2
1502 | '@babel/generator': 7.26.3
1503 | '@babel/helper-compilation-targets': 7.25.9
1504 | '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
1505 | '@babel/helpers': 7.26.0
1506 | '@babel/parser': 7.26.3
1507 | '@babel/template': 7.25.9
1508 | '@babel/traverse': 7.26.4
1509 | '@babel/types': 7.26.3
1510 | convert-source-map: 2.0.0
1511 | debug: 4.4.0
1512 | gensync: 1.0.0-beta.2
1513 | json5: 2.2.3
1514 | semver: 6.3.1
1515 | transitivePeerDependencies:
1516 | - supports-color
1517 |
1518 | '@babel/generator@7.26.3':
1519 | dependencies:
1520 | '@babel/parser': 7.26.3
1521 | '@babel/types': 7.26.3
1522 | '@jridgewell/gen-mapping': 0.3.8
1523 | '@jridgewell/trace-mapping': 0.3.25
1524 | jsesc: 3.1.0
1525 |
1526 | '@babel/helper-compilation-targets@7.25.9':
1527 | dependencies:
1528 | '@babel/compat-data': 7.26.3
1529 | '@babel/helper-validator-option': 7.25.9
1530 | browserslist: 4.24.3
1531 | lru-cache: 5.1.1
1532 | semver: 6.3.1
1533 |
1534 | '@babel/helper-module-imports@7.25.9':
1535 | dependencies:
1536 | '@babel/traverse': 7.26.4
1537 | '@babel/types': 7.26.3
1538 | transitivePeerDependencies:
1539 | - supports-color
1540 |
1541 | '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)':
1542 | dependencies:
1543 | '@babel/core': 7.26.0
1544 | '@babel/helper-module-imports': 7.25.9
1545 | '@babel/helper-validator-identifier': 7.25.9
1546 | '@babel/traverse': 7.26.4
1547 | transitivePeerDependencies:
1548 | - supports-color
1549 |
1550 | '@babel/helper-plugin-utils@7.25.9': {}
1551 |
1552 | '@babel/helper-string-parser@7.25.9': {}
1553 |
1554 | '@babel/helper-validator-identifier@7.25.9': {}
1555 |
1556 | '@babel/helper-validator-option@7.25.9': {}
1557 |
1558 | '@babel/helpers@7.26.0':
1559 | dependencies:
1560 | '@babel/template': 7.25.9
1561 | '@babel/types': 7.26.3
1562 |
1563 | '@babel/parser@7.26.3':
1564 | dependencies:
1565 | '@babel/types': 7.26.3
1566 |
1567 | '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.0)':
1568 | dependencies:
1569 | '@babel/core': 7.26.0
1570 | '@babel/helper-plugin-utils': 7.25.9
1571 |
1572 | '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.0)':
1573 | dependencies:
1574 | '@babel/core': 7.26.0
1575 | '@babel/helper-plugin-utils': 7.25.9
1576 |
1577 | '@babel/runtime@7.26.0':
1578 | dependencies:
1579 | regenerator-runtime: 0.14.1
1580 |
1581 | '@babel/template@7.25.9':
1582 | dependencies:
1583 | '@babel/code-frame': 7.26.2
1584 | '@babel/parser': 7.26.3
1585 | '@babel/types': 7.26.3
1586 |
1587 | '@babel/traverse@7.26.4':
1588 | dependencies:
1589 | '@babel/code-frame': 7.26.2
1590 | '@babel/generator': 7.26.3
1591 | '@babel/parser': 7.26.3
1592 | '@babel/template': 7.25.9
1593 | '@babel/types': 7.26.3
1594 | debug: 4.4.0
1595 | globals: 11.12.0
1596 | transitivePeerDependencies:
1597 | - supports-color
1598 |
1599 | '@babel/types@7.26.3':
1600 | dependencies:
1601 | '@babel/helper-string-parser': 7.25.9
1602 | '@babel/helper-validator-identifier': 7.25.9
1603 |
1604 | '@codemirror/autocomplete@6.18.4':
1605 | dependencies:
1606 | '@codemirror/language': 6.10.8
1607 | '@codemirror/state': 6.5.0
1608 | '@codemirror/view': 6.36.1
1609 | '@lezer/common': 1.2.3
1610 |
1611 | '@codemirror/commands@6.7.1':
1612 | dependencies:
1613 | '@codemirror/language': 6.10.8
1614 | '@codemirror/state': 6.5.0
1615 | '@codemirror/view': 6.36.1
1616 | '@lezer/common': 1.2.3
1617 |
1618 | '@codemirror/lang-javascript@6.2.2':
1619 | dependencies:
1620 | '@codemirror/autocomplete': 6.18.4
1621 | '@codemirror/language': 6.10.8
1622 | '@codemirror/lint': 6.8.4
1623 | '@codemirror/state': 6.5.0
1624 | '@codemirror/view': 6.36.1
1625 | '@lezer/common': 1.2.3
1626 | '@lezer/javascript': 1.4.21
1627 |
1628 | '@codemirror/language@6.10.8':
1629 | dependencies:
1630 | '@codemirror/state': 6.5.0
1631 | '@codemirror/view': 6.36.1
1632 | '@lezer/common': 1.2.3
1633 | '@lezer/highlight': 1.2.1
1634 | '@lezer/lr': 1.4.2
1635 | style-mod: 4.1.2
1636 |
1637 | '@codemirror/lint@6.8.4':
1638 | dependencies:
1639 | '@codemirror/state': 6.5.0
1640 | '@codemirror/view': 6.36.1
1641 | crelt: 1.0.6
1642 |
1643 | '@codemirror/search@6.5.8':
1644 | dependencies:
1645 | '@codemirror/state': 6.5.0
1646 | '@codemirror/view': 6.36.1
1647 | crelt: 1.0.6
1648 |
1649 | '@codemirror/state@6.5.0':
1650 | dependencies:
1651 | '@marijn/find-cluster-break': 1.0.2
1652 |
1653 | '@codemirror/theme-one-dark@6.1.2':
1654 | dependencies:
1655 | '@codemirror/language': 6.10.8
1656 | '@codemirror/state': 6.5.0
1657 | '@codemirror/view': 6.36.1
1658 | '@lezer/highlight': 1.2.1
1659 |
1660 | '@codemirror/view@6.36.1':
1661 | dependencies:
1662 | '@codemirror/state': 6.5.0
1663 | style-mod: 4.1.2
1664 | w3c-keyname: 2.2.8
1665 |
1666 | '@esbuild/aix-ppc64@0.21.5':
1667 | optional: true
1668 |
1669 | '@esbuild/android-arm64@0.21.5':
1670 | optional: true
1671 |
1672 | '@esbuild/android-arm@0.21.5':
1673 | optional: true
1674 |
1675 | '@esbuild/android-x64@0.21.5':
1676 | optional: true
1677 |
1678 | '@esbuild/darwin-arm64@0.21.5':
1679 | optional: true
1680 |
1681 | '@esbuild/darwin-x64@0.21.5':
1682 | optional: true
1683 |
1684 | '@esbuild/freebsd-arm64@0.21.5':
1685 | optional: true
1686 |
1687 | '@esbuild/freebsd-x64@0.21.5':
1688 | optional: true
1689 |
1690 | '@esbuild/linux-arm64@0.21.5':
1691 | optional: true
1692 |
1693 | '@esbuild/linux-arm@0.21.5':
1694 | optional: true
1695 |
1696 | '@esbuild/linux-ia32@0.21.5':
1697 | optional: true
1698 |
1699 | '@esbuild/linux-loong64@0.21.5':
1700 | optional: true
1701 |
1702 | '@esbuild/linux-mips64el@0.21.5':
1703 | optional: true
1704 |
1705 | '@esbuild/linux-ppc64@0.21.5':
1706 | optional: true
1707 |
1708 | '@esbuild/linux-riscv64@0.21.5':
1709 | optional: true
1710 |
1711 | '@esbuild/linux-s390x@0.21.5':
1712 | optional: true
1713 |
1714 | '@esbuild/linux-x64@0.21.5':
1715 | optional: true
1716 |
1717 | '@esbuild/netbsd-x64@0.21.5':
1718 | optional: true
1719 |
1720 | '@esbuild/openbsd-x64@0.21.5':
1721 | optional: true
1722 |
1723 | '@esbuild/sunos-x64@0.21.5':
1724 | optional: true
1725 |
1726 | '@esbuild/win32-arm64@0.21.5':
1727 | optional: true
1728 |
1729 | '@esbuild/win32-ia32@0.21.5':
1730 | optional: true
1731 |
1732 | '@esbuild/win32-x64@0.21.5':
1733 | optional: true
1734 |
1735 | '@eslint-community/eslint-utils@4.4.1(eslint@9.17.0(jiti@1.21.7))':
1736 | dependencies:
1737 | eslint: 9.17.0(jiti@1.21.7)
1738 | eslint-visitor-keys: 3.4.3
1739 |
1740 | '@eslint-community/regexpp@4.12.1': {}
1741 |
1742 | '@eslint/config-array@0.19.1':
1743 | dependencies:
1744 | '@eslint/object-schema': 2.1.5
1745 | debug: 4.4.0
1746 | minimatch: 3.1.2
1747 | transitivePeerDependencies:
1748 | - supports-color
1749 |
1750 | '@eslint/core@0.9.1':
1751 | dependencies:
1752 | '@types/json-schema': 7.0.15
1753 |
1754 | '@eslint/eslintrc@3.2.0':
1755 | dependencies:
1756 | ajv: 6.12.6
1757 | debug: 4.4.0
1758 | espree: 10.3.0
1759 | globals: 14.0.0
1760 | ignore: 5.3.2
1761 | import-fresh: 3.3.0
1762 | js-yaml: 4.1.0
1763 | minimatch: 3.1.2
1764 | strip-json-comments: 3.1.1
1765 | transitivePeerDependencies:
1766 | - supports-color
1767 |
1768 | '@eslint/js@9.17.0': {}
1769 |
1770 | '@eslint/object-schema@2.1.5': {}
1771 |
1772 | '@eslint/plugin-kit@0.2.4':
1773 | dependencies:
1774 | levn: 0.4.1
1775 |
1776 | '@humanfs/core@0.19.1': {}
1777 |
1778 | '@humanfs/node@0.16.6':
1779 | dependencies:
1780 | '@humanfs/core': 0.19.1
1781 | '@humanwhocodes/retry': 0.3.1
1782 |
1783 | '@humanwhocodes/module-importer@1.0.1': {}
1784 |
1785 | '@humanwhocodes/retry@0.3.1': {}
1786 |
1787 | '@humanwhocodes/retry@0.4.1': {}
1788 |
1789 | '@isaacs/cliui@8.0.2':
1790 | dependencies:
1791 | string-width: 5.1.2
1792 | string-width-cjs: string-width@4.2.3
1793 | strip-ansi: 7.1.0
1794 | strip-ansi-cjs: strip-ansi@6.0.1
1795 | wrap-ansi: 8.1.0
1796 | wrap-ansi-cjs: wrap-ansi@7.0.0
1797 |
1798 | '@jridgewell/gen-mapping@0.3.8':
1799 | dependencies:
1800 | '@jridgewell/set-array': 1.2.1
1801 | '@jridgewell/sourcemap-codec': 1.5.0
1802 | '@jridgewell/trace-mapping': 0.3.25
1803 |
1804 | '@jridgewell/resolve-uri@3.1.2': {}
1805 |
1806 | '@jridgewell/set-array@1.2.1': {}
1807 |
1808 | '@jridgewell/sourcemap-codec@1.5.0': {}
1809 |
1810 | '@jridgewell/trace-mapping@0.3.25':
1811 | dependencies:
1812 | '@jridgewell/resolve-uri': 3.1.2
1813 | '@jridgewell/sourcemap-codec': 1.5.0
1814 |
1815 | '@lezer/common@1.2.3': {}
1816 |
1817 | '@lezer/highlight@1.2.1':
1818 | dependencies:
1819 | '@lezer/common': 1.2.3
1820 |
1821 | '@lezer/javascript@1.4.21':
1822 | dependencies:
1823 | '@lezer/common': 1.2.3
1824 | '@lezer/highlight': 1.2.1
1825 | '@lezer/lr': 1.4.2
1826 |
1827 | '@lezer/lr@1.4.2':
1828 | dependencies:
1829 | '@lezer/common': 1.2.3
1830 |
1831 | '@marijn/find-cluster-break@1.0.2': {}
1832 |
1833 | '@nodelib/fs.scandir@2.1.5':
1834 | dependencies:
1835 | '@nodelib/fs.stat': 2.0.5
1836 | run-parallel: 1.2.0
1837 |
1838 | '@nodelib/fs.stat@2.0.5': {}
1839 |
1840 | '@nodelib/fs.walk@1.2.8':
1841 | dependencies:
1842 | '@nodelib/fs.scandir': 2.1.5
1843 | fastq: 1.18.0
1844 |
1845 | '@pkgjs/parseargs@0.11.0':
1846 | optional: true
1847 |
1848 | '@rollup/rollup-android-arm-eabi@4.29.1':
1849 | optional: true
1850 |
1851 | '@rollup/rollup-android-arm64@4.29.1':
1852 | optional: true
1853 |
1854 | '@rollup/rollup-darwin-arm64@4.29.1':
1855 | optional: true
1856 |
1857 | '@rollup/rollup-darwin-x64@4.29.1':
1858 | optional: true
1859 |
1860 | '@rollup/rollup-freebsd-arm64@4.29.1':
1861 | optional: true
1862 |
1863 | '@rollup/rollup-freebsd-x64@4.29.1':
1864 | optional: true
1865 |
1866 | '@rollup/rollup-linux-arm-gnueabihf@4.29.1':
1867 | optional: true
1868 |
1869 | '@rollup/rollup-linux-arm-musleabihf@4.29.1':
1870 | optional: true
1871 |
1872 | '@rollup/rollup-linux-arm64-gnu@4.29.1':
1873 | optional: true
1874 |
1875 | '@rollup/rollup-linux-arm64-musl@4.29.1':
1876 | optional: true
1877 |
1878 | '@rollup/rollup-linux-loongarch64-gnu@4.29.1':
1879 | optional: true
1880 |
1881 | '@rollup/rollup-linux-powerpc64le-gnu@4.29.1':
1882 | optional: true
1883 |
1884 | '@rollup/rollup-linux-riscv64-gnu@4.29.1':
1885 | optional: true
1886 |
1887 | '@rollup/rollup-linux-s390x-gnu@4.29.1':
1888 | optional: true
1889 |
1890 | '@rollup/rollup-linux-x64-gnu@4.29.1':
1891 | optional: true
1892 |
1893 | '@rollup/rollup-linux-x64-musl@4.29.1':
1894 | optional: true
1895 |
1896 | '@rollup/rollup-win32-arm64-msvc@4.29.1':
1897 | optional: true
1898 |
1899 | '@rollup/rollup-win32-ia32-msvc@4.29.1':
1900 | optional: true
1901 |
1902 | '@rollup/rollup-win32-x64-msvc@4.29.1':
1903 | optional: true
1904 |
1905 | '@types/babel__core@7.20.5':
1906 | dependencies:
1907 | '@babel/parser': 7.26.3
1908 | '@babel/types': 7.26.3
1909 | '@types/babel__generator': 7.6.8
1910 | '@types/babel__template': 7.4.4
1911 | '@types/babel__traverse': 7.20.6
1912 |
1913 | '@types/babel__generator@7.6.8':
1914 | dependencies:
1915 | '@babel/types': 7.26.3
1916 |
1917 | '@types/babel__template@7.4.4':
1918 | dependencies:
1919 | '@babel/parser': 7.26.3
1920 | '@babel/types': 7.26.3
1921 |
1922 | '@types/babel__traverse@7.20.6':
1923 | dependencies:
1924 | '@babel/types': 7.26.3
1925 |
1926 | '@types/estree@1.0.6': {}
1927 |
1928 | '@types/json-schema@7.0.15': {}
1929 |
1930 | '@types/prop-types@15.7.14': {}
1931 |
1932 | '@types/react-dom@18.3.5(@types/react@18.3.18)':
1933 | dependencies:
1934 | '@types/react': 18.3.18
1935 |
1936 | '@types/react@18.3.18':
1937 | dependencies:
1938 | '@types/prop-types': 15.7.14
1939 | csstype: 3.1.3
1940 |
1941 | '@typescript-eslint/eslint-plugin@8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2))(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2)':
1942 | dependencies:
1943 | '@eslint-community/regexpp': 4.12.1
1944 | '@typescript-eslint/parser': 8.19.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2)
1945 | '@typescript-eslint/scope-manager': 8.19.0
1946 | '@typescript-eslint/type-utils': 8.19.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2)
1947 | '@typescript-eslint/utils': 8.19.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2)
1948 | '@typescript-eslint/visitor-keys': 8.19.0
1949 | eslint: 9.17.0(jiti@1.21.7)
1950 | graphemer: 1.4.0
1951 | ignore: 5.3.2
1952 | natural-compare: 1.4.0
1953 | ts-api-utils: 1.4.3(typescript@5.7.2)
1954 | typescript: 5.7.2
1955 | transitivePeerDependencies:
1956 | - supports-color
1957 |
1958 | '@typescript-eslint/parser@8.19.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2)':
1959 | dependencies:
1960 | '@typescript-eslint/scope-manager': 8.19.0
1961 | '@typescript-eslint/types': 8.19.0
1962 | '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.7.2)
1963 | '@typescript-eslint/visitor-keys': 8.19.0
1964 | debug: 4.4.0
1965 | eslint: 9.17.0(jiti@1.21.7)
1966 | typescript: 5.7.2
1967 | transitivePeerDependencies:
1968 | - supports-color
1969 |
1970 | '@typescript-eslint/scope-manager@8.19.0':
1971 | dependencies:
1972 | '@typescript-eslint/types': 8.19.0
1973 | '@typescript-eslint/visitor-keys': 8.19.0
1974 |
1975 | '@typescript-eslint/type-utils@8.19.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2)':
1976 | dependencies:
1977 | '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.7.2)
1978 | '@typescript-eslint/utils': 8.19.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2)
1979 | debug: 4.4.0
1980 | eslint: 9.17.0(jiti@1.21.7)
1981 | ts-api-utils: 1.4.3(typescript@5.7.2)
1982 | typescript: 5.7.2
1983 | transitivePeerDependencies:
1984 | - supports-color
1985 |
1986 | '@typescript-eslint/types@8.19.0': {}
1987 |
1988 | '@typescript-eslint/typescript-estree@8.19.0(typescript@5.7.2)':
1989 | dependencies:
1990 | '@typescript-eslint/types': 8.19.0
1991 | '@typescript-eslint/visitor-keys': 8.19.0
1992 | debug: 4.4.0
1993 | fast-glob: 3.3.2
1994 | is-glob: 4.0.3
1995 | minimatch: 9.0.5
1996 | semver: 7.6.3
1997 | ts-api-utils: 1.4.3(typescript@5.7.2)
1998 | typescript: 5.7.2
1999 | transitivePeerDependencies:
2000 | - supports-color
2001 |
2002 | '@typescript-eslint/utils@8.19.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2)':
2003 | dependencies:
2004 | '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@1.21.7))
2005 | '@typescript-eslint/scope-manager': 8.19.0
2006 | '@typescript-eslint/types': 8.19.0
2007 | '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.7.2)
2008 | eslint: 9.17.0(jiti@1.21.7)
2009 | typescript: 5.7.2
2010 | transitivePeerDependencies:
2011 | - supports-color
2012 |
2013 | '@typescript-eslint/visitor-keys@8.19.0':
2014 | dependencies:
2015 | '@typescript-eslint/types': 8.19.0
2016 | eslint-visitor-keys: 4.2.0
2017 |
2018 | '@uiw/codemirror-extensions-basic-setup@4.23.7(@codemirror/autocomplete@6.18.4)(@codemirror/commands@6.7.1)(@codemirror/language@6.10.8)(@codemirror/lint@6.8.4)(@codemirror/search@6.5.8)(@codemirror/state@6.5.0)(@codemirror/view@6.36.1)':
2019 | dependencies:
2020 | '@codemirror/autocomplete': 6.18.4
2021 | '@codemirror/commands': 6.7.1
2022 | '@codemirror/language': 6.10.8
2023 | '@codemirror/lint': 6.8.4
2024 | '@codemirror/search': 6.5.8
2025 | '@codemirror/state': 6.5.0
2026 | '@codemirror/view': 6.36.1
2027 |
2028 | '@uiw/react-codemirror@4.23.7(@babel/runtime@7.26.0)(@codemirror/autocomplete@6.18.4)(@codemirror/language@6.10.8)(@codemirror/lint@6.8.4)(@codemirror/search@6.5.8)(@codemirror/state@6.5.0)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.36.1)(codemirror@6.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
2029 | dependencies:
2030 | '@babel/runtime': 7.26.0
2031 | '@codemirror/commands': 6.7.1
2032 | '@codemirror/state': 6.5.0
2033 | '@codemirror/theme-one-dark': 6.1.2
2034 | '@codemirror/view': 6.36.1
2035 | '@uiw/codemirror-extensions-basic-setup': 4.23.7(@codemirror/autocomplete@6.18.4)(@codemirror/commands@6.7.1)(@codemirror/language@6.10.8)(@codemirror/lint@6.8.4)(@codemirror/search@6.5.8)(@codemirror/state@6.5.0)(@codemirror/view@6.36.1)
2036 | codemirror: 6.0.1
2037 | react: 18.3.1
2038 | react-dom: 18.3.1(react@18.3.1)
2039 | transitivePeerDependencies:
2040 | - '@codemirror/autocomplete'
2041 | - '@codemirror/language'
2042 | - '@codemirror/lint'
2043 | - '@codemirror/search'
2044 |
2045 | '@vitejs/plugin-react@4.3.4(vite@5.4.11)':
2046 | dependencies:
2047 | '@babel/core': 7.26.0
2048 | '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0)
2049 | '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0)
2050 | '@types/babel__core': 7.20.5
2051 | react-refresh: 0.14.2
2052 | vite: 5.4.11
2053 | transitivePeerDependencies:
2054 | - supports-color
2055 |
2056 | acorn-jsx@5.3.2(acorn@8.14.0):
2057 | dependencies:
2058 | acorn: 8.14.0
2059 |
2060 | acorn@8.14.0: {}
2061 |
2062 | ajv@6.12.6:
2063 | dependencies:
2064 | fast-deep-equal: 3.1.3
2065 | fast-json-stable-stringify: 2.1.0
2066 | json-schema-traverse: 0.4.1
2067 | uri-js: 4.4.1
2068 |
2069 | ansi-regex@5.0.1: {}
2070 |
2071 | ansi-regex@6.1.0: {}
2072 |
2073 | ansi-styles@4.3.0:
2074 | dependencies:
2075 | color-convert: 2.0.1
2076 |
2077 | ansi-styles@6.2.1: {}
2078 |
2079 | any-promise@1.3.0: {}
2080 |
2081 | anymatch@3.1.3:
2082 | dependencies:
2083 | normalize-path: 3.0.0
2084 | picomatch: 2.3.1
2085 |
2086 | arg@5.0.2: {}
2087 |
2088 | argparse@2.0.1: {}
2089 |
2090 | asynckit@0.4.0: {}
2091 |
2092 | autoprefixer@10.4.20(postcss@8.4.49):
2093 | dependencies:
2094 | browserslist: 4.24.3
2095 | caniuse-lite: 1.0.30001690
2096 | fraction.js: 4.3.7
2097 | normalize-range: 0.1.2
2098 | picocolors: 1.1.1
2099 | postcss: 8.4.49
2100 | postcss-value-parser: 4.2.0
2101 |
2102 | axios@1.7.9:
2103 | dependencies:
2104 | follow-redirects: 1.15.9
2105 | form-data: 4.0.1
2106 | proxy-from-env: 1.1.0
2107 | transitivePeerDependencies:
2108 | - debug
2109 |
2110 | balanced-match@1.0.2: {}
2111 |
2112 | binary-extensions@2.3.0: {}
2113 |
2114 | brace-expansion@1.1.11:
2115 | dependencies:
2116 | balanced-match: 1.0.2
2117 | concat-map: 0.0.1
2118 |
2119 | brace-expansion@2.0.1:
2120 | dependencies:
2121 | balanced-match: 1.0.2
2122 |
2123 | braces@3.0.3:
2124 | dependencies:
2125 | fill-range: 7.1.1
2126 |
2127 | browserslist@4.24.3:
2128 | dependencies:
2129 | caniuse-lite: 1.0.30001690
2130 | electron-to-chromium: 1.5.76
2131 | node-releases: 2.0.19
2132 | update-browserslist-db: 1.1.1(browserslist@4.24.3)
2133 |
2134 | callsites@3.1.0: {}
2135 |
2136 | camelcase-css@2.0.1: {}
2137 |
2138 | caniuse-lite@1.0.30001690: {}
2139 |
2140 | chalk@4.1.2:
2141 | dependencies:
2142 | ansi-styles: 4.3.0
2143 | supports-color: 7.2.0
2144 |
2145 | chokidar@3.6.0:
2146 | dependencies:
2147 | anymatch: 3.1.3
2148 | braces: 3.0.3
2149 | glob-parent: 5.1.2
2150 | is-binary-path: 2.1.0
2151 | is-glob: 4.0.3
2152 | normalize-path: 3.0.0
2153 | readdirp: 3.6.0
2154 | optionalDependencies:
2155 | fsevents: 2.3.3
2156 |
2157 | codemirror@6.0.1:
2158 | dependencies:
2159 | '@codemirror/autocomplete': 6.18.4
2160 | '@codemirror/commands': 6.7.1
2161 | '@codemirror/language': 6.10.8
2162 | '@codemirror/lint': 6.8.4
2163 | '@codemirror/search': 6.5.8
2164 | '@codemirror/state': 6.5.0
2165 | '@codemirror/view': 6.36.1
2166 |
2167 | color-convert@2.0.1:
2168 | dependencies:
2169 | color-name: 1.1.4
2170 |
2171 | color-name@1.1.4: {}
2172 |
2173 | combined-stream@1.0.8:
2174 | dependencies:
2175 | delayed-stream: 1.0.0
2176 |
2177 | commander@4.1.1: {}
2178 |
2179 | concat-map@0.0.1: {}
2180 |
2181 | convert-source-map@2.0.0: {}
2182 |
2183 | crelt@1.0.6: {}
2184 |
2185 | cross-spawn@7.0.6:
2186 | dependencies:
2187 | path-key: 3.1.1
2188 | shebang-command: 2.0.0
2189 | which: 2.0.2
2190 |
2191 | cssesc@3.0.0: {}
2192 |
2193 | csstype@3.1.3: {}
2194 |
2195 | debug@4.4.0:
2196 | dependencies:
2197 | ms: 2.1.3
2198 |
2199 | deep-is@0.1.4: {}
2200 |
2201 | delayed-stream@1.0.0: {}
2202 |
2203 | didyoumean@1.2.2: {}
2204 |
2205 | dlv@1.1.3: {}
2206 |
2207 | eastasianwidth@0.2.0: {}
2208 |
2209 | electron-to-chromium@1.5.76: {}
2210 |
2211 | emoji-regex@8.0.0: {}
2212 |
2213 | emoji-regex@9.2.2: {}
2214 |
2215 | esbuild@0.21.5:
2216 | optionalDependencies:
2217 | '@esbuild/aix-ppc64': 0.21.5
2218 | '@esbuild/android-arm': 0.21.5
2219 | '@esbuild/android-arm64': 0.21.5
2220 | '@esbuild/android-x64': 0.21.5
2221 | '@esbuild/darwin-arm64': 0.21.5
2222 | '@esbuild/darwin-x64': 0.21.5
2223 | '@esbuild/freebsd-arm64': 0.21.5
2224 | '@esbuild/freebsd-x64': 0.21.5
2225 | '@esbuild/linux-arm': 0.21.5
2226 | '@esbuild/linux-arm64': 0.21.5
2227 | '@esbuild/linux-ia32': 0.21.5
2228 | '@esbuild/linux-loong64': 0.21.5
2229 | '@esbuild/linux-mips64el': 0.21.5
2230 | '@esbuild/linux-ppc64': 0.21.5
2231 | '@esbuild/linux-riscv64': 0.21.5
2232 | '@esbuild/linux-s390x': 0.21.5
2233 | '@esbuild/linux-x64': 0.21.5
2234 | '@esbuild/netbsd-x64': 0.21.5
2235 | '@esbuild/openbsd-x64': 0.21.5
2236 | '@esbuild/sunos-x64': 0.21.5
2237 | '@esbuild/win32-arm64': 0.21.5
2238 | '@esbuild/win32-ia32': 0.21.5
2239 | '@esbuild/win32-x64': 0.21.5
2240 |
2241 | escalade@3.2.0: {}
2242 |
2243 | escape-string-regexp@4.0.0: {}
2244 |
2245 | eslint-plugin-react-hooks@5.1.0(eslint@9.17.0(jiti@1.21.7)):
2246 | dependencies:
2247 | eslint: 9.17.0(jiti@1.21.7)
2248 |
2249 | eslint-plugin-react-refresh@0.4.16(eslint@9.17.0(jiti@1.21.7)):
2250 | dependencies:
2251 | eslint: 9.17.0(jiti@1.21.7)
2252 |
2253 | eslint-scope@8.2.0:
2254 | dependencies:
2255 | esrecurse: 4.3.0
2256 | estraverse: 5.3.0
2257 |
2258 | eslint-visitor-keys@3.4.3: {}
2259 |
2260 | eslint-visitor-keys@4.2.0: {}
2261 |
2262 | eslint@9.17.0(jiti@1.21.7):
2263 | dependencies:
2264 | '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@1.21.7))
2265 | '@eslint-community/regexpp': 4.12.1
2266 | '@eslint/config-array': 0.19.1
2267 | '@eslint/core': 0.9.1
2268 | '@eslint/eslintrc': 3.2.0
2269 | '@eslint/js': 9.17.0
2270 | '@eslint/plugin-kit': 0.2.4
2271 | '@humanfs/node': 0.16.6
2272 | '@humanwhocodes/module-importer': 1.0.1
2273 | '@humanwhocodes/retry': 0.4.1
2274 | '@types/estree': 1.0.6
2275 | '@types/json-schema': 7.0.15
2276 | ajv: 6.12.6
2277 | chalk: 4.1.2
2278 | cross-spawn: 7.0.6
2279 | debug: 4.4.0
2280 | escape-string-regexp: 4.0.0
2281 | eslint-scope: 8.2.0
2282 | eslint-visitor-keys: 4.2.0
2283 | espree: 10.3.0
2284 | esquery: 1.6.0
2285 | esutils: 2.0.3
2286 | fast-deep-equal: 3.1.3
2287 | file-entry-cache: 8.0.0
2288 | find-up: 5.0.0
2289 | glob-parent: 6.0.2
2290 | ignore: 5.3.2
2291 | imurmurhash: 0.1.4
2292 | is-glob: 4.0.3
2293 | json-stable-stringify-without-jsonify: 1.0.1
2294 | lodash.merge: 4.6.2
2295 | minimatch: 3.1.2
2296 | natural-compare: 1.4.0
2297 | optionator: 0.9.4
2298 | optionalDependencies:
2299 | jiti: 1.21.7
2300 | transitivePeerDependencies:
2301 | - supports-color
2302 |
2303 | espree@10.3.0:
2304 | dependencies:
2305 | acorn: 8.14.0
2306 | acorn-jsx: 5.3.2(acorn@8.14.0)
2307 | eslint-visitor-keys: 4.2.0
2308 |
2309 | esquery@1.6.0:
2310 | dependencies:
2311 | estraverse: 5.3.0
2312 |
2313 | esrecurse@4.3.0:
2314 | dependencies:
2315 | estraverse: 5.3.0
2316 |
2317 | estraverse@5.3.0: {}
2318 |
2319 | esutils@2.0.3: {}
2320 |
2321 | fast-deep-equal@3.1.3: {}
2322 |
2323 | fast-glob@3.3.2:
2324 | dependencies:
2325 | '@nodelib/fs.stat': 2.0.5
2326 | '@nodelib/fs.walk': 1.2.8
2327 | glob-parent: 5.1.2
2328 | merge2: 1.4.1
2329 | micromatch: 4.0.8
2330 |
2331 | fast-json-stable-stringify@2.1.0: {}
2332 |
2333 | fast-levenshtein@2.0.6: {}
2334 |
2335 | fastq@1.18.0:
2336 | dependencies:
2337 | reusify: 1.0.4
2338 |
2339 | file-entry-cache@8.0.0:
2340 | dependencies:
2341 | flat-cache: 4.0.1
2342 |
2343 | fill-range@7.1.1:
2344 | dependencies:
2345 | to-regex-range: 5.0.1
2346 |
2347 | find-up@5.0.0:
2348 | dependencies:
2349 | locate-path: 6.0.0
2350 | path-exists: 4.0.0
2351 |
2352 | flat-cache@4.0.1:
2353 | dependencies:
2354 | flatted: 3.3.2
2355 | keyv: 4.5.4
2356 |
2357 | flatted@3.3.2: {}
2358 |
2359 | follow-redirects@1.15.9: {}
2360 |
2361 | foreground-child@3.3.0:
2362 | dependencies:
2363 | cross-spawn: 7.0.6
2364 | signal-exit: 4.1.0
2365 |
2366 | form-data@4.0.1:
2367 | dependencies:
2368 | asynckit: 0.4.0
2369 | combined-stream: 1.0.8
2370 | mime-types: 2.1.35
2371 |
2372 | fraction.js@4.3.7: {}
2373 |
2374 | fsevents@2.3.3:
2375 | optional: true
2376 |
2377 | function-bind@1.1.2: {}
2378 |
2379 | gensync@1.0.0-beta.2: {}
2380 |
2381 | glob-parent@5.1.2:
2382 | dependencies:
2383 | is-glob: 4.0.3
2384 |
2385 | glob-parent@6.0.2:
2386 | dependencies:
2387 | is-glob: 4.0.3
2388 |
2389 | glob@10.4.5:
2390 | dependencies:
2391 | foreground-child: 3.3.0
2392 | jackspeak: 3.4.3
2393 | minimatch: 9.0.5
2394 | minipass: 7.1.2
2395 | package-json-from-dist: 1.0.1
2396 | path-scurry: 1.11.1
2397 |
2398 | globals@11.12.0: {}
2399 |
2400 | globals@14.0.0: {}
2401 |
2402 | globals@15.14.0: {}
2403 |
2404 | graphemer@1.4.0: {}
2405 |
2406 | has-flag@4.0.0: {}
2407 |
2408 | hasown@2.0.2:
2409 | dependencies:
2410 | function-bind: 1.1.2
2411 |
2412 | ignore@5.3.2: {}
2413 |
2414 | import-fresh@3.3.0:
2415 | dependencies:
2416 | parent-module: 1.0.1
2417 | resolve-from: 4.0.0
2418 |
2419 | imurmurhash@0.1.4: {}
2420 |
2421 | is-binary-path@2.1.0:
2422 | dependencies:
2423 | binary-extensions: 2.3.0
2424 |
2425 | is-core-module@2.16.1:
2426 | dependencies:
2427 | hasown: 2.0.2
2428 |
2429 | is-extglob@2.1.1: {}
2430 |
2431 | is-fullwidth-code-point@3.0.0: {}
2432 |
2433 | is-glob@4.0.3:
2434 | dependencies:
2435 | is-extglob: 2.1.1
2436 |
2437 | is-number@7.0.0: {}
2438 |
2439 | isexe@2.0.0: {}
2440 |
2441 | jackspeak@3.4.3:
2442 | dependencies:
2443 | '@isaacs/cliui': 8.0.2
2444 | optionalDependencies:
2445 | '@pkgjs/parseargs': 0.11.0
2446 |
2447 | jiti@1.21.7: {}
2448 |
2449 | js-tokens@4.0.0: {}
2450 |
2451 | js-yaml@4.1.0:
2452 | dependencies:
2453 | argparse: 2.0.1
2454 |
2455 | jsesc@3.1.0: {}
2456 |
2457 | json-buffer@3.0.1: {}
2458 |
2459 | json-schema-traverse@0.4.1: {}
2460 |
2461 | json-stable-stringify-without-jsonify@1.0.1: {}
2462 |
2463 | json5@2.2.3: {}
2464 |
2465 | keyv@4.5.4:
2466 | dependencies:
2467 | json-buffer: 3.0.1
2468 |
2469 | levn@0.4.1:
2470 | dependencies:
2471 | prelude-ls: 1.2.1
2472 | type-check: 0.4.0
2473 |
2474 | lilconfig@3.1.3: {}
2475 |
2476 | lines-and-columns@1.2.4: {}
2477 |
2478 | locate-path@6.0.0:
2479 | dependencies:
2480 | p-locate: 5.0.0
2481 |
2482 | lodash.merge@4.6.2: {}
2483 |
2484 | loose-envify@1.4.0:
2485 | dependencies:
2486 | js-tokens: 4.0.0
2487 |
2488 | lru-cache@10.4.3: {}
2489 |
2490 | lru-cache@5.1.1:
2491 | dependencies:
2492 | yallist: 3.1.1
2493 |
2494 | lucide-react@0.344.0(react@18.3.1):
2495 | dependencies:
2496 | react: 18.3.1
2497 |
2498 | merge2@1.4.1: {}
2499 |
2500 | micromatch@4.0.8:
2501 | dependencies:
2502 | braces: 3.0.3
2503 | picomatch: 2.3.1
2504 |
2505 | mime-db@1.52.0: {}
2506 |
2507 | mime-types@2.1.35:
2508 | dependencies:
2509 | mime-db: 1.52.0
2510 |
2511 | minimatch@3.1.2:
2512 | dependencies:
2513 | brace-expansion: 1.1.11
2514 |
2515 | minimatch@9.0.5:
2516 | dependencies:
2517 | brace-expansion: 2.0.1
2518 |
2519 | minipass@7.1.2: {}
2520 |
2521 | ms@2.1.3: {}
2522 |
2523 | mz@2.7.0:
2524 | dependencies:
2525 | any-promise: 1.3.0
2526 | object-assign: 4.1.1
2527 | thenify-all: 1.6.0
2528 |
2529 | nanoid@3.3.8: {}
2530 |
2531 | natural-compare@1.4.0: {}
2532 |
2533 | node-releases@2.0.19: {}
2534 |
2535 | normalize-path@3.0.0: {}
2536 |
2537 | normalize-range@0.1.2: {}
2538 |
2539 | object-assign@4.1.1: {}
2540 |
2541 | object-hash@3.0.0: {}
2542 |
2543 | optionator@0.9.4:
2544 | dependencies:
2545 | deep-is: 0.1.4
2546 | fast-levenshtein: 2.0.6
2547 | levn: 0.4.1
2548 | prelude-ls: 1.2.1
2549 | type-check: 0.4.0
2550 | word-wrap: 1.2.5
2551 |
2552 | p-limit@3.1.0:
2553 | dependencies:
2554 | yocto-queue: 0.1.0
2555 |
2556 | p-locate@5.0.0:
2557 | dependencies:
2558 | p-limit: 3.1.0
2559 |
2560 | package-json-from-dist@1.0.1: {}
2561 |
2562 | parent-module@1.0.1:
2563 | dependencies:
2564 | callsites: 3.1.0
2565 |
2566 | path-exists@4.0.0: {}
2567 |
2568 | path-key@3.1.1: {}
2569 |
2570 | path-parse@1.0.7: {}
2571 |
2572 | path-scurry@1.11.1:
2573 | dependencies:
2574 | lru-cache: 10.4.3
2575 | minipass: 7.1.2
2576 |
2577 | picocolors@1.1.1: {}
2578 |
2579 | picomatch@2.3.1: {}
2580 |
2581 | pify@2.3.0: {}
2582 |
2583 | pirates@4.0.6: {}
2584 |
2585 | postcss-import@15.1.0(postcss@8.4.49):
2586 | dependencies:
2587 | postcss: 8.4.49
2588 | postcss-value-parser: 4.2.0
2589 | read-cache: 1.0.0
2590 | resolve: 1.22.10
2591 |
2592 | postcss-js@4.0.1(postcss@8.4.49):
2593 | dependencies:
2594 | camelcase-css: 2.0.1
2595 | postcss: 8.4.49
2596 |
2597 | postcss-load-config@4.0.2(postcss@8.4.49):
2598 | dependencies:
2599 | lilconfig: 3.1.3
2600 | yaml: 2.7.0
2601 | optionalDependencies:
2602 | postcss: 8.4.49
2603 |
2604 | postcss-nested@6.2.0(postcss@8.4.49):
2605 | dependencies:
2606 | postcss: 8.4.49
2607 | postcss-selector-parser: 6.1.2
2608 |
2609 | postcss-selector-parser@6.1.2:
2610 | dependencies:
2611 | cssesc: 3.0.0
2612 | util-deprecate: 1.0.2
2613 |
2614 | postcss-value-parser@4.2.0: {}
2615 |
2616 | postcss@8.4.49:
2617 | dependencies:
2618 | nanoid: 3.3.8
2619 | picocolors: 1.1.1
2620 | source-map-js: 1.2.1
2621 |
2622 | prelude-ls@1.2.1: {}
2623 |
2624 | prettier@3.4.2: {}
2625 |
2626 | proxy-from-env@1.1.0: {}
2627 |
2628 | punycode@2.3.1: {}
2629 |
2630 | queue-microtask@1.2.3: {}
2631 |
2632 | react-dom@18.3.1(react@18.3.1):
2633 | dependencies:
2634 | loose-envify: 1.4.0
2635 | react: 18.3.1
2636 | scheduler: 0.23.2
2637 |
2638 | react-refresh@0.14.2: {}
2639 |
2640 | react@18.3.1:
2641 | dependencies:
2642 | loose-envify: 1.4.0
2643 |
2644 | read-cache@1.0.0:
2645 | dependencies:
2646 | pify: 2.3.0
2647 |
2648 | readdirp@3.6.0:
2649 | dependencies:
2650 | picomatch: 2.3.1
2651 |
2652 | regenerator-runtime@0.14.1: {}
2653 |
2654 | resolve-from@4.0.0: {}
2655 |
2656 | resolve@1.22.10:
2657 | dependencies:
2658 | is-core-module: 2.16.1
2659 | path-parse: 1.0.7
2660 | supports-preserve-symlinks-flag: 1.0.0
2661 |
2662 | reusify@1.0.4: {}
2663 |
2664 | rollup@4.29.1:
2665 | dependencies:
2666 | '@types/estree': 1.0.6
2667 | optionalDependencies:
2668 | '@rollup/rollup-android-arm-eabi': 4.29.1
2669 | '@rollup/rollup-android-arm64': 4.29.1
2670 | '@rollup/rollup-darwin-arm64': 4.29.1
2671 | '@rollup/rollup-darwin-x64': 4.29.1
2672 | '@rollup/rollup-freebsd-arm64': 4.29.1
2673 | '@rollup/rollup-freebsd-x64': 4.29.1
2674 | '@rollup/rollup-linux-arm-gnueabihf': 4.29.1
2675 | '@rollup/rollup-linux-arm-musleabihf': 4.29.1
2676 | '@rollup/rollup-linux-arm64-gnu': 4.29.1
2677 | '@rollup/rollup-linux-arm64-musl': 4.29.1
2678 | '@rollup/rollup-linux-loongarch64-gnu': 4.29.1
2679 | '@rollup/rollup-linux-powerpc64le-gnu': 4.29.1
2680 | '@rollup/rollup-linux-riscv64-gnu': 4.29.1
2681 | '@rollup/rollup-linux-s390x-gnu': 4.29.1
2682 | '@rollup/rollup-linux-x64-gnu': 4.29.1
2683 | '@rollup/rollup-linux-x64-musl': 4.29.1
2684 | '@rollup/rollup-win32-arm64-msvc': 4.29.1
2685 | '@rollup/rollup-win32-ia32-msvc': 4.29.1
2686 | '@rollup/rollup-win32-x64-msvc': 4.29.1
2687 | fsevents: 2.3.3
2688 |
2689 | run-parallel@1.2.0:
2690 | dependencies:
2691 | queue-microtask: 1.2.3
2692 |
2693 | scheduler@0.23.2:
2694 | dependencies:
2695 | loose-envify: 1.4.0
2696 |
2697 | semver@6.3.1: {}
2698 |
2699 | semver@7.6.3: {}
2700 |
2701 | shebang-command@2.0.0:
2702 | dependencies:
2703 | shebang-regex: 3.0.0
2704 |
2705 | shebang-regex@3.0.0: {}
2706 |
2707 | signal-exit@4.1.0: {}
2708 |
2709 | source-map-js@1.2.1: {}
2710 |
2711 | string-width@4.2.3:
2712 | dependencies:
2713 | emoji-regex: 8.0.0
2714 | is-fullwidth-code-point: 3.0.0
2715 | strip-ansi: 6.0.1
2716 |
2717 | string-width@5.1.2:
2718 | dependencies:
2719 | eastasianwidth: 0.2.0
2720 | emoji-regex: 9.2.2
2721 | strip-ansi: 7.1.0
2722 |
2723 | strip-ansi@6.0.1:
2724 | dependencies:
2725 | ansi-regex: 5.0.1
2726 |
2727 | strip-ansi@7.1.0:
2728 | dependencies:
2729 | ansi-regex: 6.1.0
2730 |
2731 | strip-json-comments@3.1.1: {}
2732 |
2733 | style-mod@4.1.2: {}
2734 |
2735 | sucrase@3.35.0:
2736 | dependencies:
2737 | '@jridgewell/gen-mapping': 0.3.8
2738 | commander: 4.1.1
2739 | glob: 10.4.5
2740 | lines-and-columns: 1.2.4
2741 | mz: 2.7.0
2742 | pirates: 4.0.6
2743 | ts-interface-checker: 0.1.13
2744 |
2745 | supports-color@7.2.0:
2746 | dependencies:
2747 | has-flag: 4.0.0
2748 |
2749 | supports-preserve-symlinks-flag@1.0.0: {}
2750 |
2751 | tailwindcss@3.4.17:
2752 | dependencies:
2753 | '@alloc/quick-lru': 5.2.0
2754 | arg: 5.0.2
2755 | chokidar: 3.6.0
2756 | didyoumean: 1.2.2
2757 | dlv: 1.1.3
2758 | fast-glob: 3.3.2
2759 | glob-parent: 6.0.2
2760 | is-glob: 4.0.3
2761 | jiti: 1.21.7
2762 | lilconfig: 3.1.3
2763 | micromatch: 4.0.8
2764 | normalize-path: 3.0.0
2765 | object-hash: 3.0.0
2766 | picocolors: 1.1.1
2767 | postcss: 8.4.49
2768 | postcss-import: 15.1.0(postcss@8.4.49)
2769 | postcss-js: 4.0.1(postcss@8.4.49)
2770 | postcss-load-config: 4.0.2(postcss@8.4.49)
2771 | postcss-nested: 6.2.0(postcss@8.4.49)
2772 | postcss-selector-parser: 6.1.2
2773 | resolve: 1.22.10
2774 | sucrase: 3.35.0
2775 | transitivePeerDependencies:
2776 | - ts-node
2777 |
2778 | thenify-all@1.6.0:
2779 | dependencies:
2780 | thenify: 3.3.1
2781 |
2782 | thenify@3.3.1:
2783 | dependencies:
2784 | any-promise: 1.3.0
2785 |
2786 | to-regex-range@5.0.1:
2787 | dependencies:
2788 | is-number: 7.0.0
2789 |
2790 | ts-api-utils@1.4.3(typescript@5.7.2):
2791 | dependencies:
2792 | typescript: 5.7.2
2793 |
2794 | ts-interface-checker@0.1.13: {}
2795 |
2796 | type-check@0.4.0:
2797 | dependencies:
2798 | prelude-ls: 1.2.1
2799 |
2800 | typescript-eslint@8.19.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2):
2801 | dependencies:
2802 | '@typescript-eslint/eslint-plugin': 8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2))(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2)
2803 | '@typescript-eslint/parser': 8.19.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2)
2804 | '@typescript-eslint/utils': 8.19.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2)
2805 | eslint: 9.17.0(jiti@1.21.7)
2806 | typescript: 5.7.2
2807 | transitivePeerDependencies:
2808 | - supports-color
2809 |
2810 | typescript@5.7.2: {}
2811 |
2812 | update-browserslist-db@1.1.1(browserslist@4.24.3):
2813 | dependencies:
2814 | browserslist: 4.24.3
2815 | escalade: 3.2.0
2816 | picocolors: 1.1.1
2817 |
2818 | uri-js@4.4.1:
2819 | dependencies:
2820 | punycode: 2.3.1
2821 |
2822 | util-deprecate@1.0.2: {}
2823 |
2824 | vite@5.4.11:
2825 | dependencies:
2826 | esbuild: 0.21.5
2827 | postcss: 8.4.49
2828 | rollup: 4.29.1
2829 | optionalDependencies:
2830 | fsevents: 2.3.3
2831 |
2832 | w3c-keyname@2.2.8: {}
2833 |
2834 | which@2.0.2:
2835 | dependencies:
2836 | isexe: 2.0.0
2837 |
2838 | word-wrap@1.2.5: {}
2839 |
2840 | wrap-ansi@7.0.0:
2841 | dependencies:
2842 | ansi-styles: 4.3.0
2843 | string-width: 4.2.3
2844 | strip-ansi: 6.0.1
2845 |
2846 | wrap-ansi@8.1.0:
2847 | dependencies:
2848 | ansi-styles: 6.2.1
2849 | string-width: 5.1.2
2850 | strip-ansi: 7.1.0
2851 |
2852 | yallist@3.1.1: {}
2853 |
2854 | yaml@2.7.0: {}
2855 |
2856 | yocto-queue@0.1.0: {}
2857 |
--------------------------------------------------------------------------------
/postcss.config.js:
--------------------------------------------------------------------------------
1 | export default {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | },
6 | };
7 |
--------------------------------------------------------------------------------
/src/App.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ApiClient from './components/ApiClient/index';
3 |
4 | function App() {
5 | return ;
6 | }
7 |
8 | export default App;
--------------------------------------------------------------------------------
/src/assets/example.json:
--------------------------------------------------------------------------------
1 | {
2 | "id": "9cc172c8-c998-428e-96bb-dac01d79389b",
3 | "name": "Exported Session 1/5/2025, 2:38:00 AM",
4 | "requests": [
5 | {
6 | "id": "95dfd1c6-2916-49b0-a118-755b109f5494",
7 | "name": "[example] get products",
8 | "url": "https://dummyjson.com/products?limit=4&skip=10&select=title,price,description,brand,thumbnail",
9 | "method": "GET",
10 | "headers": "{\n \"Content-Type\": \"application/json\"\n}",
11 | "body": "{\n\n}",
12 | "preRequestCode": {
13 | "code": "// Modify request options here\nreturn options;",
14 | "enabled": false
15 | },
16 | "postResponseCode": {
17 | "code": "// Create grid layout\nroot.innerHTML = `\n \n ${response.data.products\n .map(\n (product, index) => `\n
\n
\n

\n
![]()
\n
\n
\n
\n
\n ${product.title}\n
\n \n $${product.price.toFixed(2)}\n \n \n
\n ${product.description}\n
\n
\n ${product.brand}\n
\n
\n
\n `\n )\n .join('')}\n
\n`;\n\n// Generate QR codes for each product (using the qrcode CDN)\nresponse.data.products.forEach((product, index) => {\n const container = document.createElement('div');\n\n // Create QR code\n const qr = new QRCode(container, {\n text: `https://dummyjson.com/products/${product.id}`,\n width: 128,\n height: 128,\n colorDark: '#000000',\n colorLight: '#ffffff',\n });\n\n // Get the canvas element created by QRCode.js\n const canvas = container.querySelector('canvas');\n\n // Convert to PNG data URL\n const pngDataUrl = canvas.toDataURL('image/png');\n\n\n // Clean up the temporary container\n container.remove();\n\n // add the image\n document.getElementById(`qr-${index}`).src = pngDataUrl\n});\n",
18 | "enabled": true,
19 | "autoExecute": true
20 | },
21 | "cdns": [
22 | "https://cdnjs.cloudflare.com/ajax/libs/qrcodejs/1.0.0/qrcode.min.js"
23 | ],
24 | "createdAt": 1736032004441
25 | }
26 | ],
27 | "codeSnippets": [],
28 | "createdAt": 1736037480022
29 | }
--------------------------------------------------------------------------------
/src/assets/screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IVainqueur/simple-api-client/838adb43d894f973578a946203571ff82cbd02bb/src/assets/screenshot.png
--------------------------------------------------------------------------------
/src/components/ApiClient.tsx:
--------------------------------------------------------------------------------
1 | // legacy file
--------------------------------------------------------------------------------
/src/components/ApiClient/RequestDetails.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { FileText, Code } from 'lucide-react';
3 | import { HttpMethod } from './types';
4 |
5 | interface RequestDetailsProps {
6 | method: HttpMethod;
7 | headers: string;
8 | body: string;
9 | code: string;
10 | onHeadersChange: (headers: string) => void;
11 | onBodyChange: (body: string) => void;
12 | onCodeChange: (code: string) => void;
13 | }
14 |
15 | export function RequestDetails({
16 | method,
17 | headers,
18 | body,
19 | code,
20 | onHeadersChange,
21 | onBodyChange,
22 | onCodeChange,
23 | }: RequestDetailsProps) {
24 | return (
25 |
26 |
27 |
28 |
29 |
Headers
30 |
31 |
37 |
38 | {method !== 'GET' && (
39 |
40 |
41 |
42 |
Request Body
43 |
44 |
50 | )}
51 |
52 |
53 |
54 |
55 |
Transform Code
56 |
57 |
63 |
64 | );
65 | }
--------------------------------------------------------------------------------
/src/components/ApiClient/RequestForm.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Send } from 'lucide-react';
3 | import { HttpMethod } from './types';
4 |
5 | interface RequestFormProps {
6 | url: string;
7 | method: HttpMethod;
8 | onUrlChange: (url: string) => void;
9 | onMethodChange: (method: HttpMethod) => void;
10 | onSubmit: () => void;
11 | }
12 |
13 | export function RequestForm({ url, method, onUrlChange, onMethodChange, onSubmit }: RequestFormProps) {
14 | return (
15 |
16 | onUrlChange(e.target.value)}
20 | placeholder="Enter API URL"
21 | className="flex-1 px-4 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500"
22 | />
23 |
32 |
39 |
40 | );
41 | }
--------------------------------------------------------------------------------
/src/components/ApiClient/ResponseDisplay.tsx:
--------------------------------------------------------------------------------
1 | import { ApiResponse } from './types';
2 |
3 | interface ResponseDisplayProps {
4 | response: ApiResponse | null;
5 | processedResponse: any;
6 | error: string;
7 | }
8 |
9 | export function ResponseDisplay({ response, processedResponse, error }: ResponseDisplayProps) {
10 | return (
11 |
12 | {error && (
13 |
14 | {error}
15 |
16 | )}
17 |
18 | {response && (
19 |
20 |
Response
21 |
22 |
23 | Status: {response.status}
24 |
25 |
26 | {JSON.stringify(response.data, null, 2)}
27 |
28 |
29 |
30 | )}
31 |
32 | {processedResponse && (
33 |
34 |
Processed Output
35 |
36 |
37 | {JSON.stringify(processedResponse, null, 2)}
38 |
39 |
40 |
41 | )}
42 |
43 | );
44 | }
--------------------------------------------------------------------------------
/src/components/ApiClient/components/CdnManager.tsx:
--------------------------------------------------------------------------------
1 | import React, { useState } from 'react';
2 | import { Plus, X } from 'lucide-react';
3 |
4 | interface CdnManagerProps {
5 | cdns: string[];
6 | onCdnChange: (cdns: string[]) => void;
7 | }
8 |
9 | export function CdnManager({ cdns, onCdnChange }: CdnManagerProps) {
10 | const [newCdn, setNewCdn] = useState('');
11 |
12 | const handleAdd = () => {
13 | if (newCdn && !cdns.includes(newCdn)) {
14 | onCdnChange([...cdns, newCdn]);
15 | setNewCdn('');
16 | }
17 | };
18 |
19 | const handleRemove = (cdn: string) => {
20 | onCdnChange(cdns.filter(c => c !== cdn));
21 | };
22 |
23 | return (
24 |
25 |
26 |
setNewCdn(e.target.value)}
30 | placeholder="Enter CDN URL"
31 | className="flex-1 px-3 py-1.5 text-sm border rounded focus:ring-2 focus:ring-blue-500 dark:bg-gray-800 dark:border-gray-700 dark:focus:ring-blue-500 dark:text-white dark:placeholder:text-gray-400 "
32 | />
33 |
39 |
40 |
41 | {cdns.map((cdn, index) => (
42 |
43 |
49 | {cdn}
50 |
51 | ))}
52 |
53 |
54 | );
55 | }
--------------------------------------------------------------------------------
/src/components/ApiClient/components/CodeEditor.tsx:
--------------------------------------------------------------------------------
1 | import { javascript } from '@codemirror/lang-javascript';
2 | import { oneDark } from '@codemirror/theme-one-dark';
3 | import CodeMirror from '@uiw/react-codemirror';
4 | import { Code, Play } from 'lucide-react';
5 | import { CodeSection } from '../types';
6 | import { formatCode } from '../utils/codeFormatter';
7 |
8 | interface CodeEditorProps {
9 | label: string;
10 | value: CodeSection;
11 | onChange: (value: CodeSection) => void;
12 | onExecute?: () => void;
13 | canExecute?: boolean;
14 | onSaveSnippet?: () => void;
15 | }
16 |
17 | export function CodeEditor({
18 | label,
19 | value,
20 | onChange,
21 | onExecute,
22 | canExecute = false,
23 | onSaveSnippet
24 | }: CodeEditorProps) {
25 | const handleFormat = async () => {
26 | try {
27 | const formatted = await formatCode(value.code);
28 | onChange({ ...value, code: formatted });
29 | } catch (error) {
30 | console.error('Failed to format code:', error);
31 | }
32 | };
33 |
34 | return (
35 |
36 |
37 |
38 |
39 |
46 | {onSaveSnippet && (
47 |
53 | )}
54 | {onExecute && (
55 |
67 | )}
68 |
77 | {label === "Post-response Code" && (
78 |
87 | )}
88 |
89 |
90 |
91 | onChange({ ...value, code })}
97 | className="text-sm h-full"
98 | />
99 |
100 |
101 | );
102 | }
--------------------------------------------------------------------------------
/src/components/ApiClient/components/CollapsibleSection.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { ChevronDown, ChevronRight } from 'lucide-react';
3 |
4 | interface CollapsibleSectionProps {
5 | title: string;
6 | isOpen: boolean;
7 | onToggle: () => void;
8 | children: React.ReactNode;
9 | }
10 |
11 | export function CollapsibleSection({ title, isOpen, onToggle, children }: CollapsibleSectionProps) {
12 | return (
13 |
14 |
21 | {isOpen &&
{children}
}
22 |
23 | );
24 | }
--------------------------------------------------------------------------------
/src/components/ApiClient/components/ConsoleOutput.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Terminal } from 'lucide-react';
3 |
4 | interface ConsoleOutputProps {
5 | logs: Array<{
6 | type: 'log' | 'error' | 'warn';
7 | message: string;
8 | timestamp: number;
9 | }>;
10 | }
11 |
12 | export function ConsoleOutput({ logs }: ConsoleOutputProps) {
13 | if (logs.length === 0) {
14 | return null;
15 | }
16 |
17 | return (
18 |
19 |
20 |
21 |
Console Output
22 |
23 |
24 | {logs.map((log, index) => (
25 |
35 | {log.message}
36 |
37 | ))}
38 |
39 |
40 | );
41 | }
--------------------------------------------------------------------------------
/src/components/ApiClient/components/Layout.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Request } from '../types';
3 | import { ResizablePanel } from './ResizablePanel';
4 | import { RequestSidebar } from './RequestSidebar';
5 |
6 | interface LayoutProps {
7 | isDark: boolean;
8 | onThemeToggle: () => void;
9 | requests: Request[];
10 | activeRequestId: string | null;
11 | onRequestSelect: (request: Request) => void;
12 | onNewRequest: () => void;
13 | onDeleteRequest: (id: string) => void;
14 | onSaveSession: () => void;
15 | onImportSession: (e: React.ChangeEvent) => void;
16 | onExportSession: () => void;
17 | onUpdateRequest: (id: string, updates: Partial) => void;
18 | onTryExample: () => void;
19 | children: React.ReactNode;
20 | }
21 |
22 | export function Layout({
23 | isDark,
24 | onThemeToggle,
25 | requests,
26 | activeRequestId,
27 | onRequestSelect,
28 | onNewRequest,
29 | onDeleteRequest,
30 | onSaveSession,
31 | onImportSession,
32 | onExportSession,
33 | onUpdateRequest,
34 | onTryExample,
35 | children
36 | }: LayoutProps) {
37 | return (
38 |
39 |
40 |
41 |
48 |
62 |
63 |
64 |
65 |
66 |
67 |
75 |
76 | {Array.isArray(children) ? children[0] : null}
77 |
78 |
79 |
80 |
88 |
89 | {Array.isArray(children) ? children[1] : null}
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 | );
99 | }
--------------------------------------------------------------------------------
/src/components/ApiClient/components/LoadingSpinner.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Loader2 } from 'lucide-react';
3 |
4 | interface LoadingSpinnerProps {
5 | className?: string;
6 | }
7 |
8 | export function LoadingSpinner({ className = '' }: LoadingSpinnerProps) {
9 | return (
10 |
11 | );
12 | }
--------------------------------------------------------------------------------
/src/components/ApiClient/components/RequestForm.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Send, Trash2 } from 'lucide-react';
3 | import { HttpMethod } from '../types';
4 | import { LoadingSpinner } from './LoadingSpinner';
5 | import { Timer } from './Timer';
6 |
7 | interface RequestFormProps {
8 | url: string;
9 | method: HttpMethod;
10 | onUrlChange: (url: string) => void;
11 | onMethodChange: (method: HttpMethod) => void;
12 | onSubmit: () => void;
13 | onClear: () => void;
14 | isLoading: boolean;
15 | requestStartTime: number;
16 | }
17 |
18 | export function RequestForm({
19 | url,
20 | method,
21 | onUrlChange,
22 | onMethodChange,
23 | onSubmit,
24 | onClear,
25 | isLoading,
26 | requestStartTime
27 | }: RequestFormProps) {
28 | return (
29 |
30 | onUrlChange(e.target.value)}
34 | placeholder="Enter API URL"
35 | className="flex-1 px-4 py-2 border rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 border-gray-300 dark:border-gray-600 focus:ring-2 focus:ring-blue-500 focus:border-blue-500"
36 | disabled={isLoading}
37 | />
38 |
48 |
56 |
64 | {isLoading && requestStartTime > 0 && (
65 |
66 | )}
67 |
68 | );
69 | }
--------------------------------------------------------------------------------
/src/components/ApiClient/components/RequestNameEdit.tsx:
--------------------------------------------------------------------------------
1 | import React, { useState, useRef, useEffect } from 'react';
2 | import { Check, X } from 'lucide-react';
3 |
4 | interface RequestNameEditProps {
5 | name: string;
6 | onSave: (name: string) => void;
7 | onCancel: () => void;
8 | }
9 |
10 | export function RequestNameEdit({ name, onSave, onCancel }: RequestNameEditProps) {
11 | const [value, setValue] = useState(name);
12 | const inputRef = useRef(null);
13 |
14 | useEffect(() => {
15 | inputRef.current?.focus();
16 | }, []);
17 |
18 | const handleSubmit = (e: React.FormEvent) => {
19 | e.preventDefault();
20 | if (value.trim()) {
21 | onSave(value.trim());
22 | }
23 | };
24 |
25 | return (
26 |
49 | );
50 | }
--------------------------------------------------------------------------------
/src/components/ApiClient/components/RequestPanel.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { RequestForm } from './RequestForm';
3 | import { Tabs } from './Tabs';
4 | import { CodeEditor } from './CodeEditor';
5 | import { CdnManager } from './CdnManager';
6 | import { SnippetManager } from './SnippetManager';
7 | import { HttpMethod, CodeSection } from '../types';
8 |
9 | interface RequestPanelProps {
10 | url: string;
11 | method: HttpMethod;
12 | headers: string;
13 | body: string;
14 | cdns: string[];
15 | preRequestCode: CodeSection;
16 | postResponseCode: CodeSection;
17 | isLoading: boolean;
18 | requestStartTime: number;
19 | activeTab: string;
20 | onUrlChange: (url: string) => void;
21 | onMethodChange: (method: HttpMethod) => void;
22 | onHeadersChange: (headers: string) => void;
23 | onBodyChange: (body: string) => void;
24 | onCdnChange: (cdns: string[]) => void;
25 | onPreRequestCodeChange: (code: CodeSection) => void;
26 | onPostResponseCodeChange: (code: CodeSection) => void;
27 | onTabChange: (tab: string) => void;
28 | onSubmit: () => void;
29 | onClear: () => void;
30 | onLoadSnippet: (snippet: any) => void;
31 | getCurrentState: () => any;
32 | onExecutePreRequest?: () => void;
33 | onExecutePostResponse?: () => void;
34 | }
35 |
36 | const tabs = [
37 | { id: 'headers', label: 'Headers' },
38 | { id: 'body', label: 'Body' },
39 | { id: 'pre-request', label: 'Pre-request' },
40 | { id: 'post-response', label: 'Post-response' },
41 | { id: 'cdns', label: 'CDNs' },
42 | { id: 'snippets', label: 'Snippets' },
43 | ];
44 |
45 | export function RequestPanel(props: RequestPanelProps) {
46 | const renderTabContent = () => {
47 | switch (props.activeTab) {
48 | case 'headers':
49 | return (
50 | props.onHeadersChange(v.code)}
54 | />
55 | );
56 | case 'body':
57 | return props.method !== 'GET' ? (
58 | props.onBodyChange(v.code)}
62 | />
63 | ) : (
64 |
65 | Body not available for GET requests
66 |
67 | );
68 | case 'pre-request':
69 | return (
70 |
77 | );
78 | case 'post-response':
79 | return (
80 |
87 | );
88 | case 'cdns':
89 | return (
90 |
94 | );
95 | case 'snippets':
96 | return (
97 |
101 | );
102 | default:
103 | return null;
104 | }
105 | };
106 |
107 | return (
108 |
109 |
119 |
120 |
121 |
126 |
127 | {renderTabContent()}
128 |
129 |
130 |
131 | );
132 | }
--------------------------------------------------------------------------------
/src/components/ApiClient/components/RequestSidebar.tsx:
--------------------------------------------------------------------------------
1 | import React, { useState } from "react";
2 | import {
3 | Plus,
4 | Folder,
5 | Save,
6 | Upload,
7 | Download,
8 | Edit2,
9 | Trash2,
10 | Sparkles
11 | } from "lucide-react";
12 | import { Request } from "../types";
13 | import { RequestNameEdit } from "./RequestNameEdit";
14 | import { ThemeToggle } from "./ThemeToggle";
15 |
16 | interface RequestSidebarProps {
17 | isDark: boolean;
18 | onThemeToggle: () => void;
19 | requests: Request[];
20 | activeRequestId: string | null;
21 | onRequestSelect: (request: Request) => void;
22 | onNewRequest: () => void;
23 | onDeleteRequest: (id: string) => void;
24 | onUpdateRequest: (id: string, updates: Partial) => void;
25 | onSaveSession: () => void;
26 | onImportSession: (e: React.ChangeEvent) => void;
27 | onExportSession: () => void;
28 | onTryExample: () => void;
29 | }
30 |
31 | export function RequestSidebar({
32 | isDark,
33 | onThemeToggle,
34 | requests,
35 | activeRequestId,
36 | onRequestSelect,
37 | onNewRequest,
38 | onDeleteRequest,
39 | onUpdateRequest,
40 | onSaveSession,
41 | onImportSession,
42 | onExportSession,
43 | onTryExample,
44 | }: RequestSidebarProps) {
45 | const [editingId, setEditingId] = useState(null);
46 |
47 | return (
48 |
49 |
50 |
51 |
52 | Requests
53 |
54 |
55 |
56 |
63 |
64 |
65 |
66 | {requests.map((request) => (
67 |
onRequestSelect(request)}
75 | >
76 |
77 |
78 | {editingId === request.id ? (
79 |
{
82 | onUpdateRequest(request.id, { name });
83 | setEditingId(null);
84 | }}
85 | onCancel={() => setEditingId(null)}
86 | />
87 | ) : (
88 | <>
89 |
90 |
91 | {request.name}
92 |
93 |
94 |
103 |
112 |
113 | >
114 | )}
115 |
116 |
117 | {request.method} {request.url || "No URL"}
118 |
119 |
120 |
121 | ))}
122 |
123 |
124 |
125 |
132 |
139 |
140 |
152 |
159 |
160 |
161 | {/* Creator tag */}
162 |
173 |
174 | );
175 | }
176 |
--------------------------------------------------------------------------------
/src/components/ApiClient/components/ResizablePanel.tsx:
--------------------------------------------------------------------------------
1 | import React, { useState, useRef, useEffect } from 'react';
2 | import { ChevronLeft, ChevronRight } from 'lucide-react';
3 |
4 | interface ResizablePanelProps {
5 | defaultWidth: number;
6 | minWidth: number;
7 | maxWidth: number;
8 | position: 'left' | 'right';
9 | name: string;
10 | fillSpace?: boolean;
11 | children: React.ReactNode;
12 | }
13 |
14 | export function ResizablePanel({
15 | defaultWidth,
16 | minWidth,
17 | maxWidth,
18 | position,
19 | name,
20 | fillSpace = false,
21 | children
22 | }: ResizablePanelProps) {
23 | const [width, setWidth] = useState(defaultWidth);
24 | const [isCollapsed, setIsCollapsed] = useState(false);
25 | const [isDragging, setIsDragging] = useState(false);
26 | const [isHovered, setIsHovered] = useState(false);
27 | const dragStartX = useRef(0);
28 | const dragStartWidth = useRef(0);
29 | const panelRef = useRef(null);
30 |
31 | const handleMouseDown = (e: React.MouseEvent) => {
32 | setIsDragging(true);
33 | dragStartX.current = e.clientX;
34 | dragStartWidth.current = width;
35 | e.preventDefault();
36 | };
37 |
38 | useEffect(() => {
39 | const handleMouseMove = (e: MouseEvent) => {
40 | if (!isDragging) return;
41 |
42 | const delta = position === 'left'
43 | ? e.clientX - dragStartX.current
44 | : dragStartX.current - e.clientX;
45 |
46 | const newWidth = Math.min(Math.max(dragStartWidth.current + delta, minWidth), maxWidth);
47 | setWidth(newWidth);
48 | };
49 |
50 | const handleMouseUp = () => {
51 | setIsDragging(false);
52 | };
53 |
54 | if (isDragging) {
55 | document.addEventListener('mousemove', handleMouseMove);
56 | document.addEventListener('mouseup', handleMouseUp);
57 | }
58 |
59 | return () => {
60 | document.removeEventListener('mousemove', handleMouseMove);
61 | document.removeEventListener('mouseup', handleMouseUp);
62 | };
63 | }, [isDragging, minWidth, maxWidth, position]);
64 |
65 | const toggleCollapse = () => {
66 | setIsCollapsed(!isCollapsed);
67 | };
68 |
69 | return (
70 | setIsHovered(true)}
75 | onMouseLeave={() => setIsHovered(false)}
76 | >
77 | {isCollapsed ? (
78 |
79 |
83 | {name}
84 |
85 |
86 | ) : (
87 |
88 | {children}
89 |
90 | )}
91 |
92 |
97 |
103 |
104 |
113 |
114 |
115 | );
116 | }
--------------------------------------------------------------------------------
/src/components/ApiClient/components/ResponseDetails.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { ChevronDown, ChevronRight, Clock } from 'lucide-react';
3 | import { ApiResponse } from '../types';
4 |
5 | interface ResponseDetailsProps {
6 | response: ApiResponse;
7 | duration: number;
8 | }
9 |
10 | export function ResponseDetails({ response, duration }: ResponseDetailsProps) {
11 | const [isOpen, setIsOpen] = React.useState(true);
12 |
13 | return (
14 |
15 |
31 |
32 | {isOpen && (
33 |
34 |
35 |
Headers
36 |
37 | {JSON.stringify(response.headers, null, 2)}
38 |
39 |
40 |
41 |
Body
42 |
43 | {JSON.stringify(response.data, null, 2)}
44 |
45 |
46 |
47 | )}
48 |
49 | );
50 | }
--------------------------------------------------------------------------------
/src/components/ApiClient/components/ResponsePanel.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { ResponseDetails } from './ResponseDetails';
3 | import { ConsoleOutput } from './ConsoleOutput';
4 | import { ApiResponse } from '../types';
5 |
6 | interface ResponsePanelProps {
7 | response: ApiResponse | null;
8 | error: string;
9 | processedOutput: string;
10 | consoleLogs: Array<{ type: 'log' | 'error' | 'warn'; message: string; timestamp: number }>;
11 | requestStartTime: number;
12 | }
13 |
14 | export function ResponsePanel({
15 | response,
16 | error,
17 | processedOutput,
18 | consoleLogs,
19 | requestStartTime
20 | }: ResponsePanelProps) {
21 | if (!error && !response && !processedOutput && consoleLogs.length === 0) {
22 | return (
23 |
24 | Send a request to see the response
25 |
26 | );
27 | }
28 |
29 | return (
30 |
31 | {error && (
32 |
33 | {error}
34 |
35 | )}
36 |
37 | {response && (
38 |
42 | )}
43 |
44 | {processedOutput && (
45 |
46 |
47 | Processed Output
48 |
49 |
53 |
54 | )}
55 |
56 |
57 |
58 | );
59 | }
--------------------------------------------------------------------------------
/src/components/ApiClient/components/SnippetManager.tsx:
--------------------------------------------------------------------------------
1 | import React, { useState } from 'react';
2 | import { Save, Trash2, Clock, Download } from 'lucide-react';
3 | import { Snippet, HttpMethod, CodeSection } from '../types';
4 | import { saveSnippet, getSnippets, deleteSnippet } from '../utils/snippetStorage';
5 |
6 | interface SnippetManagerProps {
7 | onLoad: (snippet: Snippet) => void;
8 | getCurrentState: () => {
9 | url: string;
10 | method: HttpMethod;
11 | headers: string;
12 | body: string;
13 | preRequestCode: CodeSection;
14 | postResponseCode: CodeSection;
15 | cdns: string[];
16 | };
17 | }
18 |
19 | export function SnippetManager({ onLoad, getCurrentState }: SnippetManagerProps) {
20 | const [snippets, setSnippets] = useState(() => getSnippets());
21 | const [newSnippetName, setNewSnippetName] = useState('');
22 | const [showSaveDialog, setShowSaveDialog] = useState(false);
23 |
24 | const handleSave = () => {
25 | if (!newSnippetName.trim()) return;
26 |
27 | const state = getCurrentState();
28 | const snippet: Snippet = {
29 | id: crypto.randomUUID(),
30 | name: newSnippetName,
31 | ...state,
32 | createdAt: Date.now()
33 | };
34 |
35 | saveSnippet(snippet);
36 | setSnippets(getSnippets());
37 | setNewSnippetName('');
38 | setShowSaveDialog(false);
39 | };
40 |
41 | const handleDelete = (id: string) => {
42 | deleteSnippet(id);
43 | setSnippets(getSnippets());
44 | };
45 |
46 | return (
47 |
48 |
49 |
56 |
57 | {showSaveDialog && (
58 |
59 | setNewSnippetName(e.target.value)}
63 | placeholder="Enter snippet name"
64 | className="flex-1 px-3 py-1.5 text-sm border rounded focus:ring-2 focus:ring-blue-500"
65 | />
66 |
72 |
78 |
79 | )}
80 |
81 |
82 |
83 | {snippets.map((snippet) => (
84 |
85 |
86 |
{snippet.name}
87 |
88 |
95 |
102 |
103 |
104 |
105 | {snippet.method} {snippet.url}
106 |
107 |
108 | {new Date(snippet.createdAt).toLocaleDateString()}
109 |
110 |
111 |
112 | ))}
113 | {snippets.length === 0 && (
114 |
115 | No saved snippets yet
116 |
117 | )}
118 |
119 |
120 | );
121 | }
--------------------------------------------------------------------------------
/src/components/ApiClient/components/Tabs.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | interface Tab {
4 | id: string;
5 | label: string;
6 | }
7 |
8 | interface TabsProps {
9 | tabs: Tab[];
10 | activeTab: string;
11 | onTabChange: (tabId: string) => void;
12 | }
13 |
14 | export function Tabs({ tabs, activeTab, onTabChange }: TabsProps) {
15 | return (
16 |
17 | {tabs.map((tab) => (
18 |
29 | ))}
30 |
31 | );
32 | }
--------------------------------------------------------------------------------
/src/components/ApiClient/components/ThemeToggle.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Sun, Moon } from 'lucide-react';
3 |
4 | interface ThemeToggleProps {
5 | isDark: boolean;
6 | onToggle: () => void;
7 | }
8 |
9 | export function ThemeToggle({ isDark, onToggle }: ThemeToggleProps) {
10 | return (
11 |
18 | );
19 | }
--------------------------------------------------------------------------------
/src/components/ApiClient/components/Timer.tsx:
--------------------------------------------------------------------------------
1 | import React, { useState, useEffect } from 'react';
2 | import { Clock } from 'lucide-react';
3 |
4 | interface TimerProps {
5 | startTime: number;
6 | }
7 |
8 | export function Timer({ startTime }: TimerProps) {
9 | const [elapsed, setElapsed] = useState(0);
10 |
11 | useEffect(() => {
12 | const interval = setInterval(() => {
13 | setElapsed(Date.now() - startTime);
14 | }, 100);
15 |
16 | return () => clearInterval(interval);
17 | }, [startTime]);
18 |
19 | return (
20 |
21 |
22 | {(elapsed / 1000).toFixed(1)}s
23 |
24 | );
25 | }
--------------------------------------------------------------------------------
/src/components/ApiClient/hooks/useApiClient.ts:
--------------------------------------------------------------------------------
1 | import { useCallback, useEffect, useState } from "react";
2 | import axios from "axios";
3 | import { Request, ApiResponse } from "../types";
4 | import { runInSandbox } from "../utils/sandbox";
5 |
6 | export function useApiClient(activeRequest: Request | undefined) {
7 | const [response, setResponse] = useState(null);
8 | const [error, setError] = useState("");
9 | const [isLoading, setIsLoading] = useState(false);
10 | const [requestStartTime, setRequestStartTime] = useState(0);
11 | const [processedOutput, setProcessedOutput] = useState("");
12 | const [consoleLogs, setConsoleLogs] = useState<
13 | Array<{
14 | type: "log" | "error" | "warn";
15 | message: string;
16 | timestamp: number;
17 | }>
18 | >([]);
19 |
20 | const executePreRequestCode = useCallback(async () => {
21 | if (!activeRequest?.preRequestCode.enabled) return;
22 |
23 | try {
24 | const options = {
25 | method: activeRequest.method.toLowerCase(),
26 | headers: JSON.parse(activeRequest.headers),
27 | data:
28 | activeRequest.method !== "GET"
29 | ? JSON.parse(activeRequest.body)
30 | : undefined,
31 | };
32 |
33 | const { result: modifiedOptions, logs } = await runInSandbox(
34 | activeRequest.preRequestCode.code,
35 | { options },
36 | activeRequest.cdns
37 | );
38 |
39 | setConsoleLogs(logs);
40 | setError("");
41 |
42 | return modifiedOptions;
43 | } catch (error: any) {
44 | setError(`Pre-request code error: ${error.message}`);
45 | setConsoleLogs(error.logs || []);
46 | throw error;
47 | }
48 | }, [
49 | activeRequest?.preRequestCode.enabled,
50 | activeRequest?.preRequestCode.code,
51 | activeRequest?.cdns,
52 | activeRequest?.body,
53 | activeRequest?.headers,
54 | activeRequest?.method,
55 | ]);
56 |
57 | const executePostResponseCode = useCallback(async () => {
58 | console.log({
59 | response: response,
60 | "activeRequest?.postResponseCode.enabled":
61 | activeRequest?.postResponseCode.enabled,
62 | });
63 | if (!response || !activeRequest?.postResponseCode.enabled) return;
64 |
65 | try {
66 | const { result, logs } = await runInSandbox(
67 | activeRequest.postResponseCode.code,
68 | response,
69 | activeRequest.cdns
70 | );
71 | setProcessedOutput(result);
72 | setConsoleLogs(logs);
73 | setError("");
74 | } catch (err: any) {
75 | setError(`Post-response code error: ${err.message}`);
76 | setConsoleLogs(err.logs || []);
77 | }
78 | }, [
79 | response,
80 | activeRequest?.postResponseCode.enabled,
81 | activeRequest?.cdns,
82 | activeRequest?.postResponseCode.code,
83 | ]);
84 |
85 | const handleRequest = async () => {
86 | if (!activeRequest) return;
87 |
88 | console.log({
89 | "activeRequest.postResponseCode.autoExecute":
90 | activeRequest.postResponseCode.autoExecute,
91 | "activeRequest.postResponseCode.enabled":
92 | activeRequest.postResponseCode.enabled,
93 | });
94 |
95 | try {
96 | setIsLoading(true);
97 | setRequestStartTime(Date.now());
98 | setError("");
99 | setProcessedOutput("");
100 | setConsoleLogs([]);
101 |
102 | let options = {
103 | method: activeRequest.method.toLowerCase(),
104 | headers: JSON.parse(activeRequest.headers),
105 | data:
106 | activeRequest.method !== "GET"
107 | ? JSON.parse(activeRequest.body)
108 | : undefined,
109 | };
110 |
111 | if (activeRequest.preRequestCode.enabled) {
112 | try {
113 | const modifiedOptions = await executePreRequestCode();
114 | if (modifiedOptions && typeof modifiedOptions === "object") {
115 | options = modifiedOptions as typeof options;
116 | }
117 | } catch {
118 | return;
119 | }
120 | }
121 |
122 | const res = await axios({ url: activeRequest.url, ...options });
123 | const apiResponse = {
124 | data: res.data,
125 | status: res.status,
126 | headers: res.headers,
127 | };
128 |
129 | setResponse(apiResponse);
130 | } catch (err: any) {
131 | setError(`Request failed: ${err.message}`);
132 | } finally {
133 | setIsLoading(false);
134 | }
135 | };
136 |
137 | const handleClear = () => {
138 | setResponse(null);
139 | setProcessedOutput("");
140 | setError("");
141 | setConsoleLogs([]);
142 | };
143 |
144 | useEffect(() => {
145 | if (
146 | response &&
147 | activeRequest?.postResponseCode.enabled &&
148 | activeRequest?.postResponseCode.autoExecute
149 | ) {
150 | executePostResponseCode();
151 | }
152 | }, [
153 | response,
154 | activeRequest?.postResponseCode.enabled,
155 | activeRequest?.postResponseCode.autoExecute,
156 | executePostResponseCode,
157 | ]);
158 |
159 | return {
160 | response,
161 | error,
162 | isLoading,
163 | requestStartTime,
164 | processedOutput,
165 | consoleLogs,
166 | handleRequest,
167 | handleClear,
168 | executePreRequestCode,
169 | executePostResponseCode,
170 | };
171 | }
172 |
--------------------------------------------------------------------------------
/src/components/ApiClient/hooks/useCollapsible.ts:
--------------------------------------------------------------------------------
1 | import { useState } from 'react';
2 |
3 | export function useCollapsible(defaultOpen = true) {
4 | const [isOpen, setIsOpen] = useState(defaultOpen);
5 | return {
6 | isOpen,
7 | toggle: () => setIsOpen(prev => !prev),
8 | };
9 | }
--------------------------------------------------------------------------------
/src/components/ApiClient/hooks/useRequestManagement.ts:
--------------------------------------------------------------------------------
1 | import { useState, useEffect } from 'react';
2 | import { Request, Session } from '../types';
3 | import {
4 | saveRequest,
5 | getRequests,
6 | deleteRequest,
7 | saveSession,
8 | exportSession,
9 | importSession
10 | } from '../utils/storage';
11 | import exampleData from '../../../assets/example.json';
12 |
13 | const createDefaultRequest = (): Request => ({
14 | id: crypto.randomUUID(),
15 | name: 'New Request',
16 | url: '',
17 | method: 'GET',
18 | headers: '{\n "Content-Type": "application/json"\n}',
19 | body: '{\n\n}',
20 | preRequestCode: {
21 | code: '// Modify request options here\nreturn options;',
22 | enabled: false
23 | },
24 | postResponseCode: {
25 | code: '// Transform response here\nreturn response.data;',
26 | enabled: false,
27 | autoExecute: false
28 | },
29 | cdns: [],
30 | createdAt: Date.now()
31 | });
32 |
33 | export function useRequestManagement() {
34 | const [requests, setRequests] = useState([]);
35 | const [activeRequestId, setActiveRequestId] = useState(null);
36 |
37 | useEffect(() => {
38 | const savedRequests = getRequests();
39 | setRequests(savedRequests);
40 | if (savedRequests.length > 0) {
41 | setActiveRequestId(savedRequests[0].id);
42 | }
43 | }, []);
44 |
45 | const handleNewRequest = () => {
46 | const newRequest = createDefaultRequest();
47 | saveRequest(newRequest);
48 | setRequests([...requests, newRequest]);
49 | setActiveRequestId(newRequest.id);
50 | };
51 |
52 | const handleDeleteRequest = (id: string) => {
53 | deleteRequest(id);
54 | setRequests(requests.filter(r => r.id !== id));
55 | if (activeRequestId === id) {
56 | setActiveRequestId(requests[0]?.id ?? null);
57 | }
58 | };
59 |
60 | const handleUpdateRequest = (id: string, updates: Partial) => {
61 | const request = requests.find(r => r.id === id);
62 | if (!request) return;
63 |
64 | const updatedRequest = { ...request, ...updates };
65 | saveRequest(updatedRequest);
66 | setRequests(requests.map(r => r.id === id ? updatedRequest : r));
67 | };
68 |
69 | const handleRequestSelect = (request: Request) => {
70 | setActiveRequestId(request.id);
71 | };
72 |
73 | const handleSaveSession = () => {
74 | const session: Session = {
75 | id: crypto.randomUUID(),
76 | name: `Session ${new Date().toLocaleString()}`,
77 | requests,
78 | codeSnippets: [],
79 | createdAt: Date.now()
80 | };
81 | saveSession(session);
82 | };
83 |
84 | const handleExportSession = () => {
85 | const session: Session = {
86 | id: crypto.randomUUID(),
87 | name: `Exported Session ${new Date().toLocaleString()}`,
88 | requests,
89 | codeSnippets: [],
90 | createdAt: Date.now()
91 | };
92 |
93 | const blob = new Blob([exportSession(session)], { type: 'application/json' });
94 | const url = URL.createObjectURL(blob);
95 | const a = document.createElement('a');
96 | a.href = url;
97 | a.download = `api-client-session-${Date.now()}.json`;
98 | a.click();
99 | URL.revokeObjectURL(url);
100 | };
101 |
102 | const handleImportSession = async (e: React.ChangeEvent) => {
103 | const file = e.target.files?.[0];
104 | if (!file) return;
105 |
106 | try {
107 | const text = await file.text();
108 | const session = importSession(text);
109 | setRequests(session.requests);
110 | if (session.requests.length > 0) {
111 | setActiveRequestId(session.requests[0].id);
112 | }
113 | } catch (err) {
114 | console.error('Failed to import session:', err);
115 | }
116 | };
117 |
118 | const handleTryExample = () => {
119 | const exampleRequests = exampleData.requests as Request[];
120 | exampleRequests.forEach(request => {
121 | saveRequest(request);
122 | });
123 | setRequests([...requests, ...exampleRequests]);
124 | if (!activeRequestId && exampleRequests.length > 0) {
125 | setActiveRequestId(exampleRequests[0].id);
126 | }
127 | };
128 |
129 | return {
130 | requests,
131 | activeRequestId,
132 | handleNewRequest,
133 | handleDeleteRequest,
134 | handleUpdateRequest,
135 | handleRequestSelect,
136 | handleSaveSession,
137 | handleImportSession,
138 | handleExportSession,
139 | handleTryExample
140 | };
141 | }
--------------------------------------------------------------------------------
/src/components/ApiClient/hooks/useTheme.ts:
--------------------------------------------------------------------------------
1 | import { useState, useEffect } from 'react';
2 | import { saveTheme, getTheme } from '../utils/storage';
3 |
4 | export function useTheme() {
5 | const [isDark, setIsDark] = useState(() => getTheme());
6 |
7 | useEffect(() => {
8 | document.documentElement.classList.toggle('dark', isDark);
9 | saveTheme(isDark);
10 | }, [isDark]);
11 |
12 | const toggleTheme = () => setIsDark(!isDark);
13 |
14 | return { isDark, toggleTheme };
15 | }
--------------------------------------------------------------------------------
/src/components/ApiClient/index.tsx:
--------------------------------------------------------------------------------
1 | import { useState } from 'react';
2 | import { Layout } from './components/Layout';
3 | import { RequestPanel } from './components/RequestPanel';
4 | import { ResponsePanel } from './components/ResponsePanel';
5 | import { useApiClient } from './hooks/useApiClient';
6 | import { useRequestManagement } from './hooks/useRequestManagement';
7 | import { useTheme } from './hooks/useTheme';
8 |
9 | export default function ApiClient() {
10 | const [activeTab, setActiveTab] = useState('headers');
11 | const { isDark, toggleTheme } = useTheme();
12 |
13 | const {
14 | requests,
15 | activeRequestId,
16 | handleNewRequest,
17 | handleDeleteRequest,
18 | handleUpdateRequest,
19 | handleRequestSelect,
20 | handleSaveSession,
21 | handleImportSession,
22 | handleExportSession,
23 | handleTryExample
24 | } = useRequestManagement();
25 |
26 | const {
27 | response,
28 | error,
29 | isLoading,
30 | requestStartTime,
31 | processedOutput,
32 | consoleLogs,
33 | handleRequest,
34 | handleClear,
35 | executePreRequestCode,
36 | executePostResponseCode
37 | } = useApiClient(requests.find(r => r.id === activeRequestId));
38 |
39 | if (!requests.length) {
40 | return (
41 |
55 |
56 | Create a new request to get started
57 |
58 |
59 | );
60 | }
61 |
62 | const activeRequest = requests.find(r => r.id === activeRequestId);
63 | if (!activeRequest) return null;
64 |
65 | return (
66 |
80 | handleUpdateRequest(activeRequest.id, { url })}
92 | onMethodChange={(method) => handleUpdateRequest(activeRequest.id, { method })}
93 | onHeadersChange={(headers) => handleUpdateRequest(activeRequest.id, { headers })}
94 | onBodyChange={(body) => handleUpdateRequest(activeRequest.id, { body })}
95 | onCdnChange={(cdns) => handleUpdateRequest(activeRequest.id, { cdns })}
96 | onPreRequestCodeChange={(code) => handleUpdateRequest(activeRequest.id, { preRequestCode: code })}
97 | onPostResponseCodeChange={(code) => handleUpdateRequest(activeRequest.id, { postResponseCode: code })}
98 | onTabChange={setActiveTab}
99 | onSubmit={handleRequest}
100 | onClear={handleClear}
101 | onExecutePreRequest={executePreRequestCode}
102 | onExecutePostResponse={executePostResponseCode}
103 | onLoadSnippet={(snippet) => {
104 | handleUpdateRequest(activeRequest.id, snippet);
105 | }}
106 | getCurrentState={() => activeRequest}
107 | />
108 |
115 |
116 | );
117 | }
--------------------------------------------------------------------------------
/src/components/ApiClient/types.ts:
--------------------------------------------------------------------------------
1 | export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
2 |
3 | export interface ApiResponse {
4 | data: any;
5 | status: number;
6 | headers: any;
7 | }
8 |
9 | export interface CodeSection {
10 | code: string;
11 | enabled: boolean;
12 | autoExecute?: boolean;
13 | }
14 |
15 | export interface CodeSnippet {
16 | id: string;
17 | name: string;
18 | code: string;
19 | type: 'pre-request' | 'post-response';
20 | createdAt: number;
21 | }
22 |
23 | export interface Request {
24 | id: string;
25 | name: string;
26 | url: string;
27 | method: HttpMethod;
28 | headers: string;
29 | body: string;
30 | preRequestCode: CodeSection;
31 | postResponseCode: CodeSection;
32 | cdns: string[];
33 | createdAt: number;
34 | }
35 |
36 | export interface Session {
37 | id: string;
38 | name: string;
39 | requests: Request[];
40 | codeSnippets: CodeSnippet[];
41 | createdAt: number;
42 | }
--------------------------------------------------------------------------------
/src/components/ApiClient/utils/codeFormatter.ts:
--------------------------------------------------------------------------------
1 | import * as prettier from "prettier/standalone";
2 | import babelPlugin from "prettier/plugins/babel";
3 | import estreePlugin from "prettier/plugins/estree";
4 | import htmlPlugin from "prettier/plugins/html";
5 | import typescriptPlugin from "prettier/plugins/typescript";
6 |
7 | export async function formatCode(code: string): Promise {
8 | try {
9 | return await prettier.format(code, {
10 | parser: "babel",
11 | plugins: [babelPlugin, estreePlugin, htmlPlugin, typescriptPlugin],
12 | semi: true,
13 | singleQuote: true,
14 | trailingComma: 'es5',
15 | });
16 | } catch (error) {
17 | console.error("Failed to format code:", error);
18 | return code;
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/components/ApiClient/utils/sandbox.ts:
--------------------------------------------------------------------------------
1 | export function createSandbox(cdns: string[] = []): HTMLIFrameElement {
2 | const iframe = document.createElement('iframe');
3 | iframe.setAttribute('sandbox', 'allow-scripts');
4 | iframe.style.display = 'none';
5 |
6 | const cdnScripts = cdns.map(cdn => ``).join('\n');
7 |
8 | const sandboxContent = `
9 |
10 |
11 |
12 |
13 | ${cdnScripts}
14 |
18 |
19 |
20 |
21 |
78 |
79 |
80 | `;
81 |
82 | iframe.srcdoc = sandboxContent;
83 | return iframe;
84 | }
85 |
86 | export function runInSandbox(code: string, response: any, cdns: string[] = []): Promise<{ result: string; logs: any[] }> {
87 | return new Promise((resolve, reject) => {
88 | const iframe = createSandbox(cdns);
89 | document.body.appendChild(iframe);
90 |
91 | const handleMessage = (event: MessageEvent) => {
92 | const { type, success, result, error, logs } = event.data;
93 | if (type === 'result') {
94 | window.removeEventListener('message', handleMessage);
95 | document.body.removeChild(iframe);
96 |
97 | if (success) {
98 | resolve({ result, logs });
99 | } else {
100 | reject({ error, logs });
101 | }
102 | }
103 | };
104 |
105 | window.addEventListener('message', handleMessage);
106 |
107 | iframe.onload = () => {
108 | iframe.contentWindow?.postMessage({ code, response }, '*');
109 | };
110 | });
111 | }
--------------------------------------------------------------------------------
/src/components/ApiClient/utils/snippetStorage.ts:
--------------------------------------------------------------------------------
1 | import { Snippet } from '../types';
2 |
3 | const STORAGE_KEY = 'api-client-snippets';
4 |
5 | export function saveSnippet(snippet: Snippet): void {
6 | const snippets = getSnippets();
7 | snippets.push(snippet);
8 | localStorage.setItem(STORAGE_KEY, JSON.stringify(snippets));
9 | }
10 |
11 | export function getSnippets(): Snippet[] {
12 | const stored = localStorage.getItem(STORAGE_KEY);
13 | return stored ? JSON.parse(stored) : [];
14 | }
15 |
16 | export function deleteSnippet(id: string): void {
17 | const snippets = getSnippets();
18 | const filtered = snippets.filter(s => s.id !== id);
19 | localStorage.setItem(STORAGE_KEY, JSON.stringify(filtered));
20 | }
21 |
22 | export function loadSnippet(id: string): Snippet | null {
23 | const snippets = getSnippets();
24 | return snippets.find(s => s.id === id) || null;
25 | }
--------------------------------------------------------------------------------
/src/components/ApiClient/utils/storage.ts:
--------------------------------------------------------------------------------
1 | import { Request, CodeSnippet, Session } from '../types';
2 |
3 | const REQUESTS_KEY = 'api-client-requests';
4 | const SNIPPETS_KEY = 'api-client-snippets';
5 | const SESSIONS_KEY = 'api-client-sessions';
6 | const THEME_KEY = 'api-client-theme';
7 |
8 | // Request Storage
9 | export function saveRequest(request: Request): void {
10 | const requests = getRequests();
11 | const index = requests.findIndex(r => r.id === request.id);
12 |
13 | if (index >= 0) {
14 | requests[index] = request;
15 | } else {
16 | requests.push(request);
17 | }
18 |
19 | localStorage.setItem(REQUESTS_KEY, JSON.stringify(requests));
20 | }
21 |
22 | export function getRequests(): Request[] {
23 | const stored = localStorage.getItem(REQUESTS_KEY);
24 | return stored ? JSON.parse(stored) : [];
25 | }
26 |
27 | export function deleteRequest(id: string): void {
28 | const requests = getRequests().filter(r => r.id !== id);
29 | localStorage.setItem(REQUESTS_KEY, JSON.stringify(requests));
30 | }
31 |
32 | // Code Snippet Storage
33 | export function saveCodeSnippet(snippet: CodeSnippet): void {
34 | const snippets = getCodeSnippets();
35 | snippets.push(snippet);
36 | localStorage.setItem(SNIPPETS_KEY, JSON.stringify(snippets));
37 | }
38 |
39 | export function getCodeSnippets(): CodeSnippet[] {
40 | const stored = localStorage.getItem(SNIPPETS_KEY);
41 | return stored ? JSON.parse(stored) : [];
42 | }
43 |
44 | export function deleteCodeSnippet(id: string): void {
45 | const snippets = getCodeSnippets().filter(s => s.id !== id);
46 | localStorage.setItem(SNIPPETS_KEY, JSON.stringify(snippets));
47 | }
48 |
49 | // Session Storage
50 | export function saveSession(session: Session): void {
51 | const sessions = getSessions();
52 | const index = sessions.findIndex(s => s.id === session.id);
53 |
54 | if (index >= 0) {
55 | sessions[index] = session;
56 | } else {
57 | sessions.push(session);
58 | }
59 |
60 | localStorage.setItem(SESSIONS_KEY, JSON.stringify(sessions));
61 | }
62 |
63 | export function getSessions(): Session[] {
64 | const stored = localStorage.getItem(SESSIONS_KEY);
65 | return stored ? JSON.parse(stored) : [];
66 | }
67 |
68 | export function deleteSession(id: string): void {
69 | const sessions = getSessions().filter(s => s.id !== id);
70 | localStorage.setItem(SESSIONS_KEY, JSON.stringify(sessions));
71 | }
72 |
73 | export function exportSession(session: Session): string {
74 | return JSON.stringify(session, null, 2);
75 | }
76 |
77 | export function importSession(data: string): Session {
78 | return JSON.parse(data);
79 | }
80 |
81 | // Theme Storage
82 | export function saveTheme(isDark: boolean): void {
83 | localStorage.setItem(THEME_KEY, JSON.stringify(isDark));
84 | }
85 |
86 | export function getTheme(): boolean {
87 | const stored = localStorage.getItem(THEME_KEY);
88 | return stored ? JSON.parse(stored) : false;
89 | }
--------------------------------------------------------------------------------
/src/index.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
--------------------------------------------------------------------------------
/src/main.tsx:
--------------------------------------------------------------------------------
1 | import { StrictMode } from 'react';
2 | import { createRoot } from 'react-dom/client';
3 | import App from './App.tsx';
4 | import './index.css';
5 |
6 | createRoot(document.getElementById('root')!).render(
7 |
8 |
9 |
10 | );
11 |
--------------------------------------------------------------------------------
/src/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
--------------------------------------------------------------------------------
/tailwind.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | export default {
3 | content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'],
4 | darkMode: 'class',
5 | theme: {
6 | extend: {},
7 | },
8 | plugins: [],
9 | };
--------------------------------------------------------------------------------
/tsconfig.app.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2020",
4 | "useDefineForClassFields": true,
5 | "lib": ["ES2020", "DOM", "DOM.Iterable"],
6 | "module": "ESNext",
7 | "skipLibCheck": true,
8 |
9 | /* Bundler mode */
10 | "moduleResolution": "bundler",
11 | "allowImportingTsExtensions": true,
12 | "isolatedModules": true,
13 | "moduleDetection": "force",
14 | "noEmit": true,
15 | "jsx": "react-jsx",
16 |
17 | /* Linting */
18 | "strict": true,
19 | "noUnusedLocals": true,
20 | "noUnusedParameters": true,
21 | "noFallthroughCasesInSwitch": true
22 | },
23 | "include": ["src"]
24 | }
25 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "files": [],
3 | "references": [
4 | { "path": "./tsconfig.app.json" },
5 | { "path": "./tsconfig.node.json" }
6 | ]
7 | }
8 |
--------------------------------------------------------------------------------
/tsconfig.node.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2022",
4 | "lib": ["ES2023"],
5 | "module": "ESNext",
6 | "skipLibCheck": true,
7 |
8 | /* Bundler mode */
9 | "moduleResolution": "bundler",
10 | "allowImportingTsExtensions": true,
11 | "isolatedModules": true,
12 | "moduleDetection": "force",
13 | "noEmit": true,
14 |
15 | /* Linting */
16 | "strict": true,
17 | "noUnusedLocals": true,
18 | "noUnusedParameters": true,
19 | "noFallthroughCasesInSwitch": true
20 | },
21 | "include": ["vite.config.ts"]
22 | }
23 |
--------------------------------------------------------------------------------
/vite.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vite';
2 | import react from '@vitejs/plugin-react';
3 |
4 | // https://vitejs.dev/config/
5 | export default defineConfig({
6 | plugins: [react()],
7 | optimizeDeps: {
8 | exclude: ['lucide-react'],
9 | },
10 | });
11 |
--------------------------------------------------------------------------------