From 380f0c7dbb38158dfcfef026a786990a4bab161c Mon Sep 17 00:00:00 2001 From: Sumeet Kumar Das <41441163+sumeetskd@users.noreply.github.com> Date: Mon, 31 Jul 2023 01:25:49 +0530 Subject: [PATCH 1/9] adding files --- .gitignore | 1 + backend/.gitignore | 3 + backend/.xatarc | 6 + backend/README.md | 7 + backend/nodemon.json | 6 + backend/package-lock.json | 3391 +++ backend/package.json | 31 + backend/src/index.ts | 141 + backend/src/xata.ts | 66 + backend/tsconfig.json | 14 + frontend/.browserslistrc | 16 + frontend/.editorconfig | 16 + frontend/.gitignore | 42 + frontend/Notes/MongoDb.txt | 120 + frontend/Notes/MongoNew_SelfNoteCommands.txt | 61 + .../Project Dev Notes/project-dev-notes.txt | 79 + frontend/Notes/angular/2way bin.txt | 12 + frontend/Notes/angular/Form-TD.txt | 29 + .../angular/MongoNew_SelfNoteCommands.txt | 11 + frontend/Notes/angular/angular_cli_notes.txt | 27 + frontend/Notes/angular/notes_angular.txt | 368 + frontend/Notes/angular/pipenotes.txt | 80 + frontend/Notes/angular/pipes_eg.txt | 54 + frontend/Notes/angular/service_self_note.txt | 29 + frontend/Notes/angular/testing.txt | 19 + frontend/Notes/bootstrap.txt | 93 + frontend/Notes/cssnote.txt | 27 + frontend/Notes/mongoNotes.txt | 13 + frontend/Notes/mongoose.txt | 20 + frontend/Notes/nodeNotes.txt | 210 + frontend/Notes/project.txt | 8 + frontend/Notes/sassnotes.txt | 136 + frontend/Notes/typescript.txt | 108 + frontend/README.md | 27 + frontend/angular.json | 108 + frontend/dist/pizzeria/3rdpartylicenses.txt | 312 + .../dist/pizzeria/assets/PizzeriaLogo.png | Bin 0 -> 74884 bytes frontend/dist/pizzeria/favicon.ico | Bin 0 -> 948 bytes frontend/dist/pizzeria/index.html | 26 + .../dist/pizzeria/main.df1d2049c4b06c30.js | 1 + .../pizzeria/polyfills.34a5458270de4441.js | 1 + .../dist/pizzeria/runtime.73d9db0adcd34c62.js | 1 + .../dist/pizzeria/styles.9d92352b0964ae36.css | 1 + frontend/karma.conf.js | 44 + frontend/netlify.toml | 4 + frontend/package-lock.json | 19745 ++++++++++++++++ frontend/package.json | 44 + frontend/src/app/app-routing.module.ts | 22 + frontend/src/app/app.component.css | 23 + frontend/src/app/app.component.html | 8 + frontend/src/app/app.component.spec.ts | 35 + frontend/src/app/app.component.ts | 17 + frontend/src/app/app.module.ts | 43 + frontend/src/app/cart.service.spec.ts | 16 + frontend/src/app/cart.service.ts | 76 + frontend/src/app/footer/footer.component.css | 14 + frontend/src/app/footer/footer.component.html | 5 + .../src/app/footer/footer.component.spec.ts | 25 + frontend/src/app/footer/footer.component.ts | 15 + frontend/src/app/home/home.component.css | 39 + frontend/src/app/home/home.component.html | 67 + frontend/src/app/home/home.component.spec.ts | 25 + frontend/src/app/home/home.component.ts | 16 + frontend/src/app/ingredient.service.spec.ts | 16 + frontend/src/app/ingredient.service.ts | 28 + .../app/ingredient/ingredient.component.css | 24 + .../app/ingredient/ingredient.component.html | 42 + .../ingredient/ingredient.component.spec.ts | 25 + .../app/ingredient/ingredient.component.ts | 77 + .../app/navigation/navigation.component.css | 23 + .../app/navigation/navigation.component.html | 19 + .../navigation/navigation.component.spec.ts | 25 + .../app/navigation/navigation.component.ts | 24 + .../order-placed/order-placed.component.css | 27 + .../order-placed/order-placed.component.html | 12 + .../order-placed.component.spec.ts | 25 + .../order-placed/order-placed.component.ts | 24 + frontend/src/app/order.service.spec.ts | 16 + frontend/src/app/order.service.ts | 34 + frontend/src/app/order/order.component.css | 70 + frontend/src/app/order/order.component.html | 62 + .../src/app/order/order.component.spec.ts | 25 + frontend/src/app/order/order.component.ts | 82 + .../shopping-cart/shopping-cart.component.css | 95 + .../shopping-cart.component.html | 173 + .../shopping-cart.component.spec.ts | 25 + .../shopping-cart/shopping-cart.component.ts | 207 + frontend/src/assets/.gitkeep | 0 frontend/src/assets/PizzeriaLogo.png | Bin 0 -> 74884 bytes frontend/src/environments/environment.prod.ts | 3 + frontend/src/environments/environment.ts | 17 + frontend/src/favicon.ico | Bin 0 -> 948 bytes frontend/src/index.html | 33 + frontend/src/main.ts | 12 + frontend/src/polyfills.ts | 53 + frontend/src/styles.css | 35 + frontend/src/test.ts | 26 + frontend/tsconfig.app.json | 15 + frontend/tsconfig.json | 32 + frontend/tsconfig.spec.json | 18 + 100 files changed, 27428 insertions(+) create mode 100644 .gitignore create mode 100644 backend/.gitignore create mode 100644 backend/.xatarc create mode 100644 backend/README.md create mode 100644 backend/nodemon.json create mode 100644 backend/package-lock.json create mode 100644 backend/package.json create mode 100644 backend/src/index.ts create mode 100644 backend/src/xata.ts create mode 100644 backend/tsconfig.json create mode 100644 frontend/.browserslistrc create mode 100644 frontend/.editorconfig create mode 100644 frontend/.gitignore create mode 100644 frontend/Notes/MongoDb.txt create mode 100644 frontend/Notes/MongoNew_SelfNoteCommands.txt create mode 100644 frontend/Notes/Project Dev Notes/project-dev-notes.txt create mode 100644 frontend/Notes/angular/2way bin.txt create mode 100644 frontend/Notes/angular/Form-TD.txt create mode 100644 frontend/Notes/angular/MongoNew_SelfNoteCommands.txt create mode 100644 frontend/Notes/angular/angular_cli_notes.txt create mode 100644 frontend/Notes/angular/notes_angular.txt create mode 100644 frontend/Notes/angular/pipenotes.txt create mode 100644 frontend/Notes/angular/pipes_eg.txt create mode 100644 frontend/Notes/angular/service_self_note.txt create mode 100644 frontend/Notes/angular/testing.txt create mode 100644 frontend/Notes/bootstrap.txt create mode 100644 frontend/Notes/cssnote.txt create mode 100644 frontend/Notes/mongoNotes.txt create mode 100644 frontend/Notes/mongoose.txt create mode 100644 frontend/Notes/nodeNotes.txt create mode 100644 frontend/Notes/project.txt create mode 100644 frontend/Notes/sassnotes.txt create mode 100644 frontend/Notes/typescript.txt create mode 100644 frontend/README.md create mode 100644 frontend/angular.json create mode 100644 frontend/dist/pizzeria/3rdpartylicenses.txt create mode 100644 frontend/dist/pizzeria/assets/PizzeriaLogo.png create mode 100644 frontend/dist/pizzeria/favicon.ico create mode 100644 frontend/dist/pizzeria/index.html create mode 100644 frontend/dist/pizzeria/main.df1d2049c4b06c30.js create mode 100644 frontend/dist/pizzeria/polyfills.34a5458270de4441.js create mode 100644 frontend/dist/pizzeria/runtime.73d9db0adcd34c62.js create mode 100644 frontend/dist/pizzeria/styles.9d92352b0964ae36.css create mode 100644 frontend/karma.conf.js create mode 100644 frontend/netlify.toml create mode 100644 frontend/package-lock.json create mode 100644 frontend/package.json create mode 100644 frontend/src/app/app-routing.module.ts create mode 100644 frontend/src/app/app.component.css create mode 100644 frontend/src/app/app.component.html create mode 100644 frontend/src/app/app.component.spec.ts create mode 100644 frontend/src/app/app.component.ts create mode 100644 frontend/src/app/app.module.ts create mode 100644 frontend/src/app/cart.service.spec.ts create mode 100644 frontend/src/app/cart.service.ts create mode 100644 frontend/src/app/footer/footer.component.css create mode 100644 frontend/src/app/footer/footer.component.html create mode 100644 frontend/src/app/footer/footer.component.spec.ts create mode 100644 frontend/src/app/footer/footer.component.ts create mode 100644 frontend/src/app/home/home.component.css create mode 100644 frontend/src/app/home/home.component.html create mode 100644 frontend/src/app/home/home.component.spec.ts create mode 100644 frontend/src/app/home/home.component.ts create mode 100644 frontend/src/app/ingredient.service.spec.ts create mode 100644 frontend/src/app/ingredient.service.ts create mode 100644 frontend/src/app/ingredient/ingredient.component.css create mode 100644 frontend/src/app/ingredient/ingredient.component.html create mode 100644 frontend/src/app/ingredient/ingredient.component.spec.ts create mode 100644 frontend/src/app/ingredient/ingredient.component.ts create mode 100644 frontend/src/app/navigation/navigation.component.css create mode 100644 frontend/src/app/navigation/navigation.component.html create mode 100644 frontend/src/app/navigation/navigation.component.spec.ts create mode 100644 frontend/src/app/navigation/navigation.component.ts create mode 100644 frontend/src/app/order-placed/order-placed.component.css create mode 100644 frontend/src/app/order-placed/order-placed.component.html create mode 100644 frontend/src/app/order-placed/order-placed.component.spec.ts create mode 100644 frontend/src/app/order-placed/order-placed.component.ts create mode 100644 frontend/src/app/order.service.spec.ts create mode 100644 frontend/src/app/order.service.ts create mode 100644 frontend/src/app/order/order.component.css create mode 100644 frontend/src/app/order/order.component.html create mode 100644 frontend/src/app/order/order.component.spec.ts create mode 100644 frontend/src/app/order/order.component.ts create mode 100644 frontend/src/app/shopping-cart/shopping-cart.component.css create mode 100644 frontend/src/app/shopping-cart/shopping-cart.component.html create mode 100644 frontend/src/app/shopping-cart/shopping-cart.component.spec.ts create mode 100644 frontend/src/app/shopping-cart/shopping-cart.component.ts create mode 100644 frontend/src/assets/.gitkeep create mode 100644 frontend/src/assets/PizzeriaLogo.png create mode 100644 frontend/src/environments/environment.prod.ts create mode 100644 frontend/src/environments/environment.ts create mode 100644 frontend/src/favicon.ico create mode 100644 frontend/src/index.html create mode 100644 frontend/src/main.ts create mode 100644 frontend/src/polyfills.ts create mode 100644 frontend/src/styles.css create mode 100644 frontend/src/test.ts create mode 100644 frontend/tsconfig.app.json create mode 100644 frontend/tsconfig.json create mode 100644 frontend/tsconfig.spec.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b512c09 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/backend/.gitignore b/backend/.gitignore new file mode 100644 index 0000000..935306f --- /dev/null +++ b/backend/.gitignore @@ -0,0 +1,3 @@ +build +node_modules +.env \ No newline at end of file diff --git a/backend/.xatarc b/backend/.xatarc new file mode 100644 index 0000000..9e89768 --- /dev/null +++ b/backend/.xatarc @@ -0,0 +1,6 @@ +{ + "databaseURL": "https://Sumeet-Kumar-Das-s-workspace-89eiv8.us-east-1.xata.sh/db/pizzeria-db", + "codegen": { + "output": "src/xata.ts" + } +} \ No newline at end of file diff --git a/backend/README.md b/backend/README.md new file mode 100644 index 0000000..0f7f3c6 --- /dev/null +++ b/backend/README.md @@ -0,0 +1,7 @@ +# typescript-starter + +API End Points: + +[ingredients/allitems](https://pizzeira-api.onrender.com/ingredients/allitems) + +[orderpizza/allitems](https://pizzeira-api.onrender.com/orderpizza/allitems) diff --git a/backend/nodemon.json b/backend/nodemon.json new file mode 100644 index 0000000..5131f09 --- /dev/null +++ b/backend/nodemon.json @@ -0,0 +1,6 @@ +{ + "watch": ["src"], + "ext": ".ts,.js", + "ignore": [], + "exec": "ts-node ./src/index.ts" + } \ No newline at end of file diff --git a/backend/package-lock.json b/backend/package-lock.json new file mode 100644 index 0000000..94d4031 --- /dev/null +++ b/backend/package-lock.json @@ -0,0 +1,3391 @@ +{ + "name": "typescript-starter", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "typescript-starter", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@xata.io/client": "^0.25.1", + "dotenv": "^16.3.1", + "node-fetch": "^3.3.2" + }, + "devDependencies": { + "@types/express": "^4.17.17", + "@types/node": "^18.17.0", + "express": "^4.18.2", + "nodemon": "^3.0.1", + "rimraf": "^5.0.1", + "ts-node": "^10.9.1", + "typescript": "^5.1.6" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.17.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.1.tgz", + "integrity": "sha512-xlR1jahfizdplZYRU59JlUx9uzF1ARa8jbhM11ccpCJya8kvos5jwdm2ZAgxSCwOl0fq21svP18EVwPBXMQudw==", + "dev": true + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@xata.io/client": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@xata.io/client/-/client-0.25.1.tgz", + "integrity": "sha512-BPB+JX1URNvvSsL5crhWnWC3X0PlilQ14MJTwX3jShGXRyqgkb5/tRgntkHMI6IS8UgLHsPnCS02uf8JkuBHJQ==", + "peerDependencies": { + "typescript": ">=4.5" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", + "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jackspeak": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.2.tgz", + "integrity": "sha512-mgNtVv4vUuaKA97yxUHoA3+FkuhtxkjdXEWOyB/N76fjy0FjezEt34oy3epBtvCvS+7DyKwqCFWx/oJLV5+kCg==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.2.tgz", + "integrity": "sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/nodemon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", + "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", + "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rimraf": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.1.tgz", + "integrity": "sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg==", + "dev": true, + "dependencies": { + "glob": "^10.2.5" + }, + "bin": { + "rimraf": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", + "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + } + }, + "dependencies": { + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + } + }, + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "requires": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true + }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", + "dev": true + }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "@types/node": { + "version": "18.17.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.1.tgz", + "integrity": "sha512-xlR1jahfizdplZYRU59JlUx9uzF1ARa8jbhM11ccpCJya8kvos5jwdm2ZAgxSCwOl0fq21svP18EVwPBXMQudw==", + "dev": true + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/serve-static": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "dev": true, + "requires": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "@xata.io/client": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@xata.io/client/-/client-0.25.1.tgz", + "integrity": "sha512-BPB+JX1URNvvSsL5crhWnWC3X0PlilQ14MJTwX3jShGXRyqgkb5/tRgntkHMI6IS8UgLHsPnCS02uf8JkuBHJQ==", + "requires": {} + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==" + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==" + }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true + }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "requires": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + } + }, + "formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "requires": { + "fetch-blob": "^3.1.2" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "glob": { + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", + "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", + "dev": true, + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "jackspeak": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.2.tgz", + "integrity": "sha512-mgNtVv4vUuaKA97yxUHoA3+FkuhtxkjdXEWOyB/N76fjy0FjezEt34oy3epBtvCvS+7DyKwqCFWx/oJLV5+kCg==", + "dev": true, + "requires": { + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minipass": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.2.tgz", + "integrity": "sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==", + "dev": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true + }, + "node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==" + }, + "node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "requires": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + } + }, + "nodemon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", + "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", + "dev": true, + "requires": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "requires": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", + "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==", + "dev": true + } + } + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "rimraf": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.1.tgz", + "integrity": "sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg==", + "dev": true, + "requires": { + "glob": "^10.2.5" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", + "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", + "dev": true + }, + "simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "requires": { + "semver": "^7.5.3" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "~1.0.10" + } + }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + } + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==" + }, + "undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true + }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true + }, + "web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==" + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + } + } +} diff --git a/backend/package.json b/backend/package.json new file mode 100644 index 0000000..4ba62c9 --- /dev/null +++ b/backend/package.json @@ -0,0 +1,31 @@ +{ + "name": "typescript-starter", + "version": "1.0.0", + "description": "", + "main": "index.js", + "engines": { + "node": ">=18" + }, + "scripts": { + "start:dev": "nodemon", + "build": "npm install && rimraf ./build && tsc", + "start": "node build/index.js " + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "@types/express": "^4.17.17", + "@types/node": "^18.17.0", + "express": "^4.18.2", + "nodemon": "^3.0.1", + "rimraf": "^5.0.1", + "ts-node": "^10.9.1", + "typescript": "^5.1.6" + }, + "dependencies": { + "@xata.io/client": "^0.25.1", + "dotenv": "^16.3.1", + "node-fetch": "^3.3.2" + } +} diff --git a/backend/src/index.ts b/backend/src/index.ts new file mode 100644 index 0000000..820f286 --- /dev/null +++ b/backend/src/index.ts @@ -0,0 +1,141 @@ +import express, {Express, Request, Response} from "express"; +import dotenv from 'dotenv'; +import { getXataClient,Ingredients,Orderpizza } from "./xata"; + +dotenv.config(); // make sure that env variables are included + +const app: Express = express(); +const port = process.env.PORT || 3000; + +app.use(express.json()); + +const xata = getXataClient(); + +type MyResponse = +| { + err: string; +} | { + data: any; +} + +app.get('/ingredients/allitems', async (req: Request, res: Response>)=>{ + try { + const data = await xata.db.ingredients.getAll(); + return res.status(200).json({data:data}); + } catch (err) { + console.error(err); + return res.status(500).json({err: 'Something went wrong' }); + } +}) + +app.post('/ingredients/additem', async (req: Request<{},{},Ingredients>, res: Response>)=>{ + try{ + const item = req.body; + const createdJob = await xata.db.ingredients.create(item); + // throw new Error('error'); + return res.status(201).json({data:createdJob}); + } + catch(err){ + console.error(err); + return res.status(500).json({err:'Something went wrong'}); + } +}) + +app.put('/ingredients/modifyitem/:id', async (req: Request<{id:string},{},Ingredients>, res: Response>)=>{ + try{ + const id = req.params.id; //params.id has to match the url parameter /:id + const item = req.body; + const updatedIng = await xata.db.ingredients.update(id, item); + + if(!updatedIng){ + return res.status(404).json({err: 'Ingredient Not Found'}); + } + + return res.status(201).json({data:updatedIng}); + } + catch(err){ + console.error(err); + return res.status(500).json({err:'Something went wrong'}); + } + +}) + +app.delete('/ingredients/deleteitem/:id', +async (req: Request<{id:string},{},{}>, res: Response>)=>{ + try{ + const id = req.params.id; + const deleteRecord = await xata.db.ingredients.delete(id); + if(!deleteRecord){ + return res.status(404).json({err: "Ingredient Not Found"}) + } + return res.status(200).json({data:deleteRecord}); + } + catch(err){ + console.error(err); + res.status(500).json({err:'Something went wrong'}); + } + +}) + +app.get('/orderpizza/allitems', async (req: Request, res: Response>)=>{ + try { + const data = await xata.db.orderpizza.getAll(); + return res.status(200).json({data:data}); + } catch (err) { + console.error(err); + return res.status(500).json({err: 'Something went wrong' }); + } +}) + +app.post('/orderpizza/additem', async (req: Request<{},{},Orderpizza>, res: Response>)=>{ + try{ + const item = req.body; + const createdJob = await xata.db.orderpizza.create(item); + // throw new Error('error') + return res.status(201).json({data:createdJob}); + } + catch(err){ + console.error(err); + return res.status(500).json({err:'Something went wrong'}); + } +}) + +app.put('/orderpizza/modifyitem/:id', async (req: Request<{id:string},{},Orderpizza>, res: Response>)=>{ + try{ + const id = req.params.id; //params.id has to match the url parameter /:id + const item = req.body; + const updatedIng = await xata.db.orderpizza.update(id, item); + + if(!updatedIng){ + return res.status(404).json({err: 'Order Not Found'}); + } + + return res.status(201).json({data:updatedIng}); + } + catch(err){ + console.error(err); + return res.status(500).json({err:'Something went wrong'}); + } + +}) + +app.delete('/Orderpizza/deleteitem/:id', +async (req: Request<{id:string},{},{}>, res: Response>)=>{ + try{ + const id = req.params.id; + const deleteRecord = await xata.db.orderpizza.delete(id); + if(!deleteRecord){ + return res.status(404).json({err: "Order Not Found"}) + } + return res.status(200).json({data:deleteRecord}); + } + catch(err){ + console.error(err); + res.status(500).json({err:'Something went wrong'}); + } + +}) + +app.listen(port, ()=>{ + console.log(`Server running at port ${port}`); +}) \ No newline at end of file diff --git a/backend/src/xata.ts b/backend/src/xata.ts new file mode 100644 index 0000000..bf4cccb --- /dev/null +++ b/backend/src/xata.ts @@ -0,0 +1,66 @@ +// Generated by Xata Codegen 0.25.1. Please do not edit. +import { buildClient } from "@xata.io/client"; +import type { + BaseClientOptions, + SchemaInference, + XataRecord, +} from "@xata.io/client"; + +const tables = [ + { + name: "ingredients", + columns: [ + { name: "image", type: "string" }, + { name: "price", type: "int" }, + { name: "tname", type: "string" }, + ], + }, + { + name: "orderpizza", + columns: [ + { name: "description", type: "string" }, + { name: "image", type: "string" }, + { name: "ingredients", type: "multiple" }, + { name: "name", type: "string" }, + { name: "price", type: "int" }, + { name: "topping", type: "multiple" }, + { name: "type", type: "string" }, + ], + }, +] as const; + +export type SchemaTables = typeof tables; +export type InferredTypes = SchemaInference; + +export type Ingredients = InferredTypes["ingredients"]; +export type IngredientsRecord = Ingredients & XataRecord; + +export type Orderpizza = InferredTypes["orderpizza"]; +export type OrderpizzaRecord = Orderpizza & XataRecord; + +export type DatabaseSchema = { + ingredients: IngredientsRecord; + orderpizza: OrderpizzaRecord; +}; + +const DatabaseClient = buildClient(); + +const defaultOptions = { + databaseURL: + "https://Sumeet-Kumar-Das-s-workspace-89eiv8.us-east-1.xata.sh/db/pizzeria-db", +}; + +export class XataClient extends DatabaseClient { + constructor(options?: BaseClientOptions) { + super({ ...defaultOptions, ...options }, tables); + } +} + +let instance: XataClient | undefined = undefined; + +export const getXataClient = () => { + if (instance) return instance; + + instance = new XataClient(); + return instance; +}; diff --git a/backend/tsconfig.json b/backend/tsconfig.json new file mode 100644 index 0000000..5dac47e --- /dev/null +++ b/backend/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "es6", + "module": "commonjs", + "lib": ["es6"], + "allowJs": true, + "outDir": "build", + "rootDir": "src", + "strict": true, + "noImplicitAny": true, + "esModuleInterop": true, + "resolveJsonModule": true + } + } \ No newline at end of file diff --git a/frontend/.browserslistrc b/frontend/.browserslistrc new file mode 100644 index 0000000..4f9ac26 --- /dev/null +++ b/frontend/.browserslistrc @@ -0,0 +1,16 @@ +# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries + +# For the full list of supported browsers by the Angular framework, please see: +# https://angular.io/guide/browser-support + +# You can see what browsers were selected by your queries by running: +# npx browserslist + +last 1 Chrome version +last 1 Firefox version +last 2 Edge major versions +last 2 Safari major versions +last 2 iOS major versions +Firefox ESR diff --git a/frontend/.editorconfig b/frontend/.editorconfig new file mode 100644 index 0000000..59d9a3a --- /dev/null +++ b/frontend/.editorconfig @@ -0,0 +1,16 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.ts] +quote_type = single + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..dff2aa2 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,42 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# Compiled output + +/tmp +/out-tsc +/bazel-out + +# Node +/node_modules +npm-debug.log +yarn-error.log + +# IDEs and editors +.idea/ +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# Visual Studio Code +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# Miscellaneous +/.angular/cache +.sass-cache/ +/connect.lock +/coverage +/libpeerconnection.log +testem.log +/typings + +# System files +.DS_Store +Thumbs.db diff --git a/frontend/Notes/MongoDb.txt b/frontend/Notes/MongoDb.txt new file mode 100644 index 0000000..4ef06f5 --- /dev/null +++ b/frontend/Notes/MongoDb.txt @@ -0,0 +1,120 @@ +MongoDB + +SQL---------- Mongo +database --- database +table --- collection +row --- document + + +Creating the database in mongo. +1. "use" is the command to create and use the the database. +2. If the database with the name given is available then it be switched to or +new database will be created witrh the name given and switched to. +3. To check the current database we use "db" command. +4. To see all the databases available we use "show databases". +5. To see all the collection in current database we use "show collections" + + +Create the collection +1. To create the colection we use +db.createCollection(""); +2. We can also create the collection using below +db..insertOne({empNo:101,name:"Ram",age:21}) +Above command will insert the record if the collection with +name given is available, if it is not available then it will create the +collection with the name given and then it will insert the record. + + +Insert the records: +1. In mondo db we can insert single record at a time or we can insert multiple +records also(document). +2. To insert the single record we use db..insertOne({}); +eg. db.Users.insertOne({name:"Rahul",age:21,city:Pune}); +3. to insert multiple records we user db..insertMany([{},{}]); + + +Fetch the documents: +1. We use find() method. +2. To view output in proper styling we use find().pretty(). +3. eg. db.Users.find() or db.Users.find().pretty().4. To check the count we use count() method +eg. db.Users.find().count() +5. To fetch the documents using some condition we specify that +conditions in the find() method +eg. db.Users.find({name:"Raja"}); =>this will display the records with +name as "Raja". + + +sort(): +eg. db.Users.find().sort({age:1}).pretty(); +here we wan give values as + 1: ascending order +-1: descending order. + +Updating the documents: +1. We can update single or multiple documents using the below function: + 1. updateOne(); + 2. updateMany(); + eg: db.Users.updateOne({name:"Sachin"},{$set:{city:"Nagpur"}}); + + +To fetch only perticular field from all the documents: +1. find() method always returns _id +eg. db.Users.find({},{name:1}) +eg. db.Users.find({},{_id:0,name:1,city:1}) +This will skip all the fields and only display name and city fields +for all the documents + star 1 + + +Deleting the documents: +1. To delete the documents we have below methods: +1. deleteOne({condition}) +2. deleteMany({condition}) + + + + +$set: +1. This operator replaces the existing value with the new value for perticular fileds, if +that field is present in the document. +2. If the field is not present in the document then it creates the field +and then assign the value. +3. Using the $set operator we can set the value for the embedded document also. + $set:{name:'sumeet'} + updateOne({name:"Sachin"},{$set:{city:"Nagpur"}}) + + +Create the database in Mongo: + +1. "use" is the command used to create or switch to perticular database. +2. To check the current database, we use "db" command. + +show databases: shows list of databases; + +db book: creates new database; + +use book : enters/uses databases +___________________________________ + +collection= same as table -> have key,value pair(like a json object) +To create collection:- +db.createCollection("Book"); + +show collections : shows list of collection + +db.book.insertOne({title:"C",page:124,author:"Sumeet"} : inserts data + + +db.book.pretty() : show the database in proper format +db.book.find() + +db.book.find({title:"html"}) : fetched data from title:"html" + +db.book.find({title:"html"}).pretty() : shows data in proper structure + +db.book.find().count() : shows no. of records + +db.book.find().sort({age:1}); -> returns data in ascending order +db.book.find().sort({age:-1}); -> returns data in descending order +any other values rather than 1 and -1 will give : error + diff --git a/frontend/Notes/MongoNew_SelfNoteCommands.txt b/frontend/Notes/MongoNew_SelfNoteCommands.txt new file mode 100644 index 0000000..893af21 --- /dev/null +++ b/frontend/Notes/MongoNew_SelfNoteCommands.txt @@ -0,0 +1,61 @@ +show databases; + +create new db: use + +collection: equivalent to table + +show collections;-> shows collections + +create New Collection: +db.myNewCollection.insertOne({x:1}); (auto-creation:implicit: when first data is inserted) +db.createCollection(name_of_collection); (collection:explicit) + +Drop a Collection: +db..drop() : return true:successfully dropped + return false: failed to remove +eg: db.Student.drop() : returns true(dropped successfully) + + +Insert Data: +insertMany(): +eg: db.Employee.insertMany([{eid:101,ename:"Sumeet",esalary:29000},{eid:102,ename:"Amit",esalary:30000},{eid:103,ename:"Saurabh",esalary:50000}]); + + +_id Field is unique ObjectId for collection data, to avoid duplicate key error + + +Unordered Insertion: +db.Employee.insert([{eid:104,ename:"Rahul",esalary:34322},{eid: 105,ename: "Sambit", esalary: 32223}]); + +(Order is not maintained in above case) + +Finding the Doc.: +Method to read documents from collection: +db.collection.find(query,projection); +eg: + db.Employee.find(query,projection) + + query: + projection: + +Types: +1. FindAll: +eg: db.Employee.find(); +2. Selection: + db.Employee.find({esalary:{$gt:30000}}) +3. Projecton: + db.Employee.find({ + {esalary:{$gt:30000}}, + {eid:101} + } + +price:{$lt:200} +price:{$gt:200} +price:{$gte:2000} +price:{$in:[100,200]} +price:{$ne:3000} +price:{$nin:[100,200,300]} + +Update: + +db.Employee.update({eid:101},{$set{ename:"Rakesh",esalary:40000}}); \ No newline at end of file diff --git a/frontend/Notes/Project Dev Notes/project-dev-notes.txt b/frontend/Notes/Project Dev Notes/project-dev-notes.txt new file mode 100644 index 0000000..74a9526 --- /dev/null +++ b/frontend/Notes/Project Dev Notes/project-dev-notes.txt @@ -0,0 +1,79 @@ +Developing Complete MEAN App: +1. Create the Angular +2. Create the service with name as Books +3. Create the Component as "AddBook" +4. Import HttpClientModule in app.module.ts file +5. Create the Model Book as interface in Books.Model.ts file in app folder. +6. Inside the service file import HttpClient and create its instance as +dependency injection. +7. In the service class create the getAllBook() and addBook() methods. +8. In the app.comp.ts file create constructor and create the object of +BookService as dependency injection. + + + + + +Server side program: +1. Create the Node server side project npx express-generator. +2. Switch to that project folder and install mongodb. +3. Create the mongo connection in books.js(Routing file). +4. Create teh different methods as per requirments like get, post. +eg. router.get() ,router.post +5. From get() methods fetch all the books from mongo db and return as response. +eg. +router.get('/allbooks',(req,res)=> +{ +db.collection('Books').find().toArray((err,data)=> +{ +if(err) +console.log("Can not find book data"); +else{ +res.send(data); +} +}) +}) +IMP: +1. To execute the MEAN app we need to use "cors" +2. Install cors. +3. import cors in the app.js file(Server program) and use it as +app.use(cors) +6. Execute this node prgram and then execute the Angular program. + + + + + +Asynchronous programming: +1. Whle working with the ynchrnonous programs, if one of the opeartion failed or +took more time to execute remaining task also goes in pending state. +2. To over come this issue we use asynchronous programming. +3. Asynchronous functions contains the callback function as argument. + + + +Create the asynchronous function: +1. To create the asynchronous function we pass a callback function as parameter. +2.Then the result of our function we pass to the callback function as argument. + + +Promise: +1. Promise is used to assure the caller of function about the either result or +the error. +2. Promise object always return either success or reject state. +3. When we write promise object in the asynchronous function, then it will +either return success(data) or failure(error). +4. When we use normal asynchronous function, we only receive success(data), but +we can not get failure status(error). +5. We call the promisified functions using then() and catch() + +BlueBird: +1. It is fully featured javascript library for the Promise. +2. When we promisify any API using the bluebird, it's performance becomes more +than noraml ES6 Promise object. +3. Installation: +npm install bluebird +4. We can promicify any ither node modules using bluebird in order to use that +modules asynchronously. +Example : We can promicify the mongoose connection. + diff --git a/frontend/Notes/angular/2way bin.txt b/frontend/Notes/angular/2way bin.txt new file mode 100644 index 0000000..1181baf --- /dev/null +++ b/frontend/Notes/angular/2way bin.txt @@ -0,0 +1,12 @@ +[(ngModel)]="name" name:string="Sumeet" + +(handler)->event +[]->property + +src:string="./doc/img.jpg"; + + + +myFun(){ + this.src="./doc/img1.jpg"; +} \ No newline at end of file diff --git a/frontend/Notes/angular/Form-TD.txt b/frontend/Notes/angular/Form-TD.txt new file mode 100644 index 0000000..8232fbe --- /dev/null +++ b/frontend/Notes/angular/Form-TD.txt @@ -0,0 +1,29 @@ +
+
+ + + +
+
+ Username cannot be blank.. +
+
+ Username must be at least 3 characters.. +
+
+ + + +
+
+ Username cannot be blank.. +
+
+ Password must be at least 5 characters.. +
+
+ + +
+ +
\ No newline at end of file diff --git a/frontend/Notes/angular/MongoNew_SelfNoteCommands.txt b/frontend/Notes/angular/MongoNew_SelfNoteCommands.txt new file mode 100644 index 0000000..80b424b --- /dev/null +++ b/frontend/Notes/angular/MongoNew_SelfNoteCommands.txt @@ -0,0 +1,11 @@ +show databases; + +create new db: use + +collection: equivalent to table + +show collections;-> shows collections + +create New Collection: +db.myNewCollection.insertOne({x:1}); (auto-creation:implicit: when first data is inserted) +db.createCollection(name_of_collection); (collection:explicit) \ No newline at end of file diff --git a/frontend/Notes/angular/angular_cli_notes.txt b/frontend/Notes/angular/angular_cli_notes.txt new file mode 100644 index 0000000..70c4bd3 --- /dev/null +++ b/frontend/Notes/angular/angular_cli_notes.txt @@ -0,0 +1,27 @@ +node -v: node version +npm install -g @angular/cli: installs angular cli globally +ng -version: angular/cli version +port: 4200 + +Some angular cli commands: +1. ng new myapp:create new project +2. ng update @angular/core @angular/cli:updates angular and its dependicies +3. ng serve: serves the app on localhost:4200 +4. ng --v,npm--v: shows verson +5. ng add @angular/localize: addes ext libraries to ur project +6. ng run [option]: run an artifact target with some built in option + +7. xi18n: extract i18n messages from source code +8. config: retrives or set angular config value +9. deploy: invokes the deploy builder for specified project + +creation of: +10. module: ng g module my-module +11. ng g c component +12. ng g service service_name +13. ng generate directive directive_name + ng g d directive_name + +14. ng analytics : enables or disables all usage analytics for the user +15. ng build : name of the project can be anything +16. ng doc pipe: opens the official angular documentation in a browser \ No newline at end of file diff --git a/frontend/Notes/angular/notes_angular.txt b/frontend/Notes/angular/notes_angular.txt new file mode 100644 index 0000000..c966b5b --- /dev/null +++ b/frontend/Notes/angular/notes_angular.txt @@ -0,0 +1,368 @@ +1. Angular is a component based programming. +2. In angular we create separate component for different functionalities. +3. When we create an angular project, by default one component is created as "App" component. +4. Every component by default contains 4 files: + 1. .ts file(logic file) + 2. .html file(design file) + 3. .css file(stylesheet file) + 4. .spec.ts file (testing file) +5. When we create a class and we want to make that class as a component class, + we have to decorate that class with @component decorator. +6. Decorator is like function which is used to decorate the class/method. +7. Decorate name always starts with @ symbol. +8. Every decorator contains some metadata. +9. @component decorator has the following metadata: + 1. selector: The component is identified with the selector. Selector is used to call + the component. + We use selector as tag in html page to call the component. + + 2. templateUrl: Here we specify the html file which we bind the component with. + It means that when we will invoke the component, the html file mentioned in the templateurl will be displayed. + + 3. styleurl: Here we specify the stylesheet file for the component. + +10. Component is the collection of logic and design script. +11. Logic is implemented in .ts file and design script is implemented in the html file. +12. We bind the logic(.ts) and design(.html) file in the templateUrl of @component decorator. +13. Installation of Angular: + npm install -g @angular/cli +14. To create the angular project we use below command + ng new +15. To run the angular project use: + ng serve -o + Above command run the project and open it on localhost 4200 + +Component: +1. Component is collection of logic and design script. +2. In the project, we create diffrent components for specific task. +eg: login componet, home component, payment component. +3. Single Page Application(SPA) is the collection of muliple component. +4. In every angular project there is a default componet called "App" component. +5. We can create our user defined componet as below: + ng generate component +6. Above command will create folder with componet's name and that folder will contain 4 files(.ts,.html,.css,.spec.ts) + + +User defined comp.: +IMP: +1. When we run the angular project, it only display index.html page. +2. This index.html by default invokes(calls) App component. +3. It means angular by default loads only "App" component. +4. Thats why even if we call the user defined component from index.html +It will not call that component. +5. If we want to call the user defined componet from index.html it menas if we want to load the user defined component at the boostrapping, we need +to modify app.module.ts file. +6. In app.module.ts file there is property called as bootstrap, +In this bootstrap array we need to add our userdefined component. +Then only it will be loaded at starting of angular project and it will allow us to invoke the user defined component from Index.html page. + +Data Binding: + +1. We create the data in the class(.ts file) and display that data on the html page. +The flow of data between componet and html is called as data binding. +There are two types of data binding. +1. One way data binding. +2. Two way data binding. + +One way data binding: +1. When the data flows from component to html or html to component it is called as one way data binding. +2. Event binding is a type of one way data binding. -> (prop) +3. In the event binding, the event(click, focus, blur) gets generated on the html +page and it calls the function in the class(.ts file) +4. We can implement the one way data binding using: + 1. Interpolation: {{}} + 2. Property binding: [property_name]: In this case we declare the property in the + .ts file(class) and we apply that property on the html page. + Syntax: [property_name] = "variable declared in class" + +Two way data binding: +1. When data flows from component(.ts) to html as well as from html to the component, it is called as two way data binding. +2. To implement two way data binding, we make use of [(ngModel)] +3. To use the [(ngModel)] in the Project we need to import the Forms Module in the app.module.ts file. +4. After importing we hae to add the FormsModule in the imports array in the epp.module.ts file. +5. We create the data member in the component and inside it's html we +create any text field. We bind the text field with the data memeber created in the component. +6. We bind the data members with the textfile using [(ngModel)]. + +Directive: +1. With the help of directives we can give instruction to modify the DOM at the runtime. +2. Directives are used to display the content on html page based on some conditions. + eg: Display user name only if user is logged in, + Display logout button, make payment button only if user is logged in. +3. Directive decides how to place html content on the page. +4. There are 3 types of directives: + 1. Structural Directives + 2. Component Directives + 3. Attribute Directives + +Structural Directives: +1. This directives are responsible for the structure of page. +2. These directives can add, remove, modify html elements at runtime. +3. Using these directives we can change the appearance of the webpage. +4. Names of the structural directives always starts with * + eg. *ngFor, *ngIf, *ngSwitch, + +*ngIf: +1. It is used to display the html content based on some condition. +2. It works as simple if statement in programming. +3. To implelent if..else, we need to create the block using with some id. +4. Then we need to use this id in the else block. + +else part is written inside: ng-template +eg: +

Some text

+ + //id is created with #id_name + + +*ngFor: +1. It works as for loop in the programming language. +2. It is used to print the html elements multiple times. + +Steps: To create an example +1. Create the employee component. +2. In this employee create the array of employee data. +3. In the employee.comp.html page create the table and display this data using *ngFor. +4. We need to use *ngFor at the row level because we need to dispaly the rows multiple times. + +*ngSwitch: +1. It is used as switch case in the programming languages. +2. We can *ngSwitch when we want to dispaly a perticular option among the multiple options. + cmd: ng generate component SwitchCase + + + + +2. Vertical Form: This is default form layout +
+Apply: + +3. Inline Form: +add .form-inline to your form for left-aligned and inline-block control. +
+
+ Name + +
+
+ Email + +
+
+ + +Button: + +bootstrap provides different types of buttons with predefined style + +
+

+ *Estimated time of delivery {{countItems*timeDelivery}} mins. +

+
+ + + + + + + \ No newline at end of file diff --git a/frontend/src/app/shopping-cart/shopping-cart.component.spec.ts b/frontend/src/app/shopping-cart/shopping-cart.component.spec.ts new file mode 100644 index 0000000..fbbe21a --- /dev/null +++ b/frontend/src/app/shopping-cart/shopping-cart.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ShoppingCartComponent } from './shopping-cart.component'; + +describe('ShoppingCartComponent', () => { + let component: ShoppingCartComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ ShoppingCartComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(ShoppingCartComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/frontend/src/app/shopping-cart/shopping-cart.component.ts b/frontend/src/app/shopping-cart/shopping-cart.component.ts new file mode 100644 index 0000000..bb4f5bb --- /dev/null +++ b/frontend/src/app/shopping-cart/shopping-cart.component.ts @@ -0,0 +1,207 @@ +import { Component, OnInit, OnDestroy } from '@angular/core'; + +import { CartService } from '../cart.service'; + + +@Component({ + selector: 'app-shopping-cart', + templateUrl: './shopping-cart.component.html', + styleUrls: ['./shopping-cart.component.css'] +}) +export class ShoppingCartComponent implements OnInit { + timeDelivery:number = 10; + totalCost:number = 0; + defaultValue: number = 1; + countItems: number = 0; + totalIngredientCost:number = 0; + totalCartPrice:number = 0; + + checkCount: boolean = this.countItems == 0 ? true : false; + orderCartItem: any = []; + ingredientCartItem: any = []; + + countOrderItems: any = []; + + constructor(private cartService: CartService) { + + } + getTotalCartPrice(){ + this.totalCartPrice = this.totalCost + this.totalIngredientCost; + } + + getTotalCostIngredient(){ + let sum = 0; + for(let i of this.ingredientCartItem){ + sum+=Number(i.price); + } + this.totalIngredientCost = sum; + console.log('Total Ingredient Cost: ',this.totalIngredientCost); + } + + getTotalCost(){ + let sum = 0; + for(let i of this.countOrderItems){ + sum+=Number(i.totalPrice); + } + this.totalCost = sum; + } + + valueMinus(itemId: any) { + let findOrder = this.countOrderItems.find((data: any) => data.item.id == itemId.id); + let findIndex = this.countOrderItems.findIndex((data: any) => data.item.id == itemId.id); + console.log(findOrder); + if (findOrder.quantity == 0) { + return; + } + + findOrder.quantity -= 1; + + let itemPrice = findOrder.item.price; + let currentTotalPrice = findOrder.totalPrice; + let priceMinus = currentTotalPrice - itemPrice; + findOrder.totalPrice = priceMinus; + console.log('FindOrder: ', findOrder); + + this.countOrderItems[findIndex] = findOrder; + console.log(this.countOrderItems[findIndex]); + this.getTotalCost(); + this.getTotalCostIngredient(); + this.getTotalCartPrice(); + } + + valueAdd(itemId: any) { + console.log('valueAdd', itemId.id); + + let findOrder = this.countOrderItems.find((data: any) => data.item.id == itemId.id); + let findIndex = this.countOrderItems.findIndex((data: any) => data.item.id == itemId.id); + + console.log('findIndex:', findIndex); + + console.log('findOrder:', findOrder); + + findOrder.quantity += 1; + let itemPrice: number = Number(findOrder.item.price); + let currentTotalPrice: number = Number(findOrder.totalPrice); + + let priceSum: number = itemPrice + currentTotalPrice; + + console.log('findOrder.price:', findOrder.item.price); + console.log(Number(findOrder.item.price)); + + findOrder.totalPrice = priceSum; + console.log(itemPrice); + console.log('itemPrice: ', itemPrice); + console.log('currentTotalPrice: ', currentTotalPrice); + + console.log('TotalPrice: ', priceSum); + + this.countOrderItems[findIndex] = findOrder; + console.log(this.countOrderItems[findIndex]); + + // console.log('OrderCart: ',this.countOrderItems); + this.getTotalCost(); + this.getTotalCostIngredient(); + this.getTotalCartPrice(); + + } + + deleteOrder(item:any) { + console.log('Inside cart.component.deleteOrder(): '); + console.log(item.value); + let delItemId = item.value; + let findIndexCart = this.countOrderItems.findIndex((data: any) => data.item.id == delItemId); + let findIndexOrder = this.orderCartItem.findIndex((data: any) => data.id == delItemId); + + console.log(findIndexCart); + this.countOrderItems.splice(findIndexCart,1); + this.orderCartItem.splice(findIndexOrder,1); + console.log('Removed Item:'); + console.log('Cart:CartOrderItems: ',this.countOrderItems); + console.log('Cart:OrderItems: ',this.orderCartItem); + + this.getTotalCost(); + this.getTotalCostIngredient(); + this.getTotalCartPrice(); + } + + getBooleanCount(): boolean { + if (this.countItems == 0) { + return true; + } + else { + return false; + } + } + changeBoolean(){ + window.location.reload(); + } + + deleteIngredient(item:any) { + console.log('Inside cart.component.deleteIngredient(): '); + console.log(item.value); + let delItemId = item.value; + let findIndexIngredient = this.ingredientCartItem.findIndex((data: any) => data.id == delItemId); + // let findIndexOrder = this.orderCartItem.findIndex((data: any) => data.id == delItemId); + + console.log(findIndexIngredient); + this.ingredientCartItem.splice(findIndexIngredient,1); + // this.orderCartItem.splice(findIndexOrder,1); + console.log('Removed Item:'); + console.log('Cart:CartIngredientItems: ',this.ingredientCartItem); + + this.getTotalCost(); + this.getTotalCostIngredient(); + this.getTotalCartPrice(); + } + + ngOnInit(): void { + console.log('ngOnInit:cartComponent'); + this.orderCartItem = this.cartService.getOrderCart(); + this.ingredientCartItem = this.cartService.getIngredientCart(); + this.countItems = this.cartService.getCountItem(); + + let tempCountOrderItems = this.cartService.getcountOrderItems(); + console.log('Temp count Length:', tempCountOrderItems.length); + console.log(tempCountOrderItems); + console.log('cart order length: ', this.orderCartItem.length); + + for (let item of this.orderCartItem) { + let itemPrice = Number(item.price); + let quantity = 1; + let totalPrice = itemPrice * quantity; + if (tempCountOrderItems.length != 0) { + for (let tempItem of tempCountOrderItems) { + if (tempItem.item.id == item.id) { + quantity = tempItem.quantity; + totalPrice = tempItem.totalPrice; + break; + } + } + } + let k = { item, 'quantity': quantity, 'totalPrice': totalPrice }; + this.countOrderItems.push(k); + + + // this.totalCartPrice = this.totalCost+this.totalCartPrice; + } + + // this.countOrderItems = + console.log('shopping-cart.component:countOrderItems:', this.countOrderItems) + console.log('Number of CartItems: ', this.countItems); + console.log(this.countOrderItems); + this.getTotalCost(); + this.getTotalCostIngredient(); + this.getTotalCartPrice(); + } + + ngOnDestroy(): void { + console.log('ngOnDestroy:cartComponent'); + console.log(this.orderCartItem); + console.log(this.ingredientCartItem); + console.log('To save the quantity and total price:'); + this.cartService.setcountOrderItems(this.countOrderItems); + this.cartService.setIngredientCartItem(this.ingredientCartItem); + let totalTime = this.timeDelivery*this.countItems; + this.cartService.setTime(totalTime); + } +} diff --git a/frontend/src/assets/.gitkeep b/frontend/src/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/frontend/src/assets/PizzeriaLogo.png b/frontend/src/assets/PizzeriaLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..f1314432bfdcf89ed6ba4a6c7f73c1c00a0e983c GIT binary patch literal 74884 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

sh$16 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ÖHo>2i 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 literal 0 HcmV?d00001 diff --git a/frontend/src/environments/environment.prod.ts b/frontend/src/environments/environment.prod.ts new file mode 100644 index 0000000..3612073 --- /dev/null +++ b/frontend/src/environments/environment.prod.ts @@ -0,0 +1,3 @@ +export const environment = { + production: true +}; diff --git a/frontend/src/environments/environment.ts b/frontend/src/environments/environment.ts new file mode 100644 index 0000000..3ff06d3 --- /dev/null +++ b/frontend/src/environments/environment.ts @@ -0,0 +1,17 @@ +// This file can be replaced during build by using the `fileReplacements` array. +// `ng build` replaces `environment.ts` with `environment.prod.ts`. +// The list of file replacements can be found in `angular.json`. + +export const environment = { + production: false, + // baseURL: "https://pizzeira-api.onrender.com/orderpizza/allitems" +}; + +/* + * For easier debugging in development mode, you can import the following file + * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. + * + * This import should be commented out in production mode because it will have a negative impact + * on performance if an error is thrown. + */ +// import 'zone.js/plugins/zone-error'; // Included with Angular CLI. diff --git a/frontend/src/favicon.ico b/frontend/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..997406ad22c29aae95893fb3d666c30258a09537 GIT binary patch literal 948 zcmV;l155mgP)CBYU7IjCFmI-B}4sMJt3^s9NVg!P0 z6hDQy(L`XWMkB@zOLgN$4KYz;j0zZxq9KKdpZE#5@k0crP^5f9KO};h)ZDQ%ybhht z%t9#h|nu0K(bJ ztIkhEr!*UyrZWQ1k2+YkGqDi8Z<|mIN&$kzpKl{cNP=OQzXHz>vn+c)F)zO|Bou>E z2|-d_=qY#Y+yOu1a}XI?cU}%04)zz%anD(XZC{#~WreV!a$7k2Ug`?&CUEc0EtrkZ zL49MB)h!_K{H(*l_93D5tO0;BUnvYlo+;yss%n^&qjt6fZOa+}+FDO(~2>G z2dx@=JZ?DHP^;b7*Y1as5^uphBsh*s*z&MBd?e@I>-9kU>63PjP&^#5YTOb&x^6Cf z?674rmSHB5Fk!{Gv7rv!?qX#ei_L(XtwVqLX3L}$MI|kJ*w(rhx~tc&L&xP#?cQow zX_|gx$wMr3pRZIIr_;;O|8fAjd;1`nOeu5K(pCu7>^3E&D2OBBq?sYa(%S?GwG&_0-s%_v$L@R!5H_fc)lOb9ZoOO#p`Nn`KU z3LTTBtjwo`7(HA6 z7gmO$yTR!5L>Bsg!X8616{JUngg_@&85%>W=mChTR;x4`P=?PJ~oPuy5 zU-L`C@_!34D21{fD~Y8NVnR3t;aqZI3fIhmgmx}$oc-dKDC6Ap$Gy>a!`A*x2L1v0 WcZ@i?LyX}70000 + + + + + Pizzeria + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/src/main.ts b/frontend/src/main.ts new file mode 100644 index 0000000..c7b673c --- /dev/null +++ b/frontend/src/main.ts @@ -0,0 +1,12 @@ +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app/app.module'; +import { environment } from './environments/environment'; + +if (environment.production) { + enableProdMode(); +} + +platformBrowserDynamic().bootstrapModule(AppModule) + .catch(err => console.error(err)); diff --git a/frontend/src/polyfills.ts b/frontend/src/polyfills.ts new file mode 100644 index 0000000..429bb9e --- /dev/null +++ b/frontend/src/polyfills.ts @@ -0,0 +1,53 @@ +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes recent versions of Safari, Chrome (including + * Opera), Edge on the desktop, and iOS and Chrome on mobile. + * + * Learn more in https://angular.io/guide/browser-support + */ + +/*************************************************************************************************** + * BROWSER POLYFILLS + */ + +/** + * By default, zone.js will patch all possible macroTask and DomEvents + * user can disable parts of macroTask/DomEvents patch by setting following flags + * because those flags need to be set before `zone.js` being loaded, and webpack + * will put import in the top of bundle, so user need to create a separate file + * in this directory (for example: zone-flags.ts), and put the following flags + * into that file, and then add the following code before importing zone.js. + * import './zone-flags'; + * + * The flags allowed in zone-flags.ts are listed here. + * + * The following flags will work for all browsers. + * + * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame + * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick + * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames + * + * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js + * with the following flag, it will bypass `zone.js` patch for IE/Edge + * + * (window as any).__Zone_enable_cross_context_check = true; + * + */ + +/*************************************************************************************************** + * Zone JS is required by default for Angular itself. + */ +import 'zone.js'; // Included with Angular CLI. + + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ diff --git a/frontend/src/styles.css b/frontend/src/styles.css new file mode 100644 index 0000000..fe5aebe --- /dev/null +++ b/frontend/src/styles.css @@ -0,0 +1,35 @@ +/* You can add global styles to this file, and also import other style files */ + +html, body { height: 100%; } +body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; } + +mat-checkbox .mat-checkbox-label{ + margin-top: 4px; + font-weight: lighter; +} + mat-checkbox .mat-checkbox-frame { + border-color: rgb(0, 0, 0); + background-color: #36333300; + font-weight: lighter; +} + +mat-checkbox .mat-checkbox-indeterminate.mat-accent .mat-checkbox-background, .mat-checkbox-checked.mat-accent .mat-checkbox-background { + margin-top: 1px; + margin-left: 1px; + width: 16px; + height: 17px; +} + + /* mat-checkbox .mat-checkbox-background{ + background-color: transparent; + + +} */ + +/* .mat-checkbox-checkmark-path { + stroke:transparent; + + } + svg path{ + fill: transparent; +}; */ \ No newline at end of file diff --git a/frontend/src/test.ts b/frontend/src/test.ts new file mode 100644 index 0000000..00025da --- /dev/null +++ b/frontend/src/test.ts @@ -0,0 +1,26 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +declare const require: { + context(path: string, deep?: boolean, filter?: RegExp): { + (id: string): T; + keys(): string[]; + }; +}; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting(), +); + +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); diff --git a/frontend/tsconfig.app.json b/frontend/tsconfig.app.json new file mode 100644 index 0000000..82d91dc --- /dev/null +++ b/frontend/tsconfig.app.json @@ -0,0 +1,15 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [] + }, + "files": [ + "src/main.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.d.ts" + ] +} diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json new file mode 100644 index 0000000..f531992 --- /dev/null +++ b/frontend/tsconfig.json @@ -0,0 +1,32 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "sourceMap": true, + "declaration": false, + "downlevelIteration": true, + "experimentalDecorators": true, + "moduleResolution": "node", + "importHelpers": true, + "target": "es2017", + "module": "es2020", + "lib": [ + "es2020", + "dom" + ] + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + } +} diff --git a/frontend/tsconfig.spec.json b/frontend/tsconfig.spec.json new file mode 100644 index 0000000..092345b --- /dev/null +++ b/frontend/tsconfig.spec.json @@ -0,0 +1,18 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": [ + "jasmine" + ] + }, + "files": [ + "src/test.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} From b517e495a98fb085b0a59aa5af6a811ac4af4f8d Mon Sep 17 00:00:00 2001 From: Sumeet Kumar Das <41441163+sumeetskd@users.noreply.github.com> Date: Mon, 31 Jul 2023 01:34:16 +0530 Subject: [PATCH 2/9] Create package.json --- package.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 package.json diff --git a/package.json b/package.json new file mode 100644 index 0000000..6970ebb --- /dev/null +++ b/package.json @@ -0,0 +1,12 @@ +{ + "name": "pizzeira-app", + "version": "1.0.0", + "engines": { + "node": ">=18 <19" + }, + "scripts": { + "start": "cd backend/built && node server.js", + "prebuild": "cd backend && npm run build", + "build": "cd frontend && npm run build" + } +} \ No newline at end of file From 783b525a47f128d9409914359f1161ceec00906b Mon Sep 17 00:00:00 2001 From: Sumeet Kumar Das <41441163+sumeetskd@users.noreply.github.com> Date: Mon, 31 Jul 2023 01:45:05 +0530 Subject: [PATCH 3/9] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6970ebb..83b7b21 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "node": ">=18 <19" }, "scripts": { - "start": "cd backend/built && node server.js", + "start": "cd backend/build && node server.js", "prebuild": "cd backend && npm run build", "build": "cd frontend && npm run build" } From a97cf6ec347d0a3541b5e92f0441960102cd84d6 Mon Sep 17 00:00:00 2001 From: Sumeet Kumar Das <41441163+sumeetskd@users.noreply.github.com> Date: Mon, 31 Jul 2023 02:09:38 +0530 Subject: [PATCH 4/9] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 83b7b21..012a528 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "node": ">=18 <19" }, "scripts": { - "start": "cd backend/build && node server.js", + "start": "cd backend/build && node index.js", "prebuild": "cd backend && npm run build", "build": "cd frontend && npm run build" } From 12042f14062713b276dba0707614950dd419e2de Mon Sep 17 00:00:00 2001 From: Sumeet Kumar Das <41441163+sumeetskd@users.noreply.github.com> Date: Mon, 31 Jul 2023 02:53:32 +0530 Subject: [PATCH 5/9] Update index.ts --- backend/src/index.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/backend/src/index.ts b/backend/src/index.ts index 820f286..1016c2d 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -1,5 +1,6 @@ import express, {Express, Request, Response} from "express"; import dotenv from 'dotenv'; +import path from 'path'; import { getXataClient,Ingredients,Orderpizza } from "./xata"; dotenv.config(); // make sure that env variables are included @@ -136,6 +137,12 @@ async (req: Request<{id:string},{},{}>, res: Response>)=> }) +app.use(express.static('public')); +app.get('*', (req, res) => { + res.sendFile(path.join(__dirname,'public', 'index.html')) +}) + + app.listen(port, ()=>{ console.log(`Server running at port ${port}`); }) \ No newline at end of file From 4777871dd9c96476b3fbf2e574ed7635a9dc2585 Mon Sep 17 00:00:00 2001 From: Sumeet Kumar Das <41441163+sumeetskd@users.noreply.github.com> Date: Mon, 31 Jul 2023 03:12:57 +0530 Subject: [PATCH 6/9] Update index.ts --- backend/src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/index.ts b/backend/src/index.ts index 1016c2d..b03421f 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -137,9 +137,9 @@ async (req: Request<{id:string},{},{}>, res: Response>)=> }) -app.use(express.static('public')); +app.use(express.static('../../frontend/dist/pizzeria')); app.get('*', (req, res) => { - res.sendFile(path.join(__dirname,'public', 'index.html')) + res.sendFile(path.join(__dirname,'../../frontend/dist/pizzeria', 'index.html')) }) From fadeef086b1c113453944d1f8012d715d27c7ce3 Mon Sep 17 00:00:00 2001 From: Sumeet Kumar Das <41441163+sumeetskd@users.noreply.github.com> Date: Mon, 31 Jul 2023 03:35:20 +0530 Subject: [PATCH 7/9] URL changes --- frontend/src/app/ingredient.service.ts | 7 ++++--- frontend/src/app/order.service.ts | 7 ++++--- frontend/src/app/shared/constants/url.ts | 6 ++++++ 3 files changed, 14 insertions(+), 6 deletions(-) create mode 100644 frontend/src/app/shared/constants/url.ts diff --git a/frontend/src/app/ingredient.service.ts b/frontend/src/app/ingredient.service.ts index fbf66e5..9f26a0d 100644 --- a/frontend/src/app/ingredient.service.ts +++ b/frontend/src/app/ingredient.service.ts @@ -1,6 +1,7 @@ import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { CartService } from './cart.service'; +import { INGREDIENT_URL } from './shared/constants/url'; @Injectable({ providedIn: 'root' @@ -8,13 +9,13 @@ import { CartService } from './cart.service'; export class IngredientService { cartIngredient:any = []; - url = 'https://pizzeira-api.onrender.com/ingredients/allitems'; + URL = INGREDIENT_URL; constructor(private httpClient:HttpClient, private cartService:CartService ) { - + } getIngredientData(){ - return this.httpClient.get(this.url); + return this.httpClient.get(this.URL); } setCartIngredient(item:any){ this.cartIngredient = item; diff --git a/frontend/src/app/order.service.ts b/frontend/src/app/order.service.ts index d8a21e5..00b5b13 100644 --- a/frontend/src/app/order.service.ts +++ b/frontend/src/app/order.service.ts @@ -1,6 +1,7 @@ import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { CartService } from './cart.service'; +import { ORDER_URL } from './shared/constants/url'; @Injectable({ providedIn: 'root' @@ -8,13 +9,13 @@ import { CartService } from './cart.service'; export class OrderService { cartOrder:any = []; countOrder:number = 0; - url = 'https://pizzeira-api.onrender.com/orderpizza/allitems'; + URL = ORDER_URL; constructor(private httpClient:HttpClient, private cartService:CartService) { } - + getOrderData(){ - return this.httpClient.get(this.url); + return this.httpClient.get(this.URL); } getCountOrder(){ return this.cartOrder.length; diff --git a/frontend/src/app/shared/constants/url.ts b/frontend/src/app/shared/constants/url.ts new file mode 100644 index 0000000..061b6a8 --- /dev/null +++ b/frontend/src/app/shared/constants/url.ts @@ -0,0 +1,6 @@ +import { environment } from "src/environments/environment"; + +const BASE_URL = environment.production? '' : 'http://localhost:3000'; + +export const ORDER_URL = BASE_URL + '/orderpizza/allitems'; +export const INGREDIENT_URL = BASE_URL + '/ingredients/allitems'; From 5cfd968c93c600e1febaf8fe6ac41fd0baddc36c Mon Sep 17 00:00:00 2001 From: Sumeet Kumar Das <41441163+sumeetskd@users.noreply.github.com> Date: Mon, 31 Jul 2023 12:21:36 +0530 Subject: [PATCH 8/9] observable object changes --- frontend/src/app/ingredient.service.ts | 5 +-- .../app/ingredient/ingredient.component.ts | 33 +++++++++++-------- frontend/src/app/order.service.ts | 5 +-- frontend/src/app/order/order.component.ts | 17 +++++----- package-lock.json | 6 ++++ 5 files changed, 39 insertions(+), 27 deletions(-) create mode 100644 package-lock.json diff --git a/frontend/src/app/ingredient.service.ts b/frontend/src/app/ingredient.service.ts index 9f26a0d..2689e8c 100644 --- a/frontend/src/app/ingredient.service.ts +++ b/frontend/src/app/ingredient.service.ts @@ -2,6 +2,7 @@ import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { CartService } from './cart.service'; import { INGREDIENT_URL } from './shared/constants/url'; +import { Observable } from 'rxjs'; @Injectable({ providedIn: 'root' @@ -14,8 +15,8 @@ export class IngredientService { } - getIngredientData(){ - return this.httpClient.get(this.URL); + getIngredientData(): Observable{ + return this.httpClient.get(this.URL); } setCartIngredient(item:any){ this.cartIngredient = item; diff --git a/frontend/src/app/ingredient/ingredient.component.ts b/frontend/src/app/ingredient/ingredient.component.ts index 09bf4b1..19090a7 100644 --- a/frontend/src/app/ingredient/ingredient.component.ts +++ b/frontend/src/app/ingredient/ingredient.component.ts @@ -13,36 +13,29 @@ export class IngredientComponent implements OnInit { cost:number = 0; ingredient_data: any = []; buildIngredientId:any=[]; - + constructor(private ingredientService: IngredientService) { - this.ingredientService.getIngredientData().subscribe((data) => { - this.ingredient_data = data; - }, (err) => { - console.log('Error!!') - console.log(err); - }, () => { - console.log('Details Retrieved'); - }); + } findCost(item:MatCheckboxChange){ let item_id=item.source.id; let find_item = this.ingredient_data.find((product:any)=>product.id==item_id); if(item.checked){ - + console.log(find_item.price); this.cost += find_item.price; this.buildIngredientId.push(find_item); - + }else{ - + this.cost -= find_item.price; //find item to remove using splice let index = this.buildIngredientId.findIndex((item:any)=>item.id==find_item.id); this.buildIngredientId.splice(index,1); - + } - console.log(this.buildIngredientId); + console.log('buildIngredientId-',this.buildIngredientId); } checkPresence(item:any){ @@ -63,6 +56,18 @@ export class IngredientComponent implements OnInit { // console.log(item.value); } ngOnInit(): void { + + this.ingredientService.getIngredientData().subscribe((data) => { + let objDump = data; + this.ingredient_data = objDump.data; + console.log('Details about data',this.ingredient_data); + }, (err) => { + console.log('Error!!') + console.log(err); + }, () => { + console.log('Details Retrieved'); + }); + this.buildIngredientId = this.ingredientService.getCartIngredient(); for(let i of this.buildIngredientId){ diff --git a/frontend/src/app/order.service.ts b/frontend/src/app/order.service.ts index 00b5b13..9a6d7eb 100644 --- a/frontend/src/app/order.service.ts +++ b/frontend/src/app/order.service.ts @@ -2,6 +2,7 @@ import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { CartService } from './cart.service'; import { ORDER_URL } from './shared/constants/url'; +import { Observable } from 'rxjs'; @Injectable({ providedIn: 'root' @@ -14,8 +15,8 @@ export class OrderService { } - getOrderData(){ - return this.httpClient.get(this.URL); + getOrderData():Observable{ + return this.httpClient.get(this.URL); } getCountOrder(){ return this.cartOrder.length; diff --git a/frontend/src/app/order/order.component.ts b/frontend/src/app/order/order.component.ts index 1101212..1b1ae10 100644 --- a/frontend/src/app/order/order.component.ts +++ b/frontend/src/app/order/order.component.ts @@ -23,14 +23,6 @@ export class OrderComponent implements OnInit { } constructor(private orderServe: OrderService) { - - this.orderServe.getOrderData().subscribe((data) => { - this.pizza = data; - let jsonData = { id: this.pizza.id, value: false }; - this.initialItems.push(jsonData); - }) - - } addToCartClick(item: any) { let check_presence = this.cartItems.findIndex((data: any) => data.id == item.value); @@ -45,7 +37,6 @@ export class OrderComponent implements OnInit { } // this.onCartCountChange(); this.emitCartCount.emit(this.cartItems.length); - } checkPresence(item: any): boolean { @@ -57,6 +48,14 @@ export class OrderComponent implements OnInit { return false; } ngOnInit(): void { + + this.orderServe.getOrderData().subscribe((data) => { + let objDump = data; + this.pizza = objDump.data; + let jsonData = { id: this.pizza.id, value: false }; + this.initialItems.push(jsonData); + }) + this.cartItems = this.orderServe.getOrderCartItems(); console.log("ngOnInit:OrderComponent, No. of Items: ", this.cartItems.length); this.countCartItems = this.cartItems.length; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..e148409 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "pizzeira-app", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} From 0af1ff44497eff3c651e15e4afad130ffbd26e75 Mon Sep 17 00:00:00 2001 From: Sumeet Kumar Das <41441163+sumeetskd@users.noreply.github.com> Date: Wed, 2 Aug 2023 04:33:02 +0530 Subject: [PATCH 9/9] footer.component.html - copyright change --- frontend/src/app/footer/footer.component.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/footer/footer.component.html b/frontend/src/app/footer/footer.component.html index a053de0..6f06817 100644 --- a/frontend/src/app/footer/footer.component.html +++ b/frontend/src/app/footer/footer.component.html @@ -1,5 +1,5 @@

\ No newline at end of file +