├── .config └── dotnet-tools.json ├── .gitignore ├── Directory.Build.props ├── Fable.JsonProvider.sln ├── LICENSE ├── README.md ├── RELEASE_NOTES.md ├── build.fsx ├── fable_logo.png ├── global.json ├── index.html ├── package-lock.json ├── package.json ├── public ├── fable.ico └── test.json ├── src ├── Fable.JsonProvider.fs ├── Fable.JsonProvider.fsproj ├── JsonParser.fs ├── ProvidedTypes.fs └── ProviderDsl.fs ├── test ├── App.fs └── App.fsproj └── vite.config.js /.config/dotnet-tools.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 1, 3 | "isRoot": true, 4 | "tools": { 5 | "fable": { 6 | "version": "3.7.18", 7 | "commands": [ 8 | "fable" 9 | ] 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.fs.js 2 | 3 | ## Ignore Visual Studio temporary files, build results, and 4 | ## files generated by popular Visual Studio add-ons. 5 | .vscode/ 6 | .ionide/ 7 | build/ 8 | dist/ 9 | npm/ 10 | tests/**/out 11 | 12 | # User-specific files 13 | *.suo 14 | *.user 15 | *.userosscache 16 | *.sln.docstates 17 | 18 | # User-specific files (MonoDevelop/Xamarin Studio) 19 | *.userprefs 20 | 21 | # Build results 22 | [Dd]ebug/ 23 | [Dd]ebugPublic/ 24 | [Rr]elease/ 25 | [Rr]eleases/ 26 | x64/ 27 | x86/ 28 | bld/ 29 | [Bb]in/ 30 | [Oo]bj/ 31 | [Ll]og/ 32 | 33 | # Visual Studio 2015 cache/options directory 34 | .vs/ 35 | # Uncomment if you have tasks that create the project's static files in wwwroot 36 | #wwwroot/ 37 | 38 | # MSTest test Results 39 | [Tt]est[Rr]esult*/ 40 | [Bb]uild[Ll]og.* 41 | 42 | # NUNIT 43 | *.VisualState.xml 44 | TestResult.xml 45 | 46 | # Build Results of an ATL Project 47 | [Dd]ebugPS/ 48 | [Rr]eleasePS/ 49 | dlldata.c 50 | 51 | # DNX 52 | project.lock.json 53 | artifacts/ 54 | 55 | *_i.c 56 | *_p.c 57 | *_i.h 58 | *.ilk 59 | *.meta 60 | *.obj 61 | *.pch 62 | *.pdb 63 | *.pgc 64 | *.pgd 65 | *.rsp 66 | *.sbr 67 | *.tlb 68 | *.tli 69 | *.tlh 70 | *.tmp 71 | *.tmp_proj 72 | *.log 73 | *.vspscc 74 | *.vssscc 75 | .builds 76 | *.pidb 77 | *.svclog 78 | *.scc 79 | 80 | # Chutzpah Test files 81 | _Chutzpah* 82 | 83 | # Visual C++ cache files 84 | ipch/ 85 | *.aps 86 | *.ncb 87 | *.opendb 88 | *.opensdf 89 | *.sdf 90 | *.cachefile 91 | *.VC.db 92 | *.VC.VC.opendb 93 | 94 | # Visual Studio profiler 95 | *.psess 96 | *.vsp 97 | *.vspx 98 | *.sap 99 | 100 | # TFS 2012 Local Workspace 101 | $tf/ 102 | 103 | # Guidance Automation Toolkit 104 | *.gpState 105 | 106 | # ReSharper is a .NET coding add-in 107 | _ReSharper*/ 108 | *.[Rr]e[Ss]harper 109 | *.DotSettings.user 110 | 111 | # JustCode is a .NET coding add-in 112 | .JustCode 113 | 114 | # TeamCity is a build add-in 115 | _TeamCity* 116 | 117 | # DotCover is a Code Coverage Tool 118 | *.dotCover 119 | 120 | # NCrunch 121 | _NCrunch_* 122 | .*crunch*.local.xml 123 | nCrunchTemp_* 124 | 125 | # MightyMoose 126 | *.mm.* 127 | AutoTest.Net/ 128 | 129 | # Web workbench (sass) 130 | .sass-cache/ 131 | 132 | # Installshield output folder 133 | [Ee]xpress/ 134 | 135 | # DocProject is a documentation generator add-in 136 | DocProject/buildhelp/ 137 | DocProject/Help/*.HxT 138 | DocProject/Help/*.HxC 139 | DocProject/Help/*.hhc 140 | DocProject/Help/*.hhk 141 | DocProject/Help/*.hhp 142 | DocProject/Help/Html2 143 | DocProject/Help/html 144 | 145 | # Click-Once directory 146 | publish/ 147 | 148 | # Publish Web Output 149 | *.[Pp]ublish.xml 150 | *.azurePubxml 151 | # TODO: Comment the next line if you want to checkin your web deploy settings 152 | # but database connection strings (with potential passwords) will be unencrypted 153 | *.pubxml 154 | *.publishproj 155 | 156 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 157 | # checkin your Azure Web App publish settings, but sensitive information contained 158 | # in these scripts will be unencrypted 159 | PublishScripts/ 160 | 161 | # NuGet Packages 162 | *.nupkg 163 | # The packages folder can be ignored because of Package Restore 164 | **/packages/ 165 | # Uncomment if necessary however generally it will be regenerated when needed 166 | #!**/packages/repositories.config 167 | # NuGet v3's project.json files produces more ignoreable files 168 | *.nuget.props 169 | *.nuget.targets 170 | 171 | # Microsoft Azure Build Output 172 | csx/ 173 | *.build.csdef 174 | 175 | # Microsoft Azure Emulator 176 | ecf/ 177 | rcf/ 178 | 179 | # Windows Store app package directories and files 180 | AppPackages/ 181 | BundleArtifacts/ 182 | Package.StoreAssociation.xml 183 | _pkginfo.txt 184 | 185 | # Visual Studio cache files 186 | # files ending in .cache can be ignored 187 | *.[Cc]ache 188 | # but keep track of directories ending in .cache 189 | !*.[Cc]ache/ 190 | 191 | # Others 192 | ClientBin/ 193 | ~$* 194 | *~ 195 | *.dbmdl 196 | *.dbproj.schemaview 197 | *.pfx 198 | *.publishsettings 199 | node_modules/ 200 | orleans.codegen.cs 201 | 202 | # Since there are multiple workflows, uncomment next line to ignore bower_components 203 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 204 | #bower_components/ 205 | 206 | # RIA/Silverlight projects 207 | Generated_Code/ 208 | 209 | # Backup & report files from converting an old project file 210 | # to a newer Visual Studio version. Backup files are not needed, 211 | # because we have git ;-) 212 | _UpgradeReport_Files/ 213 | Backup*/ 214 | UpgradeLog*.XML 215 | UpgradeLog*.htm 216 | 217 | # SQL Server files 218 | *.mdf 219 | *.ldf 220 | 221 | # Business Intelligence projects 222 | *.rdl.data 223 | *.bim.layout 224 | *.bim_*.settings 225 | 226 | # Microsoft Fakes 227 | FakesAssemblies/ 228 | 229 | # GhostDoc plugin setting file 230 | *.GhostDoc.xml 231 | 232 | # Node.js Tools for Visual Studio 233 | .ntvs_analysis.dat 234 | 235 | # Visual Studio 6 build log 236 | *.plg 237 | 238 | # Visual Studio 6 workspace options file 239 | *.opt 240 | 241 | # Visual Studio LightSwitch build output 242 | **/*.HTMLClient/GeneratedArtifacts 243 | **/*.DesktopClient/GeneratedArtifacts 244 | **/*.DesktopClient/ModelManifest.xml 245 | **/*.Server/GeneratedArtifacts 246 | **/*.Server/ModelManifest.xml 247 | _Pvt_Extensions 248 | 249 | # Paket dependency manager 250 | .paket/paket.exe 251 | paket-files/ 252 | 253 | # FAKE - F# Make 254 | .fake/ 255 | 256 | # JetBrains Rider 257 | .idea/ 258 | *.sln.iml 259 | docs/public/* 260 | !docs/public/assets/ 261 | temp/ 262 | -------------------------------------------------------------------------------- /Directory.Build.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | https://fable.io 5 | https://github.com/fable-compiler/Fable.JsonProvider 6 | LICENSE 7 | README.md 8 | fable_logo.png 9 | fsharp;fable;javascript;f#;js;json 10 | Fable contributors 11 | true 12 | 13 | 14 | true 15 | true 16 | true 17 | snupkg 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Fable.JsonProvider.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.30114.105 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Fable.JsonProvider", "src\Fable.JsonProvider.fsproj", "{515ECBCB-C97E-4999-AF17-24D33AB8D974}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Debug|x64 = Debug|x64 12 | Debug|x86 = Debug|x86 13 | Release|Any CPU = Release|Any CPU 14 | Release|x64 = Release|x64 15 | Release|x86 = Release|x86 16 | EndGlobalSection 17 | GlobalSection(SolutionProperties) = preSolution 18 | HideSolutionNode = FALSE 19 | EndGlobalSection 20 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 21 | {515ECBCB-C97E-4999-AF17-24D33AB8D974}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 22 | {515ECBCB-C97E-4999-AF17-24D33AB8D974}.Debug|Any CPU.Build.0 = Debug|Any CPU 23 | {515ECBCB-C97E-4999-AF17-24D33AB8D974}.Debug|x64.ActiveCfg = Debug|Any CPU 24 | {515ECBCB-C97E-4999-AF17-24D33AB8D974}.Debug|x64.Build.0 = Debug|Any CPU 25 | {515ECBCB-C97E-4999-AF17-24D33AB8D974}.Debug|x86.ActiveCfg = Debug|Any CPU 26 | {515ECBCB-C97E-4999-AF17-24D33AB8D974}.Debug|x86.Build.0 = Debug|Any CPU 27 | {515ECBCB-C97E-4999-AF17-24D33AB8D974}.Release|Any CPU.ActiveCfg = Release|Any CPU 28 | {515ECBCB-C97E-4999-AF17-24D33AB8D974}.Release|Any CPU.Build.0 = Release|Any CPU 29 | {515ECBCB-C97E-4999-AF17-24D33AB8D974}.Release|x64.ActiveCfg = Release|Any CPU 30 | {515ECBCB-C97E-4999-AF17-24D33AB8D974}.Release|x64.Build.0 = Release|Any CPU 31 | {515ECBCB-C97E-4999-AF17-24D33AB8D974}.Release|x86.ActiveCfg = Release|Any CPU 32 | {515ECBCB-C97E-4999-AF17-24D33AB8D974}.Release|x86.Build.0 = Release|Any CPU 33 | EndGlobalSection 34 | EndGlobal 35 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Fable contributors 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Fable.JsonProvider 2 | 3 | Simple F# JSON Type Provider compatible with Fable. Currently tested with Fable 3 RC 11. 4 | 5 | ## Testing 6 | 7 | ```shell 8 | dotnet fsi build.fsx start 9 | ``` 10 | 11 | ## Usage 12 | 13 | - First, install the package `Fable.JsonProvider` from Nuget. 14 | - Then generate your model using a JSON url, file path or literal string. You can construct instances with other strings at runtime and the compiler will make sure you only access properties according to the original sample. 15 | 16 | > Please note there're currently **no runtime checks to validate the JSON**. 17 | 18 | ```fsharp 19 | type MyJson = Fable.JsonProvider.Generator<"""{ 20 | "foo": 5, 21 | "bar": ["baz"] 22 | }"""> 23 | 24 | let json = MyJson("""{"foo": 10, "bar": [] }""") 25 | printfn "%.0f" json.foo // prints 10 26 | ``` 27 | -------------------------------------------------------------------------------- /RELEASE_NOTES.md: -------------------------------------------------------------------------------- 1 | ### 1.1.1 2 | 3 | * Back to Jon Harrop's JsonParser, see #28 4 | * Prevent Stack Overflow with long strings 5 | 6 | ### 1.1.0 7 | 8 | * Use Newtonsoft.Json for parsing 9 | 10 | ### 1.0.1 11 | 12 | * Support for Arrays of Custom types @pd29 13 | 14 | ### 1.0.0 15 | 16 | * Support file paths @Titaye 17 | 18 | ### 1.0.0-beta-004 19 | 20 | * Accept array as root JSON 21 | 22 | ### 1.0.0-beta-003 23 | 24 | * Support for HTTP urls 25 | 26 | ### 1.0.0-beta-002 27 | 28 | * First release -------------------------------------------------------------------------------- /build.fsx: -------------------------------------------------------------------------------- 1 | #r "nuget: Fable.PublishUtils, 2.4.0" 2 | 3 | open PublishUtils 4 | 5 | let args = 6 | fsi.CommandLineArgs 7 | |> Array.skip 1 8 | |> List.ofArray 9 | 10 | // run "npm test" 11 | match args with 12 | | IgnoreCase "start"::_ -> 13 | run "npm install" 14 | run "npm start" 15 | | IgnoreCase "publish"::_ -> 16 | pushFableNuget "src/Fable.JsonProvider.fsproj" [] doNothing 17 | | _ -> () 18 | -------------------------------------------------------------------------------- /fable_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fable-compiler/Fable.JsonProvider/595c0977e4735290f724ccd08b5757e98c81028e/fable_logo.png -------------------------------------------------------------------------------- /global.json: -------------------------------------------------------------------------------- 1 | { 2 | "sdk": { 3 | "version": "6.0.100", 4 | "rollForward": "minor" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Fable 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Fable.JsonProvider", 3 | "lockfileVersion": 2, 4 | "requires": true, 5 | "packages": { 6 | "": { 7 | "hasInstallScript": true, 8 | "dependencies": { 9 | "react": "^18.2.0", 10 | "react-dom": "^18.2.0" 11 | }, 12 | "devDependencies": { 13 | "@vitejs/plugin-react": "^4.3.1", 14 | "vite": "^5.4.7" 15 | } 16 | }, 17 | "node_modules/@ampproject/remapping": { 18 | "version": "2.3.0", 19 | "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", 20 | "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", 21 | "dev": true, 22 | "dependencies": { 23 | "@jridgewell/gen-mapping": "^0.3.5", 24 | "@jridgewell/trace-mapping": "^0.3.24" 25 | }, 26 | "engines": { 27 | "node": ">=6.0.0" 28 | } 29 | }, 30 | "node_modules/@babel/code-frame": { 31 | "version": "7.24.7", 32 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", 33 | "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", 34 | "dev": true, 35 | "dependencies": { 36 | "@babel/highlight": "^7.24.7", 37 | "picocolors": "^1.0.0" 38 | }, 39 | "engines": { 40 | "node": ">=6.9.0" 41 | } 42 | }, 43 | "node_modules/@babel/compat-data": { 44 | "version": "7.25.4", 45 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", 46 | "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", 47 | "dev": true, 48 | "engines": { 49 | "node": ">=6.9.0" 50 | } 51 | }, 52 | "node_modules/@babel/core": { 53 | "version": "7.25.2", 54 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", 55 | "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", 56 | "dev": true, 57 | "dependencies": { 58 | "@ampproject/remapping": "^2.2.0", 59 | "@babel/code-frame": "^7.24.7", 60 | "@babel/generator": "^7.25.0", 61 | "@babel/helper-compilation-targets": "^7.25.2", 62 | "@babel/helper-module-transforms": "^7.25.2", 63 | "@babel/helpers": "^7.25.0", 64 | "@babel/parser": "^7.25.0", 65 | "@babel/template": "^7.25.0", 66 | "@babel/traverse": "^7.25.2", 67 | "@babel/types": "^7.25.2", 68 | "convert-source-map": "^2.0.0", 69 | "debug": "^4.1.0", 70 | "gensync": "^1.0.0-beta.2", 71 | "json5": "^2.2.3", 72 | "semver": "^6.3.1" 73 | }, 74 | "engines": { 75 | "node": ">=6.9.0" 76 | }, 77 | "funding": { 78 | "type": "opencollective", 79 | "url": "https://opencollective.com/babel" 80 | } 81 | }, 82 | "node_modules/@babel/generator": { 83 | "version": "7.25.6", 84 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", 85 | "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", 86 | "dev": true, 87 | "dependencies": { 88 | "@babel/types": "^7.25.6", 89 | "@jridgewell/gen-mapping": "^0.3.5", 90 | "@jridgewell/trace-mapping": "^0.3.25", 91 | "jsesc": "^2.5.1" 92 | }, 93 | "engines": { 94 | "node": ">=6.9.0" 95 | } 96 | }, 97 | "node_modules/@babel/helper-compilation-targets": { 98 | "version": "7.25.2", 99 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", 100 | "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", 101 | "dev": true, 102 | "dependencies": { 103 | "@babel/compat-data": "^7.25.2", 104 | "@babel/helper-validator-option": "^7.24.8", 105 | "browserslist": "^4.23.1", 106 | "lru-cache": "^5.1.1", 107 | "semver": "^6.3.1" 108 | }, 109 | "engines": { 110 | "node": ">=6.9.0" 111 | } 112 | }, 113 | "node_modules/@babel/helper-module-imports": { 114 | "version": "7.24.7", 115 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", 116 | "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", 117 | "dev": true, 118 | "dependencies": { 119 | "@babel/traverse": "^7.24.7", 120 | "@babel/types": "^7.24.7" 121 | }, 122 | "engines": { 123 | "node": ">=6.9.0" 124 | } 125 | }, 126 | "node_modules/@babel/helper-module-transforms": { 127 | "version": "7.25.2", 128 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", 129 | "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", 130 | "dev": true, 131 | "dependencies": { 132 | "@babel/helper-module-imports": "^7.24.7", 133 | "@babel/helper-simple-access": "^7.24.7", 134 | "@babel/helper-validator-identifier": "^7.24.7", 135 | "@babel/traverse": "^7.25.2" 136 | }, 137 | "engines": { 138 | "node": ">=6.9.0" 139 | }, 140 | "peerDependencies": { 141 | "@babel/core": "^7.0.0" 142 | } 143 | }, 144 | "node_modules/@babel/helper-plugin-utils": { 145 | "version": "7.24.8", 146 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", 147 | "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", 148 | "dev": true, 149 | "engines": { 150 | "node": ">=6.9.0" 151 | } 152 | }, 153 | "node_modules/@babel/helper-simple-access": { 154 | "version": "7.24.7", 155 | "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", 156 | "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", 157 | "dev": true, 158 | "dependencies": { 159 | "@babel/traverse": "^7.24.7", 160 | "@babel/types": "^7.24.7" 161 | }, 162 | "engines": { 163 | "node": ">=6.9.0" 164 | } 165 | }, 166 | "node_modules/@babel/helper-string-parser": { 167 | "version": "7.24.8", 168 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", 169 | "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", 170 | "dev": true, 171 | "engines": { 172 | "node": ">=6.9.0" 173 | } 174 | }, 175 | "node_modules/@babel/helper-validator-identifier": { 176 | "version": "7.24.7", 177 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", 178 | "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", 179 | "dev": true, 180 | "engines": { 181 | "node": ">=6.9.0" 182 | } 183 | }, 184 | "node_modules/@babel/helper-validator-option": { 185 | "version": "7.24.8", 186 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", 187 | "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", 188 | "dev": true, 189 | "engines": { 190 | "node": ">=6.9.0" 191 | } 192 | }, 193 | "node_modules/@babel/helpers": { 194 | "version": "7.25.6", 195 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", 196 | "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", 197 | "dev": true, 198 | "dependencies": { 199 | "@babel/template": "^7.25.0", 200 | "@babel/types": "^7.25.6" 201 | }, 202 | "engines": { 203 | "node": ">=6.9.0" 204 | } 205 | }, 206 | "node_modules/@babel/highlight": { 207 | "version": "7.24.7", 208 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", 209 | "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", 210 | "dev": true, 211 | "dependencies": { 212 | "@babel/helper-validator-identifier": "^7.24.7", 213 | "chalk": "^2.4.2", 214 | "js-tokens": "^4.0.0", 215 | "picocolors": "^1.0.0" 216 | }, 217 | "engines": { 218 | "node": ">=6.9.0" 219 | } 220 | }, 221 | "node_modules/@babel/parser": { 222 | "version": "7.25.6", 223 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", 224 | "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", 225 | "dev": true, 226 | "dependencies": { 227 | "@babel/types": "^7.25.6" 228 | }, 229 | "bin": { 230 | "parser": "bin/babel-parser.js" 231 | }, 232 | "engines": { 233 | "node": ">=6.0.0" 234 | } 235 | }, 236 | "node_modules/@babel/plugin-transform-react-jsx-self": { 237 | "version": "7.24.7", 238 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz", 239 | "integrity": "sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==", 240 | "dev": true, 241 | "dependencies": { 242 | "@babel/helper-plugin-utils": "^7.24.7" 243 | }, 244 | "engines": { 245 | "node": ">=6.9.0" 246 | }, 247 | "peerDependencies": { 248 | "@babel/core": "^7.0.0-0" 249 | } 250 | }, 251 | "node_modules/@babel/plugin-transform-react-jsx-source": { 252 | "version": "7.24.7", 253 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz", 254 | "integrity": "sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==", 255 | "dev": true, 256 | "dependencies": { 257 | "@babel/helper-plugin-utils": "^7.24.7" 258 | }, 259 | "engines": { 260 | "node": ">=6.9.0" 261 | }, 262 | "peerDependencies": { 263 | "@babel/core": "^7.0.0-0" 264 | } 265 | }, 266 | "node_modules/@babel/template": { 267 | "version": "7.25.0", 268 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", 269 | "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", 270 | "dev": true, 271 | "dependencies": { 272 | "@babel/code-frame": "^7.24.7", 273 | "@babel/parser": "^7.25.0", 274 | "@babel/types": "^7.25.0" 275 | }, 276 | "engines": { 277 | "node": ">=6.9.0" 278 | } 279 | }, 280 | "node_modules/@babel/traverse": { 281 | "version": "7.25.6", 282 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", 283 | "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", 284 | "dev": true, 285 | "dependencies": { 286 | "@babel/code-frame": "^7.24.7", 287 | "@babel/generator": "^7.25.6", 288 | "@babel/parser": "^7.25.6", 289 | "@babel/template": "^7.25.0", 290 | "@babel/types": "^7.25.6", 291 | "debug": "^4.3.1", 292 | "globals": "^11.1.0" 293 | }, 294 | "engines": { 295 | "node": ">=6.9.0" 296 | } 297 | }, 298 | "node_modules/@babel/types": { 299 | "version": "7.25.6", 300 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", 301 | "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", 302 | "dev": true, 303 | "dependencies": { 304 | "@babel/helper-string-parser": "^7.24.8", 305 | "@babel/helper-validator-identifier": "^7.24.7", 306 | "to-fast-properties": "^2.0.0" 307 | }, 308 | "engines": { 309 | "node": ">=6.9.0" 310 | } 311 | }, 312 | "node_modules/@esbuild/aix-ppc64": { 313 | "version": "0.21.5", 314 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", 315 | "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", 316 | "cpu": [ 317 | "ppc64" 318 | ], 319 | "dev": true, 320 | "optional": true, 321 | "os": [ 322 | "aix" 323 | ], 324 | "engines": { 325 | "node": ">=12" 326 | } 327 | }, 328 | "node_modules/@esbuild/android-arm": { 329 | "version": "0.21.5", 330 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", 331 | "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", 332 | "cpu": [ 333 | "arm" 334 | ], 335 | "dev": true, 336 | "optional": true, 337 | "os": [ 338 | "android" 339 | ], 340 | "engines": { 341 | "node": ">=12" 342 | } 343 | }, 344 | "node_modules/@esbuild/android-arm64": { 345 | "version": "0.21.5", 346 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", 347 | "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", 348 | "cpu": [ 349 | "arm64" 350 | ], 351 | "dev": true, 352 | "optional": true, 353 | "os": [ 354 | "android" 355 | ], 356 | "engines": { 357 | "node": ">=12" 358 | } 359 | }, 360 | "node_modules/@esbuild/android-x64": { 361 | "version": "0.21.5", 362 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", 363 | "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", 364 | "cpu": [ 365 | "x64" 366 | ], 367 | "dev": true, 368 | "optional": true, 369 | "os": [ 370 | "android" 371 | ], 372 | "engines": { 373 | "node": ">=12" 374 | } 375 | }, 376 | "node_modules/@esbuild/darwin-arm64": { 377 | "version": "0.21.5", 378 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", 379 | "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", 380 | "cpu": [ 381 | "arm64" 382 | ], 383 | "dev": true, 384 | "optional": true, 385 | "os": [ 386 | "darwin" 387 | ], 388 | "engines": { 389 | "node": ">=12" 390 | } 391 | }, 392 | "node_modules/@esbuild/darwin-x64": { 393 | "version": "0.21.5", 394 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", 395 | "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", 396 | "cpu": [ 397 | "x64" 398 | ], 399 | "dev": true, 400 | "optional": true, 401 | "os": [ 402 | "darwin" 403 | ], 404 | "engines": { 405 | "node": ">=12" 406 | } 407 | }, 408 | "node_modules/@esbuild/freebsd-arm64": { 409 | "version": "0.21.5", 410 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", 411 | "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", 412 | "cpu": [ 413 | "arm64" 414 | ], 415 | "dev": true, 416 | "optional": true, 417 | "os": [ 418 | "freebsd" 419 | ], 420 | "engines": { 421 | "node": ">=12" 422 | } 423 | }, 424 | "node_modules/@esbuild/freebsd-x64": { 425 | "version": "0.21.5", 426 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", 427 | "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", 428 | "cpu": [ 429 | "x64" 430 | ], 431 | "dev": true, 432 | "optional": true, 433 | "os": [ 434 | "freebsd" 435 | ], 436 | "engines": { 437 | "node": ">=12" 438 | } 439 | }, 440 | "node_modules/@esbuild/linux-arm": { 441 | "version": "0.21.5", 442 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", 443 | "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", 444 | "cpu": [ 445 | "arm" 446 | ], 447 | "dev": true, 448 | "optional": true, 449 | "os": [ 450 | "linux" 451 | ], 452 | "engines": { 453 | "node": ">=12" 454 | } 455 | }, 456 | "node_modules/@esbuild/linux-arm64": { 457 | "version": "0.21.5", 458 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", 459 | "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", 460 | "cpu": [ 461 | "arm64" 462 | ], 463 | "dev": true, 464 | "optional": true, 465 | "os": [ 466 | "linux" 467 | ], 468 | "engines": { 469 | "node": ">=12" 470 | } 471 | }, 472 | "node_modules/@esbuild/linux-ia32": { 473 | "version": "0.21.5", 474 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", 475 | "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", 476 | "cpu": [ 477 | "ia32" 478 | ], 479 | "dev": true, 480 | "optional": true, 481 | "os": [ 482 | "linux" 483 | ], 484 | "engines": { 485 | "node": ">=12" 486 | } 487 | }, 488 | "node_modules/@esbuild/linux-loong64": { 489 | "version": "0.21.5", 490 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", 491 | "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", 492 | "cpu": [ 493 | "loong64" 494 | ], 495 | "dev": true, 496 | "optional": true, 497 | "os": [ 498 | "linux" 499 | ], 500 | "engines": { 501 | "node": ">=12" 502 | } 503 | }, 504 | "node_modules/@esbuild/linux-mips64el": { 505 | "version": "0.21.5", 506 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", 507 | "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", 508 | "cpu": [ 509 | "mips64el" 510 | ], 511 | "dev": true, 512 | "optional": true, 513 | "os": [ 514 | "linux" 515 | ], 516 | "engines": { 517 | "node": ">=12" 518 | } 519 | }, 520 | "node_modules/@esbuild/linux-ppc64": { 521 | "version": "0.21.5", 522 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", 523 | "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", 524 | "cpu": [ 525 | "ppc64" 526 | ], 527 | "dev": true, 528 | "optional": true, 529 | "os": [ 530 | "linux" 531 | ], 532 | "engines": { 533 | "node": ">=12" 534 | } 535 | }, 536 | "node_modules/@esbuild/linux-riscv64": { 537 | "version": "0.21.5", 538 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", 539 | "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", 540 | "cpu": [ 541 | "riscv64" 542 | ], 543 | "dev": true, 544 | "optional": true, 545 | "os": [ 546 | "linux" 547 | ], 548 | "engines": { 549 | "node": ">=12" 550 | } 551 | }, 552 | "node_modules/@esbuild/linux-s390x": { 553 | "version": "0.21.5", 554 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", 555 | "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", 556 | "cpu": [ 557 | "s390x" 558 | ], 559 | "dev": true, 560 | "optional": true, 561 | "os": [ 562 | "linux" 563 | ], 564 | "engines": { 565 | "node": ">=12" 566 | } 567 | }, 568 | "node_modules/@esbuild/linux-x64": { 569 | "version": "0.21.5", 570 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", 571 | "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", 572 | "cpu": [ 573 | "x64" 574 | ], 575 | "dev": true, 576 | "optional": true, 577 | "os": [ 578 | "linux" 579 | ], 580 | "engines": { 581 | "node": ">=12" 582 | } 583 | }, 584 | "node_modules/@esbuild/netbsd-x64": { 585 | "version": "0.21.5", 586 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", 587 | "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", 588 | "cpu": [ 589 | "x64" 590 | ], 591 | "dev": true, 592 | "optional": true, 593 | "os": [ 594 | "netbsd" 595 | ], 596 | "engines": { 597 | "node": ">=12" 598 | } 599 | }, 600 | "node_modules/@esbuild/openbsd-x64": { 601 | "version": "0.21.5", 602 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", 603 | "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", 604 | "cpu": [ 605 | "x64" 606 | ], 607 | "dev": true, 608 | "optional": true, 609 | "os": [ 610 | "openbsd" 611 | ], 612 | "engines": { 613 | "node": ">=12" 614 | } 615 | }, 616 | "node_modules/@esbuild/sunos-x64": { 617 | "version": "0.21.5", 618 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", 619 | "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", 620 | "cpu": [ 621 | "x64" 622 | ], 623 | "dev": true, 624 | "optional": true, 625 | "os": [ 626 | "sunos" 627 | ], 628 | "engines": { 629 | "node": ">=12" 630 | } 631 | }, 632 | "node_modules/@esbuild/win32-arm64": { 633 | "version": "0.21.5", 634 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", 635 | "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", 636 | "cpu": [ 637 | "arm64" 638 | ], 639 | "dev": true, 640 | "optional": true, 641 | "os": [ 642 | "win32" 643 | ], 644 | "engines": { 645 | "node": ">=12" 646 | } 647 | }, 648 | "node_modules/@esbuild/win32-ia32": { 649 | "version": "0.21.5", 650 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", 651 | "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", 652 | "cpu": [ 653 | "ia32" 654 | ], 655 | "dev": true, 656 | "optional": true, 657 | "os": [ 658 | "win32" 659 | ], 660 | "engines": { 661 | "node": ">=12" 662 | } 663 | }, 664 | "node_modules/@esbuild/win32-x64": { 665 | "version": "0.21.5", 666 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", 667 | "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", 668 | "cpu": [ 669 | "x64" 670 | ], 671 | "dev": true, 672 | "optional": true, 673 | "os": [ 674 | "win32" 675 | ], 676 | "engines": { 677 | "node": ">=12" 678 | } 679 | }, 680 | "node_modules/@jridgewell/gen-mapping": { 681 | "version": "0.3.5", 682 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", 683 | "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", 684 | "dev": true, 685 | "dependencies": { 686 | "@jridgewell/set-array": "^1.2.1", 687 | "@jridgewell/sourcemap-codec": "^1.4.10", 688 | "@jridgewell/trace-mapping": "^0.3.24" 689 | }, 690 | "engines": { 691 | "node": ">=6.0.0" 692 | } 693 | }, 694 | "node_modules/@jridgewell/resolve-uri": { 695 | "version": "3.1.2", 696 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 697 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 698 | "dev": true, 699 | "engines": { 700 | "node": ">=6.0.0" 701 | } 702 | }, 703 | "node_modules/@jridgewell/set-array": { 704 | "version": "1.2.1", 705 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", 706 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", 707 | "dev": true, 708 | "engines": { 709 | "node": ">=6.0.0" 710 | } 711 | }, 712 | "node_modules/@jridgewell/sourcemap-codec": { 713 | "version": "1.5.0", 714 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 715 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 716 | "dev": true 717 | }, 718 | "node_modules/@jridgewell/trace-mapping": { 719 | "version": "0.3.25", 720 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 721 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 722 | "dev": true, 723 | "dependencies": { 724 | "@jridgewell/resolve-uri": "^3.1.0", 725 | "@jridgewell/sourcemap-codec": "^1.4.14" 726 | } 727 | }, 728 | "node_modules/@rollup/rollup-android-arm-eabi": { 729 | "version": "4.22.4", 730 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", 731 | "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", 732 | "cpu": [ 733 | "arm" 734 | ], 735 | "dev": true, 736 | "optional": true, 737 | "os": [ 738 | "android" 739 | ] 740 | }, 741 | "node_modules/@rollup/rollup-android-arm64": { 742 | "version": "4.22.4", 743 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", 744 | "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", 745 | "cpu": [ 746 | "arm64" 747 | ], 748 | "dev": true, 749 | "optional": true, 750 | "os": [ 751 | "android" 752 | ] 753 | }, 754 | "node_modules/@rollup/rollup-darwin-arm64": { 755 | "version": "4.22.4", 756 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", 757 | "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", 758 | "cpu": [ 759 | "arm64" 760 | ], 761 | "dev": true, 762 | "optional": true, 763 | "os": [ 764 | "darwin" 765 | ] 766 | }, 767 | "node_modules/@rollup/rollup-darwin-x64": { 768 | "version": "4.22.4", 769 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", 770 | "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", 771 | "cpu": [ 772 | "x64" 773 | ], 774 | "dev": true, 775 | "optional": true, 776 | "os": [ 777 | "darwin" 778 | ] 779 | }, 780 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 781 | "version": "4.22.4", 782 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", 783 | "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", 784 | "cpu": [ 785 | "arm" 786 | ], 787 | "dev": true, 788 | "optional": true, 789 | "os": [ 790 | "linux" 791 | ] 792 | }, 793 | "node_modules/@rollup/rollup-linux-arm-musleabihf": { 794 | "version": "4.22.4", 795 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", 796 | "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", 797 | "cpu": [ 798 | "arm" 799 | ], 800 | "dev": true, 801 | "optional": true, 802 | "os": [ 803 | "linux" 804 | ] 805 | }, 806 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 807 | "version": "4.22.4", 808 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", 809 | "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", 810 | "cpu": [ 811 | "arm64" 812 | ], 813 | "dev": true, 814 | "optional": true, 815 | "os": [ 816 | "linux" 817 | ] 818 | }, 819 | "node_modules/@rollup/rollup-linux-arm64-musl": { 820 | "version": "4.22.4", 821 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", 822 | "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", 823 | "cpu": [ 824 | "arm64" 825 | ], 826 | "dev": true, 827 | "optional": true, 828 | "os": [ 829 | "linux" 830 | ] 831 | }, 832 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 833 | "version": "4.22.4", 834 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", 835 | "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", 836 | "cpu": [ 837 | "ppc64" 838 | ], 839 | "dev": true, 840 | "optional": true, 841 | "os": [ 842 | "linux" 843 | ] 844 | }, 845 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 846 | "version": "4.22.4", 847 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", 848 | "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", 849 | "cpu": [ 850 | "riscv64" 851 | ], 852 | "dev": true, 853 | "optional": true, 854 | "os": [ 855 | "linux" 856 | ] 857 | }, 858 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 859 | "version": "4.22.4", 860 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", 861 | "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", 862 | "cpu": [ 863 | "s390x" 864 | ], 865 | "dev": true, 866 | "optional": true, 867 | "os": [ 868 | "linux" 869 | ] 870 | }, 871 | "node_modules/@rollup/rollup-linux-x64-gnu": { 872 | "version": "4.22.4", 873 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", 874 | "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", 875 | "cpu": [ 876 | "x64" 877 | ], 878 | "dev": true, 879 | "optional": true, 880 | "os": [ 881 | "linux" 882 | ] 883 | }, 884 | "node_modules/@rollup/rollup-linux-x64-musl": { 885 | "version": "4.22.4", 886 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", 887 | "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", 888 | "cpu": [ 889 | "x64" 890 | ], 891 | "dev": true, 892 | "optional": true, 893 | "os": [ 894 | "linux" 895 | ] 896 | }, 897 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 898 | "version": "4.22.4", 899 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", 900 | "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", 901 | "cpu": [ 902 | "arm64" 903 | ], 904 | "dev": true, 905 | "optional": true, 906 | "os": [ 907 | "win32" 908 | ] 909 | }, 910 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 911 | "version": "4.22.4", 912 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", 913 | "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", 914 | "cpu": [ 915 | "ia32" 916 | ], 917 | "dev": true, 918 | "optional": true, 919 | "os": [ 920 | "win32" 921 | ] 922 | }, 923 | "node_modules/@rollup/rollup-win32-x64-msvc": { 924 | "version": "4.22.4", 925 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", 926 | "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", 927 | "cpu": [ 928 | "x64" 929 | ], 930 | "dev": true, 931 | "optional": true, 932 | "os": [ 933 | "win32" 934 | ] 935 | }, 936 | "node_modules/@types/babel__core": { 937 | "version": "7.20.5", 938 | "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", 939 | "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", 940 | "dev": true, 941 | "dependencies": { 942 | "@babel/parser": "^7.20.7", 943 | "@babel/types": "^7.20.7", 944 | "@types/babel__generator": "*", 945 | "@types/babel__template": "*", 946 | "@types/babel__traverse": "*" 947 | } 948 | }, 949 | "node_modules/@types/babel__generator": { 950 | "version": "7.6.8", 951 | "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", 952 | "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", 953 | "dev": true, 954 | "dependencies": { 955 | "@babel/types": "^7.0.0" 956 | } 957 | }, 958 | "node_modules/@types/babel__template": { 959 | "version": "7.4.4", 960 | "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", 961 | "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", 962 | "dev": true, 963 | "dependencies": { 964 | "@babel/parser": "^7.1.0", 965 | "@babel/types": "^7.0.0" 966 | } 967 | }, 968 | "node_modules/@types/babel__traverse": { 969 | "version": "7.20.6", 970 | "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", 971 | "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", 972 | "dev": true, 973 | "dependencies": { 974 | "@babel/types": "^7.20.7" 975 | } 976 | }, 977 | "node_modules/@types/estree": { 978 | "version": "1.0.5", 979 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", 980 | "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", 981 | "dev": true 982 | }, 983 | "node_modules/@vitejs/plugin-react": { 984 | "version": "4.3.1", 985 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz", 986 | "integrity": "sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==", 987 | "dev": true, 988 | "dependencies": { 989 | "@babel/core": "^7.24.5", 990 | "@babel/plugin-transform-react-jsx-self": "^7.24.5", 991 | "@babel/plugin-transform-react-jsx-source": "^7.24.1", 992 | "@types/babel__core": "^7.20.5", 993 | "react-refresh": "^0.14.2" 994 | }, 995 | "engines": { 996 | "node": "^14.18.0 || >=16.0.0" 997 | }, 998 | "peerDependencies": { 999 | "vite": "^4.2.0 || ^5.0.0" 1000 | } 1001 | }, 1002 | "node_modules/ansi-styles": { 1003 | "version": "3.2.1", 1004 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 1005 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 1006 | "dev": true, 1007 | "dependencies": { 1008 | "color-convert": "^1.9.0" 1009 | }, 1010 | "engines": { 1011 | "node": ">=4" 1012 | } 1013 | }, 1014 | "node_modules/browserslist": { 1015 | "version": "4.23.3", 1016 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", 1017 | "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", 1018 | "dev": true, 1019 | "funding": [ 1020 | { 1021 | "type": "opencollective", 1022 | "url": "https://opencollective.com/browserslist" 1023 | }, 1024 | { 1025 | "type": "tidelift", 1026 | "url": "https://tidelift.com/funding/github/npm/browserslist" 1027 | }, 1028 | { 1029 | "type": "github", 1030 | "url": "https://github.com/sponsors/ai" 1031 | } 1032 | ], 1033 | "dependencies": { 1034 | "caniuse-lite": "^1.0.30001646", 1035 | "electron-to-chromium": "^1.5.4", 1036 | "node-releases": "^2.0.18", 1037 | "update-browserslist-db": "^1.1.0" 1038 | }, 1039 | "bin": { 1040 | "browserslist": "cli.js" 1041 | }, 1042 | "engines": { 1043 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 1044 | } 1045 | }, 1046 | "node_modules/caniuse-lite": { 1047 | "version": "1.0.30001663", 1048 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001663.tgz", 1049 | "integrity": "sha512-o9C3X27GLKbLeTYZ6HBOLU1tsAcBZsLis28wrVzddShCS16RujjHp9GDHKZqrB3meE0YjhawvMFsGb/igqiPzA==", 1050 | "dev": true, 1051 | "funding": [ 1052 | { 1053 | "type": "opencollective", 1054 | "url": "https://opencollective.com/browserslist" 1055 | }, 1056 | { 1057 | "type": "tidelift", 1058 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 1059 | }, 1060 | { 1061 | "type": "github", 1062 | "url": "https://github.com/sponsors/ai" 1063 | } 1064 | ] 1065 | }, 1066 | "node_modules/chalk": { 1067 | "version": "2.4.2", 1068 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 1069 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 1070 | "dev": true, 1071 | "dependencies": { 1072 | "ansi-styles": "^3.2.1", 1073 | "escape-string-regexp": "^1.0.5", 1074 | "supports-color": "^5.3.0" 1075 | }, 1076 | "engines": { 1077 | "node": ">=4" 1078 | } 1079 | }, 1080 | "node_modules/color-convert": { 1081 | "version": "1.9.3", 1082 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 1083 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 1084 | "dev": true, 1085 | "dependencies": { 1086 | "color-name": "1.1.3" 1087 | } 1088 | }, 1089 | "node_modules/color-name": { 1090 | "version": "1.1.3", 1091 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 1092 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", 1093 | "dev": true 1094 | }, 1095 | "node_modules/convert-source-map": { 1096 | "version": "2.0.0", 1097 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", 1098 | "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", 1099 | "dev": true 1100 | }, 1101 | "node_modules/debug": { 1102 | "version": "4.3.7", 1103 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 1104 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 1105 | "dev": true, 1106 | "dependencies": { 1107 | "ms": "^2.1.3" 1108 | }, 1109 | "engines": { 1110 | "node": ">=6.0" 1111 | }, 1112 | "peerDependenciesMeta": { 1113 | "supports-color": { 1114 | "optional": true 1115 | } 1116 | } 1117 | }, 1118 | "node_modules/electron-to-chromium": { 1119 | "version": "1.5.28", 1120 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.28.tgz", 1121 | "integrity": "sha512-VufdJl+rzaKZoYVUijN13QcXVF5dWPZANeFTLNy+OSpHdDL5ynXTF35+60RSBbaQYB1ae723lQXHCrf4pyLsMw==", 1122 | "dev": true 1123 | }, 1124 | "node_modules/esbuild": { 1125 | "version": "0.21.5", 1126 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", 1127 | "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", 1128 | "dev": true, 1129 | "hasInstallScript": true, 1130 | "bin": { 1131 | "esbuild": "bin/esbuild" 1132 | }, 1133 | "engines": { 1134 | "node": ">=12" 1135 | }, 1136 | "optionalDependencies": { 1137 | "@esbuild/aix-ppc64": "0.21.5", 1138 | "@esbuild/android-arm": "0.21.5", 1139 | "@esbuild/android-arm64": "0.21.5", 1140 | "@esbuild/android-x64": "0.21.5", 1141 | "@esbuild/darwin-arm64": "0.21.5", 1142 | "@esbuild/darwin-x64": "0.21.5", 1143 | "@esbuild/freebsd-arm64": "0.21.5", 1144 | "@esbuild/freebsd-x64": "0.21.5", 1145 | "@esbuild/linux-arm": "0.21.5", 1146 | "@esbuild/linux-arm64": "0.21.5", 1147 | "@esbuild/linux-ia32": "0.21.5", 1148 | "@esbuild/linux-loong64": "0.21.5", 1149 | "@esbuild/linux-mips64el": "0.21.5", 1150 | "@esbuild/linux-ppc64": "0.21.5", 1151 | "@esbuild/linux-riscv64": "0.21.5", 1152 | "@esbuild/linux-s390x": "0.21.5", 1153 | "@esbuild/linux-x64": "0.21.5", 1154 | "@esbuild/netbsd-x64": "0.21.5", 1155 | "@esbuild/openbsd-x64": "0.21.5", 1156 | "@esbuild/sunos-x64": "0.21.5", 1157 | "@esbuild/win32-arm64": "0.21.5", 1158 | "@esbuild/win32-ia32": "0.21.5", 1159 | "@esbuild/win32-x64": "0.21.5" 1160 | } 1161 | }, 1162 | "node_modules/escalade": { 1163 | "version": "3.2.0", 1164 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", 1165 | "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", 1166 | "dev": true, 1167 | "engines": { 1168 | "node": ">=6" 1169 | } 1170 | }, 1171 | "node_modules/escape-string-regexp": { 1172 | "version": "1.0.5", 1173 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1174 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 1175 | "dev": true, 1176 | "engines": { 1177 | "node": ">=0.8.0" 1178 | } 1179 | }, 1180 | "node_modules/fsevents": { 1181 | "version": "2.3.3", 1182 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1183 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1184 | "dev": true, 1185 | "hasInstallScript": true, 1186 | "optional": true, 1187 | "os": [ 1188 | "darwin" 1189 | ], 1190 | "engines": { 1191 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1192 | } 1193 | }, 1194 | "node_modules/gensync": { 1195 | "version": "1.0.0-beta.2", 1196 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 1197 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 1198 | "dev": true, 1199 | "engines": { 1200 | "node": ">=6.9.0" 1201 | } 1202 | }, 1203 | "node_modules/globals": { 1204 | "version": "11.12.0", 1205 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 1206 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 1207 | "dev": true, 1208 | "engines": { 1209 | "node": ">=4" 1210 | } 1211 | }, 1212 | "node_modules/has-flag": { 1213 | "version": "3.0.0", 1214 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1215 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 1216 | "dev": true, 1217 | "engines": { 1218 | "node": ">=4" 1219 | } 1220 | }, 1221 | "node_modules/js-tokens": { 1222 | "version": "4.0.0", 1223 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1224 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 1225 | }, 1226 | "node_modules/jsesc": { 1227 | "version": "2.5.2", 1228 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 1229 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 1230 | "dev": true, 1231 | "bin": { 1232 | "jsesc": "bin/jsesc" 1233 | }, 1234 | "engines": { 1235 | "node": ">=4" 1236 | } 1237 | }, 1238 | "node_modules/json5": { 1239 | "version": "2.2.3", 1240 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", 1241 | "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", 1242 | "dev": true, 1243 | "bin": { 1244 | "json5": "lib/cli.js" 1245 | }, 1246 | "engines": { 1247 | "node": ">=6" 1248 | } 1249 | }, 1250 | "node_modules/loose-envify": { 1251 | "version": "1.4.0", 1252 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 1253 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 1254 | "dependencies": { 1255 | "js-tokens": "^3.0.0 || ^4.0.0" 1256 | }, 1257 | "bin": { 1258 | "loose-envify": "cli.js" 1259 | } 1260 | }, 1261 | "node_modules/lru-cache": { 1262 | "version": "5.1.1", 1263 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 1264 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 1265 | "dev": true, 1266 | "dependencies": { 1267 | "yallist": "^3.0.2" 1268 | } 1269 | }, 1270 | "node_modules/ms": { 1271 | "version": "2.1.3", 1272 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1273 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1274 | "dev": true 1275 | }, 1276 | "node_modules/nanoid": { 1277 | "version": "3.3.7", 1278 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 1279 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", 1280 | "dev": true, 1281 | "funding": [ 1282 | { 1283 | "type": "github", 1284 | "url": "https://github.com/sponsors/ai" 1285 | } 1286 | ], 1287 | "bin": { 1288 | "nanoid": "bin/nanoid.cjs" 1289 | }, 1290 | "engines": { 1291 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1292 | } 1293 | }, 1294 | "node_modules/node-releases": { 1295 | "version": "2.0.18", 1296 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", 1297 | "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", 1298 | "dev": true 1299 | }, 1300 | "node_modules/picocolors": { 1301 | "version": "1.1.0", 1302 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", 1303 | "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", 1304 | "dev": true 1305 | }, 1306 | "node_modules/postcss": { 1307 | "version": "8.4.47", 1308 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", 1309 | "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", 1310 | "dev": true, 1311 | "funding": [ 1312 | { 1313 | "type": "opencollective", 1314 | "url": "https://opencollective.com/postcss/" 1315 | }, 1316 | { 1317 | "type": "tidelift", 1318 | "url": "https://tidelift.com/funding/github/npm/postcss" 1319 | }, 1320 | { 1321 | "type": "github", 1322 | "url": "https://github.com/sponsors/ai" 1323 | } 1324 | ], 1325 | "dependencies": { 1326 | "nanoid": "^3.3.7", 1327 | "picocolors": "^1.1.0", 1328 | "source-map-js": "^1.2.1" 1329 | }, 1330 | "engines": { 1331 | "node": "^10 || ^12 || >=14" 1332 | } 1333 | }, 1334 | "node_modules/react": { 1335 | "version": "18.2.0", 1336 | "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", 1337 | "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", 1338 | "dependencies": { 1339 | "loose-envify": "^1.1.0" 1340 | }, 1341 | "engines": { 1342 | "node": ">=0.10.0" 1343 | } 1344 | }, 1345 | "node_modules/react-dom": { 1346 | "version": "18.2.0", 1347 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", 1348 | "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", 1349 | "dependencies": { 1350 | "loose-envify": "^1.1.0", 1351 | "scheduler": "^0.23.0" 1352 | }, 1353 | "peerDependencies": { 1354 | "react": "^18.2.0" 1355 | } 1356 | }, 1357 | "node_modules/react-refresh": { 1358 | "version": "0.14.2", 1359 | "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", 1360 | "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", 1361 | "dev": true, 1362 | "engines": { 1363 | "node": ">=0.10.0" 1364 | } 1365 | }, 1366 | "node_modules/rollup": { 1367 | "version": "4.22.4", 1368 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", 1369 | "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", 1370 | "dev": true, 1371 | "dependencies": { 1372 | "@types/estree": "1.0.5" 1373 | }, 1374 | "bin": { 1375 | "rollup": "dist/bin/rollup" 1376 | }, 1377 | "engines": { 1378 | "node": ">=18.0.0", 1379 | "npm": ">=8.0.0" 1380 | }, 1381 | "optionalDependencies": { 1382 | "@rollup/rollup-android-arm-eabi": "4.22.4", 1383 | "@rollup/rollup-android-arm64": "4.22.4", 1384 | "@rollup/rollup-darwin-arm64": "4.22.4", 1385 | "@rollup/rollup-darwin-x64": "4.22.4", 1386 | "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", 1387 | "@rollup/rollup-linux-arm-musleabihf": "4.22.4", 1388 | "@rollup/rollup-linux-arm64-gnu": "4.22.4", 1389 | "@rollup/rollup-linux-arm64-musl": "4.22.4", 1390 | "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", 1391 | "@rollup/rollup-linux-riscv64-gnu": "4.22.4", 1392 | "@rollup/rollup-linux-s390x-gnu": "4.22.4", 1393 | "@rollup/rollup-linux-x64-gnu": "4.22.4", 1394 | "@rollup/rollup-linux-x64-musl": "4.22.4", 1395 | "@rollup/rollup-win32-arm64-msvc": "4.22.4", 1396 | "@rollup/rollup-win32-ia32-msvc": "4.22.4", 1397 | "@rollup/rollup-win32-x64-msvc": "4.22.4", 1398 | "fsevents": "~2.3.2" 1399 | } 1400 | }, 1401 | "node_modules/scheduler": { 1402 | "version": "0.23.0", 1403 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", 1404 | "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", 1405 | "dependencies": { 1406 | "loose-envify": "^1.1.0" 1407 | } 1408 | }, 1409 | "node_modules/semver": { 1410 | "version": "6.3.1", 1411 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 1412 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 1413 | "dev": true, 1414 | "bin": { 1415 | "semver": "bin/semver.js" 1416 | } 1417 | }, 1418 | "node_modules/source-map-js": { 1419 | "version": "1.2.1", 1420 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 1421 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 1422 | "dev": true, 1423 | "engines": { 1424 | "node": ">=0.10.0" 1425 | } 1426 | }, 1427 | "node_modules/supports-color": { 1428 | "version": "5.5.0", 1429 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1430 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1431 | "dev": true, 1432 | "dependencies": { 1433 | "has-flag": "^3.0.0" 1434 | }, 1435 | "engines": { 1436 | "node": ">=4" 1437 | } 1438 | }, 1439 | "node_modules/to-fast-properties": { 1440 | "version": "2.0.0", 1441 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 1442 | "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", 1443 | "dev": true, 1444 | "engines": { 1445 | "node": ">=4" 1446 | } 1447 | }, 1448 | "node_modules/update-browserslist-db": { 1449 | "version": "1.1.0", 1450 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", 1451 | "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", 1452 | "dev": true, 1453 | "funding": [ 1454 | { 1455 | "type": "opencollective", 1456 | "url": "https://opencollective.com/browserslist" 1457 | }, 1458 | { 1459 | "type": "tidelift", 1460 | "url": "https://tidelift.com/funding/github/npm/browserslist" 1461 | }, 1462 | { 1463 | "type": "github", 1464 | "url": "https://github.com/sponsors/ai" 1465 | } 1466 | ], 1467 | "dependencies": { 1468 | "escalade": "^3.1.2", 1469 | "picocolors": "^1.0.1" 1470 | }, 1471 | "bin": { 1472 | "update-browserslist-db": "cli.js" 1473 | }, 1474 | "peerDependencies": { 1475 | "browserslist": ">= 4.21.0" 1476 | } 1477 | }, 1478 | "node_modules/vite": { 1479 | "version": "5.4.7", 1480 | "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.7.tgz", 1481 | "integrity": "sha512-5l2zxqMEPVENgvzTuBpHer2awaetimj2BGkhBPdnwKbPNOlHsODU+oiazEZzLK7KhAnOrO+XGYJYn4ZlUhDtDQ==", 1482 | "dev": true, 1483 | "dependencies": { 1484 | "esbuild": "^0.21.3", 1485 | "postcss": "^8.4.43", 1486 | "rollup": "^4.20.0" 1487 | }, 1488 | "bin": { 1489 | "vite": "bin/vite.js" 1490 | }, 1491 | "engines": { 1492 | "node": "^18.0.0 || >=20.0.0" 1493 | }, 1494 | "funding": { 1495 | "url": "https://github.com/vitejs/vite?sponsor=1" 1496 | }, 1497 | "optionalDependencies": { 1498 | "fsevents": "~2.3.3" 1499 | }, 1500 | "peerDependencies": { 1501 | "@types/node": "^18.0.0 || >=20.0.0", 1502 | "less": "*", 1503 | "lightningcss": "^1.21.0", 1504 | "sass": "*", 1505 | "sass-embedded": "*", 1506 | "stylus": "*", 1507 | "sugarss": "*", 1508 | "terser": "^5.4.0" 1509 | }, 1510 | "peerDependenciesMeta": { 1511 | "@types/node": { 1512 | "optional": true 1513 | }, 1514 | "less": { 1515 | "optional": true 1516 | }, 1517 | "lightningcss": { 1518 | "optional": true 1519 | }, 1520 | "sass": { 1521 | "optional": true 1522 | }, 1523 | "sass-embedded": { 1524 | "optional": true 1525 | }, 1526 | "stylus": { 1527 | "optional": true 1528 | }, 1529 | "sugarss": { 1530 | "optional": true 1531 | }, 1532 | "terser": { 1533 | "optional": true 1534 | } 1535 | } 1536 | }, 1537 | "node_modules/yallist": { 1538 | "version": "3.1.1", 1539 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 1540 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 1541 | "dev": true 1542 | } 1543 | }, 1544 | "dependencies": { 1545 | "@ampproject/remapping": { 1546 | "version": "2.3.0", 1547 | "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", 1548 | "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", 1549 | "dev": true, 1550 | "requires": { 1551 | "@jridgewell/gen-mapping": "^0.3.5", 1552 | "@jridgewell/trace-mapping": "^0.3.24" 1553 | } 1554 | }, 1555 | "@babel/code-frame": { 1556 | "version": "7.24.7", 1557 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", 1558 | "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", 1559 | "dev": true, 1560 | "requires": { 1561 | "@babel/highlight": "^7.24.7", 1562 | "picocolors": "^1.0.0" 1563 | } 1564 | }, 1565 | "@babel/compat-data": { 1566 | "version": "7.25.4", 1567 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", 1568 | "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", 1569 | "dev": true 1570 | }, 1571 | "@babel/core": { 1572 | "version": "7.25.2", 1573 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", 1574 | "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", 1575 | "dev": true, 1576 | "requires": { 1577 | "@ampproject/remapping": "^2.2.0", 1578 | "@babel/code-frame": "^7.24.7", 1579 | "@babel/generator": "^7.25.0", 1580 | "@babel/helper-compilation-targets": "^7.25.2", 1581 | "@babel/helper-module-transforms": "^7.25.2", 1582 | "@babel/helpers": "^7.25.0", 1583 | "@babel/parser": "^7.25.0", 1584 | "@babel/template": "^7.25.0", 1585 | "@babel/traverse": "^7.25.2", 1586 | "@babel/types": "^7.25.2", 1587 | "convert-source-map": "^2.0.0", 1588 | "debug": "^4.1.0", 1589 | "gensync": "^1.0.0-beta.2", 1590 | "json5": "^2.2.3", 1591 | "semver": "^6.3.1" 1592 | } 1593 | }, 1594 | "@babel/generator": { 1595 | "version": "7.25.6", 1596 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", 1597 | "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", 1598 | "dev": true, 1599 | "requires": { 1600 | "@babel/types": "^7.25.6", 1601 | "@jridgewell/gen-mapping": "^0.3.5", 1602 | "@jridgewell/trace-mapping": "^0.3.25", 1603 | "jsesc": "^2.5.1" 1604 | } 1605 | }, 1606 | "@babel/helper-compilation-targets": { 1607 | "version": "7.25.2", 1608 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", 1609 | "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", 1610 | "dev": true, 1611 | "requires": { 1612 | "@babel/compat-data": "^7.25.2", 1613 | "@babel/helper-validator-option": "^7.24.8", 1614 | "browserslist": "^4.23.1", 1615 | "lru-cache": "^5.1.1", 1616 | "semver": "^6.3.1" 1617 | } 1618 | }, 1619 | "@babel/helper-module-imports": { 1620 | "version": "7.24.7", 1621 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", 1622 | "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", 1623 | "dev": true, 1624 | "requires": { 1625 | "@babel/traverse": "^7.24.7", 1626 | "@babel/types": "^7.24.7" 1627 | } 1628 | }, 1629 | "@babel/helper-module-transforms": { 1630 | "version": "7.25.2", 1631 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", 1632 | "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", 1633 | "dev": true, 1634 | "requires": { 1635 | "@babel/helper-module-imports": "^7.24.7", 1636 | "@babel/helper-simple-access": "^7.24.7", 1637 | "@babel/helper-validator-identifier": "^7.24.7", 1638 | "@babel/traverse": "^7.25.2" 1639 | } 1640 | }, 1641 | "@babel/helper-plugin-utils": { 1642 | "version": "7.24.8", 1643 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", 1644 | "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", 1645 | "dev": true 1646 | }, 1647 | "@babel/helper-simple-access": { 1648 | "version": "7.24.7", 1649 | "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", 1650 | "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", 1651 | "dev": true, 1652 | "requires": { 1653 | "@babel/traverse": "^7.24.7", 1654 | "@babel/types": "^7.24.7" 1655 | } 1656 | }, 1657 | "@babel/helper-string-parser": { 1658 | "version": "7.24.8", 1659 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", 1660 | "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", 1661 | "dev": true 1662 | }, 1663 | "@babel/helper-validator-identifier": { 1664 | "version": "7.24.7", 1665 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", 1666 | "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", 1667 | "dev": true 1668 | }, 1669 | "@babel/helper-validator-option": { 1670 | "version": "7.24.8", 1671 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", 1672 | "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", 1673 | "dev": true 1674 | }, 1675 | "@babel/helpers": { 1676 | "version": "7.25.6", 1677 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", 1678 | "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", 1679 | "dev": true, 1680 | "requires": { 1681 | "@babel/template": "^7.25.0", 1682 | "@babel/types": "^7.25.6" 1683 | } 1684 | }, 1685 | "@babel/highlight": { 1686 | "version": "7.24.7", 1687 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", 1688 | "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", 1689 | "dev": true, 1690 | "requires": { 1691 | "@babel/helper-validator-identifier": "^7.24.7", 1692 | "chalk": "^2.4.2", 1693 | "js-tokens": "^4.0.0", 1694 | "picocolors": "^1.0.0" 1695 | } 1696 | }, 1697 | "@babel/parser": { 1698 | "version": "7.25.6", 1699 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", 1700 | "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", 1701 | "dev": true, 1702 | "requires": { 1703 | "@babel/types": "^7.25.6" 1704 | } 1705 | }, 1706 | "@babel/plugin-transform-react-jsx-self": { 1707 | "version": "7.24.7", 1708 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz", 1709 | "integrity": "sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==", 1710 | "dev": true, 1711 | "requires": { 1712 | "@babel/helper-plugin-utils": "^7.24.7" 1713 | } 1714 | }, 1715 | "@babel/plugin-transform-react-jsx-source": { 1716 | "version": "7.24.7", 1717 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz", 1718 | "integrity": "sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==", 1719 | "dev": true, 1720 | "requires": { 1721 | "@babel/helper-plugin-utils": "^7.24.7" 1722 | } 1723 | }, 1724 | "@babel/template": { 1725 | "version": "7.25.0", 1726 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", 1727 | "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", 1728 | "dev": true, 1729 | "requires": { 1730 | "@babel/code-frame": "^7.24.7", 1731 | "@babel/parser": "^7.25.0", 1732 | "@babel/types": "^7.25.0" 1733 | } 1734 | }, 1735 | "@babel/traverse": { 1736 | "version": "7.25.6", 1737 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", 1738 | "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", 1739 | "dev": true, 1740 | "requires": { 1741 | "@babel/code-frame": "^7.24.7", 1742 | "@babel/generator": "^7.25.6", 1743 | "@babel/parser": "^7.25.6", 1744 | "@babel/template": "^7.25.0", 1745 | "@babel/types": "^7.25.6", 1746 | "debug": "^4.3.1", 1747 | "globals": "^11.1.0" 1748 | } 1749 | }, 1750 | "@babel/types": { 1751 | "version": "7.25.6", 1752 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", 1753 | "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", 1754 | "dev": true, 1755 | "requires": { 1756 | "@babel/helper-string-parser": "^7.24.8", 1757 | "@babel/helper-validator-identifier": "^7.24.7", 1758 | "to-fast-properties": "^2.0.0" 1759 | } 1760 | }, 1761 | "@esbuild/aix-ppc64": { 1762 | "version": "0.21.5", 1763 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", 1764 | "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", 1765 | "dev": true, 1766 | "optional": true 1767 | }, 1768 | "@esbuild/android-arm": { 1769 | "version": "0.21.5", 1770 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", 1771 | "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", 1772 | "dev": true, 1773 | "optional": true 1774 | }, 1775 | "@esbuild/android-arm64": { 1776 | "version": "0.21.5", 1777 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", 1778 | "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", 1779 | "dev": true, 1780 | "optional": true 1781 | }, 1782 | "@esbuild/android-x64": { 1783 | "version": "0.21.5", 1784 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", 1785 | "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", 1786 | "dev": true, 1787 | "optional": true 1788 | }, 1789 | "@esbuild/darwin-arm64": { 1790 | "version": "0.21.5", 1791 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", 1792 | "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", 1793 | "dev": true, 1794 | "optional": true 1795 | }, 1796 | "@esbuild/darwin-x64": { 1797 | "version": "0.21.5", 1798 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", 1799 | "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", 1800 | "dev": true, 1801 | "optional": true 1802 | }, 1803 | "@esbuild/freebsd-arm64": { 1804 | "version": "0.21.5", 1805 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", 1806 | "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", 1807 | "dev": true, 1808 | "optional": true 1809 | }, 1810 | "@esbuild/freebsd-x64": { 1811 | "version": "0.21.5", 1812 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", 1813 | "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", 1814 | "dev": true, 1815 | "optional": true 1816 | }, 1817 | "@esbuild/linux-arm": { 1818 | "version": "0.21.5", 1819 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", 1820 | "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", 1821 | "dev": true, 1822 | "optional": true 1823 | }, 1824 | "@esbuild/linux-arm64": { 1825 | "version": "0.21.5", 1826 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", 1827 | "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", 1828 | "dev": true, 1829 | "optional": true 1830 | }, 1831 | "@esbuild/linux-ia32": { 1832 | "version": "0.21.5", 1833 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", 1834 | "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", 1835 | "dev": true, 1836 | "optional": true 1837 | }, 1838 | "@esbuild/linux-loong64": { 1839 | "version": "0.21.5", 1840 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", 1841 | "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", 1842 | "dev": true, 1843 | "optional": true 1844 | }, 1845 | "@esbuild/linux-mips64el": { 1846 | "version": "0.21.5", 1847 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", 1848 | "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", 1849 | "dev": true, 1850 | "optional": true 1851 | }, 1852 | "@esbuild/linux-ppc64": { 1853 | "version": "0.21.5", 1854 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", 1855 | "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", 1856 | "dev": true, 1857 | "optional": true 1858 | }, 1859 | "@esbuild/linux-riscv64": { 1860 | "version": "0.21.5", 1861 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", 1862 | "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", 1863 | "dev": true, 1864 | "optional": true 1865 | }, 1866 | "@esbuild/linux-s390x": { 1867 | "version": "0.21.5", 1868 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", 1869 | "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", 1870 | "dev": true, 1871 | "optional": true 1872 | }, 1873 | "@esbuild/linux-x64": { 1874 | "version": "0.21.5", 1875 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", 1876 | "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", 1877 | "dev": true, 1878 | "optional": true 1879 | }, 1880 | "@esbuild/netbsd-x64": { 1881 | "version": "0.21.5", 1882 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", 1883 | "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", 1884 | "dev": true, 1885 | "optional": true 1886 | }, 1887 | "@esbuild/openbsd-x64": { 1888 | "version": "0.21.5", 1889 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", 1890 | "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", 1891 | "dev": true, 1892 | "optional": true 1893 | }, 1894 | "@esbuild/sunos-x64": { 1895 | "version": "0.21.5", 1896 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", 1897 | "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", 1898 | "dev": true, 1899 | "optional": true 1900 | }, 1901 | "@esbuild/win32-arm64": { 1902 | "version": "0.21.5", 1903 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", 1904 | "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", 1905 | "dev": true, 1906 | "optional": true 1907 | }, 1908 | "@esbuild/win32-ia32": { 1909 | "version": "0.21.5", 1910 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", 1911 | "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", 1912 | "dev": true, 1913 | "optional": true 1914 | }, 1915 | "@esbuild/win32-x64": { 1916 | "version": "0.21.5", 1917 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", 1918 | "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", 1919 | "dev": true, 1920 | "optional": true 1921 | }, 1922 | "@jridgewell/gen-mapping": { 1923 | "version": "0.3.5", 1924 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", 1925 | "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", 1926 | "dev": true, 1927 | "requires": { 1928 | "@jridgewell/set-array": "^1.2.1", 1929 | "@jridgewell/sourcemap-codec": "^1.4.10", 1930 | "@jridgewell/trace-mapping": "^0.3.24" 1931 | } 1932 | }, 1933 | "@jridgewell/resolve-uri": { 1934 | "version": "3.1.2", 1935 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 1936 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 1937 | "dev": true 1938 | }, 1939 | "@jridgewell/set-array": { 1940 | "version": "1.2.1", 1941 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", 1942 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", 1943 | "dev": true 1944 | }, 1945 | "@jridgewell/sourcemap-codec": { 1946 | "version": "1.5.0", 1947 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 1948 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 1949 | "dev": true 1950 | }, 1951 | "@jridgewell/trace-mapping": { 1952 | "version": "0.3.25", 1953 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 1954 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 1955 | "dev": true, 1956 | "requires": { 1957 | "@jridgewell/resolve-uri": "^3.1.0", 1958 | "@jridgewell/sourcemap-codec": "^1.4.14" 1959 | } 1960 | }, 1961 | "@rollup/rollup-android-arm-eabi": { 1962 | "version": "4.22.4", 1963 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", 1964 | "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", 1965 | "dev": true, 1966 | "optional": true 1967 | }, 1968 | "@rollup/rollup-android-arm64": { 1969 | "version": "4.22.4", 1970 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", 1971 | "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", 1972 | "dev": true, 1973 | "optional": true 1974 | }, 1975 | "@rollup/rollup-darwin-arm64": { 1976 | "version": "4.22.4", 1977 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", 1978 | "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", 1979 | "dev": true, 1980 | "optional": true 1981 | }, 1982 | "@rollup/rollup-darwin-x64": { 1983 | "version": "4.22.4", 1984 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", 1985 | "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", 1986 | "dev": true, 1987 | "optional": true 1988 | }, 1989 | "@rollup/rollup-linux-arm-gnueabihf": { 1990 | "version": "4.22.4", 1991 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", 1992 | "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", 1993 | "dev": true, 1994 | "optional": true 1995 | }, 1996 | "@rollup/rollup-linux-arm-musleabihf": { 1997 | "version": "4.22.4", 1998 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", 1999 | "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", 2000 | "dev": true, 2001 | "optional": true 2002 | }, 2003 | "@rollup/rollup-linux-arm64-gnu": { 2004 | "version": "4.22.4", 2005 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", 2006 | "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", 2007 | "dev": true, 2008 | "optional": true 2009 | }, 2010 | "@rollup/rollup-linux-arm64-musl": { 2011 | "version": "4.22.4", 2012 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", 2013 | "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", 2014 | "dev": true, 2015 | "optional": true 2016 | }, 2017 | "@rollup/rollup-linux-powerpc64le-gnu": { 2018 | "version": "4.22.4", 2019 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", 2020 | "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", 2021 | "dev": true, 2022 | "optional": true 2023 | }, 2024 | "@rollup/rollup-linux-riscv64-gnu": { 2025 | "version": "4.22.4", 2026 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", 2027 | "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", 2028 | "dev": true, 2029 | "optional": true 2030 | }, 2031 | "@rollup/rollup-linux-s390x-gnu": { 2032 | "version": "4.22.4", 2033 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", 2034 | "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", 2035 | "dev": true, 2036 | "optional": true 2037 | }, 2038 | "@rollup/rollup-linux-x64-gnu": { 2039 | "version": "4.22.4", 2040 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", 2041 | "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", 2042 | "dev": true, 2043 | "optional": true 2044 | }, 2045 | "@rollup/rollup-linux-x64-musl": { 2046 | "version": "4.22.4", 2047 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", 2048 | "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", 2049 | "dev": true, 2050 | "optional": true 2051 | }, 2052 | "@rollup/rollup-win32-arm64-msvc": { 2053 | "version": "4.22.4", 2054 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", 2055 | "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", 2056 | "dev": true, 2057 | "optional": true 2058 | }, 2059 | "@rollup/rollup-win32-ia32-msvc": { 2060 | "version": "4.22.4", 2061 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", 2062 | "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", 2063 | "dev": true, 2064 | "optional": true 2065 | }, 2066 | "@rollup/rollup-win32-x64-msvc": { 2067 | "version": "4.22.4", 2068 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", 2069 | "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", 2070 | "dev": true, 2071 | "optional": true 2072 | }, 2073 | "@types/babel__core": { 2074 | "version": "7.20.5", 2075 | "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", 2076 | "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", 2077 | "dev": true, 2078 | "requires": { 2079 | "@babel/parser": "^7.20.7", 2080 | "@babel/types": "^7.20.7", 2081 | "@types/babel__generator": "*", 2082 | "@types/babel__template": "*", 2083 | "@types/babel__traverse": "*" 2084 | } 2085 | }, 2086 | "@types/babel__generator": { 2087 | "version": "7.6.8", 2088 | "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", 2089 | "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", 2090 | "dev": true, 2091 | "requires": { 2092 | "@babel/types": "^7.0.0" 2093 | } 2094 | }, 2095 | "@types/babel__template": { 2096 | "version": "7.4.4", 2097 | "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", 2098 | "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", 2099 | "dev": true, 2100 | "requires": { 2101 | "@babel/parser": "^7.1.0", 2102 | "@babel/types": "^7.0.0" 2103 | } 2104 | }, 2105 | "@types/babel__traverse": { 2106 | "version": "7.20.6", 2107 | "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", 2108 | "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", 2109 | "dev": true, 2110 | "requires": { 2111 | "@babel/types": "^7.20.7" 2112 | } 2113 | }, 2114 | "@types/estree": { 2115 | "version": "1.0.5", 2116 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", 2117 | "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", 2118 | "dev": true 2119 | }, 2120 | "@vitejs/plugin-react": { 2121 | "version": "4.3.1", 2122 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz", 2123 | "integrity": "sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==", 2124 | "dev": true, 2125 | "requires": { 2126 | "@babel/core": "^7.24.5", 2127 | "@babel/plugin-transform-react-jsx-self": "^7.24.5", 2128 | "@babel/plugin-transform-react-jsx-source": "^7.24.1", 2129 | "@types/babel__core": "^7.20.5", 2130 | "react-refresh": "^0.14.2" 2131 | } 2132 | }, 2133 | "ansi-styles": { 2134 | "version": "3.2.1", 2135 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 2136 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 2137 | "dev": true, 2138 | "requires": { 2139 | "color-convert": "^1.9.0" 2140 | } 2141 | }, 2142 | "browserslist": { 2143 | "version": "4.23.3", 2144 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", 2145 | "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", 2146 | "dev": true, 2147 | "requires": { 2148 | "caniuse-lite": "^1.0.30001646", 2149 | "electron-to-chromium": "^1.5.4", 2150 | "node-releases": "^2.0.18", 2151 | "update-browserslist-db": "^1.1.0" 2152 | } 2153 | }, 2154 | "caniuse-lite": { 2155 | "version": "1.0.30001663", 2156 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001663.tgz", 2157 | "integrity": "sha512-o9C3X27GLKbLeTYZ6HBOLU1tsAcBZsLis28wrVzddShCS16RujjHp9GDHKZqrB3meE0YjhawvMFsGb/igqiPzA==", 2158 | "dev": true 2159 | }, 2160 | "chalk": { 2161 | "version": "2.4.2", 2162 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 2163 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 2164 | "dev": true, 2165 | "requires": { 2166 | "ansi-styles": "^3.2.1", 2167 | "escape-string-regexp": "^1.0.5", 2168 | "supports-color": "^5.3.0" 2169 | } 2170 | }, 2171 | "color-convert": { 2172 | "version": "1.9.3", 2173 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 2174 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 2175 | "dev": true, 2176 | "requires": { 2177 | "color-name": "1.1.3" 2178 | } 2179 | }, 2180 | "color-name": { 2181 | "version": "1.1.3", 2182 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 2183 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", 2184 | "dev": true 2185 | }, 2186 | "convert-source-map": { 2187 | "version": "2.0.0", 2188 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", 2189 | "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", 2190 | "dev": true 2191 | }, 2192 | "debug": { 2193 | "version": "4.3.7", 2194 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 2195 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 2196 | "dev": true, 2197 | "requires": { 2198 | "ms": "^2.1.3" 2199 | } 2200 | }, 2201 | "electron-to-chromium": { 2202 | "version": "1.5.28", 2203 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.28.tgz", 2204 | "integrity": "sha512-VufdJl+rzaKZoYVUijN13QcXVF5dWPZANeFTLNy+OSpHdDL5ynXTF35+60RSBbaQYB1ae723lQXHCrf4pyLsMw==", 2205 | "dev": true 2206 | }, 2207 | "esbuild": { 2208 | "version": "0.21.5", 2209 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", 2210 | "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", 2211 | "dev": true, 2212 | "requires": { 2213 | "@esbuild/aix-ppc64": "0.21.5", 2214 | "@esbuild/android-arm": "0.21.5", 2215 | "@esbuild/android-arm64": "0.21.5", 2216 | "@esbuild/android-x64": "0.21.5", 2217 | "@esbuild/darwin-arm64": "0.21.5", 2218 | "@esbuild/darwin-x64": "0.21.5", 2219 | "@esbuild/freebsd-arm64": "0.21.5", 2220 | "@esbuild/freebsd-x64": "0.21.5", 2221 | "@esbuild/linux-arm": "0.21.5", 2222 | "@esbuild/linux-arm64": "0.21.5", 2223 | "@esbuild/linux-ia32": "0.21.5", 2224 | "@esbuild/linux-loong64": "0.21.5", 2225 | "@esbuild/linux-mips64el": "0.21.5", 2226 | "@esbuild/linux-ppc64": "0.21.5", 2227 | "@esbuild/linux-riscv64": "0.21.5", 2228 | "@esbuild/linux-s390x": "0.21.5", 2229 | "@esbuild/linux-x64": "0.21.5", 2230 | "@esbuild/netbsd-x64": "0.21.5", 2231 | "@esbuild/openbsd-x64": "0.21.5", 2232 | "@esbuild/sunos-x64": "0.21.5", 2233 | "@esbuild/win32-arm64": "0.21.5", 2234 | "@esbuild/win32-ia32": "0.21.5", 2235 | "@esbuild/win32-x64": "0.21.5" 2236 | } 2237 | }, 2238 | "escalade": { 2239 | "version": "3.2.0", 2240 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", 2241 | "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", 2242 | "dev": true 2243 | }, 2244 | "escape-string-regexp": { 2245 | "version": "1.0.5", 2246 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 2247 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 2248 | "dev": true 2249 | }, 2250 | "fsevents": { 2251 | "version": "2.3.3", 2252 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 2253 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 2254 | "dev": true, 2255 | "optional": true 2256 | }, 2257 | "gensync": { 2258 | "version": "1.0.0-beta.2", 2259 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 2260 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 2261 | "dev": true 2262 | }, 2263 | "globals": { 2264 | "version": "11.12.0", 2265 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 2266 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 2267 | "dev": true 2268 | }, 2269 | "has-flag": { 2270 | "version": "3.0.0", 2271 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 2272 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 2273 | "dev": true 2274 | }, 2275 | "js-tokens": { 2276 | "version": "4.0.0", 2277 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 2278 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 2279 | }, 2280 | "jsesc": { 2281 | "version": "2.5.2", 2282 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 2283 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 2284 | "dev": true 2285 | }, 2286 | "json5": { 2287 | "version": "2.2.3", 2288 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", 2289 | "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", 2290 | "dev": true 2291 | }, 2292 | "loose-envify": { 2293 | "version": "1.4.0", 2294 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 2295 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 2296 | "requires": { 2297 | "js-tokens": "^3.0.0 || ^4.0.0" 2298 | } 2299 | }, 2300 | "lru-cache": { 2301 | "version": "5.1.1", 2302 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 2303 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 2304 | "dev": true, 2305 | "requires": { 2306 | "yallist": "^3.0.2" 2307 | } 2308 | }, 2309 | "ms": { 2310 | "version": "2.1.3", 2311 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2312 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 2313 | "dev": true 2314 | }, 2315 | "nanoid": { 2316 | "version": "3.3.7", 2317 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 2318 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", 2319 | "dev": true 2320 | }, 2321 | "node-releases": { 2322 | "version": "2.0.18", 2323 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", 2324 | "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", 2325 | "dev": true 2326 | }, 2327 | "picocolors": { 2328 | "version": "1.1.0", 2329 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", 2330 | "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", 2331 | "dev": true 2332 | }, 2333 | "postcss": { 2334 | "version": "8.4.47", 2335 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", 2336 | "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", 2337 | "dev": true, 2338 | "requires": { 2339 | "nanoid": "^3.3.7", 2340 | "picocolors": "^1.1.0", 2341 | "source-map-js": "^1.2.1" 2342 | } 2343 | }, 2344 | "react": { 2345 | "version": "18.2.0", 2346 | "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", 2347 | "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", 2348 | "requires": { 2349 | "loose-envify": "^1.1.0" 2350 | } 2351 | }, 2352 | "react-dom": { 2353 | "version": "18.2.0", 2354 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", 2355 | "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", 2356 | "requires": { 2357 | "loose-envify": "^1.1.0", 2358 | "scheduler": "^0.23.0" 2359 | } 2360 | }, 2361 | "react-refresh": { 2362 | "version": "0.14.2", 2363 | "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", 2364 | "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", 2365 | "dev": true 2366 | }, 2367 | "rollup": { 2368 | "version": "4.22.4", 2369 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", 2370 | "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", 2371 | "dev": true, 2372 | "requires": { 2373 | "@rollup/rollup-android-arm-eabi": "4.22.4", 2374 | "@rollup/rollup-android-arm64": "4.22.4", 2375 | "@rollup/rollup-darwin-arm64": "4.22.4", 2376 | "@rollup/rollup-darwin-x64": "4.22.4", 2377 | "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", 2378 | "@rollup/rollup-linux-arm-musleabihf": "4.22.4", 2379 | "@rollup/rollup-linux-arm64-gnu": "4.22.4", 2380 | "@rollup/rollup-linux-arm64-musl": "4.22.4", 2381 | "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", 2382 | "@rollup/rollup-linux-riscv64-gnu": "4.22.4", 2383 | "@rollup/rollup-linux-s390x-gnu": "4.22.4", 2384 | "@rollup/rollup-linux-x64-gnu": "4.22.4", 2385 | "@rollup/rollup-linux-x64-musl": "4.22.4", 2386 | "@rollup/rollup-win32-arm64-msvc": "4.22.4", 2387 | "@rollup/rollup-win32-ia32-msvc": "4.22.4", 2388 | "@rollup/rollup-win32-x64-msvc": "4.22.4", 2389 | "@types/estree": "1.0.5", 2390 | "fsevents": "~2.3.2" 2391 | } 2392 | }, 2393 | "scheduler": { 2394 | "version": "0.23.0", 2395 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", 2396 | "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", 2397 | "requires": { 2398 | "loose-envify": "^1.1.0" 2399 | } 2400 | }, 2401 | "semver": { 2402 | "version": "6.3.1", 2403 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 2404 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 2405 | "dev": true 2406 | }, 2407 | "source-map-js": { 2408 | "version": "1.2.1", 2409 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 2410 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 2411 | "dev": true 2412 | }, 2413 | "supports-color": { 2414 | "version": "5.5.0", 2415 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 2416 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 2417 | "dev": true, 2418 | "requires": { 2419 | "has-flag": "^3.0.0" 2420 | } 2421 | }, 2422 | "to-fast-properties": { 2423 | "version": "2.0.0", 2424 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 2425 | "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", 2426 | "dev": true 2427 | }, 2428 | "update-browserslist-db": { 2429 | "version": "1.1.0", 2430 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", 2431 | "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", 2432 | "dev": true, 2433 | "requires": { 2434 | "escalade": "^3.1.2", 2435 | "picocolors": "^1.0.1" 2436 | } 2437 | }, 2438 | "vite": { 2439 | "version": "5.4.7", 2440 | "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.7.tgz", 2441 | "integrity": "sha512-5l2zxqMEPVENgvzTuBpHer2awaetimj2BGkhBPdnwKbPNOlHsODU+oiazEZzLK7KhAnOrO+XGYJYn4ZlUhDtDQ==", 2442 | "dev": true, 2443 | "requires": { 2444 | "esbuild": "^0.21.3", 2445 | "fsevents": "~2.3.3", 2446 | "postcss": "^8.4.43", 2447 | "rollup": "^4.20.0" 2448 | } 2449 | }, 2450 | "yallist": { 2451 | "version": "3.1.1", 2452 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 2453 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 2454 | "dev": true 2455 | } 2456 | } 2457 | } 2458 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "postinstall": "dotnet tool restore", 5 | "start": "dotnet build src && dotnet fable watch test -s -o dist --run vite", 6 | "publish": "dotnet fsi build.fsx publish" 7 | }, 8 | "dependencies": { 9 | "react": "^18.2.0", 10 | "react-dom": "^18.2.0" 11 | }, 12 | "devDependencies": { 13 | "vite": "^5.4.7", 14 | "@vitejs/plugin-react": "^4.3.1" 15 | } 16 | } -------------------------------------------------------------------------------- /public/fable.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fable-compiler/Fable.JsonProvider/595c0977e4735290f724ccd08b5757e98c81028e/public/fable.ico -------------------------------------------------------------------------------- /public/test.json: -------------------------------------------------------------------------------- 1 | { 2 | "glossary": { 3 | "title": "example glossary", 4 | "GlossDiv": { 5 | "title": "S", 6 | "GlossList": { 7 | "GlossEntry": { 8 | "ID": "SGML", 9 | "SortAs": "SGML", 10 | "GlossTerm": "Standard Generalized Markup Language", 11 | "Acronym": "SGML", 12 | "Abbrev": "ISO 8879:1986", 13 | "GlossDef": { 14 | "para": "A meta-markup language, used to create markup languages such as DocBook.", 15 | "GlossSeeAlso": ["GML", "XML"] 16 | }, 17 | "GlossSee": "markup" 18 | } 19 | } 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /src/Fable.JsonProvider.fs: -------------------------------------------------------------------------------- 1 | namespace Fable.Core 2 | 3 | type EmitAttribute(macro: string) = 4 | inherit System.Attribute() 5 | 6 | namespace Fable 7 | 8 | module JsonProvider = 9 | 10 | open System.Collections.Generic 11 | open System.IO 12 | open System.Net 13 | open System.Net.Http 14 | open System.Text.RegularExpressions 15 | open FSharp.Quotations 16 | open FSharp.Core.CompilerServices 17 | open ProviderImplementation.ProvidedTypes 18 | 19 | open ProviderDsl 20 | open Fable.Core 21 | 22 | [] 23 | let jsonParse (json: string) = obj() 24 | 25 | [] 26 | let getProp (o: obj) (k: string) = obj() 27 | 28 | let fetchUrlAsync (url: string) = 29 | task { 30 | use handler = new HttpClientHandler(AutomaticDecompression=(DecompressionMethods.GZip ||| DecompressionMethods.Deflate)) 31 | use client = new HttpClient(handler) 32 | let! resp = client.GetAsync(url) 33 | use! stream = resp.Content.ReadAsStreamAsync() 34 | use reader = new StreamReader(stream) 35 | return reader.ReadToEnd() 36 | } 37 | 38 | let firstToUpper (s: string) = 39 | s.[0..0].ToUpper() + s.[1..] 40 | 41 | let getterCode name = 42 | fun (args: Expr list) -> <@@ getProp %%args.Head name @@> 43 | 44 | let rec makeType typeName json = 45 | match json with 46 | | JsonParser.Null -> Any 47 | | JsonParser.Bool _ -> Bool 48 | | JsonParser.Number _ -> Float 49 | | JsonParser.String _ -> String 50 | | JsonParser.Array items -> 51 | match items with 52 | | [] -> Array Any 53 | // TODO: Check if all items have same type 54 | | item::_ -> makeType typeName item |> Array 55 | | JsonParser.Object members -> 56 | let members = members |> List.collect (makeMember typeName) 57 | makeCustomType(typeName, members) |> Custom 58 | 59 | and makeMember ns (name, json) = 60 | let t = makeType (firstToUpper name) json 61 | let m = Property(name, t, false, getterCode name) 62 | let rec makeMember' = function 63 | | Custom t' -> [ChildType t'; m] 64 | | Array t' -> makeMember' t' 65 | | _ -> [m] 66 | makeMember' t 67 | 68 | let parseJson asm ns typeName (sample: string) = 69 | let makeRootType withCons basicMembers = 70 | makeRootType(asm, ns, typeName, [ 71 | yield! basicMembers |> Seq.collect (makeMember "") 72 | if withCons then 73 | yield Constructor(["json", String], fun args -> <@@ jsonParse %%args.Head @@>) 74 | ]) 75 | try 76 | match JsonParser.parse sample with 77 | | Some(JsonParser.Object members) -> 78 | makeRootType true members |> Ok 79 | | Some(JsonParser.Array((JsonParser.Object members)::_)) -> 80 | let t = makeRootType false members 81 | let array = t.MakeArrayType() |> Custom 82 | [Method("ParseArray", ["json", String], array, true, fun args -> <@@ jsonParse %%args.Head @@>)] 83 | |> addMembers t 84 | Ok t 85 | | _ -> Error "Expecting a JSON object or an array containing an object" 86 | with e -> 87 | Error e.Message 88 | 89 | [] 90 | type public JsonProvider (config : TypeProviderConfig) as this = 91 | inherit TypeProviderForNamespaces (config) 92 | let asm = System.Reflection.Assembly.GetExecutingAssembly() 93 | let ns = "Fable.JsonProvider" 94 | 95 | let staticParams = [ProvidedStaticParameter("sample",typeof)] 96 | let generator = ProvidedTypeDefinition(asm, ns, "Generator", Some typeof, isErased = true) 97 | 98 | do 99 | try 100 | generator.DefineStaticParameters( 101 | parameters = staticParams, 102 | instantiationFunction = (fun typeName pVals -> 103 | match pVals with 104 | | [| :? string as arg|] -> 105 | let arg = arg.Trim() 106 | if Regex.IsMatch(arg, "^https?://") then 107 | let res = fetchUrlAsync(arg).Result 108 | match parseJson asm ns typeName res with 109 | | Ok t -> t 110 | | Error e -> failwith $"Response from URL %s{arg} is not a valid JSON (%s{e}): %s{res}" 111 | else 112 | let content = 113 | // Check if the string is a JSON literal 114 | if arg.StartsWith("{") || arg.StartsWith("[") then arg 115 | else 116 | let filepath = 117 | if Path.IsPathRooted arg then arg 118 | else 119 | Path.GetFullPath(Path.Combine(config.ResolutionFolder, arg)) 120 | File.ReadAllText(filepath,System.Text.Encoding.UTF8) 121 | 122 | match parseJson asm ns typeName content with 123 | | Ok t -> t 124 | | Error e -> failwith $"Local sample is not a valid JSON (%s{e})" 125 | | _ -> failwith "unexpected parameter values" 126 | ) 127 | ) 128 | this.AddNamespace(ns, [generator]) 129 | with e -> 130 | printfn "%s" e.Message 131 | 132 | [] 133 | do () -------------------------------------------------------------------------------- /src/Fable.JsonProvider.fsproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1.1.1 5 | 1.1.1 6 | true 7 | netstandard2.0 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/JsonParser.fs: -------------------------------------------------------------------------------- 1 | // JsonParser by Jon Harrop: https://gist.github.com/jdh30/50741cd6d094004203b1dce019726ebb 2 | module JsonParser 3 | 4 | type Json = 5 | | Null 6 | | Bool of bool 7 | | Number of float 8 | | String of string 9 | | Array of Json list 10 | | Object of (string * Json) list 11 | 12 | type Bracket = Open | Close 13 | 14 | type Token = 15 | | LITERAL of Json 16 | | ARRAY of Bracket 17 | | OBJECT of Bracket 18 | 19 | let (|C|_|) (s: string, i) = 20 | if i < s.Length then Some(s.[i], (s, i+1)) else None 21 | 22 | let numeric = set ['0'..'9'] + set ['+'; '-'; '.'; 'e'; 'E'] 23 | let whitespace = set [','; ':'; '\u0009'; '\u000a'; '\u000d'; '\u0020'] 24 | 25 | let (|Contains|_|) alphabet = function 26 | | C(c, it) when Set.contains c alphabet -> Some it 27 | | _ -> None 28 | 29 | let rec (|Star|) (|Patt|_|) = function 30 | | Patt(x, Star (|Patt|_|) (xs, it)) -> x::xs, it 31 | | it -> [], it 32 | 33 | let rec (|LexNumber|_|) = function 34 | | Contains numeric (LexNumber it | it) -> Some it 35 | | _ -> None 36 | 37 | // This can cause Stack Overflow for long strings 38 | // let rec (|LexString|) = function 39 | // | C('"', it) 40 | // | C('\\', C(('"' | '\\' | '/' | 'b' | 'n' | 'r' | 't'), LexString it)) 41 | // | C('\\', C('u', C(_, C(_, C(_, C(_, LexString it)))))) 42 | // | C(_, LexString it) 43 | // | it -> it 44 | 45 | let (|LexString|) (s: string, start: int) = 46 | let mutable i = start 47 | let mutable finished = false 48 | while not finished do 49 | match s, i with 50 | | C('"', (_, i2)) -> 51 | i <- i2 52 | finished <- true 53 | | C('\\', C(('"' | '\\' | '/' | 'b' | 'n' | 'r' | 't'), (_, i2))) 54 | | C('\\', C('u', C(_, C(_, C(_, C(_, (_, i2))))))) 55 | | C(_, (_, i2)) -> 56 | i <- i2 57 | | _ -> 58 | finished <- true 59 | s, i 60 | 61 | let rec (|Lex|_|) = function 62 | | Contains whitespace it -> (|Lex|_|) it 63 | | C('n', C('u', C('l', C('l', it)))) -> Some(LITERAL Null, it) 64 | | C('t', C('r', C('u', C('e', it)))) -> Some(LITERAL(Bool true), it) 65 | | C('f', C('a', C('l', C('s', C('e', it))))) -> Some(LITERAL(Bool false), it) 66 | | LexNumber((s, last) as it) & (_, first) -> 67 | Some(LITERAL(Number(float s.[first..last-1])), it) 68 | | C('"', (LexString(it & (s, last)) & (_, first))) -> 69 | let s = System.Text.RegularExpressions.Regex.Unescape s.[first..last-2] 70 | Some(LITERAL(String s), it) 71 | | C('[', it) -> Some(ARRAY Open, it) 72 | | C(']', it) -> Some(ARRAY Close, it) 73 | | C('{', it) -> Some(OBJECT Open, it) 74 | | C('}', it) -> Some(OBJECT Close, it) 75 | | _ -> None 76 | 77 | let rec (|ParseJSON|_|) = function 78 | | Lex(LITERAL json, it) -> Some(json, it) 79 | | Lex(ARRAY Open, Star (|ParseJSON|_|) (jsons, Lex(ARRAY Close, it))) -> 80 | Some(Array jsons, it) 81 | | Lex(OBJECT Open, Star (|ParseMember|_|) (members, Lex(OBJECT Close, it))) -> 82 | Some(Object members, it) 83 | | _ -> None 84 | 85 | and (|ParseMember|_|) = function 86 | | Lex(LITERAL(String key), ParseJSON(value, it)) -> Some((key, value), it) 87 | | _ -> None 88 | 89 | let parse s = (|ParseJSON|_|) (s, 0) |> Option.map fst -------------------------------------------------------------------------------- /src/ProviderDsl.fs: -------------------------------------------------------------------------------- 1 | module rec ProviderDsl 2 | 3 | open System.Reflection 4 | open FSharp.Quotations 5 | open ProviderImplementation.ProvidedTypes 6 | 7 | type Member = 8 | | ChildType of System.Type 9 | | Property of name: string * typ: ErasedType * isStatic: bool * body: (Expr list -> Expr) 10 | | Method of name: string * args: (string * ErasedType) list * typ: ErasedType * isStatic: bool * body: (Expr list -> Expr) 11 | | Constructor of args: (string * ErasedType) list * body: (Expr list -> Expr) 12 | 13 | type ErasedType = 14 | | Any 15 | | Bool 16 | | Int 17 | | Float 18 | | String 19 | | Array of ErasedType 20 | | Option of ErasedType 21 | | Custom of System.Type 22 | | Tuple of ErasedType list 23 | 24 | let addMembers (t: ProvidedTypeDefinition) members = 25 | for memb in members do 26 | let memb: MemberInfo = 27 | match memb with 28 | | ChildType t -> 29 | upcast t 30 | | Property(name, typ, isStatic, body) -> 31 | upcast ProvidedProperty(name, makeType typ, isStatic = isStatic, getterCode = body) 32 | | Method(name, args, typ, isStatic, body) -> 33 | let args = args |> List.map (fun (name, t) -> ProvidedParameter(name, makeType t)) 34 | upcast ProvidedMethod(name, args, makeType typ, isStatic = isStatic, invokeCode = body) 35 | | Constructor(args, body) -> 36 | let args = args |> List.map (fun (name, t) -> ProvidedParameter(name, makeType t)) 37 | upcast ProvidedConstructor(args, invokeCode = body) 38 | t.AddMember(memb) 39 | 40 | let makeType = function 41 | | Any -> typeof 42 | | Bool -> typeof 43 | | Int -> typeof 44 | | Float -> typeof 45 | | String -> typeof 46 | | Array t -> (makeType t).MakeArrayType() 47 | | Option t -> typedefof>.MakeGenericType(makeType t) 48 | | Custom t -> t 49 | | Tuple ts -> 50 | match ts with 51 | | [] | [_] -> failwith "Tuple with only one or none items" 52 | | [t1; t2] -> typedefof.MakeGenericType(makeType t1, makeType t2) 53 | | [t1; t2; t3] -> typedefof.MakeGenericType(makeType t1, makeType t2, makeType t3) 54 | | [t1; t2; t3; t4] -> typedefof.MakeGenericType(makeType t1, makeType t2, makeType t3, makeType t4) 55 | | _ -> failwith "TODO: Tuples of more than 4 items" 56 | 57 | let makeCustomType(name: string, members: Member seq): System.Type = 58 | let t = ProvidedTypeDefinition(name, baseType = Some typeof, hideObjectMethods = true, isErased = true) 59 | addMembers t members 60 | upcast t 61 | 62 | let makeRootType(assembly: Assembly, nameSpace: string, typeName: string, members: Member seq) = 63 | let root = ProvidedTypeDefinition(assembly, nameSpace, typeName, baseType = Some typeof, hideObjectMethods = true, isErased = true) 64 | addMembers root members 65 | root 66 | -------------------------------------------------------------------------------- /test/App.fs: -------------------------------------------------------------------------------- 1 | module App 2 | 3 | open Elmish 4 | open Elmish.React 5 | open Fable.React 6 | open Fable.React.Props 7 | open Fable.SimpleHttp 8 | 9 | let [] FILE_JSON = "test.json" 10 | let [] FILE_JSON_PATH = "../public/" + FILE_JSON 11 | let [] REMOTE_JSON = "https://jsonplaceholder.typicode.com/todos" 12 | let [] LITERAL_JSON = """{ 13 | "widget": { 14 | "debug": "on", 15 | "window": { 16 | "title": "Sample Konfabulator Widget", 17 | "name": "main_window", 18 | "width": 500, 19 | "height": 500 20 | }, 21 | "image": { 22 | "src": "Images/Sun.png", 23 | "name": "sun1", 24 | "hOffset": 250, 25 | "vOffset": 250, 26 | "alignment": "center" 27 | }, 28 | "text": { 29 | "data": "Click Here", 30 | "size": [{ "width": 36, "height": 40 }], 31 | "style": "bold", 32 | "name": "text1", 33 | "vOffset": 100, 34 | "alignment": "center", 35 | "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;" 36 | } 37 | } 38 | }""" 39 | 40 | type LiteralJson = Fable.JsonProvider.Generator 41 | type FileJson = Fable.JsonProvider.Generator 42 | type RemoteJson = Fable.JsonProvider.Generator 43 | 44 | type Model = 45 | { LiteralJson: string 46 | ParsedLiteralJson: LiteralJson 47 | ParsedFileJson: FileJson option 48 | ParsedRemoteJson: RemoteJson[] option 49 | SelectedIndex: int } 50 | 51 | type Msg = 52 | | LiteralJsonUpdated of string 53 | | FileJsonLoaded of string option 54 | | RemoteJsonLoaded of string option 55 | | IndexUpdated of int 56 | 57 | let download url = async { 58 | let! (_, res) = Http.get url 59 | return res 60 | } 61 | 62 | let init() : Model * Cmd = 63 | let json = LITERAL_JSON 64 | let cmd1 = Cmd.OfAsync.either download FILE_JSON 65 | (Some >> FileJsonLoaded) 66 | (fun _ -> FileJsonLoaded None) 67 | let cmd2 = Cmd.OfAsync.either download REMOTE_JSON 68 | (Some >> RemoteJsonLoaded) 69 | (fun _ -> RemoteJsonLoaded None) 70 | { LiteralJson = json 71 | ParsedLiteralJson = LiteralJson(json) 72 | ParsedFileJson = None 73 | ParsedRemoteJson = None 74 | SelectedIndex = 0 }, Cmd.batch [cmd1; cmd2] 75 | 76 | let update (msg:Msg) (model:Model) = 77 | match msg with 78 | | LiteralJsonUpdated json -> 79 | try 80 | let parsed = LiteralJson json 81 | { model with LiteralJson = json; ParsedLiteralJson = parsed }, Cmd.none 82 | with _ -> 83 | { model with LiteralJson = json }, Cmd.none 84 | | FileJsonLoaded json -> 85 | { model with ParsedFileJson = Option.map FileJson json }, Cmd.none 86 | | RemoteJsonLoaded json -> 87 | { model with ParsedRemoteJson = Option.map RemoteJson.ParseArray json }, Cmd.none 88 | | IndexUpdated i -> 89 | { model with SelectedIndex = i }, Cmd.none 90 | 91 | let view (model:Model) dispatch = 92 | let par label txt = 93 | p [] [strong [] [str (label + ": ")]; str txt] 94 | div [] [ 95 | div [] 96 | [ yield h2 [] [str "Remote JSON"] 97 | match model.ParsedRemoteJson with 98 | | None -> () 99 | | Some todos -> 100 | let todo = todos.[model.SelectedIndex] 101 | yield select 102 | [Value model.SelectedIndex 103 | OnChange (fun ev -> int ev.Value |> IndexUpdated |> dispatch)] 104 | [for i = 0 to todos.Length - 1 do 105 | yield option [Value i] [str (string i)]] 106 | yield par "Id" (string todo.id) 107 | yield par "UserId" (string todo.userId) 108 | yield par "Title" todo.title 109 | yield par "Completed" (string todo.completed) 110 | ] 111 | div [] 112 | [ yield h2 [] [str "File JSON"] 113 | match model.ParsedFileJson with 114 | | None -> () 115 | | Some json -> 116 | yield par "Title" json.glossary.title 117 | yield par "Glossary Term" json.glossary.GlossDiv.GlossList.GlossEntry.GlossTerm 118 | yield par "ISO" json.glossary.GlossDiv.GlossList.GlossEntry.Abbrev 119 | ] 120 | div [] 121 | [ h2 [] [str "Literal JSON"] 122 | par "Window Title" model.ParsedLiteralJson.widget.window.title 123 | par "Image Source" model.ParsedLiteralJson.widget.image.src 124 | par "Text Size" (sprintf "%f" model.ParsedLiteralJson.widget.text.size.[0].width) 125 | textarea [OnChange (fun ev -> LiteralJsonUpdated ev.Value |> dispatch) 126 | Style [Width "600px"; Height "600px"] 127 | Value model.LiteralJson] [] 128 | ] 129 | ] 130 | 131 | // App 132 | Program.mkProgram init update view 133 | |> Program.withReactSynchronous "elmish-app" 134 | |> Program.withConsoleTrace 135 | |> Program.run 136 | -------------------------------------------------------------------------------- /test/App.fsproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | netstandard2.0 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import react from '@vitejs/plugin-react' 3 | 4 | export default defineConfig({ 5 | plugins: [react()] 6 | }) --------------------------------------------------------------------------------