├── frontend ├── src │ ├── assets │ │ └── .gitkeep │ ├── app │ │ ├── app.component.css │ │ ├── app.component.html │ │ ├── app-routing.module.ts │ │ ├── services │ │ │ └── mostrador.service.ts │ │ ├── app.module.ts │ │ └── app.component.ts │ ├── styles.css │ ├── favicon.ico │ ├── main.ts │ └── index.html ├── .vscode │ ├── extensions.json │ ├── launch.json │ └── tasks.json ├── tsconfig.app.json ├── tsconfig.spec.json ├── .editorconfig ├── .gitignore ├── tsconfig.json ├── README.md ├── package.json └── angular.json ├── .gitattributes ├── backend ├── Dockerfile ├── package.json ├── index.js └── package-lock.json ├── .github └── workflows │ └── ci_cd_example.yml ├── .gitignore └── README.md /frontend/src/assets/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/src/app/app.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /frontend/src/styles.css: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | -------------------------------------------------------------------------------- /frontend/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperMartin/01-restaurante-fullapp/HEAD/frontend/src/favicon.ico -------------------------------------------------------------------------------- /frontend/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /frontend/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846 3 | "recommendations": ["angular.ng-template"] 4 | } 5 | -------------------------------------------------------------------------------- /backend/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:18-bullseye-slim 2 | 3 | WORKDIR /app 4 | 5 | COPY package.json ./ 6 | 7 | RUN npm install 8 | 9 | COPY ./ ./ 10 | 11 | EXPOSE 3000 12 | 13 | CMD ["node", "./index.js"] -------------------------------------------------------------------------------- /frontend/src/main.ts: -------------------------------------------------------------------------------- 1 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 2 | 3 | import { AppModule } from './app/app.module'; 4 | 5 | 6 | platformBrowserDynamic().bootstrapModule(AppModule) 7 | .catch(err => console.error(err)); 8 | -------------------------------------------------------------------------------- /frontend/src/app/app-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { RouterModule, Routes } from '@angular/router'; 3 | 4 | const routes: Routes = []; 5 | 6 | @NgModule({ 7 | imports: [RouterModule.forRoot(routes)], 8 | exports: [RouterModule] 9 | }) 10 | export class AppRoutingModule { } 11 | -------------------------------------------------------------------------------- /frontend/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/app", 6 | "types": [] 7 | }, 8 | "files": [ 9 | "src/main.ts" 10 | ], 11 | "include": [ 12 | "src/**/*.d.ts" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /frontend/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/spec", 6 | "types": [ 7 | "jasmine" 8 | ] 9 | }, 10 | "include": [ 11 | "src/**/*.spec.ts", 12 | "src/**/*.d.ts" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /frontend/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /frontend/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frontend 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /backend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "restaurante-backend", 3 | "version": "1.0.0", 4 | "description": "Aplicacion de ejemplo de un restaurante ficticio ", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node ./index.js" 8 | }, 9 | "author": "Martin", 10 | "license": "ISC", 11 | "dependencies": { 12 | "cors": "^2.8.5", 13 | "express": "^4.18.2" 14 | } 15 | } -------------------------------------------------------------------------------- /frontend/src/app/services/mostrador.service.ts: -------------------------------------------------------------------------------- 1 | import { HttpClient } from '@angular/common/http'; 2 | import { Injectable } from '@angular/core'; 3 | 4 | @Injectable({ 5 | providedIn: 'root' 6 | }) 7 | export class MostradorService { 8 | 9 | constructor(private httpClient: HttpClient) { } 10 | 11 | getFood() { 12 | return this.httpClient.get('http://localhost:3000/foods'); 13 | } 14 | 15 | getDrink() { 16 | return this.httpClient.get('http://localhost:3000/drinks'); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /frontend/src/app/app.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { BrowserModule } from '@angular/platform-browser'; 3 | import { HttpClientModule } from '@angular/common/http'; 4 | import { AppRoutingModule } from './app-routing.module'; 5 | import { AppComponent } from './app.component'; 6 | 7 | @NgModule({ 8 | declarations: [ 9 | AppComponent 10 | ], 11 | imports: [ 12 | BrowserModule, 13 | AppRoutingModule, 14 | HttpClientModule 15 | ], 16 | providers: [], 17 | bootstrap: [AppComponent] 18 | }) 19 | export class AppModule { } 20 | -------------------------------------------------------------------------------- /frontend/.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 3 | "version": "0.2.0", 4 | "configurations": [ 5 | { 6 | "name": "ng serve", 7 | "type": "pwa-chrome", 8 | "request": "launch", 9 | "preLaunchTask": "npm: start", 10 | "url": "http://localhost:4200/" 11 | }, 12 | { 13 | "name": "ng test", 14 | "type": "chrome", 15 | "request": "launch", 16 | "preLaunchTask": "npm: test", 17 | "url": "http://localhost:9876/debug.html" 18 | } 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /frontend/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { MostradorService } from './services/mostrador.service'; 3 | 4 | @Component({ 5 | selector: 'app-root', 6 | templateUrl: './app.component.html', 7 | styleUrls: ['./app.component.css'] 8 | }) 9 | export class AppComponent { 10 | 11 | constructor(private mostradorService: MostradorService) {} 12 | 13 | getFood(){ 14 | this.mostradorService.getFood().subscribe((data) => { 15 | console.log(data); 16 | }); 17 | } 18 | 19 | getDrink(){ 20 | this.mostradorService.getDrink().subscribe((data) => { 21 | console.log(data); 22 | }); 23 | } 24 | 25 | 26 | } 27 | -------------------------------------------------------------------------------- /frontend/.gitignore: -------------------------------------------------------------------------------- 1 | # See http://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # Compiled output 4 | /dist 5 | /tmp 6 | /out-tsc 7 | /bazel-out 8 | 9 | # Node 10 | /node_modules 11 | npm-debug.log 12 | yarn-error.log 13 | 14 | # IDEs and editors 15 | .idea/ 16 | .project 17 | .classpath 18 | .c9/ 19 | *.launch 20 | .settings/ 21 | *.sublime-workspace 22 | 23 | # Visual Studio Code 24 | .vscode/* 25 | !.vscode/settings.json 26 | !.vscode/tasks.json 27 | !.vscode/launch.json 28 | !.vscode/extensions.json 29 | .history/* 30 | 31 | # Miscellaneous 32 | /.angular/cache 33 | .sass-cache/ 34 | /connect.lock 35 | /coverage 36 | /libpeerconnection.log 37 | testem.log 38 | /typings 39 | 40 | # System files 41 | .DS_Store 42 | Thumbs.db 43 | -------------------------------------------------------------------------------- /backend/index.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const app = express() 3 | const path = require('path') 4 | 5 | console.log(path.join(__dirname, 'dist')) 6 | 7 | app.use(express.static(path.join(__dirname, 'dist'))) 8 | 9 | app.get('/frontend', (req, res) => { 10 | res.sendFile(path.join(__dirname, 'dist', 'index.html')) 11 | }) 12 | 13 | app.get('/foods', function (req, res) { 14 | res.json({ 15 | response: [{ 16 | food: 'pizza' 17 | }, { 18 | food: 'tacos' 19 | }, { 20 | food: 'sushi' 21 | }] 22 | }) 23 | }) 24 | 25 | app.get('/drinks', function (req, res) { 26 | res.json({ 27 | response: [{ 28 | drink: 'cerveza' 29 | }, { 30 | drink: 'mojito' 31 | }, { 32 | drink: 'monster' 33 | }, { 34 | drink: 'vodka' 35 | }] 36 | }) 37 | }) 38 | 39 | app.listen(3000, () => { 40 | console.log('La aplicacion se levanto en el puerto 3000') 41 | }) -------------------------------------------------------------------------------- /.github/workflows/ci_cd_example.yml: -------------------------------------------------------------------------------- 1 | name: CI / CD - Ejemplo 2 | 3 | on: 4 | push: 5 | tags: 6 | - 'v*' 7 | 8 | jobs: 9 | build: 10 | runs-on: ubuntu-latest 11 | 12 | strategy: 13 | matrix: 14 | node-version: [16.x] 15 | 16 | steps: 17 | - uses: actions/checkout@v2 18 | 19 | - name: build backend 20 | working-directory: backend 21 | run: | 22 | npm install 23 | 24 | - name: build docker backend image 25 | working-directory: backend 26 | run: | 27 | docker build -t developermartinfernandez/backend-twitch:$(echo ${GITHUB_REF:10}) . 28 | 29 | - name: Login de docker hub 30 | uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9 31 | with: 32 | registry: docker.io 33 | username: developermartinfernandez 34 | password: ${{ secrets.TOKEN_DE_DOCKER_HUB }} 35 | 36 | - name: Publish Image 37 | run: | 38 | docker image push developermartinfernandez/backend-twitch:$(echo ${GITHUB_REF:10}) 39 | 40 | 41 | -------------------------------------------------------------------------------- /frontend/tsconfig.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "compileOnSave": false, 4 | "compilerOptions": { 5 | "baseUrl": "./", 6 | "outDir": "./dist/out-tsc", 7 | "forceConsistentCasingInFileNames": true, 8 | "strict": true, 9 | "noImplicitOverride": true, 10 | "noPropertyAccessFromIndexSignature": true, 11 | "noImplicitReturns": true, 12 | "noFallthroughCasesInSwitch": true, 13 | "sourceMap": true, 14 | "declaration": false, 15 | "downlevelIteration": true, 16 | "experimentalDecorators": true, 17 | "moduleResolution": "node", 18 | "importHelpers": true, 19 | "target": "ES2022", 20 | "module": "ES2022", 21 | "useDefineForClassFields": false, 22 | "lib": [ 23 | "ES2022", 24 | "dom" 25 | ] 26 | }, 27 | "angularCompilerOptions": { 28 | "enableI18nLegacyMessageIdFormat": false, 29 | "strictInjectionParameters": true, 30 | "strictInputAccessModifiers": true, 31 | "strictTemplates": true 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /frontend/.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | // For more information, visit: https://go.microsoft.com/fwlink/?LinkId=733558 3 | "version": "2.0.0", 4 | "tasks": [ 5 | { 6 | "type": "npm", 7 | "script": "start", 8 | "isBackground": true, 9 | "problemMatcher": { 10 | "owner": "typescript", 11 | "pattern": "$tsc", 12 | "background": { 13 | "activeOnStart": true, 14 | "beginsPattern": { 15 | "regexp": "(.*?)" 16 | }, 17 | "endsPattern": { 18 | "regexp": "bundle generation complete" 19 | } 20 | } 21 | } 22 | }, 23 | { 24 | "type": "npm", 25 | "script": "test", 26 | "isBackground": true, 27 | "problemMatcher": { 28 | "owner": "typescript", 29 | "pattern": "$tsc", 30 | "background": { 31 | "activeOnStart": true, 32 | "beginsPattern": { 33 | "regexp": "(.*?)" 34 | }, 35 | "endsPattern": { 36 | "regexp": "bundle generation complete" 37 | } 38 | } 39 | } 40 | } 41 | ] 42 | } 43 | -------------------------------------------------------------------------------- /frontend/README.md: -------------------------------------------------------------------------------- 1 | # Frontend 2 | 3 | This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 15.0.0. 4 | 5 | ## Development server 6 | 7 | Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The application will automatically reload if you change any of the source files. 8 | 9 | ## Code scaffolding 10 | 11 | Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. 12 | 13 | ## Build 14 | 15 | Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. 16 | 17 | ## Running unit tests 18 | 19 | Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). 20 | 21 | ## Running end-to-end tests 22 | 23 | Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities. 24 | 25 | ## Further help 26 | 27 | To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page. 28 | -------------------------------------------------------------------------------- /frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "frontend", 3 | "version": "0.0.0", 4 | "scripts": { 5 | "ng": "ng", 6 | "start": "ng serve", 7 | "build": "ng build", 8 | "watch": "ng build --watch --configuration development", 9 | "test": "ng test" 10 | }, 11 | "private": true, 12 | "dependencies": { 13 | "@angular/animations": "^15.0.0", 14 | "@angular/common": "^15.0.0", 15 | "@angular/compiler": "^15.0.0", 16 | "@angular/core": "^15.0.0", 17 | "@angular/forms": "^15.0.0", 18 | "@angular/platform-browser": "^15.0.0", 19 | "@angular/platform-browser-dynamic": "^15.0.0", 20 | "@angular/router": "^15.0.0", 21 | "rxjs": "~7.5.0", 22 | "tslib": "^2.3.0", 23 | "zone.js": "~0.12.0" 24 | }, 25 | "devDependencies": { 26 | "@angular-devkit/build-angular": "^15.0.0", 27 | "@angular/cli": "~15.0.0", 28 | "@angular/compiler-cli": "^15.0.0", 29 | "@types/jasmine": "~4.3.0", 30 | "jasmine-core": "~4.5.0", 31 | "karma": "~6.4.0", 32 | "karma-chrome-launcher": "~3.1.0", 33 | "karma-coverage": "~2.2.0", 34 | "karma-jasmine": "~5.1.0", 35 | "karma-jasmine-html-reporter": "~2.0.0", 36 | "typescript": "~4.8.2" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | .env 77 | .env.development.local 78 | .env.test.local 79 | .env.production.local 80 | .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | dist 93 | 94 | # Gatsby files 95 | .cache/ 96 | # Comment in the public line in if your project uses Gatsby and not Next.js 97 | # https://nextjs.org/blog/next-9-1#public-directory-support 98 | # public 99 | 100 | # vuepress build output 101 | .vuepress/dist 102 | 103 | # vuepress v2.x temp and cache directory 104 | .temp 105 | .cache 106 | 107 | # Serverless directories 108 | .serverless/ 109 | 110 | # FuseBox cache 111 | .fusebox/ 112 | 113 | # DynamoDB Local files 114 | .dynamodb/ 115 | 116 | # TernJS port file 117 | .tern-port 118 | 119 | # Stores VSCode versions used for testing VSCode extensions 120 | .vscode-test 121 | 122 | # yarn v2 123 | .yarn/cache 124 | .yarn/unplugged 125 | .yarn/build-state.yml 126 | .yarn/install-state.gz 127 | .pnp.* 128 | -------------------------------------------------------------------------------- /frontend/angular.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./node_modules/@angular/cli/lib/config/schema.json", 3 | "version": 1, 4 | "newProjectRoot": "projects", 5 | "projects": { 6 | "frontend": { 7 | "projectType": "application", 8 | "schematics": {}, 9 | "root": "", 10 | "sourceRoot": "src", 11 | "prefix": "app", 12 | "architect": { 13 | "build": { 14 | "builder": "@angular-devkit/build-angular:browser", 15 | "options": { 16 | "outputPath": "../backend/dist", 17 | "index": "src/index.html", 18 | "main": "src/main.ts", 19 | "polyfills": [ 20 | "zone.js" 21 | ], 22 | "tsConfig": "tsconfig.app.json", 23 | "assets": [ 24 | "src/favicon.ico", 25 | "src/assets" 26 | ], 27 | "styles": [ 28 | "src/styles.css" 29 | ], 30 | "scripts": [] 31 | }, 32 | "configurations": { 33 | "production": { 34 | "budgets": [ 35 | { 36 | "type": "initial", 37 | "maximumWarning": "500kb", 38 | "maximumError": "1mb" 39 | }, 40 | { 41 | "type": "anyComponentStyle", 42 | "maximumWarning": "2kb", 43 | "maximumError": "4kb" 44 | } 45 | ], 46 | "outputHashing": "all" 47 | }, 48 | "development": { 49 | "buildOptimizer": false, 50 | "optimization": false, 51 | "vendorChunk": true, 52 | "extractLicenses": false, 53 | "sourceMap": true, 54 | "namedChunks": true 55 | } 56 | }, 57 | "defaultConfiguration": "production" 58 | }, 59 | "serve": { 60 | "builder": "@angular-devkit/build-angular:dev-server", 61 | "configurations": { 62 | "production": { 63 | "browserTarget": "frontend:build:production" 64 | }, 65 | "development": { 66 | "browserTarget": "frontend:build:development" 67 | } 68 | }, 69 | "defaultConfiguration": "development" 70 | }, 71 | "extract-i18n": { 72 | "builder": "@angular-devkit/build-angular:extract-i18n", 73 | "options": { 74 | "browserTarget": "frontend:build" 75 | } 76 | }, 77 | "test": { 78 | "builder": "@angular-devkit/build-angular:karma", 79 | "options": { 80 | "polyfills": [ 81 | "zone.js", 82 | "zone.js/testing" 83 | ], 84 | "tsConfig": "tsconfig.spec.json", 85 | "assets": [ 86 | "src/favicon.ico", 87 | "src/assets" 88 | ], 89 | "styles": [ 90 | "src/styles.css" 91 | ], 92 | "scripts": [] 93 | } 94 | } 95 | } 96 | } 97 | }, 98 | "cli": { 99 | "analytics": "cb5e6fe1-07bf-4b11-a121-47a8cbb4d489" 100 | } 101 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Restaurante full app 2 | 3 | ![image](https://user-images.githubusercontent.com/43618471/203546384-1339a378-3118-47fc-b353-6d22595f7437.png) 4 | > Aplicacion para simular la comunicación entre Frontend y Backend utilizando la analogia del restaurante 5 | 6 | 7 | ### Estado del proyecto 🏗 8 | 9 | En progreso 10 | 11 | 12 | ### Pre-requisitos necesarios 📋 13 | * Descargar [Visual Studio Code (Color azul)](https://visualstudio.microsoft.com/es/downloads/) (o su editor de texto de confianza) 14 | * Descargar e instalar el [software de control de versiones](https://git-scm.com/) 15 | * Descargar e instalar [Node.js (Version LTS)](https://git-scm.com/) 16 | * Ejecutar en la terminal 17 | ```bash 18 | npm install -g @angular/cli 19 | ``` 20 | 21 | ### Pre-requisitos no necesarios 22 | 23 | * Extensiones para Visual Studio Code 24 | * [Angular Language Service](https://marketplace.visualstudio.com/items?itemName=Angular.ng-template) 25 | * [Angular Snippets (Version 13)](https://marketplace.visualstudio.com/items?itemName=johnpapa.Angular2) 26 | * [Angular 10 Snippets](https://marketplace.visualstudio.com/items?itemName=Mikael.Angular-BeastCode) 27 | * [Error Lens](https://marketplace.visualstudio.com/items?itemName=usernamehw.errorlens) 28 | * [Material Icon Theme](https://marketplace.visualstudio.com/items?itemName=PKief.material-icon-theme) 29 | 30 | ## Comenzando 🚀 31 | 32 | 1. Clonar el repositorio 33 | ```bash 34 | git clone https://github.com/DeveloperMartin/01-restaurante-fullapp.git 35 | ``` 36 | 2. Instalar las dependencias del backend y del frontend, recorda que tenes que ir hasta la carpeta del backend, ejecutar el comando y despues tenes que ir al frontend a realizar la misma accion (el orden en el que se haga no importa) 37 | ```bash 38 | npm install 39 | ``` 40 | 3. Levantar el backend (Recorda viajar hasta la carpeta de backend para ejecutar este comando) 41 | ```bash 42 | node ./index.js 43 | ``` 44 | 4. Abri otra terminal (Es importante que la terminal donde esta corriendo el backend no la cierres) 45 | 5. Levantar el frontend (Recordar viajar hasta la carpeta del frontend para ejecutar este comando) 46 | ```bash 47 | ng serve -o 48 | ``` 49 | 50 | > `clone` va a crear una carpeta con el nombre completo del repositorio en donde sea que este situado en la terminal. Es aconsejable viajar con la terminal hasta la ruta donde realmente quiere que el proyecto se descargue (Por ejemplo en Documents). Para ello hay que utilizar el comando `cd` e indicar a que carpeta se quiere mover con la terminal. 51 | ```bash 52 | cd ./users 53 | cd ./Documents 54 | cd ./github 55 | git clone https... 56 | ``` 57 | * [Documentación del comando clone](https://www.google.com/search?q=git+clone&rlz=1C1ONGR_esAR1032AR1032&oq=git+clone&aqs=chrome..69i57j69i64.884j0j7&sourceid=chrome&ie=UTF-8) 58 | * [Documentacion del comando - cd -](https://denovatoanovato.net/comando-cd/) 59 | 60 | ## Despliegue 📦 61 | 62 | 1. Abrir terminal 63 | 2. Viajar hasta la carpeta del frontend 64 | 3. Ejecutar comando 65 | ```bash 66 | ng build 67 | ``` 68 | 4. Con la misma termimal (no es necesario), viajar hasta el backend 69 | 5. Ejecutar comando 70 | ```bash 71 | node ./index.js 72 | ``` 73 | 6. En el navegador buscar 74 | ```url 75 | http://localhost:3000/frontend 76 | ``` 77 | 7. Si aparece la aplicacion de frontend, entonces ya tenes todo! 78 | 79 | ## Expresiones de Gratitud 🎁 80 | 81 | * Comenta a otros sobre este proyecto 📢 82 | * Seguime en [Twitch](https://twitch.tv/zatge) 83 | 84 | ![example](https://img.shields.io/discord/820794171844722728?label=Discord&style=plastic) - [Invitación](https://discord.gg/UMCMAKxcZ7) 85 | 86 | --- 87 | con ❤️ por [Zatge](https://github.com/DeveloperMartin) 😊 88 | -------------------------------------------------------------------------------- /backend/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "restaurante-backend", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "restaurante-backend", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "cors": "^2.8.5", 13 | "express": "^4.18.2" 14 | } 15 | }, 16 | "node_modules/accepts": { 17 | "version": "1.3.8", 18 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 19 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 20 | "dependencies": { 21 | "mime-types": "~2.1.34", 22 | "negotiator": "0.6.3" 23 | }, 24 | "engines": { 25 | "node": ">= 0.6" 26 | } 27 | }, 28 | "node_modules/array-flatten": { 29 | "version": "1.1.1", 30 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 31 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 32 | }, 33 | "node_modules/body-parser": { 34 | "version": "1.20.1", 35 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", 36 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", 37 | "dependencies": { 38 | "bytes": "3.1.2", 39 | "content-type": "~1.0.4", 40 | "debug": "2.6.9", 41 | "depd": "2.0.0", 42 | "destroy": "1.2.0", 43 | "http-errors": "2.0.0", 44 | "iconv-lite": "0.4.24", 45 | "on-finished": "2.4.1", 46 | "qs": "6.11.0", 47 | "raw-body": "2.5.1", 48 | "type-is": "~1.6.18", 49 | "unpipe": "1.0.0" 50 | }, 51 | "engines": { 52 | "node": ">= 0.8", 53 | "npm": "1.2.8000 || >= 1.4.16" 54 | } 55 | }, 56 | "node_modules/bytes": { 57 | "version": "3.1.2", 58 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 59 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 60 | "engines": { 61 | "node": ">= 0.8" 62 | } 63 | }, 64 | "node_modules/call-bind": { 65 | "version": "1.0.2", 66 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 67 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 68 | "dependencies": { 69 | "function-bind": "^1.1.1", 70 | "get-intrinsic": "^1.0.2" 71 | }, 72 | "funding": { 73 | "url": "https://github.com/sponsors/ljharb" 74 | } 75 | }, 76 | "node_modules/content-disposition": { 77 | "version": "0.5.4", 78 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 79 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 80 | "dependencies": { 81 | "safe-buffer": "5.2.1" 82 | }, 83 | "engines": { 84 | "node": ">= 0.6" 85 | } 86 | }, 87 | "node_modules/content-type": { 88 | "version": "1.0.4", 89 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 90 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", 91 | "engines": { 92 | "node": ">= 0.6" 93 | } 94 | }, 95 | "node_modules/cookie": { 96 | "version": "0.5.0", 97 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 98 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 99 | "engines": { 100 | "node": ">= 0.6" 101 | } 102 | }, 103 | "node_modules/cookie-signature": { 104 | "version": "1.0.6", 105 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 106 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 107 | }, 108 | "node_modules/cors": { 109 | "version": "2.8.5", 110 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 111 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 112 | "dependencies": { 113 | "object-assign": "^4", 114 | "vary": "^1" 115 | }, 116 | "engines": { 117 | "node": ">= 0.10" 118 | } 119 | }, 120 | "node_modules/debug": { 121 | "version": "2.6.9", 122 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 123 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 124 | "dependencies": { 125 | "ms": "2.0.0" 126 | } 127 | }, 128 | "node_modules/depd": { 129 | "version": "2.0.0", 130 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 131 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 132 | "engines": { 133 | "node": ">= 0.8" 134 | } 135 | }, 136 | "node_modules/destroy": { 137 | "version": "1.2.0", 138 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 139 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 140 | "engines": { 141 | "node": ">= 0.8", 142 | "npm": "1.2.8000 || >= 1.4.16" 143 | } 144 | }, 145 | "node_modules/ee-first": { 146 | "version": "1.1.1", 147 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 148 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 149 | }, 150 | "node_modules/encodeurl": { 151 | "version": "1.0.2", 152 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 153 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 154 | "engines": { 155 | "node": ">= 0.8" 156 | } 157 | }, 158 | "node_modules/escape-html": { 159 | "version": "1.0.3", 160 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 161 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 162 | }, 163 | "node_modules/etag": { 164 | "version": "1.8.1", 165 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 166 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 167 | "engines": { 168 | "node": ">= 0.6" 169 | } 170 | }, 171 | "node_modules/express": { 172 | "version": "4.18.2", 173 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", 174 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", 175 | "dependencies": { 176 | "accepts": "~1.3.8", 177 | "array-flatten": "1.1.1", 178 | "body-parser": "1.20.1", 179 | "content-disposition": "0.5.4", 180 | "content-type": "~1.0.4", 181 | "cookie": "0.5.0", 182 | "cookie-signature": "1.0.6", 183 | "debug": "2.6.9", 184 | "depd": "2.0.0", 185 | "encodeurl": "~1.0.2", 186 | "escape-html": "~1.0.3", 187 | "etag": "~1.8.1", 188 | "finalhandler": "1.2.0", 189 | "fresh": "0.5.2", 190 | "http-errors": "2.0.0", 191 | "merge-descriptors": "1.0.1", 192 | "methods": "~1.1.2", 193 | "on-finished": "2.4.1", 194 | "parseurl": "~1.3.3", 195 | "path-to-regexp": "0.1.7", 196 | "proxy-addr": "~2.0.7", 197 | "qs": "6.11.0", 198 | "range-parser": "~1.2.1", 199 | "safe-buffer": "5.2.1", 200 | "send": "0.18.0", 201 | "serve-static": "1.15.0", 202 | "setprototypeof": "1.2.0", 203 | "statuses": "2.0.1", 204 | "type-is": "~1.6.18", 205 | "utils-merge": "1.0.1", 206 | "vary": "~1.1.2" 207 | }, 208 | "engines": { 209 | "node": ">= 0.10.0" 210 | } 211 | }, 212 | "node_modules/finalhandler": { 213 | "version": "1.2.0", 214 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 215 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 216 | "dependencies": { 217 | "debug": "2.6.9", 218 | "encodeurl": "~1.0.2", 219 | "escape-html": "~1.0.3", 220 | "on-finished": "2.4.1", 221 | "parseurl": "~1.3.3", 222 | "statuses": "2.0.1", 223 | "unpipe": "~1.0.0" 224 | }, 225 | "engines": { 226 | "node": ">= 0.8" 227 | } 228 | }, 229 | "node_modules/forwarded": { 230 | "version": "0.2.0", 231 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 232 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 233 | "engines": { 234 | "node": ">= 0.6" 235 | } 236 | }, 237 | "node_modules/fresh": { 238 | "version": "0.5.2", 239 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 240 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 241 | "engines": { 242 | "node": ">= 0.6" 243 | } 244 | }, 245 | "node_modules/function-bind": { 246 | "version": "1.1.1", 247 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 248 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 249 | }, 250 | "node_modules/get-intrinsic": { 251 | "version": "1.1.3", 252 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", 253 | "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", 254 | "dependencies": { 255 | "function-bind": "^1.1.1", 256 | "has": "^1.0.3", 257 | "has-symbols": "^1.0.3" 258 | }, 259 | "funding": { 260 | "url": "https://github.com/sponsors/ljharb" 261 | } 262 | }, 263 | "node_modules/has": { 264 | "version": "1.0.3", 265 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 266 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 267 | "dependencies": { 268 | "function-bind": "^1.1.1" 269 | }, 270 | "engines": { 271 | "node": ">= 0.4.0" 272 | } 273 | }, 274 | "node_modules/has-symbols": { 275 | "version": "1.0.3", 276 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 277 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 278 | "engines": { 279 | "node": ">= 0.4" 280 | }, 281 | "funding": { 282 | "url": "https://github.com/sponsors/ljharb" 283 | } 284 | }, 285 | "node_modules/http-errors": { 286 | "version": "2.0.0", 287 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 288 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 289 | "dependencies": { 290 | "depd": "2.0.0", 291 | "inherits": "2.0.4", 292 | "setprototypeof": "1.2.0", 293 | "statuses": "2.0.1", 294 | "toidentifier": "1.0.1" 295 | }, 296 | "engines": { 297 | "node": ">= 0.8" 298 | } 299 | }, 300 | "node_modules/iconv-lite": { 301 | "version": "0.4.24", 302 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 303 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 304 | "dependencies": { 305 | "safer-buffer": ">= 2.1.2 < 3" 306 | }, 307 | "engines": { 308 | "node": ">=0.10.0" 309 | } 310 | }, 311 | "node_modules/inherits": { 312 | "version": "2.0.4", 313 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 314 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 315 | }, 316 | "node_modules/ipaddr.js": { 317 | "version": "1.9.1", 318 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 319 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 320 | "engines": { 321 | "node": ">= 0.10" 322 | } 323 | }, 324 | "node_modules/media-typer": { 325 | "version": "0.3.0", 326 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 327 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 328 | "engines": { 329 | "node": ">= 0.6" 330 | } 331 | }, 332 | "node_modules/merge-descriptors": { 333 | "version": "1.0.1", 334 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 335 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 336 | }, 337 | "node_modules/methods": { 338 | "version": "1.1.2", 339 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 340 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 341 | "engines": { 342 | "node": ">= 0.6" 343 | } 344 | }, 345 | "node_modules/mime": { 346 | "version": "1.6.0", 347 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 348 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 349 | "bin": { 350 | "mime": "cli.js" 351 | }, 352 | "engines": { 353 | "node": ">=4" 354 | } 355 | }, 356 | "node_modules/mime-db": { 357 | "version": "1.52.0", 358 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 359 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 360 | "engines": { 361 | "node": ">= 0.6" 362 | } 363 | }, 364 | "node_modules/mime-types": { 365 | "version": "2.1.35", 366 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 367 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 368 | "dependencies": { 369 | "mime-db": "1.52.0" 370 | }, 371 | "engines": { 372 | "node": ">= 0.6" 373 | } 374 | }, 375 | "node_modules/ms": { 376 | "version": "2.0.0", 377 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 378 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 379 | }, 380 | "node_modules/negotiator": { 381 | "version": "0.6.3", 382 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 383 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 384 | "engines": { 385 | "node": ">= 0.6" 386 | } 387 | }, 388 | "node_modules/object-assign": { 389 | "version": "4.1.1", 390 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 391 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 392 | "engines": { 393 | "node": ">=0.10.0" 394 | } 395 | }, 396 | "node_modules/object-inspect": { 397 | "version": "1.12.2", 398 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", 399 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", 400 | "funding": { 401 | "url": "https://github.com/sponsors/ljharb" 402 | } 403 | }, 404 | "node_modules/on-finished": { 405 | "version": "2.4.1", 406 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 407 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 408 | "dependencies": { 409 | "ee-first": "1.1.1" 410 | }, 411 | "engines": { 412 | "node": ">= 0.8" 413 | } 414 | }, 415 | "node_modules/parseurl": { 416 | "version": "1.3.3", 417 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 418 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 419 | "engines": { 420 | "node": ">= 0.8" 421 | } 422 | }, 423 | "node_modules/path-to-regexp": { 424 | "version": "0.1.7", 425 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 426 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 427 | }, 428 | "node_modules/proxy-addr": { 429 | "version": "2.0.7", 430 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 431 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 432 | "dependencies": { 433 | "forwarded": "0.2.0", 434 | "ipaddr.js": "1.9.1" 435 | }, 436 | "engines": { 437 | "node": ">= 0.10" 438 | } 439 | }, 440 | "node_modules/qs": { 441 | "version": "6.11.0", 442 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 443 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 444 | "dependencies": { 445 | "side-channel": "^1.0.4" 446 | }, 447 | "engines": { 448 | "node": ">=0.6" 449 | }, 450 | "funding": { 451 | "url": "https://github.com/sponsors/ljharb" 452 | } 453 | }, 454 | "node_modules/range-parser": { 455 | "version": "1.2.1", 456 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 457 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 458 | "engines": { 459 | "node": ">= 0.6" 460 | } 461 | }, 462 | "node_modules/raw-body": { 463 | "version": "2.5.1", 464 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 465 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 466 | "dependencies": { 467 | "bytes": "3.1.2", 468 | "http-errors": "2.0.0", 469 | "iconv-lite": "0.4.24", 470 | "unpipe": "1.0.0" 471 | }, 472 | "engines": { 473 | "node": ">= 0.8" 474 | } 475 | }, 476 | "node_modules/safe-buffer": { 477 | "version": "5.2.1", 478 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 479 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 480 | "funding": [ 481 | { 482 | "type": "github", 483 | "url": "https://github.com/sponsors/feross" 484 | }, 485 | { 486 | "type": "patreon", 487 | "url": "https://www.patreon.com/feross" 488 | }, 489 | { 490 | "type": "consulting", 491 | "url": "https://feross.org/support" 492 | } 493 | ] 494 | }, 495 | "node_modules/safer-buffer": { 496 | "version": "2.1.2", 497 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 498 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 499 | }, 500 | "node_modules/send": { 501 | "version": "0.18.0", 502 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 503 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 504 | "dependencies": { 505 | "debug": "2.6.9", 506 | "depd": "2.0.0", 507 | "destroy": "1.2.0", 508 | "encodeurl": "~1.0.2", 509 | "escape-html": "~1.0.3", 510 | "etag": "~1.8.1", 511 | "fresh": "0.5.2", 512 | "http-errors": "2.0.0", 513 | "mime": "1.6.0", 514 | "ms": "2.1.3", 515 | "on-finished": "2.4.1", 516 | "range-parser": "~1.2.1", 517 | "statuses": "2.0.1" 518 | }, 519 | "engines": { 520 | "node": ">= 0.8.0" 521 | } 522 | }, 523 | "node_modules/send/node_modules/ms": { 524 | "version": "2.1.3", 525 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 526 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 527 | }, 528 | "node_modules/serve-static": { 529 | "version": "1.15.0", 530 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 531 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 532 | "dependencies": { 533 | "encodeurl": "~1.0.2", 534 | "escape-html": "~1.0.3", 535 | "parseurl": "~1.3.3", 536 | "send": "0.18.0" 537 | }, 538 | "engines": { 539 | "node": ">= 0.8.0" 540 | } 541 | }, 542 | "node_modules/setprototypeof": { 543 | "version": "1.2.0", 544 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 545 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 546 | }, 547 | "node_modules/side-channel": { 548 | "version": "1.0.4", 549 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 550 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 551 | "dependencies": { 552 | "call-bind": "^1.0.0", 553 | "get-intrinsic": "^1.0.2", 554 | "object-inspect": "^1.9.0" 555 | }, 556 | "funding": { 557 | "url": "https://github.com/sponsors/ljharb" 558 | } 559 | }, 560 | "node_modules/statuses": { 561 | "version": "2.0.1", 562 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 563 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 564 | "engines": { 565 | "node": ">= 0.8" 566 | } 567 | }, 568 | "node_modules/toidentifier": { 569 | "version": "1.0.1", 570 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 571 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 572 | "engines": { 573 | "node": ">=0.6" 574 | } 575 | }, 576 | "node_modules/type-is": { 577 | "version": "1.6.18", 578 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 579 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 580 | "dependencies": { 581 | "media-typer": "0.3.0", 582 | "mime-types": "~2.1.24" 583 | }, 584 | "engines": { 585 | "node": ">= 0.6" 586 | } 587 | }, 588 | "node_modules/unpipe": { 589 | "version": "1.0.0", 590 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 591 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 592 | "engines": { 593 | "node": ">= 0.8" 594 | } 595 | }, 596 | "node_modules/utils-merge": { 597 | "version": "1.0.1", 598 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 599 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 600 | "engines": { 601 | "node": ">= 0.4.0" 602 | } 603 | }, 604 | "node_modules/vary": { 605 | "version": "1.1.2", 606 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 607 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 608 | "engines": { 609 | "node": ">= 0.8" 610 | } 611 | } 612 | }, 613 | "dependencies": { 614 | "accepts": { 615 | "version": "1.3.8", 616 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 617 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 618 | "requires": { 619 | "mime-types": "~2.1.34", 620 | "negotiator": "0.6.3" 621 | } 622 | }, 623 | "array-flatten": { 624 | "version": "1.1.1", 625 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 626 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 627 | }, 628 | "body-parser": { 629 | "version": "1.20.1", 630 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", 631 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", 632 | "requires": { 633 | "bytes": "3.1.2", 634 | "content-type": "~1.0.4", 635 | "debug": "2.6.9", 636 | "depd": "2.0.0", 637 | "destroy": "1.2.0", 638 | "http-errors": "2.0.0", 639 | "iconv-lite": "0.4.24", 640 | "on-finished": "2.4.1", 641 | "qs": "6.11.0", 642 | "raw-body": "2.5.1", 643 | "type-is": "~1.6.18", 644 | "unpipe": "1.0.0" 645 | } 646 | }, 647 | "bytes": { 648 | "version": "3.1.2", 649 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 650 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" 651 | }, 652 | "call-bind": { 653 | "version": "1.0.2", 654 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 655 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 656 | "requires": { 657 | "function-bind": "^1.1.1", 658 | "get-intrinsic": "^1.0.2" 659 | } 660 | }, 661 | "content-disposition": { 662 | "version": "0.5.4", 663 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 664 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 665 | "requires": { 666 | "safe-buffer": "5.2.1" 667 | } 668 | }, 669 | "content-type": { 670 | "version": "1.0.4", 671 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 672 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 673 | }, 674 | "cookie": { 675 | "version": "0.5.0", 676 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 677 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" 678 | }, 679 | "cookie-signature": { 680 | "version": "1.0.6", 681 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 682 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 683 | }, 684 | "cors": { 685 | "version": "2.8.5", 686 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 687 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 688 | "requires": { 689 | "object-assign": "^4", 690 | "vary": "^1" 691 | } 692 | }, 693 | "debug": { 694 | "version": "2.6.9", 695 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 696 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 697 | "requires": { 698 | "ms": "2.0.0" 699 | } 700 | }, 701 | "depd": { 702 | "version": "2.0.0", 703 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 704 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 705 | }, 706 | "destroy": { 707 | "version": "1.2.0", 708 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 709 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" 710 | }, 711 | "ee-first": { 712 | "version": "1.1.1", 713 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 714 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 715 | }, 716 | "encodeurl": { 717 | "version": "1.0.2", 718 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 719 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" 720 | }, 721 | "escape-html": { 722 | "version": "1.0.3", 723 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 724 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 725 | }, 726 | "etag": { 727 | "version": "1.8.1", 728 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 729 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" 730 | }, 731 | "express": { 732 | "version": "4.18.2", 733 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", 734 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", 735 | "requires": { 736 | "accepts": "~1.3.8", 737 | "array-flatten": "1.1.1", 738 | "body-parser": "1.20.1", 739 | "content-disposition": "0.5.4", 740 | "content-type": "~1.0.4", 741 | "cookie": "0.5.0", 742 | "cookie-signature": "1.0.6", 743 | "debug": "2.6.9", 744 | "depd": "2.0.0", 745 | "encodeurl": "~1.0.2", 746 | "escape-html": "~1.0.3", 747 | "etag": "~1.8.1", 748 | "finalhandler": "1.2.0", 749 | "fresh": "0.5.2", 750 | "http-errors": "2.0.0", 751 | "merge-descriptors": "1.0.1", 752 | "methods": "~1.1.2", 753 | "on-finished": "2.4.1", 754 | "parseurl": "~1.3.3", 755 | "path-to-regexp": "0.1.7", 756 | "proxy-addr": "~2.0.7", 757 | "qs": "6.11.0", 758 | "range-parser": "~1.2.1", 759 | "safe-buffer": "5.2.1", 760 | "send": "0.18.0", 761 | "serve-static": "1.15.0", 762 | "setprototypeof": "1.2.0", 763 | "statuses": "2.0.1", 764 | "type-is": "~1.6.18", 765 | "utils-merge": "1.0.1", 766 | "vary": "~1.1.2" 767 | } 768 | }, 769 | "finalhandler": { 770 | "version": "1.2.0", 771 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 772 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 773 | "requires": { 774 | "debug": "2.6.9", 775 | "encodeurl": "~1.0.2", 776 | "escape-html": "~1.0.3", 777 | "on-finished": "2.4.1", 778 | "parseurl": "~1.3.3", 779 | "statuses": "2.0.1", 780 | "unpipe": "~1.0.0" 781 | } 782 | }, 783 | "forwarded": { 784 | "version": "0.2.0", 785 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 786 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 787 | }, 788 | "fresh": { 789 | "version": "0.5.2", 790 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 791 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" 792 | }, 793 | "function-bind": { 794 | "version": "1.1.1", 795 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 796 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 797 | }, 798 | "get-intrinsic": { 799 | "version": "1.1.3", 800 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", 801 | "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", 802 | "requires": { 803 | "function-bind": "^1.1.1", 804 | "has": "^1.0.3", 805 | "has-symbols": "^1.0.3" 806 | } 807 | }, 808 | "has": { 809 | "version": "1.0.3", 810 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 811 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 812 | "requires": { 813 | "function-bind": "^1.1.1" 814 | } 815 | }, 816 | "has-symbols": { 817 | "version": "1.0.3", 818 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 819 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" 820 | }, 821 | "http-errors": { 822 | "version": "2.0.0", 823 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 824 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 825 | "requires": { 826 | "depd": "2.0.0", 827 | "inherits": "2.0.4", 828 | "setprototypeof": "1.2.0", 829 | "statuses": "2.0.1", 830 | "toidentifier": "1.0.1" 831 | } 832 | }, 833 | "iconv-lite": { 834 | "version": "0.4.24", 835 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 836 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 837 | "requires": { 838 | "safer-buffer": ">= 2.1.2 < 3" 839 | } 840 | }, 841 | "inherits": { 842 | "version": "2.0.4", 843 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 844 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 845 | }, 846 | "ipaddr.js": { 847 | "version": "1.9.1", 848 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 849 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 850 | }, 851 | "media-typer": { 852 | "version": "0.3.0", 853 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 854 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" 855 | }, 856 | "merge-descriptors": { 857 | "version": "1.0.1", 858 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 859 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 860 | }, 861 | "methods": { 862 | "version": "1.1.2", 863 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 864 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" 865 | }, 866 | "mime": { 867 | "version": "1.6.0", 868 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 869 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 870 | }, 871 | "mime-db": { 872 | "version": "1.52.0", 873 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 874 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 875 | }, 876 | "mime-types": { 877 | "version": "2.1.35", 878 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 879 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 880 | "requires": { 881 | "mime-db": "1.52.0" 882 | } 883 | }, 884 | "ms": { 885 | "version": "2.0.0", 886 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 887 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 888 | }, 889 | "negotiator": { 890 | "version": "0.6.3", 891 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 892 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" 893 | }, 894 | "object-assign": { 895 | "version": "4.1.1", 896 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 897 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" 898 | }, 899 | "object-inspect": { 900 | "version": "1.12.2", 901 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", 902 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" 903 | }, 904 | "on-finished": { 905 | "version": "2.4.1", 906 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 907 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 908 | "requires": { 909 | "ee-first": "1.1.1" 910 | } 911 | }, 912 | "parseurl": { 913 | "version": "1.3.3", 914 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 915 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 916 | }, 917 | "path-to-regexp": { 918 | "version": "0.1.7", 919 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 920 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 921 | }, 922 | "proxy-addr": { 923 | "version": "2.0.7", 924 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 925 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 926 | "requires": { 927 | "forwarded": "0.2.0", 928 | "ipaddr.js": "1.9.1" 929 | } 930 | }, 931 | "qs": { 932 | "version": "6.11.0", 933 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 934 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 935 | "requires": { 936 | "side-channel": "^1.0.4" 937 | } 938 | }, 939 | "range-parser": { 940 | "version": "1.2.1", 941 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 942 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 943 | }, 944 | "raw-body": { 945 | "version": "2.5.1", 946 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 947 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 948 | "requires": { 949 | "bytes": "3.1.2", 950 | "http-errors": "2.0.0", 951 | "iconv-lite": "0.4.24", 952 | "unpipe": "1.0.0" 953 | } 954 | }, 955 | "safe-buffer": { 956 | "version": "5.2.1", 957 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 958 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 959 | }, 960 | "safer-buffer": { 961 | "version": "2.1.2", 962 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 963 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 964 | }, 965 | "send": { 966 | "version": "0.18.0", 967 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 968 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 969 | "requires": { 970 | "debug": "2.6.9", 971 | "depd": "2.0.0", 972 | "destroy": "1.2.0", 973 | "encodeurl": "~1.0.2", 974 | "escape-html": "~1.0.3", 975 | "etag": "~1.8.1", 976 | "fresh": "0.5.2", 977 | "http-errors": "2.0.0", 978 | "mime": "1.6.0", 979 | "ms": "2.1.3", 980 | "on-finished": "2.4.1", 981 | "range-parser": "~1.2.1", 982 | "statuses": "2.0.1" 983 | }, 984 | "dependencies": { 985 | "ms": { 986 | "version": "2.1.3", 987 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 988 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 989 | } 990 | } 991 | }, 992 | "serve-static": { 993 | "version": "1.15.0", 994 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 995 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 996 | "requires": { 997 | "encodeurl": "~1.0.2", 998 | "escape-html": "~1.0.3", 999 | "parseurl": "~1.3.3", 1000 | "send": "0.18.0" 1001 | } 1002 | }, 1003 | "setprototypeof": { 1004 | "version": "1.2.0", 1005 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1006 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1007 | }, 1008 | "side-channel": { 1009 | "version": "1.0.4", 1010 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 1011 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 1012 | "requires": { 1013 | "call-bind": "^1.0.0", 1014 | "get-intrinsic": "^1.0.2", 1015 | "object-inspect": "^1.9.0" 1016 | } 1017 | }, 1018 | "statuses": { 1019 | "version": "2.0.1", 1020 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1021 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" 1022 | }, 1023 | "toidentifier": { 1024 | "version": "1.0.1", 1025 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1026 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 1027 | }, 1028 | "type-is": { 1029 | "version": "1.6.18", 1030 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1031 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1032 | "requires": { 1033 | "media-typer": "0.3.0", 1034 | "mime-types": "~2.1.24" 1035 | } 1036 | }, 1037 | "unpipe": { 1038 | "version": "1.0.0", 1039 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1040 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" 1041 | }, 1042 | "utils-merge": { 1043 | "version": "1.0.1", 1044 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1045 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" 1046 | }, 1047 | "vary": { 1048 | "version": "1.1.2", 1049 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1050 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" 1051 | } 1052 | } 1053 | } 1054 | --------------------------------------------------------------------------------