├── .DS_Store ├── .devcontainer └── devcontainer.json ├── .gitignore ├── .hintrc ├── .vscode ├── extensions.json ├── launch.json ├── settings.json └── tasks.json ├── CODE_OF_CONDUCT.md ├── DB_SETUP ├── CREATE_DATABASE.sh ├── GET_CONNECTION_STRING.sh ├── POPULATE_DATABASE.js ├── package-lock.json ├── package.json └── products.json ├── LICENSE ├── README.md ├── SECURITY.md ├── api ├── .funcignore ├── .gitignore ├── host.json ├── local.settings.sample.json ├── package-lock.json ├── package.json ├── src │ ├── functions │ │ ├── CreateProduct.ts │ │ ├── DeleteProduct.ts │ │ └── UpdateProduct.ts │ ├── index.ts │ └── services │ │ └── product.services.ts └── tsconfig.json ├── frontend ├── index.html ├── index.js ├── package-lock.json └── package.json ├── package-lock.json └── products-manager.code-workspace /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDocs/mslearn-build-api-azure-functions/af2873eda025e6b02d00aff47ae336d9a0f1f839/.DS_Store -------------------------------------------------------------------------------- /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | // For format details, see https://aka.ms/devcontainer.json. For config options, see the 2 | // README at: https://github.com/devcontainers/templates/tree/main/src/javascript-node 3 | { 4 | "name": "Node.js", 5 | // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile 6 | "image": "mcr.microsoft.com/devcontainers/javascript-node:1-20-bullseye", 7 | "features": { 8 | "ghcr.io/devcontainers/features/node:1": {}, 9 | "ghcr.io/devcontainers-contrib/features/npm-package:1": {}, 10 | "ghcr.io/devcontainers-contrib/features/prettier:1": {}, 11 | "ghcr.io/jlaundry/devcontainer-features/azure-functions-core-tools:1": {}, 12 | "ghcr.io/devcontainers-community/npm-features/typescript:1": {} 13 | }, 14 | "customizations": { 15 | "vscode": { 16 | "extensions": [ 17 | "ms-azuretools.vscode-azurefunctions", 18 | "ms-vscode.azure-account", 19 | "github.vscode-github-actions", 20 | "GitHub.copilot", 21 | "GitHub.copilot-chat", 22 | "christian-kohler.npm-intellisense", 23 | "ms-vscode.vscode-typescript-next", 24 | "esbenp.prettier-vscode", 25 | "dbaeumer.vscode-eslint", 26 | "jasonnutter.search-node-modules", 27 | "xabikos.JavaScriptSnippets" 28 | ] 29 | } 30 | }, 31 | 32 | // Features to add to the dev container. More info: https://containers.dev/features. 33 | // "features": {}, 34 | 35 | // Use 'forwardPorts' to make a list of ports inside the container available locally. 36 | "forwardPorts": [3000, 7071] 37 | 38 | // Use 'postCreateCommand' to run commands after the container is created. 39 | // "postCreateCommand": "yarn install", 40 | 41 | // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. 42 | // "remoteUser": "root" 43 | } 44 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 5 | 6 | # User-specific files 7 | *.rsuser 8 | *.suo 9 | *.user 10 | *.userosscache 11 | *.sln.docstates 12 | 13 | # User-specific files (MonoDevelop/Xamarin Studio) 14 | *.userprefs 15 | 16 | # Mono auto generated files 17 | mono_crash.* 18 | 19 | # Build results 20 | [Dd]ebug/ 21 | [Dd]ebugPublic/ 22 | [Rr]elease/ 23 | [Rr]eleases/ 24 | x64/ 25 | x86/ 26 | [Aa][Rr][Mm]/ 27 | [Aa][Rr][Mm]64/ 28 | bld/ 29 | [Bb]in/ 30 | [Oo]bj/ 31 | [Ll]og/ 32 | [Ll]ogs/ 33 | 34 | # Visual Studio 2015/2017 cache/options directory 35 | .vs/ 36 | # Uncomment if you have tasks that create the project's static files in wwwroot 37 | #wwwroot/ 38 | 39 | # Visual Studio 2017 auto generated files 40 | Generated\ Files/ 41 | 42 | # MSTest test Results 43 | [Tt]est[Rr]esult*/ 44 | [Bb]uild[Ll]og.* 45 | 46 | # NUnit 47 | *.VisualState.xml 48 | TestResult.xml 49 | nunit-*.xml 50 | 51 | # Build Results of an ATL Project 52 | [Dd]ebugPS/ 53 | [Rr]eleasePS/ 54 | dlldata.c 55 | 56 | # Benchmark Results 57 | BenchmarkDotNet.Artifacts/ 58 | 59 | # .NET Core 60 | project.lock.json 61 | project.fragment.lock.json 62 | artifacts/ 63 | 64 | # StyleCop 65 | StyleCopReport.xml 66 | 67 | # Files built by Visual Studio 68 | *_i.c 69 | *_p.c 70 | *_h.h 71 | *.ilk 72 | *.meta 73 | *.obj 74 | *.iobj 75 | *.pch 76 | *.pdb 77 | *.ipdb 78 | *.pgc 79 | *.pgd 80 | *.rsp 81 | *.sbr 82 | *.tlb 83 | *.tli 84 | *.tlh 85 | *.tmp 86 | *.tmp_proj 87 | *_wpftmp.csproj 88 | *.log 89 | *.vspscc 90 | *.vssscc 91 | .builds 92 | *.pidb 93 | *.svclog 94 | *.scc 95 | 96 | # Chutzpah Test files 97 | _Chutzpah* 98 | 99 | # Visual C++ cache files 100 | ipch/ 101 | *.aps 102 | *.ncb 103 | *.opendb 104 | *.opensdf 105 | *.sdf 106 | *.cachefile 107 | *.VC.db 108 | *.VC.VC.opendb 109 | 110 | # Visual Studio profiler 111 | *.psess 112 | *.vsp 113 | *.vspx 114 | *.sap 115 | 116 | # Visual Studio Trace Files 117 | *.e2e 118 | 119 | # TFS 2012 Local Workspace 120 | $tf/ 121 | 122 | # Guidance Automation Toolkit 123 | *.gpState 124 | 125 | # ReSharper is a .NET coding add-in 126 | _ReSharper*/ 127 | *.[Rr]e[Ss]harper 128 | *.DotSettings.user 129 | 130 | # TeamCity is a build add-in 131 | _TeamCity* 132 | 133 | # DotCover is a Code Coverage Tool 134 | *.dotCover 135 | 136 | # AxoCover is a Code Coverage Tool 137 | .axoCover/* 138 | !.axoCover/settings.json 139 | 140 | # Visual Studio code coverage results 141 | *.coverage 142 | *.coveragexml 143 | 144 | # NCrunch 145 | _NCrunch_* 146 | .*crunch*.local.xml 147 | nCrunchTemp_* 148 | 149 | # MightyMoose 150 | *.mm.* 151 | AutoTest.Net/ 152 | 153 | # Web workbench (sass) 154 | .sass-cache/ 155 | 156 | # Installshield output folder 157 | [Ee]xpress/ 158 | 159 | # DocProject is a documentation generator add-in 160 | DocProject/buildhelp/ 161 | DocProject/Help/*.HxT 162 | DocProject/Help/*.HxC 163 | DocProject/Help/*.hhc 164 | DocProject/Help/*.hhk 165 | DocProject/Help/*.hhp 166 | DocProject/Help/Html2 167 | DocProject/Help/html 168 | 169 | # Click-Once directory 170 | publish/ 171 | 172 | # Publish Web Output 173 | *.[Pp]ublish.xml 174 | *.azurePubxml 175 | # Note: Comment the next line if you want to checkin your web deploy settings, 176 | # but database connection strings (with potential passwords) will be unencrypted 177 | *.pubxml 178 | *.publishproj 179 | 180 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 181 | # checkin your Azure Web App publish settings, but sensitive information contained 182 | # in these scripts will be unencrypted 183 | PublishScripts/ 184 | 185 | # NuGet Packages 186 | *.nupkg 187 | # NuGet Symbol Packages 188 | *.snupkg 189 | # The packages folder can be ignored because of Package Restore 190 | **/[Pp]ackages/* 191 | # except build/, which is used as an MSBuild target. 192 | !**/[Pp]ackages/build/ 193 | # Uncomment if necessary however generally it will be regenerated when needed 194 | #!**/[Pp]ackages/repositories.config 195 | # NuGet v3's project.json files produces more ignorable files 196 | *.nuget.props 197 | *.nuget.targets 198 | 199 | # Microsoft Azure Build Output 200 | csx/ 201 | *.build.csdef 202 | 203 | # Microsoft Azure Emulator 204 | ecf/ 205 | rcf/ 206 | 207 | # Windows Store app package directories and files 208 | AppPackages/ 209 | BundleArtifacts/ 210 | Package.StoreAssociation.xml 211 | _pkginfo.txt 212 | *.appx 213 | *.appxbundle 214 | *.appxupload 215 | 216 | # Visual Studio cache files 217 | # files ending in .cache can be ignored 218 | *.[Cc]ache 219 | # but keep track of directories ending in .cache 220 | !?*.[Cc]ache/ 221 | 222 | # Others 223 | ClientBin/ 224 | ~$* 225 | *~ 226 | *.dbmdl 227 | *.dbproj.schemaview 228 | *.jfm 229 | *.pfx 230 | *.publishsettings 231 | orleans.codegen.cs 232 | 233 | # Including strong name files can present a security risk 234 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 235 | #*.snk 236 | 237 | # Since there are multiple workflows, uncomment next line to ignore bower_components 238 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 239 | #bower_components/ 240 | 241 | # RIA/Silverlight projects 242 | Generated_Code/ 243 | 244 | # Backup & report files from converting an old project file 245 | # to a newer Visual Studio version. Backup files are not needed, 246 | # because we have git ;-) 247 | _UpgradeReport_Files/ 248 | Backup*/ 249 | UpgradeLog*.XML 250 | UpgradeLog*.htm 251 | ServiceFabricBackup/ 252 | *.rptproj.bak 253 | 254 | # SQL Server files 255 | *.mdf 256 | *.ldf 257 | *.ndf 258 | 259 | # Business Intelligence projects 260 | *.rdl.data 261 | *.bim.layout 262 | *.bim_*.settings 263 | *.rptproj.rsuser 264 | *- [Bb]ackup.rdl 265 | *- [Bb]ackup ([0-9]).rdl 266 | *- [Bb]ackup ([0-9][0-9]).rdl 267 | 268 | # Microsoft Fakes 269 | FakesAssemblies/ 270 | 271 | # GhostDoc plugin setting file 272 | *.GhostDoc.xml 273 | 274 | # Node.js Tools for Visual Studio 275 | .ntvs_analysis.dat 276 | node_modules/ 277 | 278 | # Visual Studio 6 build log 279 | *.plg 280 | 281 | # Visual Studio 6 workspace options file 282 | *.opt 283 | 284 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 285 | *.vbw 286 | 287 | # Visual Studio LightSwitch build output 288 | **/*.HTMLClient/GeneratedArtifacts 289 | **/*.DesktopClient/GeneratedArtifacts 290 | **/*.DesktopClient/ModelManifest.xml 291 | **/*.Server/GeneratedArtifacts 292 | **/*.Server/ModelManifest.xml 293 | _Pvt_Extensions 294 | 295 | # Paket dependency manager 296 | .paket/paket.exe 297 | paket-files/ 298 | 299 | # FAKE - F# Make 300 | .fake/ 301 | 302 | # CodeRush personal settings 303 | .cr/personal 304 | 305 | # Python Tools for Visual Studio (PTVS) 306 | __pycache__/ 307 | *.pyc 308 | 309 | # Cake - Uncomment if you are using it 310 | # tools/** 311 | # !tools/packages.config 312 | 313 | # Tabs Studio 314 | *.tss 315 | 316 | # Telerik's JustMock configuration file 317 | *.jmconfig 318 | 319 | # BizTalk build output 320 | *.btp.cs 321 | *.btm.cs 322 | *.odx.cs 323 | *.xsd.cs 324 | 325 | # OpenCover UI analysis results 326 | OpenCover/ 327 | 328 | # Azure Stream Analytics local run output 329 | ASALocalRun/ 330 | 331 | # MSBuild Binary and Structured Log 332 | *.binlog 333 | 334 | # NVidia Nsight GPU debugger configuration file 335 | *.nvuser 336 | 337 | # MFractors (Xamarin productivity tool) working folder 338 | .mfractor/ 339 | 340 | # Local History for Visual Studio 341 | .localhistory/ 342 | 343 | # BeatPulse healthcheck temp database 344 | healthchecksdb 345 | 346 | # Backup folder for Package Reference Convert tool in Visual Studio 2017 347 | MigrationBackup/ 348 | 349 | # Ionide (cross platform F# VS Code tools) working folder 350 | .ionide/ 351 | -------------------------------------------------------------------------------- /.hintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "development" 4 | ], 5 | "hints": { 6 | "typescript-config/strict": "off", 7 | "typescript-config/consistent-casing": "off" 8 | } 9 | } -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "ms-azuretools.vscode-azurefunctions" 4 | ] 5 | } -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "Attach to Node Functions", 6 | "type": "node", 7 | "request": "attach", 8 | "port": 9229, 9 | "preLaunchTask": "func: host start" 10 | } 11 | ] 12 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "azureFunctions.deploySubpath": "api", 3 | "azureFunctions.postDeployTask": "npm install (functions)", 4 | "azureFunctions.projectLanguage": "TypeScript", 5 | "azureFunctions.projectRuntime": "~4", 6 | "debug.internalConsoleOptions": "neverOpen", 7 | "azureFunctions.projectLanguageModel": 4, 8 | "azureFunctions.preDeployTask": "npm prune (functions)" 9 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [ 4 | { 5 | "type": "func", 6 | "label": "func: host start", 7 | "command": "host start", 8 | "problemMatcher": "$func-node-watch", 9 | "isBackground": true, 10 | "dependsOn": "npm build (functions)", 11 | "options": { 12 | "cwd": "${workspaceFolder}/api" 13 | } 14 | }, 15 | { 16 | "type": "shell", 17 | "label": "npm build (functions)", 18 | "command": "npm run build", 19 | "dependsOn": "npm clean (functions)", 20 | "problemMatcher": "$tsc", 21 | "options": { 22 | "cwd": "${workspaceFolder}/api" 23 | } 24 | }, 25 | { 26 | "type": "shell", 27 | "label": "npm install (functions)", 28 | "command": "npm install", 29 | "options": { 30 | "cwd": "${workspaceFolder}/api" 31 | } 32 | }, 33 | { 34 | "type": "shell", 35 | "label": "npm prune (functions)", 36 | "command": "npm prune --production", 37 | "dependsOn": "npm build (functions)", 38 | "problemMatcher": [], 39 | "options": { 40 | "cwd": "${workspaceFolder}/api" 41 | } 42 | }, 43 | { 44 | "type": "shell", 45 | "label": "npm clean (functions)", 46 | "command": "npm run clean", 47 | "dependsOn": "npm install (functions)", 48 | "options": { 49 | "cwd": "${workspaceFolder}/api" 50 | } 51 | } 52 | ] 53 | } -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Microsoft Open Source Code of Conduct 2 | 3 | This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). 4 | 5 | Resources: 6 | 7 | - [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/) 8 | - [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) 9 | - Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns 10 | -------------------------------------------------------------------------------- /DB_SETUP/CREATE_DATABASE.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | rnd=$RANDOM 3 | accountName=tailwind-traders-$RANDOM 4 | databaseName=tailwind 5 | containerName=products 6 | 7 | echo "Beginning database creation process..." 8 | 9 | groupName=$(az group list --query "[0].name" -o tsv) 10 | 11 | echo "Creating Cosmos DB database $accountName in Resource Group $groupName..." 12 | echo "This can take up to 10 minutes. Feel free to continue with the Learn Module." 13 | az cosmosdb create -n $accountName -g $groupName -o none -------------------------------------------------------------------------------- /DB_SETUP/GET_CONNECTION_STRING.sh: -------------------------------------------------------------------------------- 1 | databaseName=tailwind 2 | containerName=products 3 | 4 | # Get the connection string 5 | echo "Getting connection string. This might take up to two minutes as we prepare the database..." 6 | 7 | # Get the account name, which is randomized 8 | accountName=$(az cosmosdb list --query "[0].name" -o tsv) 9 | 10 | # Get the group name, which is preassigned 11 | groupName=$(az group list --query "[0].name" -o tsv) 12 | 13 | # Create the database 14 | az cosmosdb sql database create -a $accountName -g $groupName -n $databaseName -o none 15 | 16 | # Add products data 17 | az cosmosdb sql container create -g $groupName -a $accountName -d $databaseName -n $containerName -p /brand/name -o none 18 | 19 | endpoint=https://$accountName.documents.azure.com:443 20 | key=$(az cosmosdb keys list -g $groupName -n $accountName --type keys --query "primaryMasterKey" -o json) 21 | 22 | ## silent npm install 23 | npm install > "/dev/null" 2>&1 24 | 25 | node ./POPULATE_DATABASE.js --endpoint $endpoint --key $key --databaseName $databaseName --containerName $containerName 26 | 27 | echo "This is your connection string. Copy it to your clipboard..." 28 | az cosmosdb keys list -n $accountName -g $groupName --type connection-strings --query "connectionStrings[0].connectionString" -o tsv 29 | 30 | 31 | -------------------------------------------------------------------------------- /DB_SETUP/POPULATE_DATABASE.js: -------------------------------------------------------------------------------- 1 | const Cosmos = require("@azure/cosmos"); 2 | const products = require("./products.json"); 3 | const yargs = require("yargs"); 4 | 5 | // destructure command line arguments 6 | let { endpoint, key, databaseName, containerName } = yargs.argv; 7 | 8 | // create the cosmos client 9 | const client = new Cosmos.CosmosClient({ endpoint, key }); 10 | 11 | const database = client.database(databaseName); 12 | const container = database.container(containerName); 13 | 14 | // insert the items into Cosmos DB 15 | products.forEach(async product => { 16 | try { 17 | await container.items.create(product); 18 | } catch (err) { 19 | console.log(err.message); 20 | } 21 | }); 22 | -------------------------------------------------------------------------------- /DB_SETUP/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tailwind-products", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@azure/abort-controller": { 8 | "version": "1.1.0", 9 | "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz", 10 | "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==", 11 | "requires": { 12 | "tslib": "^2.2.0" 13 | } 14 | }, 15 | "@azure/core-auth": { 16 | "version": "1.4.0", 17 | "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.4.0.tgz", 18 | "integrity": "sha512-HFrcTgmuSuukRf/EdPmqBrc5l6Q5Uu+2TbuhaKbgaCpP2TfAeiNaQPAadxO+CYBRHGUzIDteMAjFspFLDLnKVQ==", 19 | "requires": { 20 | "@azure/abort-controller": "^1.0.0", 21 | "tslib": "^2.2.0" 22 | } 23 | }, 24 | "@azure/core-rest-pipeline": { 25 | "version": "1.11.0", 26 | "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.11.0.tgz", 27 | "integrity": "sha512-nB4KXl6qAyJmBVLWA7SakT4tzpYZTCk4pvRBeI+Ye0WYSOrlTqlMhc4MSS/8atD3ufeYWdkN380LLoXlUUzThw==", 28 | "requires": { 29 | "@azure/abort-controller": "^1.0.0", 30 | "@azure/core-auth": "^1.4.0", 31 | "@azure/core-tracing": "^1.0.1", 32 | "@azure/core-util": "^1.3.0", 33 | "@azure/logger": "^1.0.0", 34 | "form-data": "^4.0.0", 35 | "http-proxy-agent": "^5.0.0", 36 | "https-proxy-agent": "^5.0.0", 37 | "tslib": "^2.2.0" 38 | } 39 | }, 40 | "@azure/core-tracing": { 41 | "version": "1.0.1", 42 | "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz", 43 | "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==", 44 | "requires": { 45 | "tslib": "^2.2.0" 46 | } 47 | }, 48 | "@azure/core-util": { 49 | "version": "1.3.2", 50 | "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.3.2.tgz", 51 | "integrity": "sha512-2bECOUh88RvL1pMZTcc6OzfobBeWDBf5oBbhjIhT1MV9otMVWCzpOJkkiKtrnO88y5GGBelgY8At73KGAdbkeQ==", 52 | "requires": { 53 | "@azure/abort-controller": "^1.0.0", 54 | "tslib": "^2.2.0" 55 | } 56 | }, 57 | "@azure/cosmos": { 58 | "version": "3.17.3", 59 | "resolved": "https://registry.npmjs.org/@azure/cosmos/-/cosmos-3.17.3.tgz", 60 | "integrity": "sha512-wBglkQ6Irjv5Vo2iw8fd6eYj60WYRSSg4/0DBkeOP6BwQ4RA91znsOHd6s3qG6UAbNgYuzC9Nnq07vlFFZkHEw==", 61 | "requires": { 62 | "@azure/abort-controller": "^1.0.0", 63 | "@azure/core-auth": "^1.3.0", 64 | "@azure/core-rest-pipeline": "^1.2.0", 65 | "@azure/core-tracing": "^1.0.0", 66 | "debug": "^4.1.1", 67 | "fast-json-stable-stringify": "^2.1.0", 68 | "jsbi": "^3.1.3", 69 | "node-abort-controller": "^3.0.0", 70 | "priorityqueuejs": "^1.0.0", 71 | "semaphore": "^1.0.5", 72 | "tslib": "^2.2.0", 73 | "universal-user-agent": "^6.0.0", 74 | "uuid": "^8.3.0" 75 | } 76 | }, 77 | "@azure/logger": { 78 | "version": "1.0.4", 79 | "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.4.tgz", 80 | "integrity": "sha512-ustrPY8MryhloQj7OWGe+HrYx+aoiOxzbXTtgblbV3xwCqpzUK36phH3XNHQKj3EPonyFUuDTfR3qFhTEAuZEg==", 81 | "requires": { 82 | "tslib": "^2.2.0" 83 | } 84 | }, 85 | "@tootallnate/once": { 86 | "version": "2.0.0", 87 | "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", 88 | "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==" 89 | }, 90 | "agent-base": { 91 | "version": "6.0.2", 92 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 93 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 94 | "requires": { 95 | "debug": "4" 96 | } 97 | }, 98 | "ansi-regex": { 99 | "version": "5.0.1", 100 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 101 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" 102 | }, 103 | "ansi-styles": { 104 | "version": "4.3.0", 105 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 106 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 107 | "requires": { 108 | "color-convert": "^2.0.1" 109 | } 110 | }, 111 | "asynckit": { 112 | "version": "0.4.0", 113 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 114 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 115 | }, 116 | "camelcase": { 117 | "version": "5.3.1", 118 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 119 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" 120 | }, 121 | "cliui": { 122 | "version": "6.0.0", 123 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", 124 | "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", 125 | "requires": { 126 | "string-width": "^4.2.0", 127 | "strip-ansi": "^6.0.0", 128 | "wrap-ansi": "^6.2.0" 129 | } 130 | }, 131 | "color-convert": { 132 | "version": "2.0.1", 133 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 134 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 135 | "requires": { 136 | "color-name": "~1.1.4" 137 | } 138 | }, 139 | "color-name": { 140 | "version": "1.1.4", 141 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 142 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 143 | }, 144 | "combined-stream": { 145 | "version": "1.0.8", 146 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 147 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 148 | "requires": { 149 | "delayed-stream": "~1.0.0" 150 | } 151 | }, 152 | "debug": { 153 | "version": "4.3.4", 154 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 155 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 156 | "requires": { 157 | "ms": "2.1.2" 158 | } 159 | }, 160 | "decamelize": { 161 | "version": "1.2.0", 162 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 163 | "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==" 164 | }, 165 | "delayed-stream": { 166 | "version": "1.0.0", 167 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 168 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" 169 | }, 170 | "emoji-regex": { 171 | "version": "8.0.0", 172 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 173 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 174 | }, 175 | "fast-json-stable-stringify": { 176 | "version": "2.1.0", 177 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 178 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 179 | }, 180 | "find-up": { 181 | "version": "4.1.0", 182 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 183 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 184 | "requires": { 185 | "locate-path": "^5.0.0", 186 | "path-exists": "^4.0.0" 187 | } 188 | }, 189 | "form-data": { 190 | "version": "4.0.0", 191 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 192 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 193 | "requires": { 194 | "asynckit": "^0.4.0", 195 | "combined-stream": "^1.0.8", 196 | "mime-types": "^2.1.12" 197 | } 198 | }, 199 | "get-caller-file": { 200 | "version": "2.0.5", 201 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 202 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" 203 | }, 204 | "http-proxy-agent": { 205 | "version": "5.0.0", 206 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", 207 | "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", 208 | "requires": { 209 | "@tootallnate/once": "2", 210 | "agent-base": "6", 211 | "debug": "4" 212 | } 213 | }, 214 | "https-proxy-agent": { 215 | "version": "5.0.1", 216 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", 217 | "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", 218 | "requires": { 219 | "agent-base": "6", 220 | "debug": "4" 221 | } 222 | }, 223 | "is-fullwidth-code-point": { 224 | "version": "3.0.0", 225 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 226 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" 227 | }, 228 | "jsbi": { 229 | "version": "3.2.5", 230 | "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-3.2.5.tgz", 231 | "integrity": "sha512-aBE4n43IPvjaddScbvWRA2YlTzKEynHzu7MqOyTipdHucf/VxS63ViCjxYRg86M8Rxwbt/GfzHl1kKERkt45fQ==" 232 | }, 233 | "locate-path": { 234 | "version": "5.0.0", 235 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 236 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 237 | "requires": { 238 | "p-locate": "^4.1.0" 239 | } 240 | }, 241 | "mime-db": { 242 | "version": "1.52.0", 243 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 244 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 245 | }, 246 | "mime-types": { 247 | "version": "2.1.35", 248 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 249 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 250 | "requires": { 251 | "mime-db": "1.52.0" 252 | } 253 | }, 254 | "ms": { 255 | "version": "2.1.2", 256 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 257 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 258 | }, 259 | "node-abort-controller": { 260 | "version": "3.1.1", 261 | "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", 262 | "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==" 263 | }, 264 | "p-limit": { 265 | "version": "2.3.0", 266 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 267 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 268 | "requires": { 269 | "p-try": "^2.0.0" 270 | } 271 | }, 272 | "p-locate": { 273 | "version": "4.1.0", 274 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 275 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 276 | "requires": { 277 | "p-limit": "^2.2.0" 278 | } 279 | }, 280 | "p-try": { 281 | "version": "2.2.0", 282 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 283 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" 284 | }, 285 | "path-exists": { 286 | "version": "4.0.0", 287 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 288 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" 289 | }, 290 | "priorityqueuejs": { 291 | "version": "1.0.0", 292 | "resolved": "https://registry.npmjs.org/priorityqueuejs/-/priorityqueuejs-1.0.0.tgz", 293 | "integrity": "sha512-lg++21mreCEOuGWTbO5DnJKAdxfjrdN0S9ysoW9SzdSJvbkWpkaDdpG/cdsPCsEnoLUwmd9m3WcZhngW7yKA2g==" 294 | }, 295 | "require-directory": { 296 | "version": "2.1.1", 297 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 298 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" 299 | }, 300 | "require-main-filename": { 301 | "version": "2.0.0", 302 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 303 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" 304 | }, 305 | "semaphore": { 306 | "version": "1.1.0", 307 | "resolved": "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz", 308 | "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==" 309 | }, 310 | "semver": { 311 | "version": "5.7.2", 312 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", 313 | "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" 314 | }, 315 | "set-blocking": { 316 | "version": "2.0.0", 317 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 318 | "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" 319 | }, 320 | "string-width": { 321 | "version": "4.2.3", 322 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 323 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 324 | "requires": { 325 | "emoji-regex": "^8.0.0", 326 | "is-fullwidth-code-point": "^3.0.0", 327 | "strip-ansi": "^6.0.1" 328 | } 329 | }, 330 | "strip-ansi": { 331 | "version": "6.0.1", 332 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 333 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 334 | "requires": { 335 | "ansi-regex": "^5.0.1" 336 | } 337 | }, 338 | "tslib": { 339 | "version": "2.5.3", 340 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", 341 | "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" 342 | }, 343 | "universal-user-agent": { 344 | "version": "6.0.0", 345 | "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", 346 | "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" 347 | }, 348 | "uuid": { 349 | "version": "8.3.2", 350 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 351 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" 352 | }, 353 | "which-module": { 354 | "version": "2.0.0", 355 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 356 | "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" 357 | }, 358 | "wrap-ansi": { 359 | "version": "6.2.0", 360 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", 361 | "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", 362 | "requires": { 363 | "ansi-styles": "^4.0.0", 364 | "string-width": "^4.1.0", 365 | "strip-ansi": "^6.0.0" 366 | } 367 | }, 368 | "y18n": { 369 | "version": "4.0.3", 370 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", 371 | "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" 372 | }, 373 | "yargs": { 374 | "version": "15.4.1", 375 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", 376 | "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", 377 | "requires": { 378 | "cliui": "^6.0.0", 379 | "decamelize": "^1.2.0", 380 | "find-up": "^4.1.0", 381 | "get-caller-file": "^2.0.1", 382 | "require-directory": "^2.1.1", 383 | "require-main-filename": "^2.0.0", 384 | "set-blocking": "^2.0.0", 385 | "string-width": "^4.2.0", 386 | "which-module": "^2.0.0", 387 | "y18n": "^4.0.0", 388 | "yargs-parser": "^18.1.2" 389 | } 390 | }, 391 | "yargs-parser": { 392 | "version": "18.1.3", 393 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", 394 | "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", 395 | "requires": { 396 | "camelcase": "^5.0.0", 397 | "decamelize": "^1.2.0" 398 | } 399 | } 400 | } 401 | } 402 | -------------------------------------------------------------------------------- /DB_SETUP/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tailwind-products", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "POPULATE_DATABASE.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/burkeholland/tailwind-products.git" 12 | }, 13 | "keywords": [], 14 | "author": "", 15 | "license": "ISC", 16 | "bugs": { 17 | "url": "https://github.com/burkeholland/tailwind-products/issues" 18 | }, 19 | "homepage": "https://github.com/burkeholland/tailwind-products#readme", 20 | "dependencies": { 21 | "@azure/cosmos": "^3.17.3", 22 | "yargs": "15.4.1" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /DB_SETUP/products.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "Single red garden gnome", 4 | "price": 56, 5 | "brand": { 6 | "name": "Home & Pro tools" 7 | }, 8 | "stockUnits": 98 9 | }, 10 | { 11 | "name": "Two red garden gnomes", 12 | "price": 92, 13 | "brand": { 14 | "name": "Home & Pro tools" 15 | }, 16 | "stockUnits": 4 17 | }, 18 | { 19 | "name": "One sat gnome", 20 | "price": 34, 21 | "brand": { 22 | "name": "Home & Pro tools" 23 | }, 24 | "stockUnits": 34 25 | }, 26 | { 27 | "name": "One sat on shoe gnome", 28 | "price": 54, 29 | "brand": { 30 | "name": "Home & Pro tools" 31 | }, 32 | "stockUnits": 54 33 | }, 34 | { 35 | "name": "One barrow gnome", 36 | "price": 29, 37 | "brand": { 38 | "name": "Home & Pro tools" 39 | }, 40 | "stockUnits": 23 41 | }, 42 | { 43 | "name": "One glasses gnome", 44 | "price": 54, 45 | "brand": { 46 | "name": "Home & Pro tools" 47 | }, 48 | "stockUnits": 94 49 | }, 50 | { 51 | "name": "One smiling gnome", 52 | "price": 43, 53 | "brand": { 54 | "name": "Home & Pro tools" 55 | }, 56 | "stockUnits": 45 57 | }, 58 | { 59 | "name": "Two singing gnomes", 60 | "price": 65, 61 | "brand": { 62 | "name": "Home & Pro tools" 63 | }, 64 | "stockUnits": 78 65 | }, 66 | { 67 | "name": "Two sleeping gnomes", 68 | "price": 32, 69 | "brand": { 70 | "name": "Home & Pro tools" 71 | }, 72 | "stockUnits": 12 73 | }, 74 | { 75 | "name": "Seven-pack gnomes", 76 | "price": 2543, 77 | "brand": { 78 | "name": "Home & Pro tools" 79 | }, 80 | "stockUnits": 45 81 | }, 82 | { 83 | "name": "One afraid gnome", 84 | "price": 39, 85 | "brand": { 86 | "name": "Home & Pro tools" 87 | }, 88 | "stockUnits": 88 89 | }, 90 | { 91 | "name": "One welcome gnome", 92 | "price": 28, 93 | "brand": { 94 | "name": "Home & Pro tools" 95 | }, 96 | "stockUnits": 65 97 | }, 98 | { 99 | "name": "Two smiling gnomes", 100 | "price": 76, 101 | "brand": { 102 | "name": "Home & Pro tools" 103 | }, 104 | "stockUnits": 87 105 | }, 106 | { 107 | "name": "Microwave 33.9 Cu. Ft. 92325 W", 108 | "price": 1740, 109 | "brand": { 110 | "name": "ElctroDrill" 111 | }, 112 | "stockUnits": 58 113 | }, 114 | { 115 | "name": "Refrigerator 1.7 cu. ft. 110 watts", 116 | "price": 200, 117 | "brand": { 118 | "name": "ProSaws" 119 | }, 120 | "stockUnits": 54 121 | }, 122 | { 123 | "name": "Oven 900 W", 124 | "price": 300, 125 | "brand": { 126 | "name": "Drills Co" 127 | }, 128 | "stockUnits": 389 129 | }, 130 | { 131 | "name": "Washing machine 1200rpm", 132 | "price": 400, 133 | "brand": { 134 | "name": "Home & Pro tools" 135 | }, 136 | "stockUnits": 45 137 | }, 138 | { 139 | "name": "Washing machine 900rpm", 140 | "price": 300, 141 | "brand": { 142 | "name": "ElctroDrill" 143 | }, 144 | "stockUnits": 27 145 | }, 146 | { 147 | "name": "Kitchen stoves ", 148 | "price": 1400, 149 | "brand": { 150 | "name": "Home & Pro tools" 151 | }, 152 | "stockUnits": 58 153 | }, 154 | { 155 | "name": "Refrigerator ft. 90 watts", 156 | "price": 400, 157 | "brand": { 158 | "name": "ProSaws" 159 | }, 160 | "stockUnits": 25 161 | }, 162 | { 163 | "name": "One Handle Stainless Steel Pull Out Kitchen Faucet", 164 | "price": 20, 165 | "brand": { 166 | "name": "ProSaws" 167 | }, 168 | "stockUnits": 65 169 | }, 170 | { 171 | "name": "Bathing System Classic 18 in. H x 60 in. W x 32.5", 172 | "price": 200, 173 | "brand": { 174 | "name": "ElctroDrill" 175 | }, 176 | "stockUnits": 38 177 | }, 178 | { 179 | "name": "Showerhead 1.75 gpm", 180 | "price": 40, 181 | "brand": { 182 | "name": "ElctroDrill" 183 | }, 184 | "stockUnits": 32 185 | }, 186 | { 187 | "name": "Toilet 1.28 gal.", 188 | "price": 180, 189 | "brand": { 190 | "name": "ElctroDrill" 191 | }, 192 | "stockUnits": 35 193 | }, 194 | { 195 | "name": "Black Bathing System Classic 18 in. H x 60 in. W x 32.5", 196 | "price": 250, 197 | "brand": { 198 | "name": "Home & Pro tools" 199 | }, 200 | "stockUnits": 35 201 | }, 202 | { 203 | "name": "Bathroom Sink Faucet Waterfall", 204 | "price": 175, 205 | "brand": { 206 | "name": "Home & Pro tools" 207 | }, 208 | "stockUnits": 32 209 | }, 210 | { 211 | "name": "Bathroom Sink Faucet", 212 | "price": 99, 213 | "brand": { 214 | "name": "Home & Pro tools" 215 | }, 216 | "stockUnits": 15 217 | }, 218 | { 219 | "name": "Bathroom Sink Faucet Classic", 220 | "price": 100, 221 | "brand": { 222 | "name": "ProSaws" 223 | }, 224 | "stockUnits": 12 225 | }, 226 | { 227 | "name": "Showerhead 1.20 gpm", 228 | "price": 125, 229 | "brand": { 230 | "name": "ProSaws" 231 | }, 232 | "stockUnits": 14 233 | }, 234 | { 235 | "name": "Blend Solid White Sheer Curtains", 236 | "price": 110, 237 | "brand": { 238 | "name": "ProSaws" 239 | }, 240 | "stockUnits": 18 241 | }, 242 | { 243 | "name": "Door Hardware Kit Single Door", 244 | "price": 120, 245 | "brand": { 246 | "name": "Drills Co" 247 | }, 248 | "stockUnits": 61 249 | }, 250 | { 251 | "name": "White Sheer Curtains", 252 | "price": 105, 253 | "brand": { 254 | "name": "Drills Co" 255 | }, 256 | "stockUnits": 95 257 | }, 258 | { 259 | "name": "White Window", 260 | "price": 120, 261 | "brand": { 262 | "name": "Drills Co" 263 | }, 264 | "stockUnits": 32 265 | }, 266 | { 267 | "name": "Curtain Rod 48 in", 268 | "price": 25, 269 | "brand": { 270 | "name": "Drills Co" 271 | }, 272 | "stockUnits": 52 273 | }, 274 | { 275 | "name": "Steel Passage Door Knob", 276 | "price": 10, 277 | "brand": { 278 | "name": "ElctroDrill" 279 | }, 280 | "stockUnits": 41 281 | }, 282 | { 283 | "name": "White Door", 284 | "price": 123, 285 | "brand": { 286 | "name": "ElctroDrill" 287 | }, 288 | "stockUnits": 15 289 | }, 290 | { 291 | "name": "White Window Wood", 292 | "price": 230, 293 | "brand": { 294 | "name": "ElctroDrill" 295 | }, 296 | "stockUnits": 84 297 | }, 298 | { 299 | "name": "Indoor Kit Gardering", 300 | "price": 70, 301 | "brand": { 302 | "name": "ProSaws" 303 | }, 304 | "stockUnits": 25 305 | }, 306 | { 307 | "name": "Craftsman 100 ft. L x 5/8 in.", 308 | "price": 100, 309 | "brand": { 310 | "name": "ProSaws" 311 | }, 312 | "stockUnits": 74 313 | }, 314 | { 315 | "name": "Metal Watering Can", 316 | "price": 20, 317 | "brand": { 318 | "name": "ProSaws" 319 | }, 320 | "stockUnits": 59 321 | }, 322 | { 323 | "name": "Steel Contractor Wheelbarrow", 324 | "price": 100, 325 | "brand": { 326 | "name": "ProSaws" 327 | }, 328 | "stockUnits": 65 329 | }, 330 | { 331 | "name": "Craftsman 21 in. W 140", 332 | "price": 200, 333 | "brand": { 334 | "name": "ProSaws" 335 | }, 336 | "stockUnits": 82 337 | }, 338 | { 339 | "name": "Gardering", 340 | "price": 10, 341 | "brand": { 342 | "name": "Home & Pro tools" 343 | }, 344 | "stockUnits": 51 345 | }, 346 | { 347 | "name": "Celebrations C9", 348 | "price": 10, 349 | "brand": { 350 | "name": "Home & Pro tools" 351 | }, 352 | "stockUnits": 96 353 | }, 354 | { 355 | "name": "Artificial Tree", 356 | "price": 250, 357 | "brand": { 358 | "name": "Home & Pro tools" 359 | }, 360 | "stockUnits": 654 361 | }, 362 | { 363 | "name": "Celebrations C8", 364 | "price": 5, 365 | "brand": { 366 | "name": "Home & Pro tools" 367 | }, 368 | "stockUnits": 21 369 | }, 370 | { 371 | "name": "Artificial Tree Big", 372 | "price": 300, 373 | "brand": { 374 | "name": "Home & Pro tools" 375 | }, 376 | "stockUnits": 32 377 | }, 378 | { 379 | "name": "Wood Pack", 380 | "price": 30, 381 | "brand": { 382 | "name": "ElctroDrill" 383 | }, 384 | "stockUnits": 25 385 | }, 386 | { 387 | "name": "Wood Table", 388 | "price": 395, 389 | "brand": { 390 | "name": "ElctroDrill" 391 | }, 392 | "stockUnits": 68 393 | }, 394 | { 395 | "name": "Kitchen Stoves", 396 | "price": 85, 397 | "brand": { 398 | "name": "ElctroDrill" 399 | }, 400 | "stockUnits": 96 401 | }, 402 | { 403 | "name": "Kit Metal Casseroles", 404 | "price": 125, 405 | "brand": { 406 | "name": "Drills Co" 407 | }, 408 | "stockUnits": 64 409 | }, 410 | { 411 | "name": "Coffee Maker Red", 412 | "price": 200, 413 | "brand": { 414 | "name": "Drills Co" 415 | }, 416 | "stockUnits": 68 417 | }, 418 | { 419 | "name": "Extractor Steal", 420 | "price": 135, 421 | "brand": { 422 | "name": "Drills Co" 423 | }, 424 | "stockUnits": 35 425 | }, 426 | { 427 | "name": "Wooden Commode", 428 | "price": 50, 429 | "brand": { 430 | "name": "ElctroDrill" 431 | }, 432 | "stockUnits": 37 433 | }, 434 | { 435 | "name": "Metal Shelving", 436 | "price": 90, 437 | "brand": { 438 | "name": "ElctroDrill" 439 | }, 440 | "stockUnits": 95 441 | }, 442 | { 443 | "name": "Big Metal Shelving", 444 | "price": 99, 445 | "brand": { 446 | "name": "Home & Pro tools" 447 | }, 448 | "stockUnits": 6 449 | }, 450 | { 451 | "name": "Wooden Wardrobe", 452 | "price": 120, 453 | "brand": { 454 | "name": "Home & Pro tools" 455 | }, 456 | "stockUnits": 6 457 | }, 458 | { 459 | "name": "Wooden Saw", 460 | "price": 145, 461 | "brand": { 462 | "name": "ProSaws" 463 | }, 464 | "stockUnits": 65 465 | }, 466 | { 467 | "name": "Measuring Tape", 468 | "price": 123, 469 | "brand": { 470 | "name": "ProSaws" 471 | }, 472 | "stockUnits": 84 473 | }, 474 | { 475 | "name": "Multi Function Drill", 476 | "price": 159, 477 | "brand": { 478 | "name": "Home & Pro tools" 479 | }, 480 | "stockUnits": 21 481 | }, 482 | { 483 | "name": "Hammer", 484 | "price": 100, 485 | "brand": { 486 | "name": "Home & Pro tools" 487 | }, 488 | "stockUnits": 54 489 | }, 490 | { 491 | "name": "Screwdriver", 492 | "price": 110, 493 | "brand": { 494 | "name": "ElctroDrill" 495 | }, 496 | "stockUnits": 29 497 | }, 498 | { 499 | "name": "Pliers", 500 | "price": 105, 501 | "brand": { 502 | "name": "ElctroDrill" 503 | }, 504 | "stockUnits": 54 505 | }, 506 | { 507 | "name": "Red multi-tool plier", 508 | "price": 50, 509 | "brand": { 510 | "name": "ElctroDrill" 511 | }, 512 | "stockUnits": 86 513 | }, 514 | { 515 | "name": "Blue multi-tool plier", 516 | "price": 50, 517 | "brand": { 518 | "name": "ElctroDrill" 519 | }, 520 | "stockUnits": 69 521 | }, 522 | { 523 | "name": "Stainless multi-tool plier", 524 | "price": 90, 525 | "brand": { 526 | "name": "ElctroDrill" 527 | }, 528 | "stockUnits": 57 529 | }, 530 | { 531 | "name": "Yellow Rechargeable screwdriver", 532 | "price": 250, 533 | "brand": { 534 | "name": "Home & Pro tools" 535 | }, 536 | "stockUnits": 25 537 | }, 538 | { 539 | "name": "Red Rechargeable screwdriver", 540 | "price": 250, 541 | "brand": { 542 | "name": "ElctroDrill" 543 | }, 544 | "stockUnits": 26 545 | }, 546 | { 547 | "name": "Rechargeable screwdriver with extra battery", 548 | "price": 312, 549 | "brand": { 550 | "name": "Home & Pro tools" 551 | }, 552 | "stockUnits": 34 553 | }, 554 | { 555 | "name": "Yellow hard hat with tool bag pack", 556 | "price": 46, 557 | "brand": { 558 | "name": "ProSaws" 559 | }, 560 | "stockUnits": 65 561 | } 562 | ] 563 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Microsoft Corporation. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | --- 2 | page_type: sample 3 | languages: 4 | - javascript 5 | products: 6 | - azure 7 | description: "Products Manager application for Serverless API Learn Module" 8 | urlFragment: "mslearn-build-api-azure-functions" 9 | --- 10 | 11 | # Official Microsoft Sample 12 | 13 | 20 | 21 | This is a sample web application frontend for the [Build Serverless APIs with Azure Functions](https://learn.microsoft.com/en-us/training/modules/build-api-azure-functions/) Learn Module. 22 | 23 | [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MicrosoftDocs/mslearn-build-api-azure-functions) 24 | 25 | > [!NOTE] 26 | > GitHub provides all users 60 hours of GitHub Codespaces for free each month. 27 | 28 | ## Contents 29 | 30 | Outline the file contents of the repository. It helps users navigate the codebase, build configuration and any related assets. 31 | 32 | | File/folder | Description | 33 | | ----------------- | ----------------------------------------------------------------------------- | 34 | | `frontend` | The frontend website for the Products Manager application. | 35 | | `api` | A base Azure Functions project where the user will finish out the API project | 36 | | `.gitignore` | Define what to ignore at commit time. | 37 | | `CHANGELOG.md` | List of changes to the sample. | 38 | | `CONTRIBUTING.md` | Guidelines for contributing to the sample. | 39 | | `README.md` | This README file. | 40 | | `LICENSE` | The license for the sample. | 41 | 42 | ## Prerequisites 43 | 44 | - [Node.js](https://nodejs.org/en/) 45 | - [Azure Functions Core Tools](https://github.com/Azure/azure-functions-core-tools) 46 | 47 | ## Setup 48 | 49 | ### Frontend 50 | Switch to the "frontend" directory. 51 | 52 | Run `npm start`. 53 | 54 | ### Key concepts 55 | 56 | The "frontend" folder contains a single `index.html` file. This file defines the interface for the Products Manager application. It references the Bulma CSS framework, the Vue.js JavaScript framework, and a reference to the `index.js` file. 57 | 58 | The `index.js` file is a single Vue.js object which the `index.html` file needs to properly function. This `index.js` file contains all of the application logic, binding code and AJAX requests. 59 | 60 | ### Api 61 | Switch to the "api" directory 62 | 63 | Run `func start` 64 | 65 | ## Contributing 66 | 67 | This project welcomes contributions and suggestions. Most contributions require you to agree to a 68 | Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us 69 | the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com. 70 | 71 | When you submit a pull request, a CLA bot will automatically determine whether you need to provide 72 | a CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions 73 | provided by the bot. You will only need to do this once across all repos using our CLA. 74 | 75 | This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). 76 | For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or 77 | contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. 78 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## Security 4 | 5 | Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). 6 | 7 | If you believe you have found a security vulnerability in any Microsoft-owned repository that meets Microsoft's [Microsoft's definition of a security vulnerability](https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc751383(v=technet.10)) of a security vulnerability, please report it to us as described below. 8 | 9 | ## Reporting Security Issues 10 | 11 | **Please do not report security vulnerabilities through public GitHub issues.** 12 | 13 | Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report). 14 | 15 | If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the the [Microsoft Security Response Center PGP Key page](https://www.microsoft.com/en-us/msrc/pgp-key-msrc). 16 | 17 | You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://www.microsoft.com/msrc). 18 | 19 | Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: 20 | 21 | * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) 22 | * Full paths of source file(s) related to the manifestation of the issue 23 | * The location of the affected source code (tag/branch/commit or direct URL) 24 | * Any special configuration required to reproduce the issue 25 | * Step-by-step instructions to reproduce the issue 26 | * Proof-of-concept or exploit code (if possible) 27 | * Impact of the issue, including how an attacker might exploit the issue 28 | 29 | This information will help us triage your report more quickly. 30 | 31 | If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://microsoft.com/msrc/bounty) page for more details about our active programs. 32 | 33 | ## Preferred Languages 34 | 35 | We prefer all communications to be in English. 36 | 37 | ## Policy 38 | 39 | Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://www.microsoft.com/en-us/msrc/cvd). 40 | 41 | 42 | -------------------------------------------------------------------------------- /api/.funcignore: -------------------------------------------------------------------------------- 1 | *.js.map 2 | *.ts 3 | .git* 4 | .vscode 5 | __azurite_db*__.json 6 | __blobstorage__ 7 | __queuestorage__ 8 | local.settings.json 9 | test 10 | tsconfig.json -------------------------------------------------------------------------------- /api/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | 24 | # nyc test coverage 25 | .nyc_output 26 | 27 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 28 | .grunt 29 | 30 | # Bower dependency directory (https://bower.io/) 31 | bower_components 32 | 33 | # node-waf configuration 34 | .lock-wscript 35 | 36 | # Compiled binary addons (https://nodejs.org/api/addons.html) 37 | build/Release 38 | 39 | # Dependency directories 40 | node_modules/ 41 | jspm_packages/ 42 | 43 | # TypeScript v1 declaration files 44 | typings/ 45 | 46 | # Optional npm cache directory 47 | .npm 48 | 49 | # Optional eslint cache 50 | .eslintcache 51 | 52 | # Optional REPL history 53 | .node_repl_history 54 | 55 | # Output of 'npm pack' 56 | *.tgz 57 | 58 | # Yarn Integrity file 59 | .yarn-integrity 60 | 61 | # dotenv environment variables file 62 | .env 63 | .env.test 64 | 65 | # parcel-bundler cache (https://parceljs.org/) 66 | .cache 67 | 68 | # next.js build output 69 | .next 70 | 71 | # nuxt.js build output 72 | .nuxt 73 | 74 | # vuepress build output 75 | .vuepress/dist 76 | 77 | # Serverless directories 78 | .serverless/ 79 | 80 | # FuseBox cache 81 | .fusebox/ 82 | 83 | # DynamoDB Local files 84 | .dynamodb/ 85 | 86 | # TypeScript output 87 | dist 88 | out 89 | 90 | # Azure Functions artifacts 91 | bin 92 | obj 93 | appsettings.json 94 | local.settings.json 95 | 96 | # Azurite artifacts 97 | __blobstorage__ 98 | __queuestorage__ 99 | __azurite_db*__.json -------------------------------------------------------------------------------- /api/host.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0", 3 | "logging": { 4 | "applicationInsights": { 5 | "samplingSettings": { 6 | "isEnabled": true, 7 | "excludedTypes": "Request" 8 | } 9 | } 10 | }, 11 | "extensionBundle": { 12 | "id": "Microsoft.Azure.Functions.ExtensionBundle", 13 | "version": "[4.*, 5.0.0)" 14 | } 15 | } -------------------------------------------------------------------------------- /api/local.settings.sample.json: -------------------------------------------------------------------------------- 1 | { 2 | "IsEncrypted": false, 3 | "Values": { 4 | "AzureWebJobsStorage": "", 5 | "FUNCTIONS_WORKER_RUNTIME": "node", 6 | "AzureWebJobsFeatureFlags": "EnableWorkerIndexing", 7 | "CONNECTION_STRING": "" 8 | }, 9 | "Host": { 10 | "CORS": "*" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /api/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "api", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "api", 9 | "version": "1.0.0", 10 | "dependencies": { 11 | "@azure/cosmos": "^4.0.0", 12 | "@azure/functions": "^4.0.0", 13 | "npm-run-all": "^4.1.5" 14 | }, 15 | "devDependencies": { 16 | "@types/node": "^18.x", 17 | "rimraf": "^5.0.5", 18 | "typescript": "^4.0.0" 19 | } 20 | }, 21 | "node_modules/@azure/abort-controller": { 22 | "version": "1.1.0", 23 | "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz", 24 | "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==", 25 | "dependencies": { 26 | "tslib": "^2.2.0" 27 | }, 28 | "engines": { 29 | "node": ">=12.0.0" 30 | } 31 | }, 32 | "node_modules/@azure/core-auth": { 33 | "version": "1.7.1", 34 | "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.7.1.tgz", 35 | "integrity": "sha512-dyeQwvgthqs/SlPVQbZQetpslXceHd4i5a7M/7z/lGEAVwnSluabnQOjF2/dk/hhWgMISusv1Ytp4mQ8JNy62A==", 36 | "dependencies": { 37 | "@azure/abort-controller": "^2.0.0", 38 | "@azure/core-util": "^1.1.0", 39 | "tslib": "^2.6.2" 40 | }, 41 | "engines": { 42 | "node": ">=18.0.0" 43 | } 44 | }, 45 | "node_modules/@azure/core-auth/node_modules/@azure/abort-controller": { 46 | "version": "2.1.1", 47 | "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.1.tgz", 48 | "integrity": "sha512-NhzeNm5zu2fPlwGXPUjzsRCRuPx5demaZyNcyNYJDqpa/Sbxzvo/RYt9IwUaAOnDW5+r7J9UOE6f22TQnb9nhQ==", 49 | "dependencies": { 50 | "tslib": "^2.6.2" 51 | }, 52 | "engines": { 53 | "node": ">=18.0.0" 54 | } 55 | }, 56 | "node_modules/@azure/core-rest-pipeline": { 57 | "version": "1.15.1", 58 | "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.15.1.tgz", 59 | "integrity": "sha512-ZxS6i3eHxh86u+1eWZJiYywoN2vxvsSoAUx60Mny8cZ4nTwvt7UzVVBJO+m2PW2KIJfNiXMt59xBa59htOWL4g==", 60 | "dependencies": { 61 | "@azure/abort-controller": "^2.0.0", 62 | "@azure/core-auth": "^1.4.0", 63 | "@azure/core-tracing": "^1.0.1", 64 | "@azure/core-util": "^1.3.0", 65 | "@azure/logger": "^1.0.0", 66 | "http-proxy-agent": "^7.0.0", 67 | "https-proxy-agent": "^7.0.0", 68 | "tslib": "^2.6.2" 69 | }, 70 | "engines": { 71 | "node": ">=18.0.0" 72 | } 73 | }, 74 | "node_modules/@azure/core-rest-pipeline/node_modules/@azure/abort-controller": { 75 | "version": "2.1.1", 76 | "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.1.tgz", 77 | "integrity": "sha512-NhzeNm5zu2fPlwGXPUjzsRCRuPx5demaZyNcyNYJDqpa/Sbxzvo/RYt9IwUaAOnDW5+r7J9UOE6f22TQnb9nhQ==", 78 | "dependencies": { 79 | "tslib": "^2.6.2" 80 | }, 81 | "engines": { 82 | "node": ">=18.0.0" 83 | } 84 | }, 85 | "node_modules/@azure/core-tracing": { 86 | "version": "1.1.1", 87 | "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.1.1.tgz", 88 | "integrity": "sha512-qPbYhN1pE5XQ2jPKIHP33x8l3oBu1UqIWnYqZZ3OYnYjzY0xqIHjn49C+ptsPD9yC7uyWI9Zm7iZUZLs2R4DhQ==", 89 | "dependencies": { 90 | "tslib": "^2.6.2" 91 | }, 92 | "engines": { 93 | "node": ">=18.0.0" 94 | } 95 | }, 96 | "node_modules/@azure/core-util": { 97 | "version": "1.8.1", 98 | "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.8.1.tgz", 99 | "integrity": "sha512-L3voj0StUdJ+YKomvwnTv7gHzguJO+a6h30pmmZdRprJCM+RJlGMPxzuh4R7lhQu1jNmEtaHX5wvTgWLDAmbGQ==", 100 | "dependencies": { 101 | "@azure/abort-controller": "^2.0.0", 102 | "tslib": "^2.6.2" 103 | }, 104 | "engines": { 105 | "node": ">=18.0.0" 106 | } 107 | }, 108 | "node_modules/@azure/core-util/node_modules/@azure/abort-controller": { 109 | "version": "2.1.1", 110 | "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.1.tgz", 111 | "integrity": "sha512-NhzeNm5zu2fPlwGXPUjzsRCRuPx5demaZyNcyNYJDqpa/Sbxzvo/RYt9IwUaAOnDW5+r7J9UOE6f22TQnb9nhQ==", 112 | "dependencies": { 113 | "tslib": "^2.6.2" 114 | }, 115 | "engines": { 116 | "node": ">=18.0.0" 117 | } 118 | }, 119 | "node_modules/@azure/cosmos": { 120 | "version": "4.0.0", 121 | "resolved": "https://registry.npmjs.org/@azure/cosmos/-/cosmos-4.0.0.tgz", 122 | "integrity": "sha512-/Z27p1+FTkmjmm8jk90zi/HrczPHw2t8WecFnsnTe4xGocWl0Z4clP0YlLUTJPhRLWYa5upwD9rMvKJkS1f1kg==", 123 | "dependencies": { 124 | "@azure/abort-controller": "^1.0.0", 125 | "@azure/core-auth": "^1.3.0", 126 | "@azure/core-rest-pipeline": "^1.2.0", 127 | "@azure/core-tracing": "^1.0.0", 128 | "debug": "^4.1.1", 129 | "fast-json-stable-stringify": "^2.1.0", 130 | "jsbi": "^3.1.3", 131 | "node-abort-controller": "^3.0.0", 132 | "priorityqueuejs": "^1.0.0", 133 | "semaphore": "^1.0.5", 134 | "tslib": "^2.2.0", 135 | "universal-user-agent": "^6.0.0", 136 | "uuid": "^8.3.0" 137 | }, 138 | "engines": { 139 | "node": ">=14.0.0" 140 | } 141 | }, 142 | "node_modules/@azure/functions": { 143 | "version": "4.3.0", 144 | "resolved": "https://registry.npmjs.org/@azure/functions/-/functions-4.3.0.tgz", 145 | "integrity": "sha512-l7iAuSyyBCOgwkDZmV6UUagwkFoqMOVfq01oJ+rJlFhN7Mb8/kkUAZLffCPUxBy2Wwah741BhJGizwaCP9G2/A==", 146 | "dependencies": { 147 | "cookie": "^0.6.0", 148 | "long": "^4.0.0", 149 | "undici": "^5.13.0" 150 | }, 151 | "engines": { 152 | "node": ">=18.0" 153 | } 154 | }, 155 | "node_modules/@azure/logger": { 156 | "version": "1.1.1", 157 | "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.1.1.tgz", 158 | "integrity": "sha512-/+4TtokaGgC+MnThdf6HyIH9Wrjp+CnCn3Nx3ggevN7FFjjNyjqg0yLlc2i9S+Z2uAzI8GYOo35Nzb1MhQ89MA==", 159 | "dependencies": { 160 | "tslib": "^2.6.2" 161 | }, 162 | "engines": { 163 | "node": ">=18.0.0" 164 | } 165 | }, 166 | "node_modules/@fastify/busboy": { 167 | "version": "2.1.1", 168 | "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", 169 | "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", 170 | "engines": { 171 | "node": ">=14" 172 | } 173 | }, 174 | "node_modules/@isaacs/cliui": { 175 | "version": "8.0.2", 176 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 177 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 178 | "dev": true, 179 | "dependencies": { 180 | "string-width": "^5.1.2", 181 | "string-width-cjs": "npm:string-width@^4.2.0", 182 | "strip-ansi": "^7.0.1", 183 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 184 | "wrap-ansi": "^8.1.0", 185 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 186 | }, 187 | "engines": { 188 | "node": ">=12" 189 | } 190 | }, 191 | "node_modules/@pkgjs/parseargs": { 192 | "version": "0.11.0", 193 | "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", 194 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", 195 | "dev": true, 196 | "optional": true, 197 | "engines": { 198 | "node": ">=14" 199 | } 200 | }, 201 | "node_modules/@types/node": { 202 | "version": "18.19.26", 203 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.26.tgz", 204 | "integrity": "sha512-+wiMJsIwLOYCvUqSdKTrfkS8mpTp+MPINe6+Np4TAGFWWRWiBQ5kSq9nZGCSPkzx9mvT+uEukzpX4MOSCydcvw==", 205 | "dev": true, 206 | "dependencies": { 207 | "undici-types": "~5.26.4" 208 | } 209 | }, 210 | "node_modules/agent-base": { 211 | "version": "7.1.0", 212 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", 213 | "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", 214 | "dependencies": { 215 | "debug": "^4.3.4" 216 | }, 217 | "engines": { 218 | "node": ">= 14" 219 | } 220 | }, 221 | "node_modules/ansi-regex": { 222 | "version": "6.0.1", 223 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", 224 | "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", 225 | "dev": true, 226 | "engines": { 227 | "node": ">=12" 228 | }, 229 | "funding": { 230 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 231 | } 232 | }, 233 | "node_modules/ansi-styles": { 234 | "version": "6.2.1", 235 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 236 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 237 | "dev": true, 238 | "engines": { 239 | "node": ">=12" 240 | }, 241 | "funding": { 242 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 243 | } 244 | }, 245 | "node_modules/array-buffer-byte-length": { 246 | "version": "1.0.1", 247 | "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", 248 | "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", 249 | "dependencies": { 250 | "call-bind": "^1.0.5", 251 | "is-array-buffer": "^3.0.4" 252 | }, 253 | "engines": { 254 | "node": ">= 0.4" 255 | }, 256 | "funding": { 257 | "url": "https://github.com/sponsors/ljharb" 258 | } 259 | }, 260 | "node_modules/arraybuffer.prototype.slice": { 261 | "version": "1.0.3", 262 | "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", 263 | "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", 264 | "dependencies": { 265 | "array-buffer-byte-length": "^1.0.1", 266 | "call-bind": "^1.0.5", 267 | "define-properties": "^1.2.1", 268 | "es-abstract": "^1.22.3", 269 | "es-errors": "^1.2.1", 270 | "get-intrinsic": "^1.2.3", 271 | "is-array-buffer": "^3.0.4", 272 | "is-shared-array-buffer": "^1.0.2" 273 | }, 274 | "engines": { 275 | "node": ">= 0.4" 276 | }, 277 | "funding": { 278 | "url": "https://github.com/sponsors/ljharb" 279 | } 280 | }, 281 | "node_modules/available-typed-arrays": { 282 | "version": "1.0.7", 283 | "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", 284 | "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", 285 | "dependencies": { 286 | "possible-typed-array-names": "^1.0.0" 287 | }, 288 | "engines": { 289 | "node": ">= 0.4" 290 | }, 291 | "funding": { 292 | "url": "https://github.com/sponsors/ljharb" 293 | } 294 | }, 295 | "node_modules/balanced-match": { 296 | "version": "1.0.2", 297 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 298 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 299 | }, 300 | "node_modules/brace-expansion": { 301 | "version": "2.0.1", 302 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 303 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 304 | "dev": true, 305 | "dependencies": { 306 | "balanced-match": "^1.0.0" 307 | } 308 | }, 309 | "node_modules/call-bind": { 310 | "version": "1.0.7", 311 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", 312 | "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", 313 | "dependencies": { 314 | "es-define-property": "^1.0.0", 315 | "es-errors": "^1.3.0", 316 | "function-bind": "^1.1.2", 317 | "get-intrinsic": "^1.2.4", 318 | "set-function-length": "^1.2.1" 319 | }, 320 | "engines": { 321 | "node": ">= 0.4" 322 | }, 323 | "funding": { 324 | "url": "https://github.com/sponsors/ljharb" 325 | } 326 | }, 327 | "node_modules/chalk": { 328 | "version": "2.4.2", 329 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 330 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 331 | "dependencies": { 332 | "ansi-styles": "^3.2.1", 333 | "escape-string-regexp": "^1.0.5", 334 | "supports-color": "^5.3.0" 335 | }, 336 | "engines": { 337 | "node": ">=4" 338 | } 339 | }, 340 | "node_modules/chalk/node_modules/ansi-styles": { 341 | "version": "3.2.1", 342 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 343 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 344 | "dependencies": { 345 | "color-convert": "^1.9.0" 346 | }, 347 | "engines": { 348 | "node": ">=4" 349 | } 350 | }, 351 | "node_modules/chalk/node_modules/color-convert": { 352 | "version": "1.9.3", 353 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 354 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 355 | "dependencies": { 356 | "color-name": "1.1.3" 357 | } 358 | }, 359 | "node_modules/chalk/node_modules/color-name": { 360 | "version": "1.1.3", 361 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 362 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" 363 | }, 364 | "node_modules/color-convert": { 365 | "version": "2.0.1", 366 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 367 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 368 | "dev": true, 369 | "dependencies": { 370 | "color-name": "~1.1.4" 371 | }, 372 | "engines": { 373 | "node": ">=7.0.0" 374 | } 375 | }, 376 | "node_modules/color-name": { 377 | "version": "1.1.4", 378 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 379 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 380 | "dev": true 381 | }, 382 | "node_modules/concat-map": { 383 | "version": "0.0.1", 384 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 385 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" 386 | }, 387 | "node_modules/cookie": { 388 | "version": "0.6.0", 389 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", 390 | "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", 391 | "engines": { 392 | "node": ">= 0.6" 393 | } 394 | }, 395 | "node_modules/cross-spawn": { 396 | "version": "7.0.3", 397 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 398 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 399 | "dev": true, 400 | "dependencies": { 401 | "path-key": "^3.1.0", 402 | "shebang-command": "^2.0.0", 403 | "which": "^2.0.1" 404 | }, 405 | "engines": { 406 | "node": ">= 8" 407 | } 408 | }, 409 | "node_modules/data-view-buffer": { 410 | "version": "1.0.1", 411 | "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", 412 | "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", 413 | "dependencies": { 414 | "call-bind": "^1.0.6", 415 | "es-errors": "^1.3.0", 416 | "is-data-view": "^1.0.1" 417 | }, 418 | "engines": { 419 | "node": ">= 0.4" 420 | }, 421 | "funding": { 422 | "url": "https://github.com/sponsors/ljharb" 423 | } 424 | }, 425 | "node_modules/data-view-byte-length": { 426 | "version": "1.0.1", 427 | "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", 428 | "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", 429 | "dependencies": { 430 | "call-bind": "^1.0.7", 431 | "es-errors": "^1.3.0", 432 | "is-data-view": "^1.0.1" 433 | }, 434 | "engines": { 435 | "node": ">= 0.4" 436 | }, 437 | "funding": { 438 | "url": "https://github.com/sponsors/ljharb" 439 | } 440 | }, 441 | "node_modules/data-view-byte-offset": { 442 | "version": "1.0.0", 443 | "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", 444 | "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", 445 | "dependencies": { 446 | "call-bind": "^1.0.6", 447 | "es-errors": "^1.3.0", 448 | "is-data-view": "^1.0.1" 449 | }, 450 | "engines": { 451 | "node": ">= 0.4" 452 | }, 453 | "funding": { 454 | "url": "https://github.com/sponsors/ljharb" 455 | } 456 | }, 457 | "node_modules/debug": { 458 | "version": "4.3.4", 459 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 460 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 461 | "dependencies": { 462 | "ms": "2.1.2" 463 | }, 464 | "engines": { 465 | "node": ">=6.0" 466 | }, 467 | "peerDependenciesMeta": { 468 | "supports-color": { 469 | "optional": true 470 | } 471 | } 472 | }, 473 | "node_modules/define-data-property": { 474 | "version": "1.1.4", 475 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", 476 | "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", 477 | "dependencies": { 478 | "es-define-property": "^1.0.0", 479 | "es-errors": "^1.3.0", 480 | "gopd": "^1.0.1" 481 | }, 482 | "engines": { 483 | "node": ">= 0.4" 484 | }, 485 | "funding": { 486 | "url": "https://github.com/sponsors/ljharb" 487 | } 488 | }, 489 | "node_modules/define-properties": { 490 | "version": "1.2.1", 491 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", 492 | "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", 493 | "dependencies": { 494 | "define-data-property": "^1.0.1", 495 | "has-property-descriptors": "^1.0.0", 496 | "object-keys": "^1.1.1" 497 | }, 498 | "engines": { 499 | "node": ">= 0.4" 500 | }, 501 | "funding": { 502 | "url": "https://github.com/sponsors/ljharb" 503 | } 504 | }, 505 | "node_modules/eastasianwidth": { 506 | "version": "0.2.0", 507 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 508 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 509 | "dev": true 510 | }, 511 | "node_modules/emoji-regex": { 512 | "version": "9.2.2", 513 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 514 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 515 | "dev": true 516 | }, 517 | "node_modules/error-ex": { 518 | "version": "1.3.2", 519 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 520 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 521 | "dependencies": { 522 | "is-arrayish": "^0.2.1" 523 | } 524 | }, 525 | "node_modules/es-abstract": { 526 | "version": "1.23.2", 527 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.2.tgz", 528 | "integrity": "sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w==", 529 | "dependencies": { 530 | "array-buffer-byte-length": "^1.0.1", 531 | "arraybuffer.prototype.slice": "^1.0.3", 532 | "available-typed-arrays": "^1.0.7", 533 | "call-bind": "^1.0.7", 534 | "data-view-buffer": "^1.0.1", 535 | "data-view-byte-length": "^1.0.1", 536 | "data-view-byte-offset": "^1.0.0", 537 | "es-define-property": "^1.0.0", 538 | "es-errors": "^1.3.0", 539 | "es-object-atoms": "^1.0.0", 540 | "es-set-tostringtag": "^2.0.3", 541 | "es-to-primitive": "^1.2.1", 542 | "function.prototype.name": "^1.1.6", 543 | "get-intrinsic": "^1.2.4", 544 | "get-symbol-description": "^1.0.2", 545 | "globalthis": "^1.0.3", 546 | "gopd": "^1.0.1", 547 | "has-property-descriptors": "^1.0.2", 548 | "has-proto": "^1.0.3", 549 | "has-symbols": "^1.0.3", 550 | "hasown": "^2.0.2", 551 | "internal-slot": "^1.0.7", 552 | "is-array-buffer": "^3.0.4", 553 | "is-callable": "^1.2.7", 554 | "is-data-view": "^1.0.1", 555 | "is-negative-zero": "^2.0.3", 556 | "is-regex": "^1.1.4", 557 | "is-shared-array-buffer": "^1.0.3", 558 | "is-string": "^1.0.7", 559 | "is-typed-array": "^1.1.13", 560 | "is-weakref": "^1.0.2", 561 | "object-inspect": "^1.13.1", 562 | "object-keys": "^1.1.1", 563 | "object.assign": "^4.1.5", 564 | "regexp.prototype.flags": "^1.5.2", 565 | "safe-array-concat": "^1.1.2", 566 | "safe-regex-test": "^1.0.3", 567 | "string.prototype.trim": "^1.2.9", 568 | "string.prototype.trimend": "^1.0.8", 569 | "string.prototype.trimstart": "^1.0.7", 570 | "typed-array-buffer": "^1.0.2", 571 | "typed-array-byte-length": "^1.0.1", 572 | "typed-array-byte-offset": "^1.0.2", 573 | "typed-array-length": "^1.0.5", 574 | "unbox-primitive": "^1.0.2", 575 | "which-typed-array": "^1.1.15" 576 | }, 577 | "engines": { 578 | "node": ">= 0.4" 579 | }, 580 | "funding": { 581 | "url": "https://github.com/sponsors/ljharb" 582 | } 583 | }, 584 | "node_modules/es-define-property": { 585 | "version": "1.0.0", 586 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", 587 | "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", 588 | "dependencies": { 589 | "get-intrinsic": "^1.2.4" 590 | }, 591 | "engines": { 592 | "node": ">= 0.4" 593 | } 594 | }, 595 | "node_modules/es-errors": { 596 | "version": "1.3.0", 597 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 598 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 599 | "engines": { 600 | "node": ">= 0.4" 601 | } 602 | }, 603 | "node_modules/es-object-atoms": { 604 | "version": "1.0.0", 605 | "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", 606 | "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", 607 | "dependencies": { 608 | "es-errors": "^1.3.0" 609 | }, 610 | "engines": { 611 | "node": ">= 0.4" 612 | } 613 | }, 614 | "node_modules/es-set-tostringtag": { 615 | "version": "2.0.3", 616 | "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", 617 | "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", 618 | "dependencies": { 619 | "get-intrinsic": "^1.2.4", 620 | "has-tostringtag": "^1.0.2", 621 | "hasown": "^2.0.1" 622 | }, 623 | "engines": { 624 | "node": ">= 0.4" 625 | } 626 | }, 627 | "node_modules/es-to-primitive": { 628 | "version": "1.2.1", 629 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 630 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 631 | "dependencies": { 632 | "is-callable": "^1.1.4", 633 | "is-date-object": "^1.0.1", 634 | "is-symbol": "^1.0.2" 635 | }, 636 | "engines": { 637 | "node": ">= 0.4" 638 | }, 639 | "funding": { 640 | "url": "https://github.com/sponsors/ljharb" 641 | } 642 | }, 643 | "node_modules/escape-string-regexp": { 644 | "version": "1.0.5", 645 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 646 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 647 | "engines": { 648 | "node": ">=0.8.0" 649 | } 650 | }, 651 | "node_modules/fast-json-stable-stringify": { 652 | "version": "2.1.0", 653 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 654 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 655 | }, 656 | "node_modules/for-each": { 657 | "version": "0.3.3", 658 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 659 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 660 | "dependencies": { 661 | "is-callable": "^1.1.3" 662 | } 663 | }, 664 | "node_modules/foreground-child": { 665 | "version": "3.1.1", 666 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", 667 | "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", 668 | "dev": true, 669 | "dependencies": { 670 | "cross-spawn": "^7.0.0", 671 | "signal-exit": "^4.0.1" 672 | }, 673 | "engines": { 674 | "node": ">=14" 675 | }, 676 | "funding": { 677 | "url": "https://github.com/sponsors/isaacs" 678 | } 679 | }, 680 | "node_modules/function-bind": { 681 | "version": "1.1.2", 682 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 683 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 684 | "funding": { 685 | "url": "https://github.com/sponsors/ljharb" 686 | } 687 | }, 688 | "node_modules/function.prototype.name": { 689 | "version": "1.1.6", 690 | "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", 691 | "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", 692 | "dependencies": { 693 | "call-bind": "^1.0.2", 694 | "define-properties": "^1.2.0", 695 | "es-abstract": "^1.22.1", 696 | "functions-have-names": "^1.2.3" 697 | }, 698 | "engines": { 699 | "node": ">= 0.4" 700 | }, 701 | "funding": { 702 | "url": "https://github.com/sponsors/ljharb" 703 | } 704 | }, 705 | "node_modules/functions-have-names": { 706 | "version": "1.2.3", 707 | "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", 708 | "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", 709 | "funding": { 710 | "url": "https://github.com/sponsors/ljharb" 711 | } 712 | }, 713 | "node_modules/get-intrinsic": { 714 | "version": "1.2.4", 715 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", 716 | "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", 717 | "dependencies": { 718 | "es-errors": "^1.3.0", 719 | "function-bind": "^1.1.2", 720 | "has-proto": "^1.0.1", 721 | "has-symbols": "^1.0.3", 722 | "hasown": "^2.0.0" 723 | }, 724 | "engines": { 725 | "node": ">= 0.4" 726 | }, 727 | "funding": { 728 | "url": "https://github.com/sponsors/ljharb" 729 | } 730 | }, 731 | "node_modules/get-symbol-description": { 732 | "version": "1.0.2", 733 | "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", 734 | "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", 735 | "dependencies": { 736 | "call-bind": "^1.0.5", 737 | "es-errors": "^1.3.0", 738 | "get-intrinsic": "^1.2.4" 739 | }, 740 | "engines": { 741 | "node": ">= 0.4" 742 | }, 743 | "funding": { 744 | "url": "https://github.com/sponsors/ljharb" 745 | } 746 | }, 747 | "node_modules/glob": { 748 | "version": "10.3.10", 749 | "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", 750 | "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", 751 | "dev": true, 752 | "dependencies": { 753 | "foreground-child": "^3.1.0", 754 | "jackspeak": "^2.3.5", 755 | "minimatch": "^9.0.1", 756 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", 757 | "path-scurry": "^1.10.1" 758 | }, 759 | "bin": { 760 | "glob": "dist/esm/bin.mjs" 761 | }, 762 | "engines": { 763 | "node": ">=16 || 14 >=14.17" 764 | }, 765 | "funding": { 766 | "url": "https://github.com/sponsors/isaacs" 767 | } 768 | }, 769 | "node_modules/globalthis": { 770 | "version": "1.0.3", 771 | "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", 772 | "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", 773 | "dependencies": { 774 | "define-properties": "^1.1.3" 775 | }, 776 | "engines": { 777 | "node": ">= 0.4" 778 | }, 779 | "funding": { 780 | "url": "https://github.com/sponsors/ljharb" 781 | } 782 | }, 783 | "node_modules/gopd": { 784 | "version": "1.0.1", 785 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 786 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 787 | "dependencies": { 788 | "get-intrinsic": "^1.1.3" 789 | }, 790 | "funding": { 791 | "url": "https://github.com/sponsors/ljharb" 792 | } 793 | }, 794 | "node_modules/graceful-fs": { 795 | "version": "4.2.11", 796 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 797 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" 798 | }, 799 | "node_modules/has-bigints": { 800 | "version": "1.0.2", 801 | "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", 802 | "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", 803 | "funding": { 804 | "url": "https://github.com/sponsors/ljharb" 805 | } 806 | }, 807 | "node_modules/has-flag": { 808 | "version": "3.0.0", 809 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 810 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 811 | "engines": { 812 | "node": ">=4" 813 | } 814 | }, 815 | "node_modules/has-property-descriptors": { 816 | "version": "1.0.2", 817 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", 818 | "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", 819 | "dependencies": { 820 | "es-define-property": "^1.0.0" 821 | }, 822 | "funding": { 823 | "url": "https://github.com/sponsors/ljharb" 824 | } 825 | }, 826 | "node_modules/has-proto": { 827 | "version": "1.0.3", 828 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", 829 | "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", 830 | "engines": { 831 | "node": ">= 0.4" 832 | }, 833 | "funding": { 834 | "url": "https://github.com/sponsors/ljharb" 835 | } 836 | }, 837 | "node_modules/has-symbols": { 838 | "version": "1.0.3", 839 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 840 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 841 | "engines": { 842 | "node": ">= 0.4" 843 | }, 844 | "funding": { 845 | "url": "https://github.com/sponsors/ljharb" 846 | } 847 | }, 848 | "node_modules/has-tostringtag": { 849 | "version": "1.0.2", 850 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", 851 | "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", 852 | "dependencies": { 853 | "has-symbols": "^1.0.3" 854 | }, 855 | "engines": { 856 | "node": ">= 0.4" 857 | }, 858 | "funding": { 859 | "url": "https://github.com/sponsors/ljharb" 860 | } 861 | }, 862 | "node_modules/hasown": { 863 | "version": "2.0.2", 864 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 865 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 866 | "dependencies": { 867 | "function-bind": "^1.1.2" 868 | }, 869 | "engines": { 870 | "node": ">= 0.4" 871 | } 872 | }, 873 | "node_modules/hosted-git-info": { 874 | "version": "2.8.9", 875 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", 876 | "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" 877 | }, 878 | "node_modules/http-proxy-agent": { 879 | "version": "7.0.2", 880 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", 881 | "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", 882 | "dependencies": { 883 | "agent-base": "^7.1.0", 884 | "debug": "^4.3.4" 885 | }, 886 | "engines": { 887 | "node": ">= 14" 888 | } 889 | }, 890 | "node_modules/https-proxy-agent": { 891 | "version": "7.0.4", 892 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", 893 | "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", 894 | "dependencies": { 895 | "agent-base": "^7.0.2", 896 | "debug": "4" 897 | }, 898 | "engines": { 899 | "node": ">= 14" 900 | } 901 | }, 902 | "node_modules/internal-slot": { 903 | "version": "1.0.7", 904 | "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", 905 | "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", 906 | "dependencies": { 907 | "es-errors": "^1.3.0", 908 | "hasown": "^2.0.0", 909 | "side-channel": "^1.0.4" 910 | }, 911 | "engines": { 912 | "node": ">= 0.4" 913 | } 914 | }, 915 | "node_modules/is-array-buffer": { 916 | "version": "3.0.4", 917 | "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", 918 | "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", 919 | "dependencies": { 920 | "call-bind": "^1.0.2", 921 | "get-intrinsic": "^1.2.1" 922 | }, 923 | "engines": { 924 | "node": ">= 0.4" 925 | }, 926 | "funding": { 927 | "url": "https://github.com/sponsors/ljharb" 928 | } 929 | }, 930 | "node_modules/is-arrayish": { 931 | "version": "0.2.1", 932 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 933 | "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" 934 | }, 935 | "node_modules/is-bigint": { 936 | "version": "1.0.4", 937 | "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", 938 | "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", 939 | "dependencies": { 940 | "has-bigints": "^1.0.1" 941 | }, 942 | "funding": { 943 | "url": "https://github.com/sponsors/ljharb" 944 | } 945 | }, 946 | "node_modules/is-boolean-object": { 947 | "version": "1.1.2", 948 | "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", 949 | "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", 950 | "dependencies": { 951 | "call-bind": "^1.0.2", 952 | "has-tostringtag": "^1.0.0" 953 | }, 954 | "engines": { 955 | "node": ">= 0.4" 956 | }, 957 | "funding": { 958 | "url": "https://github.com/sponsors/ljharb" 959 | } 960 | }, 961 | "node_modules/is-callable": { 962 | "version": "1.2.7", 963 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", 964 | "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", 965 | "engines": { 966 | "node": ">= 0.4" 967 | }, 968 | "funding": { 969 | "url": "https://github.com/sponsors/ljharb" 970 | } 971 | }, 972 | "node_modules/is-core-module": { 973 | "version": "2.13.1", 974 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", 975 | "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", 976 | "dependencies": { 977 | "hasown": "^2.0.0" 978 | }, 979 | "funding": { 980 | "url": "https://github.com/sponsors/ljharb" 981 | } 982 | }, 983 | "node_modules/is-data-view": { 984 | "version": "1.0.1", 985 | "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", 986 | "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", 987 | "dependencies": { 988 | "is-typed-array": "^1.1.13" 989 | }, 990 | "engines": { 991 | "node": ">= 0.4" 992 | }, 993 | "funding": { 994 | "url": "https://github.com/sponsors/ljharb" 995 | } 996 | }, 997 | "node_modules/is-date-object": { 998 | "version": "1.0.5", 999 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", 1000 | "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", 1001 | "dependencies": { 1002 | "has-tostringtag": "^1.0.0" 1003 | }, 1004 | "engines": { 1005 | "node": ">= 0.4" 1006 | }, 1007 | "funding": { 1008 | "url": "https://github.com/sponsors/ljharb" 1009 | } 1010 | }, 1011 | "node_modules/is-fullwidth-code-point": { 1012 | "version": "3.0.0", 1013 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1014 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1015 | "dev": true, 1016 | "engines": { 1017 | "node": ">=8" 1018 | } 1019 | }, 1020 | "node_modules/is-negative-zero": { 1021 | "version": "2.0.3", 1022 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", 1023 | "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", 1024 | "engines": { 1025 | "node": ">= 0.4" 1026 | }, 1027 | "funding": { 1028 | "url": "https://github.com/sponsors/ljharb" 1029 | } 1030 | }, 1031 | "node_modules/is-number-object": { 1032 | "version": "1.0.7", 1033 | "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", 1034 | "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", 1035 | "dependencies": { 1036 | "has-tostringtag": "^1.0.0" 1037 | }, 1038 | "engines": { 1039 | "node": ">= 0.4" 1040 | }, 1041 | "funding": { 1042 | "url": "https://github.com/sponsors/ljharb" 1043 | } 1044 | }, 1045 | "node_modules/is-regex": { 1046 | "version": "1.1.4", 1047 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", 1048 | "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", 1049 | "dependencies": { 1050 | "call-bind": "^1.0.2", 1051 | "has-tostringtag": "^1.0.0" 1052 | }, 1053 | "engines": { 1054 | "node": ">= 0.4" 1055 | }, 1056 | "funding": { 1057 | "url": "https://github.com/sponsors/ljharb" 1058 | } 1059 | }, 1060 | "node_modules/is-shared-array-buffer": { 1061 | "version": "1.0.3", 1062 | "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", 1063 | "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", 1064 | "dependencies": { 1065 | "call-bind": "^1.0.7" 1066 | }, 1067 | "engines": { 1068 | "node": ">= 0.4" 1069 | }, 1070 | "funding": { 1071 | "url": "https://github.com/sponsors/ljharb" 1072 | } 1073 | }, 1074 | "node_modules/is-string": { 1075 | "version": "1.0.7", 1076 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", 1077 | "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", 1078 | "dependencies": { 1079 | "has-tostringtag": "^1.0.0" 1080 | }, 1081 | "engines": { 1082 | "node": ">= 0.4" 1083 | }, 1084 | "funding": { 1085 | "url": "https://github.com/sponsors/ljharb" 1086 | } 1087 | }, 1088 | "node_modules/is-symbol": { 1089 | "version": "1.0.4", 1090 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", 1091 | "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", 1092 | "dependencies": { 1093 | "has-symbols": "^1.0.2" 1094 | }, 1095 | "engines": { 1096 | "node": ">= 0.4" 1097 | }, 1098 | "funding": { 1099 | "url": "https://github.com/sponsors/ljharb" 1100 | } 1101 | }, 1102 | "node_modules/is-typed-array": { 1103 | "version": "1.1.13", 1104 | "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", 1105 | "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", 1106 | "dependencies": { 1107 | "which-typed-array": "^1.1.14" 1108 | }, 1109 | "engines": { 1110 | "node": ">= 0.4" 1111 | }, 1112 | "funding": { 1113 | "url": "https://github.com/sponsors/ljharb" 1114 | } 1115 | }, 1116 | "node_modules/is-weakref": { 1117 | "version": "1.0.2", 1118 | "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", 1119 | "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", 1120 | "dependencies": { 1121 | "call-bind": "^1.0.2" 1122 | }, 1123 | "funding": { 1124 | "url": "https://github.com/sponsors/ljharb" 1125 | } 1126 | }, 1127 | "node_modules/isarray": { 1128 | "version": "2.0.5", 1129 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", 1130 | "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" 1131 | }, 1132 | "node_modules/isexe": { 1133 | "version": "2.0.0", 1134 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1135 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" 1136 | }, 1137 | "node_modules/jackspeak": { 1138 | "version": "2.3.6", 1139 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", 1140 | "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", 1141 | "dev": true, 1142 | "dependencies": { 1143 | "@isaacs/cliui": "^8.0.2" 1144 | }, 1145 | "engines": { 1146 | "node": ">=14" 1147 | }, 1148 | "funding": { 1149 | "url": "https://github.com/sponsors/isaacs" 1150 | }, 1151 | "optionalDependencies": { 1152 | "@pkgjs/parseargs": "^0.11.0" 1153 | } 1154 | }, 1155 | "node_modules/jsbi": { 1156 | "version": "3.2.5", 1157 | "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-3.2.5.tgz", 1158 | "integrity": "sha512-aBE4n43IPvjaddScbvWRA2YlTzKEynHzu7MqOyTipdHucf/VxS63ViCjxYRg86M8Rxwbt/GfzHl1kKERkt45fQ==" 1159 | }, 1160 | "node_modules/json-parse-better-errors": { 1161 | "version": "1.0.2", 1162 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", 1163 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" 1164 | }, 1165 | "node_modules/load-json-file": { 1166 | "version": "4.0.0", 1167 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", 1168 | "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", 1169 | "dependencies": { 1170 | "graceful-fs": "^4.1.2", 1171 | "parse-json": "^4.0.0", 1172 | "pify": "^3.0.0", 1173 | "strip-bom": "^3.0.0" 1174 | }, 1175 | "engines": { 1176 | "node": ">=4" 1177 | } 1178 | }, 1179 | "node_modules/long": { 1180 | "version": "4.0.0", 1181 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", 1182 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" 1183 | }, 1184 | "node_modules/lru-cache": { 1185 | "version": "10.2.0", 1186 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", 1187 | "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", 1188 | "dev": true, 1189 | "engines": { 1190 | "node": "14 || >=16.14" 1191 | } 1192 | }, 1193 | "node_modules/memorystream": { 1194 | "version": "0.3.1", 1195 | "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", 1196 | "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", 1197 | "engines": { 1198 | "node": ">= 0.10.0" 1199 | } 1200 | }, 1201 | "node_modules/minimatch": { 1202 | "version": "9.0.3", 1203 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", 1204 | "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", 1205 | "dev": true, 1206 | "dependencies": { 1207 | "brace-expansion": "^2.0.1" 1208 | }, 1209 | "engines": { 1210 | "node": ">=16 || 14 >=14.17" 1211 | }, 1212 | "funding": { 1213 | "url": "https://github.com/sponsors/isaacs" 1214 | } 1215 | }, 1216 | "node_modules/minipass": { 1217 | "version": "7.0.4", 1218 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", 1219 | "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", 1220 | "dev": true, 1221 | "engines": { 1222 | "node": ">=16 || 14 >=14.17" 1223 | } 1224 | }, 1225 | "node_modules/ms": { 1226 | "version": "2.1.2", 1227 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1228 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1229 | }, 1230 | "node_modules/nice-try": { 1231 | "version": "1.0.5", 1232 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 1233 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" 1234 | }, 1235 | "node_modules/node-abort-controller": { 1236 | "version": "3.1.1", 1237 | "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", 1238 | "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==" 1239 | }, 1240 | "node_modules/normalize-package-data": { 1241 | "version": "2.5.0", 1242 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", 1243 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", 1244 | "dependencies": { 1245 | "hosted-git-info": "^2.1.4", 1246 | "resolve": "^1.10.0", 1247 | "semver": "2 || 3 || 4 || 5", 1248 | "validate-npm-package-license": "^3.0.1" 1249 | } 1250 | }, 1251 | "node_modules/npm-run-all": { 1252 | "version": "4.1.5", 1253 | "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", 1254 | "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", 1255 | "dependencies": { 1256 | "ansi-styles": "^3.2.1", 1257 | "chalk": "^2.4.1", 1258 | "cross-spawn": "^6.0.5", 1259 | "memorystream": "^0.3.1", 1260 | "minimatch": "^3.0.4", 1261 | "pidtree": "^0.3.0", 1262 | "read-pkg": "^3.0.0", 1263 | "shell-quote": "^1.6.1", 1264 | "string.prototype.padend": "^3.0.0" 1265 | }, 1266 | "bin": { 1267 | "npm-run-all": "bin/npm-run-all/index.js", 1268 | "run-p": "bin/run-p/index.js", 1269 | "run-s": "bin/run-s/index.js" 1270 | }, 1271 | "engines": { 1272 | "node": ">= 4" 1273 | } 1274 | }, 1275 | "node_modules/npm-run-all/node_modules/ansi-styles": { 1276 | "version": "3.2.1", 1277 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 1278 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 1279 | "dependencies": { 1280 | "color-convert": "^1.9.0" 1281 | }, 1282 | "engines": { 1283 | "node": ">=4" 1284 | } 1285 | }, 1286 | "node_modules/npm-run-all/node_modules/brace-expansion": { 1287 | "version": "1.1.11", 1288 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1289 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1290 | "dependencies": { 1291 | "balanced-match": "^1.0.0", 1292 | "concat-map": "0.0.1" 1293 | } 1294 | }, 1295 | "node_modules/npm-run-all/node_modules/color-convert": { 1296 | "version": "1.9.3", 1297 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 1298 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 1299 | "dependencies": { 1300 | "color-name": "1.1.3" 1301 | } 1302 | }, 1303 | "node_modules/npm-run-all/node_modules/color-name": { 1304 | "version": "1.1.3", 1305 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 1306 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" 1307 | }, 1308 | "node_modules/npm-run-all/node_modules/cross-spawn": { 1309 | "version": "6.0.5", 1310 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 1311 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 1312 | "dependencies": { 1313 | "nice-try": "^1.0.4", 1314 | "path-key": "^2.0.1", 1315 | "semver": "^5.5.0", 1316 | "shebang-command": "^1.2.0", 1317 | "which": "^1.2.9" 1318 | }, 1319 | "engines": { 1320 | "node": ">=4.8" 1321 | } 1322 | }, 1323 | "node_modules/npm-run-all/node_modules/minimatch": { 1324 | "version": "3.1.2", 1325 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1326 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1327 | "dependencies": { 1328 | "brace-expansion": "^1.1.7" 1329 | }, 1330 | "engines": { 1331 | "node": "*" 1332 | } 1333 | }, 1334 | "node_modules/npm-run-all/node_modules/path-key": { 1335 | "version": "2.0.1", 1336 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1337 | "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", 1338 | "engines": { 1339 | "node": ">=4" 1340 | } 1341 | }, 1342 | "node_modules/npm-run-all/node_modules/shebang-command": { 1343 | "version": "1.2.0", 1344 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1345 | "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", 1346 | "dependencies": { 1347 | "shebang-regex": "^1.0.0" 1348 | }, 1349 | "engines": { 1350 | "node": ">=0.10.0" 1351 | } 1352 | }, 1353 | "node_modules/npm-run-all/node_modules/shebang-regex": { 1354 | "version": "1.0.0", 1355 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1356 | "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", 1357 | "engines": { 1358 | "node": ">=0.10.0" 1359 | } 1360 | }, 1361 | "node_modules/npm-run-all/node_modules/which": { 1362 | "version": "1.3.1", 1363 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1364 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1365 | "dependencies": { 1366 | "isexe": "^2.0.0" 1367 | }, 1368 | "bin": { 1369 | "which": "bin/which" 1370 | } 1371 | }, 1372 | "node_modules/object-inspect": { 1373 | "version": "1.13.1", 1374 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", 1375 | "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", 1376 | "funding": { 1377 | "url": "https://github.com/sponsors/ljharb" 1378 | } 1379 | }, 1380 | "node_modules/object-keys": { 1381 | "version": "1.1.1", 1382 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1383 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 1384 | "engines": { 1385 | "node": ">= 0.4" 1386 | } 1387 | }, 1388 | "node_modules/object.assign": { 1389 | "version": "4.1.5", 1390 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", 1391 | "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", 1392 | "dependencies": { 1393 | "call-bind": "^1.0.5", 1394 | "define-properties": "^1.2.1", 1395 | "has-symbols": "^1.0.3", 1396 | "object-keys": "^1.1.1" 1397 | }, 1398 | "engines": { 1399 | "node": ">= 0.4" 1400 | }, 1401 | "funding": { 1402 | "url": "https://github.com/sponsors/ljharb" 1403 | } 1404 | }, 1405 | "node_modules/parse-json": { 1406 | "version": "4.0.0", 1407 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", 1408 | "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", 1409 | "dependencies": { 1410 | "error-ex": "^1.3.1", 1411 | "json-parse-better-errors": "^1.0.1" 1412 | }, 1413 | "engines": { 1414 | "node": ">=4" 1415 | } 1416 | }, 1417 | "node_modules/path-key": { 1418 | "version": "3.1.1", 1419 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1420 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1421 | "dev": true, 1422 | "engines": { 1423 | "node": ">=8" 1424 | } 1425 | }, 1426 | "node_modules/path-parse": { 1427 | "version": "1.0.7", 1428 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1429 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" 1430 | }, 1431 | "node_modules/path-scurry": { 1432 | "version": "1.10.1", 1433 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", 1434 | "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", 1435 | "dev": true, 1436 | "dependencies": { 1437 | "lru-cache": "^9.1.1 || ^10.0.0", 1438 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" 1439 | }, 1440 | "engines": { 1441 | "node": ">=16 || 14 >=14.17" 1442 | }, 1443 | "funding": { 1444 | "url": "https://github.com/sponsors/isaacs" 1445 | } 1446 | }, 1447 | "node_modules/path-type": { 1448 | "version": "3.0.0", 1449 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", 1450 | "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", 1451 | "dependencies": { 1452 | "pify": "^3.0.0" 1453 | }, 1454 | "engines": { 1455 | "node": ">=4" 1456 | } 1457 | }, 1458 | "node_modules/pidtree": { 1459 | "version": "0.3.1", 1460 | "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", 1461 | "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", 1462 | "bin": { 1463 | "pidtree": "bin/pidtree.js" 1464 | }, 1465 | "engines": { 1466 | "node": ">=0.10" 1467 | } 1468 | }, 1469 | "node_modules/pify": { 1470 | "version": "3.0.0", 1471 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 1472 | "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", 1473 | "engines": { 1474 | "node": ">=4" 1475 | } 1476 | }, 1477 | "node_modules/possible-typed-array-names": { 1478 | "version": "1.0.0", 1479 | "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", 1480 | "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", 1481 | "engines": { 1482 | "node": ">= 0.4" 1483 | } 1484 | }, 1485 | "node_modules/priorityqueuejs": { 1486 | "version": "1.0.0", 1487 | "resolved": "https://registry.npmjs.org/priorityqueuejs/-/priorityqueuejs-1.0.0.tgz", 1488 | "integrity": "sha512-lg++21mreCEOuGWTbO5DnJKAdxfjrdN0S9ysoW9SzdSJvbkWpkaDdpG/cdsPCsEnoLUwmd9m3WcZhngW7yKA2g==" 1489 | }, 1490 | "node_modules/read-pkg": { 1491 | "version": "3.0.0", 1492 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", 1493 | "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", 1494 | "dependencies": { 1495 | "load-json-file": "^4.0.0", 1496 | "normalize-package-data": "^2.3.2", 1497 | "path-type": "^3.0.0" 1498 | }, 1499 | "engines": { 1500 | "node": ">=4" 1501 | } 1502 | }, 1503 | "node_modules/regexp.prototype.flags": { 1504 | "version": "1.5.2", 1505 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", 1506 | "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", 1507 | "dependencies": { 1508 | "call-bind": "^1.0.6", 1509 | "define-properties": "^1.2.1", 1510 | "es-errors": "^1.3.0", 1511 | "set-function-name": "^2.0.1" 1512 | }, 1513 | "engines": { 1514 | "node": ">= 0.4" 1515 | }, 1516 | "funding": { 1517 | "url": "https://github.com/sponsors/ljharb" 1518 | } 1519 | }, 1520 | "node_modules/resolve": { 1521 | "version": "1.22.8", 1522 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", 1523 | "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", 1524 | "dependencies": { 1525 | "is-core-module": "^2.13.0", 1526 | "path-parse": "^1.0.7", 1527 | "supports-preserve-symlinks-flag": "^1.0.0" 1528 | }, 1529 | "bin": { 1530 | "resolve": "bin/resolve" 1531 | }, 1532 | "funding": { 1533 | "url": "https://github.com/sponsors/ljharb" 1534 | } 1535 | }, 1536 | "node_modules/rimraf": { 1537 | "version": "5.0.5", 1538 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", 1539 | "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", 1540 | "dev": true, 1541 | "dependencies": { 1542 | "glob": "^10.3.7" 1543 | }, 1544 | "bin": { 1545 | "rimraf": "dist/esm/bin.mjs" 1546 | }, 1547 | "engines": { 1548 | "node": ">=14" 1549 | }, 1550 | "funding": { 1551 | "url": "https://github.com/sponsors/isaacs" 1552 | } 1553 | }, 1554 | "node_modules/safe-array-concat": { 1555 | "version": "1.1.2", 1556 | "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", 1557 | "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", 1558 | "dependencies": { 1559 | "call-bind": "^1.0.7", 1560 | "get-intrinsic": "^1.2.4", 1561 | "has-symbols": "^1.0.3", 1562 | "isarray": "^2.0.5" 1563 | }, 1564 | "engines": { 1565 | "node": ">=0.4" 1566 | }, 1567 | "funding": { 1568 | "url": "https://github.com/sponsors/ljharb" 1569 | } 1570 | }, 1571 | "node_modules/safe-regex-test": { 1572 | "version": "1.0.3", 1573 | "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", 1574 | "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", 1575 | "dependencies": { 1576 | "call-bind": "^1.0.6", 1577 | "es-errors": "^1.3.0", 1578 | "is-regex": "^1.1.4" 1579 | }, 1580 | "engines": { 1581 | "node": ">= 0.4" 1582 | }, 1583 | "funding": { 1584 | "url": "https://github.com/sponsors/ljharb" 1585 | } 1586 | }, 1587 | "node_modules/semaphore": { 1588 | "version": "1.1.0", 1589 | "resolved": "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz", 1590 | "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==", 1591 | "engines": { 1592 | "node": ">=0.8.0" 1593 | } 1594 | }, 1595 | "node_modules/semver": { 1596 | "version": "5.7.2", 1597 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", 1598 | "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", 1599 | "bin": { 1600 | "semver": "bin/semver" 1601 | } 1602 | }, 1603 | "node_modules/set-function-length": { 1604 | "version": "1.2.2", 1605 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", 1606 | "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", 1607 | "dependencies": { 1608 | "define-data-property": "^1.1.4", 1609 | "es-errors": "^1.3.0", 1610 | "function-bind": "^1.1.2", 1611 | "get-intrinsic": "^1.2.4", 1612 | "gopd": "^1.0.1", 1613 | "has-property-descriptors": "^1.0.2" 1614 | }, 1615 | "engines": { 1616 | "node": ">= 0.4" 1617 | } 1618 | }, 1619 | "node_modules/set-function-name": { 1620 | "version": "2.0.2", 1621 | "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", 1622 | "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", 1623 | "dependencies": { 1624 | "define-data-property": "^1.1.4", 1625 | "es-errors": "^1.3.0", 1626 | "functions-have-names": "^1.2.3", 1627 | "has-property-descriptors": "^1.0.2" 1628 | }, 1629 | "engines": { 1630 | "node": ">= 0.4" 1631 | } 1632 | }, 1633 | "node_modules/shebang-command": { 1634 | "version": "2.0.0", 1635 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1636 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1637 | "dev": true, 1638 | "dependencies": { 1639 | "shebang-regex": "^3.0.0" 1640 | }, 1641 | "engines": { 1642 | "node": ">=8" 1643 | } 1644 | }, 1645 | "node_modules/shebang-regex": { 1646 | "version": "3.0.0", 1647 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1648 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1649 | "dev": true, 1650 | "engines": { 1651 | "node": ">=8" 1652 | } 1653 | }, 1654 | "node_modules/shell-quote": { 1655 | "version": "1.8.1", 1656 | "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", 1657 | "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", 1658 | "funding": { 1659 | "url": "https://github.com/sponsors/ljharb" 1660 | } 1661 | }, 1662 | "node_modules/side-channel": { 1663 | "version": "1.0.6", 1664 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", 1665 | "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", 1666 | "dependencies": { 1667 | "call-bind": "^1.0.7", 1668 | "es-errors": "^1.3.0", 1669 | "get-intrinsic": "^1.2.4", 1670 | "object-inspect": "^1.13.1" 1671 | }, 1672 | "engines": { 1673 | "node": ">= 0.4" 1674 | }, 1675 | "funding": { 1676 | "url": "https://github.com/sponsors/ljharb" 1677 | } 1678 | }, 1679 | "node_modules/signal-exit": { 1680 | "version": "4.1.0", 1681 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 1682 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 1683 | "dev": true, 1684 | "engines": { 1685 | "node": ">=14" 1686 | }, 1687 | "funding": { 1688 | "url": "https://github.com/sponsors/isaacs" 1689 | } 1690 | }, 1691 | "node_modules/spdx-correct": { 1692 | "version": "3.2.0", 1693 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", 1694 | "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", 1695 | "dependencies": { 1696 | "spdx-expression-parse": "^3.0.0", 1697 | "spdx-license-ids": "^3.0.0" 1698 | } 1699 | }, 1700 | "node_modules/spdx-exceptions": { 1701 | "version": "2.5.0", 1702 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", 1703 | "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" 1704 | }, 1705 | "node_modules/spdx-expression-parse": { 1706 | "version": "3.0.1", 1707 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", 1708 | "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", 1709 | "dependencies": { 1710 | "spdx-exceptions": "^2.1.0", 1711 | "spdx-license-ids": "^3.0.0" 1712 | } 1713 | }, 1714 | "node_modules/spdx-license-ids": { 1715 | "version": "3.0.17", 1716 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", 1717 | "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==" 1718 | }, 1719 | "node_modules/string-width": { 1720 | "version": "5.1.2", 1721 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 1722 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 1723 | "dev": true, 1724 | "dependencies": { 1725 | "eastasianwidth": "^0.2.0", 1726 | "emoji-regex": "^9.2.2", 1727 | "strip-ansi": "^7.0.1" 1728 | }, 1729 | "engines": { 1730 | "node": ">=12" 1731 | }, 1732 | "funding": { 1733 | "url": "https://github.com/sponsors/sindresorhus" 1734 | } 1735 | }, 1736 | "node_modules/string-width-cjs": { 1737 | "name": "string-width", 1738 | "version": "4.2.3", 1739 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1740 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1741 | "dev": true, 1742 | "dependencies": { 1743 | "emoji-regex": "^8.0.0", 1744 | "is-fullwidth-code-point": "^3.0.0", 1745 | "strip-ansi": "^6.0.1" 1746 | }, 1747 | "engines": { 1748 | "node": ">=8" 1749 | } 1750 | }, 1751 | "node_modules/string-width-cjs/node_modules/ansi-regex": { 1752 | "version": "5.0.1", 1753 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1754 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1755 | "dev": true, 1756 | "engines": { 1757 | "node": ">=8" 1758 | } 1759 | }, 1760 | "node_modules/string-width-cjs/node_modules/emoji-regex": { 1761 | "version": "8.0.0", 1762 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1763 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1764 | "dev": true 1765 | }, 1766 | "node_modules/string-width-cjs/node_modules/strip-ansi": { 1767 | "version": "6.0.1", 1768 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1769 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1770 | "dev": true, 1771 | "dependencies": { 1772 | "ansi-regex": "^5.0.1" 1773 | }, 1774 | "engines": { 1775 | "node": ">=8" 1776 | } 1777 | }, 1778 | "node_modules/string.prototype.padend": { 1779 | "version": "3.1.6", 1780 | "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz", 1781 | "integrity": "sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==", 1782 | "dependencies": { 1783 | "call-bind": "^1.0.7", 1784 | "define-properties": "^1.2.1", 1785 | "es-abstract": "^1.23.2", 1786 | "es-object-atoms": "^1.0.0" 1787 | }, 1788 | "engines": { 1789 | "node": ">= 0.4" 1790 | }, 1791 | "funding": { 1792 | "url": "https://github.com/sponsors/ljharb" 1793 | } 1794 | }, 1795 | "node_modules/string.prototype.trim": { 1796 | "version": "1.2.9", 1797 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", 1798 | "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", 1799 | "dependencies": { 1800 | "call-bind": "^1.0.7", 1801 | "define-properties": "^1.2.1", 1802 | "es-abstract": "^1.23.0", 1803 | "es-object-atoms": "^1.0.0" 1804 | }, 1805 | "engines": { 1806 | "node": ">= 0.4" 1807 | }, 1808 | "funding": { 1809 | "url": "https://github.com/sponsors/ljharb" 1810 | } 1811 | }, 1812 | "node_modules/string.prototype.trimend": { 1813 | "version": "1.0.8", 1814 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", 1815 | "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", 1816 | "dependencies": { 1817 | "call-bind": "^1.0.7", 1818 | "define-properties": "^1.2.1", 1819 | "es-object-atoms": "^1.0.0" 1820 | }, 1821 | "funding": { 1822 | "url": "https://github.com/sponsors/ljharb" 1823 | } 1824 | }, 1825 | "node_modules/string.prototype.trimstart": { 1826 | "version": "1.0.8", 1827 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", 1828 | "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", 1829 | "dependencies": { 1830 | "call-bind": "^1.0.7", 1831 | "define-properties": "^1.2.1", 1832 | "es-object-atoms": "^1.0.0" 1833 | }, 1834 | "engines": { 1835 | "node": ">= 0.4" 1836 | }, 1837 | "funding": { 1838 | "url": "https://github.com/sponsors/ljharb" 1839 | } 1840 | }, 1841 | "node_modules/strip-ansi": { 1842 | "version": "7.1.0", 1843 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 1844 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 1845 | "dev": true, 1846 | "dependencies": { 1847 | "ansi-regex": "^6.0.1" 1848 | }, 1849 | "engines": { 1850 | "node": ">=12" 1851 | }, 1852 | "funding": { 1853 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 1854 | } 1855 | }, 1856 | "node_modules/strip-ansi-cjs": { 1857 | "name": "strip-ansi", 1858 | "version": "6.0.1", 1859 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1860 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1861 | "dev": true, 1862 | "dependencies": { 1863 | "ansi-regex": "^5.0.1" 1864 | }, 1865 | "engines": { 1866 | "node": ">=8" 1867 | } 1868 | }, 1869 | "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { 1870 | "version": "5.0.1", 1871 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1872 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1873 | "dev": true, 1874 | "engines": { 1875 | "node": ">=8" 1876 | } 1877 | }, 1878 | "node_modules/strip-bom": { 1879 | "version": "3.0.0", 1880 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 1881 | "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", 1882 | "engines": { 1883 | "node": ">=4" 1884 | } 1885 | }, 1886 | "node_modules/supports-color": { 1887 | "version": "5.5.0", 1888 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1889 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1890 | "dependencies": { 1891 | "has-flag": "^3.0.0" 1892 | }, 1893 | "engines": { 1894 | "node": ">=4" 1895 | } 1896 | }, 1897 | "node_modules/supports-preserve-symlinks-flag": { 1898 | "version": "1.0.0", 1899 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1900 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1901 | "engines": { 1902 | "node": ">= 0.4" 1903 | }, 1904 | "funding": { 1905 | "url": "https://github.com/sponsors/ljharb" 1906 | } 1907 | }, 1908 | "node_modules/tslib": { 1909 | "version": "2.6.2", 1910 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", 1911 | "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" 1912 | }, 1913 | "node_modules/typed-array-buffer": { 1914 | "version": "1.0.2", 1915 | "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", 1916 | "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", 1917 | "dependencies": { 1918 | "call-bind": "^1.0.7", 1919 | "es-errors": "^1.3.0", 1920 | "is-typed-array": "^1.1.13" 1921 | }, 1922 | "engines": { 1923 | "node": ">= 0.4" 1924 | } 1925 | }, 1926 | "node_modules/typed-array-byte-length": { 1927 | "version": "1.0.1", 1928 | "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", 1929 | "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", 1930 | "dependencies": { 1931 | "call-bind": "^1.0.7", 1932 | "for-each": "^0.3.3", 1933 | "gopd": "^1.0.1", 1934 | "has-proto": "^1.0.3", 1935 | "is-typed-array": "^1.1.13" 1936 | }, 1937 | "engines": { 1938 | "node": ">= 0.4" 1939 | }, 1940 | "funding": { 1941 | "url": "https://github.com/sponsors/ljharb" 1942 | } 1943 | }, 1944 | "node_modules/typed-array-byte-offset": { 1945 | "version": "1.0.2", 1946 | "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", 1947 | "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", 1948 | "dependencies": { 1949 | "available-typed-arrays": "^1.0.7", 1950 | "call-bind": "^1.0.7", 1951 | "for-each": "^0.3.3", 1952 | "gopd": "^1.0.1", 1953 | "has-proto": "^1.0.3", 1954 | "is-typed-array": "^1.1.13" 1955 | }, 1956 | "engines": { 1957 | "node": ">= 0.4" 1958 | }, 1959 | "funding": { 1960 | "url": "https://github.com/sponsors/ljharb" 1961 | } 1962 | }, 1963 | "node_modules/typed-array-length": { 1964 | "version": "1.0.6", 1965 | "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", 1966 | "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", 1967 | "dependencies": { 1968 | "call-bind": "^1.0.7", 1969 | "for-each": "^0.3.3", 1970 | "gopd": "^1.0.1", 1971 | "has-proto": "^1.0.3", 1972 | "is-typed-array": "^1.1.13", 1973 | "possible-typed-array-names": "^1.0.0" 1974 | }, 1975 | "engines": { 1976 | "node": ">= 0.4" 1977 | }, 1978 | "funding": { 1979 | "url": "https://github.com/sponsors/ljharb" 1980 | } 1981 | }, 1982 | "node_modules/typescript": { 1983 | "version": "4.9.5", 1984 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", 1985 | "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", 1986 | "dev": true, 1987 | "bin": { 1988 | "tsc": "bin/tsc", 1989 | "tsserver": "bin/tsserver" 1990 | }, 1991 | "engines": { 1992 | "node": ">=4.2.0" 1993 | } 1994 | }, 1995 | "node_modules/unbox-primitive": { 1996 | "version": "1.0.2", 1997 | "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", 1998 | "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", 1999 | "dependencies": { 2000 | "call-bind": "^1.0.2", 2001 | "has-bigints": "^1.0.2", 2002 | "has-symbols": "^1.0.3", 2003 | "which-boxed-primitive": "^1.0.2" 2004 | }, 2005 | "funding": { 2006 | "url": "https://github.com/sponsors/ljharb" 2007 | } 2008 | }, 2009 | "node_modules/undici": { 2010 | "version": "5.28.3", 2011 | "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz", 2012 | "integrity": "sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==", 2013 | "dependencies": { 2014 | "@fastify/busboy": "^2.0.0" 2015 | }, 2016 | "engines": { 2017 | "node": ">=14.0" 2018 | } 2019 | }, 2020 | "node_modules/undici-types": { 2021 | "version": "5.26.5", 2022 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 2023 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", 2024 | "dev": true 2025 | }, 2026 | "node_modules/universal-user-agent": { 2027 | "version": "6.0.1", 2028 | "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", 2029 | "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==" 2030 | }, 2031 | "node_modules/uuid": { 2032 | "version": "8.3.2", 2033 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 2034 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", 2035 | "bin": { 2036 | "uuid": "dist/bin/uuid" 2037 | } 2038 | }, 2039 | "node_modules/validate-npm-package-license": { 2040 | "version": "3.0.4", 2041 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 2042 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 2043 | "dependencies": { 2044 | "spdx-correct": "^3.0.0", 2045 | "spdx-expression-parse": "^3.0.0" 2046 | } 2047 | }, 2048 | "node_modules/which": { 2049 | "version": "2.0.2", 2050 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2051 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2052 | "dev": true, 2053 | "dependencies": { 2054 | "isexe": "^2.0.0" 2055 | }, 2056 | "bin": { 2057 | "node-which": "bin/node-which" 2058 | }, 2059 | "engines": { 2060 | "node": ">= 8" 2061 | } 2062 | }, 2063 | "node_modules/which-boxed-primitive": { 2064 | "version": "1.0.2", 2065 | "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", 2066 | "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", 2067 | "dependencies": { 2068 | "is-bigint": "^1.0.1", 2069 | "is-boolean-object": "^1.1.0", 2070 | "is-number-object": "^1.0.4", 2071 | "is-string": "^1.0.5", 2072 | "is-symbol": "^1.0.3" 2073 | }, 2074 | "funding": { 2075 | "url": "https://github.com/sponsors/ljharb" 2076 | } 2077 | }, 2078 | "node_modules/which-typed-array": { 2079 | "version": "1.1.15", 2080 | "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", 2081 | "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", 2082 | "dependencies": { 2083 | "available-typed-arrays": "^1.0.7", 2084 | "call-bind": "^1.0.7", 2085 | "for-each": "^0.3.3", 2086 | "gopd": "^1.0.1", 2087 | "has-tostringtag": "^1.0.2" 2088 | }, 2089 | "engines": { 2090 | "node": ">= 0.4" 2091 | }, 2092 | "funding": { 2093 | "url": "https://github.com/sponsors/ljharb" 2094 | } 2095 | }, 2096 | "node_modules/wrap-ansi": { 2097 | "version": "8.1.0", 2098 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 2099 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 2100 | "dev": true, 2101 | "dependencies": { 2102 | "ansi-styles": "^6.1.0", 2103 | "string-width": "^5.0.1", 2104 | "strip-ansi": "^7.0.1" 2105 | }, 2106 | "engines": { 2107 | "node": ">=12" 2108 | }, 2109 | "funding": { 2110 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 2111 | } 2112 | }, 2113 | "node_modules/wrap-ansi-cjs": { 2114 | "name": "wrap-ansi", 2115 | "version": "7.0.0", 2116 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 2117 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 2118 | "dev": true, 2119 | "dependencies": { 2120 | "ansi-styles": "^4.0.0", 2121 | "string-width": "^4.1.0", 2122 | "strip-ansi": "^6.0.0" 2123 | }, 2124 | "engines": { 2125 | "node": ">=10" 2126 | }, 2127 | "funding": { 2128 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 2129 | } 2130 | }, 2131 | "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { 2132 | "version": "5.0.1", 2133 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2134 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2135 | "dev": true, 2136 | "engines": { 2137 | "node": ">=8" 2138 | } 2139 | }, 2140 | "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { 2141 | "version": "4.3.0", 2142 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 2143 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 2144 | "dev": true, 2145 | "dependencies": { 2146 | "color-convert": "^2.0.1" 2147 | }, 2148 | "engines": { 2149 | "node": ">=8" 2150 | }, 2151 | "funding": { 2152 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 2153 | } 2154 | }, 2155 | "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { 2156 | "version": "8.0.0", 2157 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2158 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 2159 | "dev": true 2160 | }, 2161 | "node_modules/wrap-ansi-cjs/node_modules/string-width": { 2162 | "version": "4.2.3", 2163 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2164 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2165 | "dev": true, 2166 | "dependencies": { 2167 | "emoji-regex": "^8.0.0", 2168 | "is-fullwidth-code-point": "^3.0.0", 2169 | "strip-ansi": "^6.0.1" 2170 | }, 2171 | "engines": { 2172 | "node": ">=8" 2173 | } 2174 | }, 2175 | "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { 2176 | "version": "6.0.1", 2177 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2178 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2179 | "dev": true, 2180 | "dependencies": { 2181 | "ansi-regex": "^5.0.1" 2182 | }, 2183 | "engines": { 2184 | "node": ">=8" 2185 | } 2186 | } 2187 | } 2188 | } 2189 | -------------------------------------------------------------------------------- /api/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "api", 3 | "version": "1.0.0", 4 | "description": "", 5 | "scripts": { 6 | "build": "tsc", 7 | "watch": "tsc -w", 8 | "clean": "rimraf dist", 9 | "start:host": "npm run prestart && func start", 10 | "start": "npm-run-all --parallel start:host watch", 11 | "prestart": "npm run clean && npm run build" 12 | }, 13 | "dependencies": { 14 | "@azure/cosmos": "^4.0.0", 15 | "@azure/functions": "^4.0.0", 16 | "npm-run-all": "^4.1.5" 17 | }, 18 | "devDependencies": { 19 | "@types/node": "^18.x", 20 | "rimraf": "^5.0.5", 21 | "typescript": "^4.0.0" 22 | }, 23 | "main": "dist/src/index.js" 24 | } 25 | -------------------------------------------------------------------------------- /api/src/functions/CreateProduct.ts: -------------------------------------------------------------------------------- 1 | import { HttpRequest, HttpResponseInit, InvocationContext } from "@azure/functions"; 2 | import productService from "../services/product.services"; 3 | 4 | export async function CreateProduct(request: HttpRequest, context: InvocationContext): Promise { 5 | context.log(`Http function processed request for url "${request.url}"`); 6 | 7 | try { 8 | // parse request body to extract product data 9 | const product = await request.json(); 10 | 11 | // Create the product using the productService 12 | const createdProduct = await productService.create(product); 13 | 14 | return { 15 | status: 201, 16 | jsonBody: createdProduct 17 | }; 18 | 19 | } catch (error: unknown) { 20 | const err = error as Error; 21 | context.error(`Error creating product: ${err.message}`); 22 | 23 | return { 24 | status: 500, 25 | jsonBody: { 26 | error: "Failed to create product", 27 | } 28 | }; 29 | } 30 | }; -------------------------------------------------------------------------------- /api/src/functions/DeleteProduct.ts: -------------------------------------------------------------------------------- 1 | import { HttpRequest, HttpResponseInit, InvocationContext } from "@azure/functions"; 2 | import productService from "../services/product.services"; 3 | 4 | export async function DeleteProduct(request: HttpRequest, context: InvocationContext): Promise { 5 | context.log(`Http function processed request for url "${request.url}"`); 6 | 7 | try { 8 | // Extract product id and brand name from the request 9 | const id: string = request.params.id; 10 | const body = await request.json(); 11 | const brand = JSON.stringify(body); 12 | const brandName = JSON.parse(brand).brand.name; 13 | 14 | // Delete the product using the productService 15 | const deletedProduct = await productService.delete(id, brandName); 16 | 17 | return { 18 | status: 200, 19 | jsonBody: { 20 | deletedProduct 21 | }, 22 | }; 23 | 24 | } catch (error: unknown) { 25 | const err = error as Error; 26 | context.error(`Error deleting product: ${err.message}`); 27 | 28 | return { 29 | status: 500, 30 | jsonBody: { 31 | error: "Failed to delete product", 32 | }, 33 | }; 34 | } 35 | }; -------------------------------------------------------------------------------- /api/src/functions/UpdateProduct.ts: -------------------------------------------------------------------------------- 1 | import { HttpRequest, HttpResponseInit, InvocationContext } from "@azure/functions"; 2 | import productService from "../services/product.services"; 3 | 4 | export async function UpdateProduct(request: HttpRequest, context: InvocationContext): Promise { 5 | context.log(`Http function processed request for url "${request.url}"`); 6 | 7 | try { 8 | // Parse request body to extract product data 9 | const product = await request.json(); 10 | 11 | // Update the product using the productService 12 | const udpatedProduct = await productService.update(product); 13 | 14 | return { 15 | status: 200, 16 | jsonBody: { 17 | udpatedProduct 18 | } 19 | }; 20 | 21 | } catch (error: unknown) { 22 | const err = error as Error; 23 | context.error(`Error updating product: ${err.message}`); 24 | 25 | return { 26 | status: 500, 27 | jsonBody: { 28 | error: "Failed to update product", 29 | } 30 | }; 31 | } 32 | }; -------------------------------------------------------------------------------- /api/src/index.ts: -------------------------------------------------------------------------------- 1 | import { app } from "@azure/functions"; 2 | import { CreateProduct } from "./functions/CreateProduct"; 3 | import { DeleteProduct } from "./functions/DeleteProduct"; 4 | import { UpdateProduct } from "./functions/UpdateProduct"; 5 | 6 | app.http('CreateProduct', { 7 | methods: ['POST'], 8 | route: 'products', 9 | authLevel: 'anonymous', 10 | handler: CreateProduct 11 | }); 12 | 13 | app.http('DeleteProduct', { 14 | methods: ['DELETE'], 15 | route: 'products/{id}', 16 | authLevel: 'anonymous', 17 | handler: DeleteProduct 18 | }); 19 | 20 | app.http('UpdateProduct', { 21 | methods: ['PUT'], 22 | route: 'products/{id}', 23 | authLevel: 'anonymous', 24 | handler: UpdateProduct 25 | }); -------------------------------------------------------------------------------- /api/src/services/product.services.ts: -------------------------------------------------------------------------------- 1 | import { CosmosClient } from "@azure/cosmos"; 2 | 3 | // Set connection string from CONNECTION_STRING value in local.settings.json 4 | const CONNECTION_STRING = process.env.CONNECTION_STRING; 5 | 6 | const productService = { 7 | init() { 8 | try { 9 | this.client = new CosmosClient(CONNECTION_STRING); 10 | this.database = this.client.database("tailwind"); 11 | this.container = this.database.container("products"); 12 | } catch (err) { 13 | console.log(err.message); 14 | } 15 | }, 16 | async create(productToCreate) { 17 | const { resource } = await this.container.items.create(productToCreate); 18 | return resource; 19 | }, 20 | async read(): Promise { 21 | const iterator = this.container.items.readAll(); 22 | const { resources } = await iterator.fetchAll(); 23 | return resources; 24 | }, 25 | async update(product) { 26 | const { resource } = await this.container.item( 27 | product.id, 28 | product.brand.name, 29 | ) 30 | .replace(product); 31 | return resource; 32 | }, 33 | async delete(id: string, brandName) { 34 | const result = await this.container.item(id, brandName).delete(); 35 | return; 36 | }, 37 | }; 38 | 39 | productService.init(); 40 | 41 | export default productService; 42 | -------------------------------------------------------------------------------- /api/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "CommonJS", 4 | "target": "ES2022", 5 | "outDir": "dist", 6 | "rootDir": ".", 7 | "sourceMap": true, 8 | "strict": false 9 | } 10 | } -------------------------------------------------------------------------------- /frontend/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 11 | 12 | Products Manager 13 | 22 | 23 | 24 | 25 |
26 |
27 |
28 |
29 |
30 |

Products

31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 | 41 |
42 |
43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 59 | 64 | 71 | 78 | 83 | 89 | 90 | 91 |
NameBrandPriceUnits in Stock
57 | 58 | 60 | 63 | 65 | 70 | 72 | 77 | 79 | 82 | 84 | 88 |
92 |
93 |

Loading...

94 |
95 |
96 |
97 |

{{ toast.message }}

98 |
99 |
100 |
101 | 148 |
149 | 150 | 151 | 152 | 153 | -------------------------------------------------------------------------------- /frontend/index.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | const API = "http://127.0.0.1:7071/api"; 3 | 4 | new Vue({ 5 | el: "#app", 6 | data: { 7 | showModal: false, 8 | products: [], 9 | brands: ["Home & Pro tools", "Drills Co", "ProSaws", "ElctroDrill"], 10 | newProduct: { name: "", price: null, stockUnits: null, brand: {} }, 11 | toast: { 12 | type: "danger", 13 | message: null, 14 | show: false 15 | } 16 | }, 17 | mounted() { 18 | this.getProducts(); 19 | }, 20 | methods: { 21 | getProducts() { 22 | this.products = axios 23 | .get(`${API}/products`) 24 | .then((response) => { 25 | this.products = response.data.products; 26 | }) 27 | .catch((err) => { 28 | this.showError("Get", err.message); 29 | }); 30 | }, 31 | updateProduct(index) { 32 | axios 33 | .put(`${API}/products`, this.products[index]) 34 | .then(() => { 35 | this.showSuccess("Item updated"); 36 | }) 37 | .catch((err) => { 38 | this.showError("Update", err.message); 39 | }); 40 | }, 41 | createProduct() { 42 | axios 43 | .post(`${API}/products`, this.newProduct) 44 | .then((item) => { 45 | this.products.push(item.data); 46 | this.showSuccess("Item created"); 47 | }) 48 | .catch((err) => { 49 | this.showError("Create", err.message); 50 | }) 51 | .finally(() => { 52 | this.showModal = false; 53 | }); 54 | }, 55 | deleteProduct(id, brandName, index) { 56 | axios 57 | .delete(`${API}/products/${id}`, { 58 | data: { 59 | brand: { 60 | name: brandName 61 | } 62 | } 63 | }) 64 | .then(() => { 65 | // use the index to remove from the products array 66 | this.products.splice(index, 1); 67 | this.showSuccess("Item deleted"); 68 | }) 69 | .catch((err) => { 70 | this.showError("Delete", err.message); 71 | }); 72 | }, 73 | showError(action, message) { 74 | this.showToast(`${action} failed: ${message}`, "danger"); 75 | }, 76 | showSuccess(message) { 77 | this.showToast(message, "success"); 78 | }, 79 | showToast(message, type) { 80 | this.toast.message = message; 81 | this.toast.show = true; 82 | this.toast.type = type; 83 | setTimeout(() => { 84 | this.toast.show = false; 85 | }, 3000); 86 | } 87 | } 88 | }); 89 | })(); 90 | -------------------------------------------------------------------------------- /frontend/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "products-manager", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "products-manager", 9 | "version": "1.0.0" 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "products-manager", 3 | "version": "1.0.0", 4 | "description": "Product Manager web application for Tailwind Traders", 5 | "main": "index.html", 6 | "scripts": { 7 | "start": "npx serve" 8 | } 9 | } -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "lockfileVersion": 1 3 | } 4 | -------------------------------------------------------------------------------- /products-manager.code-workspace: -------------------------------------------------------------------------------- 1 | { 2 | "folders": [ 3 | { 4 | "path": "frontend" 5 | }, 6 | { 7 | "path": "api" 8 | } 9 | ], 10 | "settings": { 11 | "debug.internalConsoleOptions": "neverOpen" 12 | } 13 | } --------------------------------------------------------------------------------