├── .vscode └── settings.json ├── src ├── ecommerce-ui │ ├── .browserslistrc │ ├── babel.config.js │ ├── public │ │ ├── favicon.ico │ │ └── index.html │ ├── src │ │ ├── assets │ │ │ └── logo.png │ │ ├── services │ │ │ ├── product.js │ │ │ └── order.js │ │ ├── views │ │ │ ├── Home.vue │ │ │ └── Order.vue │ │ ├── App.vue │ │ ├── main.js │ │ ├── router │ │ │ └── index.js │ │ └── components │ │ │ ├── NavBar.vue │ │ │ ├── Products.vue │ │ │ └── Product.vue │ ├── jest.setup.js │ ├── .gitignore │ ├── README.md │ ├── tests │ │ └── unit │ │ │ ├── Products.spec.js │ │ │ └── Product.spec.js │ ├── .eslintrc.js │ ├── package.json │ └── jest.config.js ├── Ecommerce.Entity │ ├── Contracts │ │ └── IBaseModel.cs │ ├── Models │ │ ├── Product.cs │ │ ├── OrderDetail.cs │ │ └── Order.cs │ └── Ecommerce.Entity.csproj ├── Ecommerce.Service │ ├── Contracts │ │ ├── BaseService.cs │ │ ├── IProductService.cs │ │ └── IOrderService.cs │ ├── ServiceResponse.cs │ ├── Ecommerce.Service.csproj │ ├── Services │ │ ├── ProductService.cs │ │ └── OrderService.cs │ └── Extensions │ │ └── ServiceExtension.cs ├── Ecommerce.Dto │ ├── Ecommerce.Dto.csproj │ └── Objects │ │ ├── CreateOrderDto.cs │ │ ├── ProductDto.cs │ │ └── OrderDto.cs ├── Ecommerce.Api │ ├── appsettings.Development.json │ ├── Models │ │ ├── ApiData.cs │ │ └── CreateOrderModel.cs │ ├── appsettings.json │ ├── Controllers │ │ ├── ProductsController.cs │ │ ├── OrdersController.cs │ │ └── Base │ │ │ └── BaseApiController.cs │ ├── Program.cs │ ├── Ecommerce.Api.csproj │ ├── Helpers │ │ ├── ApiExceptionFilterAttribute.cs │ │ └── ValidateModelAttribute.cs │ ├── Properties │ │ └── launchSettings.json │ └── Startup.cs ├── Ecommerce.Data │ ├── Ecommerce.Data.csproj │ └── EcommerceContext.cs ├── Ecommerce.UnitOfWork │ ├── Contracts │ │ └── IUnitOfWork.cs │ ├── Ecommerce.UnitOfWork.csproj │ └── UnitOfWork.cs └── Ecommerce.Repository │ ├── Ecommerce.Repository.csproj │ ├── Contracts │ └── IRepository.cs │ └── Repository.cs ├── utils ├── puppeteer │ ├── jest-puppeteer.config.js │ ├── jest.config.js │ ├── teardown.js │ ├── package.json │ ├── setup.js │ ├── puppeteer_environment.js │ └── __test__ │ │ └── pages │ │ └── products.test.js └── mountebank │ ├── mbhelper.js │ ├── package.json │ ├── index.js │ ├── imposters │ └── api.js │ ├── stubs │ └── product.js │ └── package-lock.json ├── test ├── Ecommerce.Api.IntegrationTests │ ├── Helpers │ │ ├── SeedData.cs │ │ └── CustomFactory.cs │ ├── Ecommerce.Api.IntegrationTests.csproj │ └── ProductsControllerTests.cs └── Ecommerce.Api.Tests │ ├── Ecommerce.Api.Tests.csproj │ └── ProductsControllerTests.cs ├── developer-summit-testing-sample.sln └── .gitignore /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "jira-plugin.workingProject": "" 3 | } -------------------------------------------------------------------------------- /src/ecommerce-ui/.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | not dead 4 | -------------------------------------------------------------------------------- /src/ecommerce-ui/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: ["@vue/cli-plugin-babel/preset"] 3 | }; 4 | -------------------------------------------------------------------------------- /src/ecommerce-ui/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monofor/developer-summit-2020-sample-app/HEAD/src/ecommerce-ui/public/favicon.ico -------------------------------------------------------------------------------- /src/ecommerce-ui/src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monofor/developer-summit-2020-sample-app/HEAD/src/ecommerce-ui/src/assets/logo.png -------------------------------------------------------------------------------- /src/Ecommerce.Entity/Contracts/IBaseModel.cs: -------------------------------------------------------------------------------- 1 | namespace Ecommerce.Entity 2 | { 3 | public interface IBaseModel 4 | { 5 | 6 | } 7 | } -------------------------------------------------------------------------------- /src/Ecommerce.Service/Contracts/BaseService.cs: -------------------------------------------------------------------------------- 1 | namespace Ecommerce.Service 2 | { 3 | public class BaseService 4 | { 5 | 6 | } 7 | } -------------------------------------------------------------------------------- /src/ecommerce-ui/src/services/product.js: -------------------------------------------------------------------------------- 1 | import axios from "axios"; 2 | 3 | export default { 4 | get(){ 5 | return axios.get("products"); 6 | } 7 | } -------------------------------------------------------------------------------- /src/Ecommerce.Dto/Ecommerce.Dto.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net5.0 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /utils/puppeteer/jest-puppeteer.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | launch: { 3 | headless: process.env.HEADLESS !== "false", 4 | slowMo: process.env.SLOWMO ? process.env.SLOWMO : 0, 5 | devtools: true 6 | } 7 | }; 8 | -------------------------------------------------------------------------------- /src/Ecommerce.Api/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft": "Warning", 6 | "Microsoft.Hosting.Lifetime": "Information" 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/ecommerce-ui/src/services/order.js: -------------------------------------------------------------------------------- 1 | import axios from "axios"; 2 | 3 | export default { 4 | get(){ 5 | return axios.get("orders"); 6 | }, 7 | post(data){ 8 | return axios.post("orders", data); 9 | } 10 | } -------------------------------------------------------------------------------- /src/Ecommerce.Api/Models/ApiData.cs: -------------------------------------------------------------------------------- 1 | namespace Ecommerce.Api.Models 2 | { 3 | public class ApiData 4 | { 5 | public bool Success { get; set; } 6 | public string Message { get; set; } 7 | public T Data { get; set; } 8 | } 9 | } -------------------------------------------------------------------------------- /src/Ecommerce.Dto/Objects/CreateOrderDto.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace Ecommerce.Dto 4 | { 5 | public class CreateOrderDto 6 | { 7 | public Guid ProductId { get; set; } 8 | public int Quantity { get; set; } 9 | } 10 | } -------------------------------------------------------------------------------- /src/Ecommerce.Api/Models/CreateOrderModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace Ecommerce.Api.Models 4 | { 5 | public class CreateOrderModel 6 | { 7 | public Guid ProductId { get; set; } 8 | public int Quantity { get; set; } 9 | } 10 | } -------------------------------------------------------------------------------- /src/Ecommerce.Service/Contracts/IProductService.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using Ecommerce.Dto; 3 | 4 | namespace Ecommerce.Service 5 | { 6 | public interface IProductService 7 | { 8 | ServiceResponse> GetAll(); 9 | } 10 | } -------------------------------------------------------------------------------- /src/ecommerce-ui/jest.setup.js: -------------------------------------------------------------------------------- 1 | import axios from "axios"; 2 | 3 | beforeEach(() => { 4 | const apiHostUrl = process.env.API_HOST_URL; // eslint-disable-line no-undef 5 | 6 | if (apiHostUrl !== undefined) { 7 | axios.defaults.baseURL = apiHostUrl; 8 | } 9 | }); 10 | -------------------------------------------------------------------------------- /src/ecommerce-ui/src/views/Home.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 16 | -------------------------------------------------------------------------------- /src/Ecommerce.Dto/Objects/ProductDto.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace Ecommerce.Dto 4 | { 5 | public class ProductDto 6 | { 7 | public Guid ProductId { get; set; } 8 | public string Code { get; set; } 9 | public string Name { get; set; } 10 | public double Price { get; set; } 11 | } 12 | } -------------------------------------------------------------------------------- /src/Ecommerce.Data/Ecommerce.Data.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net5.0 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/Ecommerce.Service/Contracts/IOrderService.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using Ecommerce.Dto; 4 | 5 | namespace Ecommerce.Service 6 | { 7 | public interface IOrderService 8 | { 9 | ServiceResponse> GetAll(); 10 | ServiceResponse Create(List data); 11 | } 12 | } -------------------------------------------------------------------------------- /src/ecommerce-ui/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | 6 | # local env files 7 | .env.local 8 | .env.*.local 9 | 10 | # Log files 11 | npm-debug.log* 12 | yarn-debug.log* 13 | yarn-error.log* 14 | pnpm-debug.log* 15 | 16 | # Editor directories and files 17 | .idea 18 | .vscode 19 | *.suo 20 | *.ntvs* 21 | *.njsproj 22 | *.sln 23 | *.sw? 24 | -------------------------------------------------------------------------------- /utils/puppeteer/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | preset: "jest-puppeteer", 3 | globals: { 4 | URL: "http://localhost:8080" 5 | }, 6 | testMatch: ["**/__test__/**/*.test.js"], 7 | verbose: true, 8 | globalSetup: "./setup.js", 9 | globalTeardown: "./teardown.js", 10 | testEnvironment: "./puppeteer_environment.js" 11 | }; 12 | -------------------------------------------------------------------------------- /utils/mountebank/mbhelper.js: -------------------------------------------------------------------------------- 1 | const fetch = require("node-fetch"); 2 | 3 | function postImposter(body) { 4 | const url = "http://127.0.0.1:4001/imposters"; 5 | 6 | return fetch(url, { 7 | method: "POST", 8 | headers: {"Content-Type": "application/json"}, 9 | body: JSON.stringify(body), 10 | }); 11 | } 12 | 13 | module.exports = {postImposter}; -------------------------------------------------------------------------------- /utils/mountebank/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mountebank-api-util", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "mock": "node index.js" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "mountebank": "^2.3.3", 14 | "node-fetch": "^2.6.1" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/ecommerce-ui/src/App.vue: -------------------------------------------------------------------------------- 1 | 9 | 18 | 19 | 22 | -------------------------------------------------------------------------------- /src/Ecommerce.Service/ServiceResponse.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace Ecommerce.Service 5 | { 6 | public class ServiceResponse 7 | { 8 | public bool Success { get; set; } 9 | public T Data { get; set; } 10 | public string Message { get; set; } 11 | public List Errors { get; set; } 12 | } 13 | } -------------------------------------------------------------------------------- /src/Ecommerce.Api/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft": "Warning", 6 | "Microsoft.Hosting.Lifetime": "Information" 7 | } 8 | }, 9 | "AllowedHosts": "*", 10 | "ConnectionStrings": { 11 | "Db": "Server=localhost;Port=5432;Database=commerce;User Id=postgres;Password=1234567890;" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /utils/mountebank/index.js: -------------------------------------------------------------------------------- 1 | const mb = require("mountebank"); 2 | const apiImposter = require("./imposters/api"); 3 | 4 | const mbServerInstance = mb.create({ 5 | port: 4001, 6 | pidfile: "./mb.pid", 7 | logfile: "./mg.log", 8 | protofile: "./protofile.json", 9 | ipWhitelist: ["*"], 10 | }); 11 | 12 | mbServerInstance.then(function () { 13 | apiImposter.addStubs(); 14 | }); -------------------------------------------------------------------------------- /src/Ecommerce.UnitOfWork/Contracts/IUnitOfWork.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Data; 3 | using Ecommerce.Entity; 4 | using Ecommerce.Repository; 5 | 6 | namespace Ecommerce.UnitOfWork 7 | { 8 | public interface IUnitOfWork : IDisposable 9 | { 10 | IRepository ProductRepository { get; } 11 | IRepository OrderRepository { get; } 12 | void SaveChanges(); 13 | } 14 | } -------------------------------------------------------------------------------- /utils/mountebank/imposters/api.js: -------------------------------------------------------------------------------- 1 | const mbhelper = require("../mbhelper"); 2 | const productStubs = require("../stubs/product"); 3 | 4 | function addStubs() { 5 | const stubs = [...productStubs]; 6 | 7 | const imposter = { 8 | port: 4006, 9 | protocol: "http", 10 | stubs: stubs, 11 | }; 12 | 13 | return mbhelper.postImposter(imposter); 14 | } 15 | 16 | module.exports = {addStubs}; -------------------------------------------------------------------------------- /utils/puppeteer/teardown.js: -------------------------------------------------------------------------------- 1 | const chalk = require("chalk"); 2 | const rimraf = require("rimraf"); 3 | const os = require("os"); 4 | const path = require("path"); 5 | 6 | const DIR = path.join(os.tmpdir(), "jest_puppeteer_global_setup"); 7 | 8 | module.exports = async function () { 9 | console.log(chalk.green("Teardown Puppeteer")); 10 | await global.__BROWSER_GLOBAL__.close(); 11 | rimraf.sync(DIR); 12 | }; 13 | -------------------------------------------------------------------------------- /src/Ecommerce.Repository/Ecommerce.Repository.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net5.0 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/ecommerce-ui/src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from "vue"; 2 | import App from "./App.vue"; 3 | import router from "./router"; 4 | import axios from "axios"; 5 | import 'bootstrap' 6 | import 'bootstrap/dist/css/bootstrap.min.css' 7 | 8 | Vue.config.productionTip = false; 9 | axios.defaults.baseURL = process.env.API_HOST_URL || "https://localhost:5001"; 10 | 11 | Vue.prototype.$http = axios; 12 | 13 | new Vue({ 14 | router, 15 | render: h => h(App) 16 | }).$mount("#app"); 17 | -------------------------------------------------------------------------------- /src/Ecommerce.Entity/Models/Product.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.ComponentModel.DataAnnotations; 3 | using System.ComponentModel.DataAnnotations.Schema; 4 | 5 | namespace Ecommerce.Entity 6 | { 7 | [Table("Products")] 8 | public class Product : IBaseModel 9 | { 10 | [Key] 11 | public Guid ProductId { get; set; } 12 | 13 | public string Code { get; set; } 14 | public string Name { get; set; } 15 | public double Price { get; set; } 16 | } 17 | } -------------------------------------------------------------------------------- /src/Ecommerce.Service/Ecommerce.Service.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net5.0 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/Ecommerce.UnitOfWork/Ecommerce.UnitOfWork.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net5.0 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/ecommerce-ui/README.md: -------------------------------------------------------------------------------- 1 | # ecommerce-ui 2 | 3 | ## Project setup 4 | ``` 5 | yarn install 6 | ``` 7 | 8 | ### Compiles and hot-reloads for development 9 | ``` 10 | yarn serve 11 | ``` 12 | 13 | ### Compiles and minifies for production 14 | ``` 15 | yarn build 16 | ``` 17 | 18 | ### Run your unit tests 19 | ``` 20 | yarn test:unit 21 | ``` 22 | 23 | ### Lints and fixes files 24 | ``` 25 | yarn lint 26 | ``` 27 | 28 | ### Customize configuration 29 | See [Configuration Reference](https://cli.vuejs.org/config/). 30 | -------------------------------------------------------------------------------- /utils/puppeteer/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "puppeteer", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "cross-env SLOWMO=true node node_modules/jest/bin/jest.js" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "chalk": "^4.1.0", 14 | "jest": "^26.6.3", 15 | "jest-puppeteer": "^4.4.0", 16 | "mkdirp": "^1.0.4", 17 | "puppeteer": "^5.5.0", 18 | "rimraf": "^3.0.2" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/Ecommerce.Data/EcommerceContext.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Ecommerce.Entity; 3 | using Microsoft.EntityFrameworkCore; 4 | 5 | namespace Ecommerce.Data 6 | { 7 | public class EcommerceContext : DbContext 8 | { 9 | public DbSet Products { get; set; } 10 | public DbSet Orders { get; set; } 11 | public DbSet OrderDetails { get; set; } 12 | 13 | public EcommerceContext(DbContextOptions options) : base(options) 14 | { 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /src/ecommerce-ui/tests/unit/Products.spec.js: -------------------------------------------------------------------------------- 1 | import {shallowMount} from "@vue/test-utils"; 2 | import Products from "@/components/Products.vue"; 3 | 4 | describe("Products.vue", () => { 5 | it("has a mounted hook", () => { 6 | expect(typeof Products.mounted).toBe("function"); 7 | }); 8 | 9 | it("renders product title when passed", async () => { 10 | const wrapper = shallowMount(Products); 11 | await wrapper.vm.getProducts(); 12 | 13 | expect(wrapper.vm.products.length).toBe(2); 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /src/ecommerce-ui/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | node: true 5 | }, 6 | extends: ["plugin:vue/essential", "eslint:recommended", "@vue/prettier"], 7 | parserOptions: { 8 | parser: "babel-eslint" 9 | }, 10 | rules: { 11 | "no-console": process.env.NODE_ENV === "production" ? "warn" : "off", 12 | "no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off" 13 | }, 14 | overrides: [ 15 | { 16 | files: [ 17 | "**/__tests__/*.{j,t}s?(x)", 18 | "**/tests/unit/**/*.spec.{j,t}s?(x)" 19 | ], 20 | env: { 21 | jest: true 22 | } 23 | } 24 | ] 25 | }; 26 | -------------------------------------------------------------------------------- /src/Ecommerce.Repository/Contracts/IRepository.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Linq.Expressions; 5 | 6 | namespace Ecommerce.Repository 7 | { 8 | public interface IRepository where TEntity : class 9 | { 10 | IQueryable FindAll(params Expression>[] includes); 11 | IQueryable Find(Expression> predicate); 12 | TEntity FirstOrDefault(Expression> predicate); 13 | void Add(TEntity entity); 14 | void Update(TEntity entity); 15 | void Delete(TEntity entity); 16 | } 17 | } -------------------------------------------------------------------------------- /src/Ecommerce.Entity/Models/OrderDetail.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.ComponentModel.DataAnnotations; 3 | using System.ComponentModel.DataAnnotations.Schema; 4 | 5 | namespace Ecommerce.Entity 6 | { 7 | [Table("OrderDetails")] 8 | public class OrderDetail : IBaseModel 9 | { 10 | [Key] 11 | public Guid OrderDetailId { get; set; } 12 | 13 | public Guid OrderId { get; set; } 14 | public Guid ProductId { get; set; } 15 | public int Quantity { get; set; } 16 | public double UnitPrice { get; set; } 17 | public double TotalPrice { get; set; } 18 | public virtual Product Product { get; set; } 19 | } 20 | } -------------------------------------------------------------------------------- /src/ecommerce-ui/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | <%= htmlWebpackPlugin.options.title %> 9 | 10 | 11 | 14 |
15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/Ecommerce.Entity/Ecommerce.Entity.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net5.0 5 | 6 | 7 | 8 | 9 | 10 | all 11 | runtime; build; native; contentfiles; analyzers; buildtransitive 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Ecommerce.Api/Controllers/ProductsController.cs: -------------------------------------------------------------------------------- 1 | using Ecommerce.Service; 2 | using Microsoft.AspNetCore.Mvc; 3 | 4 | namespace Ecommerce.Api.Controllers 5 | { 6 | public class ProductsController : BaseApiController 7 | { 8 | private readonly IProductService _productService; 9 | 10 | public ProductsController(IProductService productService) 11 | { 12 | _productService = productService; 13 | } 14 | 15 | [HttpGet] 16 | public IActionResult Get() 17 | { 18 | var products = _productService.GetAll(); 19 | 20 | return products.Success ? Success(products.Data, products.Message) : BadRequest(null, products.Message); 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /src/Ecommerce.Api/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using Microsoft.AspNetCore.Hosting; 6 | using Microsoft.Extensions.Configuration; 7 | using Microsoft.Extensions.Hosting; 8 | using Microsoft.Extensions.Logging; 9 | 10 | namespace Ecommerce.Api 11 | { 12 | public class Program 13 | { 14 | public static void Main(string[] args) 15 | { 16 | CreateHostBuilder(args).Build().Run(); 17 | } 18 | 19 | public static IHostBuilder CreateHostBuilder(string[] args) => 20 | Host.CreateDefaultBuilder(args) 21 | .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); }); 22 | } 23 | } -------------------------------------------------------------------------------- /src/Ecommerce.Entity/Models/Order.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel.DataAnnotations; 4 | using System.ComponentModel.DataAnnotations.Schema; 5 | 6 | namespace Ecommerce.Entity 7 | { 8 | [Table("Orders")] 9 | public class Order : IBaseModel 10 | { 11 | [Key] 12 | public Guid OrderId { get; set; } 13 | 14 | public DateTime CreatedDate { get; set; } 15 | public double TotalPrice { get; set; } 16 | public OrderStatuses Status { get; set; } 17 | public virtual List OrderDetails { get; set; } 18 | } 19 | 20 | public enum OrderStatuses 21 | { 22 | Created, 23 | Shipping, 24 | Shipped, 25 | Completed 26 | } 27 | } -------------------------------------------------------------------------------- /src/ecommerce-ui/src/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from "vue"; 2 | import VueRouter from "vue-router"; 3 | import Home from "../views/Home.vue"; 4 | 5 | Vue.use(VueRouter); 6 | 7 | const routes = [ 8 | { 9 | path: "/", 10 | name: "Home", 11 | component: Home 12 | }, 13 | { 14 | path: "/orders", 15 | name: "Orders", 16 | // route level code-splitting 17 | // this generates a separate chunk (about.[hash].js) for this route 18 | // which is lazy-loaded when the route is visited. 19 | component: () => 20 | import(/* webpackChunkName: "about" */ "../views/Order.vue") 21 | } 22 | ]; 23 | 24 | const router = new VueRouter({ 25 | mode: "history", 26 | base: process.env.BASE_URL, 27 | routes 28 | }); 29 | 30 | export default router; 31 | -------------------------------------------------------------------------------- /src/Ecommerce.Api/Ecommerce.Api.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net5.0 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/Ecommerce.Api/Helpers/ApiExceptionFilterAttribute.cs: -------------------------------------------------------------------------------- 1 | using System.Net; 2 | using System.Threading.Tasks; 3 | using Ecommerce.Api.Models; 4 | using Microsoft.AspNetCore.Mvc; 5 | using Microsoft.AspNetCore.Mvc.Filters; 6 | 7 | namespace Ecommerce.Api 8 | { 9 | public class ApiExceptionFilterAttribute : ExceptionFilterAttribute 10 | { 11 | public override async Task OnExceptionAsync(ExceptionContext context) 12 | { 13 | context.Exception = null; 14 | context.HttpContext.Response.StatusCode = (int) HttpStatusCode.InternalServerError; 15 | context.Result = new JsonResult(new ApiData() 16 | { 17 | Message = "Internal server error. Please contact your system administrator.", 18 | }); 19 | 20 | await base.OnExceptionAsync(context); 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /utils/puppeteer/setup.js: -------------------------------------------------------------------------------- 1 | const chalk = require("chalk"); 2 | const puppeteer = require("puppeteer"); 3 | const fs = require("fs"); 4 | const mkdirp = require("mkdirp"); 5 | const os = require("os"); 6 | const path = require("path"); 7 | 8 | const DIR = path.join(os.tmpdir(), "jest_puppeteer_global_setup"); 9 | 10 | module.exports = async function () { 11 | console.log(chalk.green("Setup Puppeteer")); 12 | const browser = await puppeteer.launch({ 13 | headless: false, 14 | waitUntil: "networkidle", 15 | // TODO: for test 16 | ignoreHTTPSErrors: true, 17 | args: ["--ignore-certificate-errors"], 18 | }); 19 | // This global is not available inside tests but only in global teardown 20 | global.__BROWSER_GLOBAL__ = browser; 21 | // Instead, we expose the connection details via file system to be used in tests 22 | mkdirp.sync(DIR); 23 | fs.writeFileSync(path.join(DIR, "wsEndpoint"), browser.wsEndpoint()); 24 | }; 25 | -------------------------------------------------------------------------------- /src/Ecommerce.Api/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json.schemastore.org/launchsettings.json", 3 | "iisSettings": { 4 | "windowsAuthentication": false, 5 | "anonymousAuthentication": true, 6 | "iisExpress": { 7 | "applicationUrl": "http://localhost:12805", 8 | "sslPort": 44379 9 | } 10 | }, 11 | "profiles": { 12 | "IIS Express": { 13 | "commandName": "IISExpress", 14 | "launchBrowser": true, 15 | "launchUrl": "swagger", 16 | "environmentVariables": { 17 | "ASPNETCORE_ENVIRONMENT": "Development" 18 | } 19 | }, 20 | "Ecommerce.Api": { 21 | "commandName": "Project", 22 | "dotnetRunMessages": "true", 23 | "launchBrowser": true, 24 | "launchUrl": "swagger", 25 | "applicationUrl": "https://localhost:5001;http://localhost:5000", 26 | "environmentVariables": { 27 | "ASPNETCORE_ENVIRONMENT": "Development" 28 | } 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/Ecommerce.Dto/Objects/OrderDto.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace Ecommerce.Dto 5 | { 6 | public class OrderDto 7 | { 8 | public Guid OrderId { get; set; } 9 | public DateTime CreatedDate { get; set; } 10 | public OrderStatuses Status { get; set; } 11 | public string StatusText => Status.ToString(); 12 | public double TotalPrice { get; set; } 13 | public List Details { get; set; } 14 | } 15 | 16 | public class OrderDetailDto 17 | { 18 | public Guid ProductId { get; set; } 19 | public string ProductCode { get; set; } 20 | public string ProductName { get; set; } 21 | public int Quantity { get; set; } 22 | public double UnitPrice { get; set; } 23 | public double TotalPrice { get; set; } 24 | } 25 | 26 | public enum OrderStatuses 27 | { 28 | Created, 29 | Shipping, 30 | Shipped, 31 | Completed 32 | } 33 | } -------------------------------------------------------------------------------- /src/Ecommerce.Api/Helpers/ValidateModelAttribute.cs: -------------------------------------------------------------------------------- 1 | using System.Linq; 2 | using Ecommerce.Api.Models; 3 | using Microsoft.AspNetCore.Mvc; 4 | using Microsoft.AspNetCore.Mvc.Filters; 5 | 6 | namespace Ecommerce.Api 7 | { 8 | public class ValidateModelAttribute : ActionFilterAttribute 9 | { 10 | public override void OnActionExecuting(ActionExecutingContext context) 11 | { 12 | if (!context.ModelState.IsValid) 13 | { 14 | var errors = context.ModelState.Select(m => new 15 | { 16 | m.Key, 17 | Errors = m.Value.Errors.Select(x => x.ErrorMessage) 18 | }).ToList(); 19 | 20 | context.Result = new BadRequestObjectResult(new ApiData() 21 | { 22 | Message = "Form data not validated.", 23 | Data = errors 24 | }); 25 | } 26 | 27 | base.OnActionExecuting(context); 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /utils/mountebank/stubs/product.js: -------------------------------------------------------------------------------- 1 | const productStubs = [ 2 | { 3 | predicates: [ 4 | { 5 | equals: { 6 | method: "GET", 7 | path: "/products", 8 | }, 9 | }, 10 | ], 11 | responses: [ 12 | { 13 | is: { 14 | statusCode: 200, 15 | headers: { "Content-Type": "application/json" }, 16 | body: JSON.stringify({ 17 | success: true, 18 | data: [ 19 | { 20 | productId: "8F11AD71-D7E7-45EF-AF9E-D54EF0675C77", 21 | code: "iPhone", 22 | name: "iPhone 12", 23 | price: 14550, 24 | }, 25 | { 26 | productId: "463089DA-12B7-4975-ABC2-F7C785486644", 27 | code: "macbook", 28 | name: "Macbook Pro 16'", 29 | price: 34521, 30 | }, 31 | ], 32 | }), 33 | }, 34 | }, 35 | ], 36 | }, 37 | ]; 38 | 39 | module.exports = productStubs; 40 | -------------------------------------------------------------------------------- /src/ecommerce-ui/src/components/NavBar.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 27 | 28 | -------------------------------------------------------------------------------- /test/Ecommerce.Api.IntegrationTests/Helpers/SeedData.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using Ecommerce.Data; 4 | using Ecommerce.Entity; 5 | 6 | namespace Ecommerce.Api.IntegrationTests 7 | { 8 | public static class SeedData 9 | { 10 | public static void Seed(EcommerceContext dbContext) 11 | { 12 | var products = new List 13 | { 14 | new Product 15 | { 16 | ProductId = Guid.NewGuid(), 17 | Code = "iPhone", 18 | Name = "iPhone 12", 19 | Price = 14000 20 | }, 21 | new Product 22 | { 23 | ProductId = Guid.NewGuid(), 24 | Code = "macbook", 25 | Name = "Macbook Pro 16'", 26 | Price = 34000 27 | } 28 | }; 29 | 30 | dbContext.Products.AddRange(products); 31 | dbContext.SaveChanges(); 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /src/Ecommerce.Service/Services/ProductService.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | using Ecommerce.Dto; 4 | using Ecommerce.UnitOfWork; 5 | 6 | namespace Ecommerce.Service.Services 7 | { 8 | public class ProductService : IProductService 9 | { 10 | private readonly IUnitOfWork _uow; 11 | 12 | public ProductService(IUnitOfWork uow) 13 | { 14 | _uow = uow; 15 | } 16 | 17 | public ServiceResponse> GetAll() 18 | { 19 | var products = _uow.ProductRepository.FindAll().Select(x => new ProductDto 20 | { 21 | ProductId = x.ProductId, 22 | Code = x.Code, 23 | Name = x.Name, 24 | Price = x.Price 25 | }).ToList(); 26 | 27 | return new ServiceResponse> 28 | { 29 | Success = true, 30 | Message = "Products listed successfully.", 31 | Data = products 32 | }; 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /src/ecommerce-ui/src/components/Products.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 44 | 45 | 46 | 48 | -------------------------------------------------------------------------------- /src/ecommerce-ui/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ecommerce-ui", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "serve": "vue-cli-service serve", 7 | "build": "vue-cli-service build", 8 | "test:unit": "cross-env API_HOST_URL=http://localhost:4006 vue-cli-service test:unit", 9 | "lint": "vue-cli-service lint" 10 | }, 11 | "dependencies": { 12 | "axios": "^0.21.0", 13 | "bootstrap": "^4.5.3", 14 | "core-js": "^3.6.5", 15 | "jquery": "^3.5.1", 16 | "popper.js": "^1.16.1", 17 | "vue": "^2.6.11", 18 | "vue-router": "^3.2.0" 19 | }, 20 | "devDependencies": { 21 | "@vue/cli-plugin-babel": "~4.5.0", 22 | "@vue/cli-plugin-eslint": "~4.5.0", 23 | "@vue/cli-plugin-router": "~4.5.0", 24 | "@vue/cli-plugin-unit-jest": "~4.5.0", 25 | "@vue/cli-service": "~4.5.0", 26 | "@vue/eslint-config-prettier": "^6.0.0", 27 | "@vue/test-utils": "^1.0.3", 28 | "babel-eslint": "^10.1.0", 29 | "eslint": "^6.7.2", 30 | "eslint-plugin-prettier": "^3.1.3", 31 | "eslint-plugin-vue": "^6.2.2", 32 | "prettier": "^1.19.1", 33 | "vue-template-compiler": "^2.6.11" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /test/Ecommerce.Api.Tests/Ecommerce.Api.Tests.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net5.0 5 | 6 | false 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | runtime; build; native; contentfiles; analyzers; buildtransitive 15 | all 16 | 17 | 18 | runtime; build; native; contentfiles; analyzers; buildtransitive 19 | all 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /utils/puppeteer/puppeteer_environment.js: -------------------------------------------------------------------------------- 1 | const chalk = require("chalk"); 2 | const NodeEnvironment = require("jest-environment-node"); 3 | const puppeteer = require("puppeteer"); 4 | const fs = require("fs"); 5 | const os = require("os"); 6 | const path = require("path"); 7 | 8 | const DIR = path.join(os.tmpdir(), "jest_puppeteer_global_setup"); 9 | 10 | class PuppeteerEnvironment extends NodeEnvironment { 11 | constructor(config) { 12 | super(config); 13 | } 14 | 15 | async setup() { 16 | console.log(chalk.yellow("Setup Test Environment.")); 17 | await super.setup(); 18 | const wsEndpoint = fs.readFileSync(path.join(DIR, "wsEndpoint"), "utf8"); 19 | if (!wsEndpoint) { 20 | throw new Error("wsEndpoint not found"); 21 | } 22 | this.global.__BROWSER__ = await puppeteer.connect({ 23 | browserWSEndpoint: wsEndpoint 24 | }); 25 | } 26 | 27 | async teardown() { 28 | console.log(chalk.yellow("Teardown Test Environment.")); 29 | await super.teardown(); 30 | } 31 | 32 | runScript(script) { 33 | return super.runScript(script); 34 | } 35 | } 36 | 37 | module.exports = PuppeteerEnvironment; 38 | -------------------------------------------------------------------------------- /src/ecommerce-ui/src/views/Order.vue: -------------------------------------------------------------------------------- 1 | 25 | 51 | -------------------------------------------------------------------------------- /src/ecommerce-ui/jest.config.js: -------------------------------------------------------------------------------- 1 | /*module.exports = { 2 | preset: "@vue/cli-plugin-unit-jest" 3 | };*/ 4 | 5 | // eslint-disable-next-line no-undef 6 | module.exports = { 7 | verbose: true, 8 | moduleFileExtensions: ["js", "vue"], 9 | moduleNameMapper: { 10 | "^.+\\.module\\.(css|sass|scss)$": "identity-obj-proxy", 11 | "\\.(css|less)$": "identity-obj-proxy", 12 | "@/(.*)$": "/src/$1", 13 | "^vue$": "vue/dist/vue.common.js" 14 | }, 15 | transform: { 16 | "^.+\\.vue$": "vue-jest", 17 | "^.+\\.jsx?$": "babel-jest" 18 | }, 19 | transformIgnorePatterns: [], 20 | testMatch: [ 21 | "**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)" 22 | ], 23 | testURL: "http://localhost:4006/", 24 | setupFilesAfterEnv: ["./jest.setup.js"], 25 | collectCoverage: false, 26 | collectCoverageFrom: [ 27 | "**/*.{js,vue}", 28 | "!**/node_modules/**", 29 | "!**/coverage/**", 30 | "!**/router/**", 31 | "!**/babel.config.js", 32 | "!**/jest.config.js", 33 | "!**/webpack.config.js", 34 | "!**/webpack.config.vendor.js", 35 | "!**/mock.js", 36 | "!**/*.mock.js", 37 | "!**/main.js", 38 | "!**/App.vue" 39 | ], 40 | coverageReporters: ["lcov", "text", "text-summary"] 41 | }; 42 | 43 | -------------------------------------------------------------------------------- /test/Ecommerce.Api.IntegrationTests/Ecommerce.Api.IntegrationTests.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net5.0 5 | 6 | false 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | runtime; build; native; contentfiles; analyzers; buildtransitive 16 | all 17 | 18 | 19 | runtime; build; native; contentfiles; analyzers; buildtransitive 20 | all 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /src/ecommerce-ui/tests/unit/Product.spec.js: -------------------------------------------------------------------------------- 1 | import {shallowMount} from "@vue/test-utils"; 2 | import Product from "@/components/Product.vue"; 3 | 4 | describe("Product.vue", () => { 5 | it("renders product title when passed", () => { 6 | const wrapper = shallowMount(Product, { 7 | propsData: { 8 | product: { 9 | productId: "8F11AD71-D7E7-45EF-AF9E-D54EF0675C77", 10 | code: "iPhone", 11 | name: "iPhone 12", 12 | price: 14550 13 | }, 14 | index: 0 15 | } 16 | }); 17 | 18 | const title = wrapper.find(".card-title"); 19 | expect(title.element.innerHTML).toBe("iPhone 12"); 20 | }); 21 | 22 | it("renders product code when passed", () => { 23 | const wrapper = shallowMount(Product, { 24 | propsData: { 25 | product: { 26 | productId: "8F11AD71-D7E7-45EF-AF9E-D54EF0675C77", 27 | code: "iPhone", 28 | name: "iPhone 12", 29 | price: 14550 30 | }, 31 | index: 0 32 | } 33 | }); 34 | 35 | const code = wrapper.find(".card-text"); 36 | expect(code.element.innerHTML).toBe("Code: iPhone"); 37 | }); 38 | }); 39 | -------------------------------------------------------------------------------- /src/Ecommerce.Api/Controllers/OrdersController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using Ecommerce.Api.Models; 5 | using Ecommerce.Dto; 6 | using Ecommerce.Service; 7 | using Microsoft.AspNetCore.Mvc; 8 | 9 | namespace Ecommerce.Api.Controllers 10 | { 11 | public class OrdersController : BaseApiController 12 | { 13 | private readonly IOrderService _orderService; 14 | 15 | public OrdersController(IOrderService orderService) 16 | { 17 | _orderService = orderService; 18 | } 19 | 20 | [HttpGet] 21 | public IActionResult Get() 22 | { 23 | var orders = _orderService.GetAll(); 24 | 25 | return orders.Success ? Success(orders.Data, orders.Message) : BadRequest(null, orders.Message); 26 | } 27 | 28 | [HttpPost] 29 | public IActionResult Post([FromBody] List model) 30 | { 31 | var data = model.Select(x => new CreateOrderDto 32 | { 33 | ProductId = x.ProductId, 34 | Quantity = x.Quantity 35 | }).ToList(); 36 | 37 | var orderInfo = _orderService.Create(data); 38 | 39 | return orderInfo.Success ? Success(orderInfo.Data, orderInfo.Message) : BadRequest(Guid.Empty, orderInfo.Message); 40 | } 41 | } 42 | } -------------------------------------------------------------------------------- /src/Ecommerce.UnitOfWork/UnitOfWork.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Data; 3 | using Ecommerce.Data; 4 | using Ecommerce.Entity; 5 | using Ecommerce.Repository; 6 | 7 | namespace Ecommerce.UnitOfWork 8 | { 9 | public class UnitOfWork : IUnitOfWork 10 | { 11 | private readonly EcommerceContext _context; 12 | private bool disposed; 13 | private IRepository _productRepository; 14 | private IRepository _orderRepository; 15 | public IRepository ProductRepository => _productRepository ??= new Repository(_context); 16 | public IRepository OrderRepository => _orderRepository ??= new Repository(_context); 17 | 18 | public UnitOfWork(EcommerceContext context) 19 | { 20 | _context = context; 21 | } 22 | 23 | public void SaveChanges() 24 | { 25 | _context.SaveChanges(); 26 | } 27 | 28 | public virtual void Dispose(bool disposing) 29 | { 30 | if (!disposed) 31 | { 32 | if (disposing) 33 | { 34 | _context.Dispose(); 35 | } 36 | } 37 | 38 | disposed = true; 39 | } 40 | 41 | public void Dispose() 42 | { 43 | Dispose(true); 44 | GC.SuppressFinalize(this); 45 | } 46 | } 47 | } -------------------------------------------------------------------------------- /test/Ecommerce.Api.IntegrationTests/ProductsControllerTests.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Net; 4 | using System.Net.Http; 5 | using System.Threading.Tasks; 6 | using Ecommerce.Api.Models; 7 | using Ecommerce.Dto; 8 | using Newtonsoft.Json; 9 | using Xunit; 10 | 11 | namespace Ecommerce.Api.IntegrationTests 12 | { 13 | public class ProductsControllerTests : IClassFixture> 14 | { 15 | private readonly HttpClient _client; 16 | 17 | public ProductsControllerTests(CustomFactory factory) 18 | { 19 | _client = factory.CreateClient(); 20 | } 21 | 22 | [Fact] 23 | public async Task GetProductList() 24 | { 25 | var httpResponse = await _client.GetAsync("products"); 26 | 27 | httpResponse.EnsureSuccessStatusCode(); 28 | 29 | var stringResponse = await httpResponse.Content.ReadAsStringAsync(); 30 | var response = JsonConvert.DeserializeObject>>(stringResponse); 31 | 32 | Assert.True(response.Success); 33 | Assert.Equal("Products listed successfully.", response.Message); 34 | Assert.NotNull(response.Data); 35 | Assert.Contains(response.Data, p => p.Code == "iPhone"); 36 | } 37 | 38 | [Fact] 39 | public async Task ReturnsError() 40 | { 41 | var httpResponse = await _client.GetAsync("product-orders"); 42 | 43 | Assert.Equal(HttpStatusCode.NotFound, httpResponse.StatusCode); 44 | } 45 | } 46 | } -------------------------------------------------------------------------------- /utils/puppeteer/__test__/pages/products.test.js: -------------------------------------------------------------------------------- 1 | const timeout = process.env.SLOWMO ? 30000 : 10000; 2 | 3 | describe("Test product list page", () => { 4 | let page; 5 | 6 | beforeAll(async () => { 7 | jest.setTimeout(timeout); 8 | page = await global.__BROWSER__.newPage(); 9 | await page.goto(URL, { waitUntil: "domcontentloaded" }); 10 | }, timeout); 11 | 12 | afterEach(async () => { 13 | await page.waitFor(1000); 14 | }); 15 | 16 | afterAll(async () => { 17 | // await page.close(); 18 | }); 19 | 20 | test("Title of the product list page", async () => { 21 | const title = await page.title(); 22 | expect(title).toBe("ecommerce-ui"); 23 | }); 24 | 25 | test("Must have 2 cards on products list", async () => { 26 | const cards = await page.$$(".card"); 27 | 28 | expect(cards.length).toBeGreaterThan(0); 29 | }); 30 | 31 | test("Type 5 in quantity input", async () => { 32 | await page.$eval("#quantity0", (el) => (el.value = "5")); 33 | const input = await page.$("#quantity0"); 34 | const value = await page.evaluate((x) => x.value, input); 35 | expect(value).toBe("5"); 36 | }); 37 | 38 | test("Must have 2 rows on order list", async () => { 39 | await page.goto("http://localhost:8080/orders", { 40 | waitUntil: "networkidle0", 41 | }); 42 | 43 | const rows = await page.$$("tbody tr"); 44 | 45 | expect(rows).toHaveLength(2); 46 | }); 47 | }); 48 | -------------------------------------------------------------------------------- /src/Ecommerce.Service/Extensions/ServiceExtension.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Ecommerce.Data; 3 | using Ecommerce.Repository; 4 | using Ecommerce.Service.Services; 5 | using Ecommerce.UnitOfWork; 6 | using Microsoft.EntityFrameworkCore; 7 | using Microsoft.Extensions.DependencyInjection; 8 | using Microsoft.VisualBasic; 9 | 10 | namespace Ecommerce.Service 11 | { 12 | public static class ServiceExtension 13 | { 14 | public static void ConfigureServices(this IServiceCollection services) 15 | { 16 | services.AddScoped(typeof(IRepository<>), typeof(Repository<>)); 17 | services.AddScoped(); 18 | services.AddScoped(); 19 | services.AddScoped(); 20 | } 21 | 22 | public static void ConfigureDatabase(this IServiceCollection services, string connectionString) 23 | { 24 | if (string.IsNullOrEmpty(connectionString)) 25 | throw new Exception($"Connection string not set!"); 26 | 27 | services.AddDbContext(options => options.UseNpgsql(connectionString)); 28 | 29 | var serviceProvider = services.BuildServiceProvider(); 30 | var db = serviceProvider.GetRequiredService(); 31 | db.Database.EnsureCreated(); 32 | db.Database.Migrate(); 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /src/ecommerce-ui/src/components/Product.vue: -------------------------------------------------------------------------------- 1 | 25 | 26 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /src/Ecommerce.Api/Controllers/Base/BaseApiController.cs: -------------------------------------------------------------------------------- 1 | using Ecommerce.Api.Models; 2 | using Microsoft.AspNetCore.Mvc; 3 | 4 | namespace Ecommerce.Api.Controllers 5 | { 6 | [ApiController] 7 | [ValidateModel] 8 | // [ApiExceptionFilter] 9 | [Route("[controller]")] 10 | public class BaseApiController : Controller 11 | { 12 | [NonAction] 13 | protected IActionResult Success(T data, string message) => 14 | StatusCode(200, new ApiData 15 | { 16 | Success = true, 17 | Data = data, 18 | Message = message 19 | }); 20 | 21 | [NonAction] 22 | protected IActionResult BadRequest(T data) => StatusCode(400, new ApiData {Success = false, Data = data}); 23 | 24 | [NonAction] 25 | protected IActionResult BadRequest(T data, string message) => StatusCode(400, 26 | new ApiData {Success = false, Data = data, Message = message}); 27 | 28 | [NonAction] 29 | protected IActionResult Unauthorized(T data) => 30 | StatusCode(401, new ApiData {Success = false, Data = data}); 31 | 32 | [NonAction] 33 | protected IActionResult Forbidden(T data) => StatusCode(403, new ApiData {Success = false, Data = data}); 34 | 35 | [NonAction] 36 | protected IActionResult NotFound(T data) => StatusCode(404, new ApiData {Success = false, Data = data}); 37 | 38 | [NonAction] 39 | protected IActionResult Error(string message, string[] errors) => StatusCode(500, 40 | new ApiData {Success = false, Data = errors, Message = message}); 41 | } 42 | } -------------------------------------------------------------------------------- /src/Ecommerce.Repository/Repository.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Linq.Expressions; 5 | using Ecommerce.Data; 6 | using Microsoft.EntityFrameworkCore; 7 | 8 | namespace Ecommerce.Repository 9 | { 10 | public class Repository : IRepository where TEntity : class 11 | { 12 | private readonly EcommerceContext _context; 13 | private readonly DbSet _entity; 14 | 15 | public Repository(EcommerceContext context) 16 | { 17 | _context = context; 18 | _entity = context.Set(); 19 | } 20 | 21 | public IQueryable FindAll(params Expression>[] includes) 22 | { 23 | IQueryable query = null; 24 | foreach (var include in includes) 25 | { 26 | query = _entity.Include(include); 27 | } 28 | 29 | return query ?? _entity; 30 | } 31 | 32 | public IQueryable Find(Expression> predicate) 33 | { 34 | return _entity.Where(predicate).AsQueryable(); 35 | } 36 | 37 | public TEntity FirstOrDefault(Expression> predicate) 38 | { 39 | return _entity.FirstOrDefault(predicate); 40 | } 41 | 42 | public void Add(TEntity entity) 43 | { 44 | _entity.Add(entity); 45 | } 46 | 47 | public void Update(TEntity entity) 48 | { 49 | _entity.Attach(entity); 50 | _context.Entry(entity).State = EntityState.Modified; 51 | } 52 | 53 | public void Delete(TEntity entity) 54 | { 55 | _context.Remove(entity); 56 | } 57 | } 58 | } -------------------------------------------------------------------------------- /test/Ecommerce.Api.IntegrationTests/Helpers/CustomFactory.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Ecommerce.Data; 3 | using Microsoft.AspNetCore.Hosting; 4 | using Microsoft.AspNetCore.Mvc.Testing; 5 | using Microsoft.EntityFrameworkCore; 6 | using Microsoft.Extensions.DependencyInjection; 7 | using Microsoft.Extensions.Logging; 8 | 9 | namespace Ecommerce.Api.IntegrationTests 10 | { 11 | public class CustomFactory : WebApplicationFactory 12 | { 13 | protected override void ConfigureWebHost(IWebHostBuilder builder) 14 | { 15 | builder.ConfigureServices(services => 16 | { 17 | var serviceProvider = new ServiceCollection() 18 | .AddEntityFrameworkInMemoryDatabase() 19 | .BuildServiceProvider(); 20 | 21 | services.AddDbContext(options => 22 | { 23 | options.UseInMemoryDatabase("CommerceDb"); 24 | options.UseInternalServiceProvider(serviceProvider); 25 | }); 26 | 27 | var sp = services.BuildServiceProvider(); 28 | 29 | using var scope = sp.CreateScope(); 30 | var scopedServices = scope.ServiceProvider; 31 | var appDb = scopedServices.GetRequiredService(); 32 | 33 | var logger = scopedServices.GetRequiredService>>(); 34 | 35 | appDb.Database.EnsureCreated(); 36 | 37 | try 38 | { 39 | SeedData.Seed(appDb); 40 | } 41 | catch (Exception ex) 42 | { 43 | logger.LogError(ex, ex.Message); 44 | } 45 | }); 46 | } 47 | } 48 | } -------------------------------------------------------------------------------- /test/Ecommerce.Api.Tests/ProductsControllerTests.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using Ecommerce.Api.Controllers; 4 | using Ecommerce.Api.Models; 5 | using Ecommerce.Dto; 6 | using Ecommerce.Service; 7 | using Microsoft.AspNetCore.Http; 8 | using Microsoft.AspNetCore.Mvc; 9 | using Moq; 10 | using Xunit; 11 | 12 | namespace Ecommerce.Api.Tests 13 | { 14 | public class ProductsControllerTests 15 | { 16 | private readonly Mock _productService; 17 | 18 | public ProductsControllerTests() 19 | { 20 | _productService = new Mock(); 21 | } 22 | 23 | [Fact] 24 | public void Get_ReturnsProductList() 25 | { 26 | // Arrange 27 | var returnData = new ServiceResponse> 28 | { 29 | Success = true, 30 | Message = "Products listed successfully", 31 | Data = new List 32 | { 33 | new ProductDto 34 | { 35 | Code = "iphone", 36 | Name = "iPhone 12", 37 | Price = 14000 38 | } 39 | } 40 | }; 41 | _productService.Setup(x => x.GetAll()).Returns(returnData); 42 | 43 | // Act 44 | var controller = new ProductsController(_productService.Object); 45 | var result = controller.Get(); 46 | 47 | // Assert 48 | var apiResult = Assert.IsType(result); 49 | var model = Assert.IsAssignableFrom>>(apiResult.Value); 50 | 51 | Assert.True(model.Success); 52 | Assert.Equal("Products listed successfully", model.Message); 53 | Assert.Equal(StatusCodes.Status200OK, apiResult.StatusCode); 54 | Assert.NotNull(model.Data); 55 | Assert.Single(model.Data); 56 | } 57 | 58 | [Fact] 59 | public void Get_ReturnsNoProduct() 60 | { 61 | // Arrange 62 | var returnData = new ServiceResponse> 63 | { 64 | Success = false, 65 | Message = "Internal service error" 66 | }; 67 | _productService.Setup(x => x.GetAll()).Returns(returnData); 68 | 69 | // Act 70 | var controller = new ProductsController(_productService.Object); 71 | var result = controller.Get(); 72 | 73 | // Assert 74 | var apiResult = Assert.IsType(result); 75 | var model = Assert.IsAssignableFrom>(apiResult.Value); 76 | 77 | Assert.False(model.Success); 78 | Assert.Equal("Internal service error", model.Message); 79 | Assert.Equal(StatusCodes.Status400BadRequest, apiResult.StatusCode); 80 | Assert.Null(model.Data); 81 | } 82 | } 83 | } -------------------------------------------------------------------------------- /src/Ecommerce.Api/Startup.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using Ecommerce.Service; 6 | using Microsoft.AspNetCore.Builder; 7 | using Microsoft.AspNetCore.Hosting; 8 | using Microsoft.AspNetCore.HttpsPolicy; 9 | using Microsoft.AspNetCore.Mvc; 10 | using Microsoft.Extensions.Configuration; 11 | using Microsoft.Extensions.DependencyInjection; 12 | using Microsoft.Extensions.Hosting; 13 | using Microsoft.Extensions.Logging; 14 | using Microsoft.OpenApi.Models; 15 | 16 | namespace Ecommerce.Api 17 | { 18 | public class Startup 19 | { 20 | public Startup(IConfiguration configuration) 21 | { 22 | Configuration = configuration; 23 | } 24 | 25 | public IConfiguration Configuration { get; } 26 | 27 | // This method gets called by the runtime. Use this method to add services to the container. 28 | public void ConfigureServices(IServiceCollection services) 29 | { 30 | var connectionString = Configuration.GetConnectionString("Db"); 31 | services.ConfigureServices(); 32 | services.ConfigureDatabase(connectionString); 33 | 34 | services.Configure(options => { options.SuppressModelStateInvalidFilter = true; }); 35 | services.AddScoped(); 36 | services.AddScoped(); 37 | 38 | services.AddControllers(); 39 | services.AddSwaggerGen(c => 40 | { 41 | c.SwaggerDoc("v1", new OpenApiInfo {Title = "Ecommerce.Api", Version = "v1"}); 42 | }); 43 | } 44 | 45 | // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. 46 | public void Configure(IApplicationBuilder app, IWebHostEnvironment env) 47 | { 48 | if (env.IsDevelopment()) 49 | { 50 | app.UseDeveloperExceptionPage(); 51 | app.UseSwagger(); 52 | app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Ecommerce.Api v1")); 53 | } 54 | 55 | app.UseHttpsRedirection(); 56 | 57 | app.UseCors(options => 58 | { 59 | options.AllowAnyOrigin(); 60 | options.AllowAnyHeader(); 61 | options.AllowAnyMethod(); 62 | }); 63 | 64 | app.UseRouting(); 65 | 66 | app.UseAuthorization(); 67 | 68 | app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); 69 | } 70 | } 71 | } -------------------------------------------------------------------------------- /src/Ecommerce.Service/Services/OrderService.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using Ecommerce.Dto; 5 | using Ecommerce.Entity; 6 | using Ecommerce.Repository; 7 | using Ecommerce.UnitOfWork; 8 | using OrderStatuses = Ecommerce.Dto.OrderStatuses; 9 | 10 | namespace Ecommerce.Service.Services 11 | { 12 | public class OrderService : IOrderService 13 | { 14 | private readonly IUnitOfWork _uow; 15 | private readonly IRepository _productRepository; 16 | 17 | public OrderService(IUnitOfWork uow, IRepository productRepository) 18 | { 19 | _uow = uow; 20 | _productRepository = productRepository; 21 | } 22 | 23 | public ServiceResponse> GetAll() 24 | { 25 | var orders = _uow.OrderRepository.FindAll(x => x.OrderDetails).ToList(); 26 | var data = new List(); 27 | 28 | foreach (var order in orders) 29 | { 30 | var o = new OrderDto 31 | { 32 | OrderId = order.OrderId, 33 | TotalPrice = order.TotalPrice, 34 | CreatedDate = order.CreatedDate, 35 | Status = (OrderStatuses) order.Status, 36 | Details = new List() 37 | }; 38 | 39 | foreach (var orderDetail in order.OrderDetails) 40 | { 41 | var product = _productRepository.FirstOrDefault(x => x.ProductId == orderDetail.ProductId); 42 | o.Details.Add(new OrderDetailDto 43 | { 44 | ProductId = orderDetail.ProductId, 45 | Quantity = orderDetail.Quantity, 46 | UnitPrice = orderDetail.UnitPrice, 47 | TotalPrice = orderDetail.TotalPrice, 48 | ProductCode = product.Code, 49 | ProductName = product.Name 50 | }); 51 | } 52 | 53 | data.Add(o); 54 | } 55 | 56 | return new ServiceResponse> 57 | { 58 | Success = true, 59 | Message = "Orders listed successfully.", 60 | Data = data 61 | }; 62 | } 63 | 64 | public ServiceResponse Create(List data) 65 | { 66 | var order = new Order 67 | { 68 | CreatedDate = DateTime.UtcNow, 69 | Status = Entity.OrderStatuses.Created, 70 | OrderDetails = new List() 71 | }; 72 | var totalOrderPrice = 0d; 73 | 74 | foreach (var orderDetail in data) 75 | { 76 | var product = _productRepository.FirstOrDefault(x => x.ProductId == orderDetail.ProductId); 77 | var totalPrice = product.Price * orderDetail.Quantity; 78 | var detail = new OrderDetail 79 | { 80 | ProductId = orderDetail.ProductId, 81 | Quantity = orderDetail.Quantity, 82 | UnitPrice = product.Price, 83 | TotalPrice = totalPrice 84 | }; 85 | 86 | totalOrderPrice += totalPrice; 87 | 88 | order.OrderDetails.Add(detail); 89 | } 90 | 91 | order.TotalPrice = totalOrderPrice; 92 | 93 | _uow.OrderRepository.Add(order); 94 | _uow.SaveChanges(); 95 | 96 | return new ServiceResponse 97 | { 98 | Success = true, 99 | Message = "Order created successfully.", 100 | Data = order.OrderId 101 | }; 102 | } 103 | } 104 | } -------------------------------------------------------------------------------- /developer-summit-testing-sample.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{18631DA2-704A-4A33-8411-CCB435B294F5}" 4 | EndProject 5 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{4D331FCA-CE07-4A20-A850-6559A310B24D}" 6 | EndProject 7 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Data", "Data", "{5783A989-418E-434A-902C-8373A3AF481F}" 8 | EndProject 9 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ecommerce.Data", "src\Ecommerce.Data\Ecommerce.Data.csproj", "{7C52D900-CE7F-4B2D-8446-F9DE55BD40DF}" 10 | EndProject 11 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ecommerce.Entity", "src\Ecommerce.Entity\Ecommerce.Entity.csproj", "{0F61D221-BAEC-4E2E-A7F3-1C9150BA3A42}" 12 | EndProject 13 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{763DBDF2-8A07-4C17-8A08-6F3280FEF586}" 14 | EndProject 15 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ecommerce.Repository", "src\Ecommerce.Repository\Ecommerce.Repository.csproj", "{E15E2BE3-2B8F-4F8F-90A2-22ED17D8F200}" 16 | EndProject 17 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ecommerce.UnitOfWork", "src\Ecommerce.UnitOfWork\Ecommerce.UnitOfWork.csproj", "{D017357C-26BF-4B4B-973D-BA2FE2B8EA50}" 18 | EndProject 19 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ecommerce.Service", "src\Ecommerce.Service\Ecommerce.Service.csproj", "{B0FDD99B-D9AF-4EA9-B52D-85F62E0FC2A1}" 20 | EndProject 21 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ecommerce.Dto", "src\Ecommerce.Dto\Ecommerce.Dto.csproj", "{187A2213-5CC7-46B6-9C57-F27230F639A0}" 22 | EndProject 23 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UI", "UI", "{C50E25E1-BAD0-484A-BBFE-23684EE8373D}" 24 | EndProject 25 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ecommerce.Api", "src\Ecommerce.Api\Ecommerce.Api.csproj", "{70B3B0A1-E3A4-45F6-9809-ABF398C679A7}" 26 | EndProject 27 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ecommerce.Api.Tests", "test\Ecommerce.Api.Tests\Ecommerce.Api.Tests.csproj", "{C1337358-FF5A-491A-88F4-1E9212A842D4}" 28 | EndProject 29 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ecommerce.Api.IntegrationTests", "test\Ecommerce.Api.IntegrationTests\Ecommerce.Api.IntegrationTests.csproj", "{1F3FC63A-0CE8-4E17-B5B4-C3001CEEF99E}" 30 | EndProject 31 | Global 32 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 33 | Debug|Any CPU = Debug|Any CPU 34 | Release|Any CPU = Release|Any CPU 35 | EndGlobalSection 36 | GlobalSection(NestedProjects) = preSolution 37 | {5783A989-418E-434A-902C-8373A3AF481F} = {18631DA2-704A-4A33-8411-CCB435B294F5} 38 | {7C52D900-CE7F-4B2D-8446-F9DE55BD40DF} = {5783A989-418E-434A-902C-8373A3AF481F} 39 | {0F61D221-BAEC-4E2E-A7F3-1C9150BA3A42} = {5783A989-418E-434A-902C-8373A3AF481F} 40 | {763DBDF2-8A07-4C17-8A08-6F3280FEF586} = {18631DA2-704A-4A33-8411-CCB435B294F5} 41 | {E15E2BE3-2B8F-4F8F-90A2-22ED17D8F200} = {763DBDF2-8A07-4C17-8A08-6F3280FEF586} 42 | {D017357C-26BF-4B4B-973D-BA2FE2B8EA50} = {763DBDF2-8A07-4C17-8A08-6F3280FEF586} 43 | {B0FDD99B-D9AF-4EA9-B52D-85F62E0FC2A1} = {763DBDF2-8A07-4C17-8A08-6F3280FEF586} 44 | {187A2213-5CC7-46B6-9C57-F27230F639A0} = {763DBDF2-8A07-4C17-8A08-6F3280FEF586} 45 | {C50E25E1-BAD0-484A-BBFE-23684EE8373D} = {18631DA2-704A-4A33-8411-CCB435B294F5} 46 | {70B3B0A1-E3A4-45F6-9809-ABF398C679A7} = {C50E25E1-BAD0-484A-BBFE-23684EE8373D} 47 | {C1337358-FF5A-491A-88F4-1E9212A842D4} = {4D331FCA-CE07-4A20-A850-6559A310B24D} 48 | {1F3FC63A-0CE8-4E17-B5B4-C3001CEEF99E} = {4D331FCA-CE07-4A20-A850-6559A310B24D} 49 | EndGlobalSection 50 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 51 | {7C52D900-CE7F-4B2D-8446-F9DE55BD40DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 52 | {7C52D900-CE7F-4B2D-8446-F9DE55BD40DF}.Debug|Any CPU.Build.0 = Debug|Any CPU 53 | {7C52D900-CE7F-4B2D-8446-F9DE55BD40DF}.Release|Any CPU.ActiveCfg = Release|Any CPU 54 | {7C52D900-CE7F-4B2D-8446-F9DE55BD40DF}.Release|Any CPU.Build.0 = Release|Any CPU 55 | {0F61D221-BAEC-4E2E-A7F3-1C9150BA3A42}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 56 | {0F61D221-BAEC-4E2E-A7F3-1C9150BA3A42}.Debug|Any CPU.Build.0 = Debug|Any CPU 57 | {0F61D221-BAEC-4E2E-A7F3-1C9150BA3A42}.Release|Any CPU.ActiveCfg = Release|Any CPU 58 | {0F61D221-BAEC-4E2E-A7F3-1C9150BA3A42}.Release|Any CPU.Build.0 = Release|Any CPU 59 | {E15E2BE3-2B8F-4F8F-90A2-22ED17D8F200}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 60 | {E15E2BE3-2B8F-4F8F-90A2-22ED17D8F200}.Debug|Any CPU.Build.0 = Debug|Any CPU 61 | {E15E2BE3-2B8F-4F8F-90A2-22ED17D8F200}.Release|Any CPU.ActiveCfg = Release|Any CPU 62 | {E15E2BE3-2B8F-4F8F-90A2-22ED17D8F200}.Release|Any CPU.Build.0 = Release|Any CPU 63 | {D017357C-26BF-4B4B-973D-BA2FE2B8EA50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 64 | {D017357C-26BF-4B4B-973D-BA2FE2B8EA50}.Debug|Any CPU.Build.0 = Debug|Any CPU 65 | {D017357C-26BF-4B4B-973D-BA2FE2B8EA50}.Release|Any CPU.ActiveCfg = Release|Any CPU 66 | {D017357C-26BF-4B4B-973D-BA2FE2B8EA50}.Release|Any CPU.Build.0 = Release|Any CPU 67 | {B0FDD99B-D9AF-4EA9-B52D-85F62E0FC2A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 68 | {B0FDD99B-D9AF-4EA9-B52D-85F62E0FC2A1}.Debug|Any CPU.Build.0 = Debug|Any CPU 69 | {B0FDD99B-D9AF-4EA9-B52D-85F62E0FC2A1}.Release|Any CPU.ActiveCfg = Release|Any CPU 70 | {B0FDD99B-D9AF-4EA9-B52D-85F62E0FC2A1}.Release|Any CPU.Build.0 = Release|Any CPU 71 | {187A2213-5CC7-46B6-9C57-F27230F639A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 72 | {187A2213-5CC7-46B6-9C57-F27230F639A0}.Debug|Any CPU.Build.0 = Debug|Any CPU 73 | {187A2213-5CC7-46B6-9C57-F27230F639A0}.Release|Any CPU.ActiveCfg = Release|Any CPU 74 | {187A2213-5CC7-46B6-9C57-F27230F639A0}.Release|Any CPU.Build.0 = Release|Any CPU 75 | {70B3B0A1-E3A4-45F6-9809-ABF398C679A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 76 | {70B3B0A1-E3A4-45F6-9809-ABF398C679A7}.Debug|Any CPU.Build.0 = Debug|Any CPU 77 | {70B3B0A1-E3A4-45F6-9809-ABF398C679A7}.Release|Any CPU.ActiveCfg = Release|Any CPU 78 | {70B3B0A1-E3A4-45F6-9809-ABF398C679A7}.Release|Any CPU.Build.0 = Release|Any CPU 79 | {C1337358-FF5A-491A-88F4-1E9212A842D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 80 | {C1337358-FF5A-491A-88F4-1E9212A842D4}.Debug|Any CPU.Build.0 = Debug|Any CPU 81 | {C1337358-FF5A-491A-88F4-1E9212A842D4}.Release|Any CPU.ActiveCfg = Release|Any CPU 82 | {C1337358-FF5A-491A-88F4-1E9212A842D4}.Release|Any CPU.Build.0 = Release|Any CPU 83 | {1F3FC63A-0CE8-4E17-B5B4-C3001CEEF99E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 84 | {1F3FC63A-0CE8-4E17-B5B4-C3001CEEF99E}.Debug|Any CPU.Build.0 = Debug|Any CPU 85 | {1F3FC63A-0CE8-4E17-B5B4-C3001CEEF99E}.Release|Any CPU.ActiveCfg = Release|Any CPU 86 | {1F3FC63A-0CE8-4E17-B5B4-C3001CEEF99E}.Release|Any CPU.Build.0 = Release|Any CPU 87 | EndGlobalSection 88 | EndGlobal 89 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.toptal.com/developers/gitignore/api/aspnetcore,csharp,dotnetcore,visualstudiocode,vscode,macos 2 | # Edit at https://www.toptal.com/developers/gitignore?templates=aspnetcore,csharp,dotnetcore,visualstudiocode,vscode,macos 3 | 4 | ### ASPNETCore ### 5 | ## Ignore Visual Studio temporary files, build results, and 6 | ## files generated by popular Visual Studio add-ons. 7 | 8 | # User-specific files 9 | *.suo 10 | *.user 11 | *.userosscache 12 | *.sln.docstates 13 | 14 | # User-specific files (MonoDevelop/Xamarin Studio) 15 | *.userprefs 16 | 17 | # Build results 18 | [Dd]ebug/ 19 | [Dd]ebugPublic/ 20 | [Rr]elease/ 21 | [Rr]eleases/ 22 | x64/ 23 | x86/ 24 | bld/ 25 | [Bb]in/ 26 | [Oo]bj/ 27 | [Ll]og/ 28 | 29 | # Visual Studio 2015 cache/options directory 30 | .vs/ 31 | # Uncomment if you have tasks that create the project's static files in wwwroot 32 | #wwwroot/ 33 | 34 | # MSTest test Results 35 | [Tt]est[Rr]esult*/ 36 | [Bb]uild[Ll]og.* 37 | 38 | # NUNIT 39 | *.VisualState.xml 40 | TestResult.xml 41 | 42 | # Build Results of an ATL Project 43 | [Dd]ebugPS/ 44 | [Rr]eleasePS/ 45 | dlldata.c 46 | 47 | # DNX 48 | project.lock.json 49 | project.fragment.lock.json 50 | artifacts/ 51 | 52 | *_i.c 53 | *_p.c 54 | *_i.h 55 | *.ilk 56 | *.meta 57 | *.obj 58 | *.pch 59 | *.pdb 60 | *.pgc 61 | *.pgd 62 | *.rsp 63 | *.sbr 64 | *.tlb 65 | *.tli 66 | *.tlh 67 | *.tmp 68 | *.tmp_proj 69 | *.log 70 | *.vspscc 71 | *.vssscc 72 | .builds 73 | *.pidb 74 | *.svclog 75 | *.scc 76 | 77 | # Chutzpah Test files 78 | _Chutzpah* 79 | 80 | # Visual C++ cache files 81 | ipch/ 82 | *.aps 83 | *.ncb 84 | *.opendb 85 | *.opensdf 86 | *.sdf 87 | *.cachefile 88 | *.VC.db 89 | *.VC.VC.opendb 90 | 91 | # Visual Studio profiler 92 | *.psess 93 | *.vsp 94 | *.vspx 95 | *.sap 96 | 97 | # TFS 2012 Local Workspace 98 | $tf/ 99 | 100 | # Guidance Automation Toolkit 101 | *.gpState 102 | 103 | # ReSharper is a .NET coding add-in 104 | _ReSharper*/ 105 | *.[Rr]e[Ss]harper 106 | *.DotSettings.user 107 | 108 | # JustCode is a .NET coding add-in 109 | .JustCode 110 | 111 | # TeamCity is a build add-in 112 | _TeamCity* 113 | 114 | # DotCover is a Code Coverage Tool 115 | *.dotCover 116 | 117 | # Visual Studio code coverage results 118 | *.coverage 119 | *.coveragexml 120 | 121 | # NCrunch 122 | _NCrunch_* 123 | .*crunch*.local.xml 124 | nCrunchTemp_* 125 | 126 | # MightyMoose 127 | *.mm.* 128 | AutoTest.Net/ 129 | 130 | # Web workbench (sass) 131 | .sass-cache/ 132 | 133 | # Installshield output folder 134 | [Ee]xpress/ 135 | 136 | # DocProject is a documentation generator add-in 137 | DocProject/buildhelp/ 138 | DocProject/Help/*.HxT 139 | DocProject/Help/*.HxC 140 | DocProject/Help/*.hhc 141 | DocProject/Help/*.hhk 142 | DocProject/Help/*.hhp 143 | DocProject/Help/Html2 144 | DocProject/Help/html 145 | 146 | # Click-Once directory 147 | publish/ 148 | 149 | # Publish Web Output 150 | *.[Pp]ublish.xml 151 | *.azurePubxml 152 | # TODO: Comment the next line if you want to checkin your web deploy settings 153 | # but database connection strings (with potential passwords) will be unencrypted 154 | *.pubxml 155 | *.publishproj 156 | 157 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 158 | # checkin your Azure Web App publish settings, but sensitive information contained 159 | # in these scripts will be unencrypted 160 | PublishScripts/ 161 | 162 | # NuGet Packages 163 | *.nupkg 164 | # The packages folder can be ignored because of Package Restore 165 | **/packages/* 166 | # except build/, which is used as an MSBuild target. 167 | !**/packages/build/ 168 | # Uncomment if necessary however generally it will be regenerated when needed 169 | #!**/packages/repositories.config 170 | # NuGet v3's project.json files produces more ignoreable files 171 | *.nuget.props 172 | *.nuget.targets 173 | 174 | # Microsoft Azure Build Output 175 | csx/ 176 | *.build.csdef 177 | 178 | # Microsoft Azure Emulator 179 | ecf/ 180 | rcf/ 181 | 182 | # Windows Store app package directories and files 183 | AppPackages/ 184 | BundleArtifacts/ 185 | Package.StoreAssociation.xml 186 | _pkginfo.txt 187 | 188 | # Visual Studio cache files 189 | # files ending in .cache can be ignored 190 | *.[Cc]ache 191 | # but keep track of directories ending in .cache 192 | !*.[Cc]ache/ 193 | 194 | # Others 195 | ClientBin/ 196 | ~$* 197 | *~ 198 | *.dbmdl 199 | *.dbproj.schemaview 200 | *.jfm 201 | *.pfx 202 | *.publishsettings 203 | node_modules/ 204 | orleans.codegen.cs 205 | 206 | # Since there are multiple workflows, uncomment next line to ignore bower_components 207 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 208 | #bower_components/ 209 | 210 | # RIA/Silverlight projects 211 | Generated_Code/ 212 | 213 | # Backup & report files from converting an old project file 214 | # to a newer Visual Studio version. Backup files are not needed, 215 | # because we have git ;-) 216 | _UpgradeReport_Files/ 217 | Backup*/ 218 | UpgradeLog*.XML 219 | UpgradeLog*.htm 220 | 221 | # SQL Server files 222 | *.mdf 223 | *.ldf 224 | 225 | # Business Intelligence projects 226 | *.rdl.data 227 | *.bim.layout 228 | *.bim_*.settings 229 | 230 | # Microsoft Fakes 231 | FakesAssemblies/ 232 | 233 | # GhostDoc plugin setting file 234 | *.GhostDoc.xml 235 | 236 | # Node.js Tools for Visual Studio 237 | .ntvs_analysis.dat 238 | 239 | # Visual Studio 6 build log 240 | *.plg 241 | 242 | # Visual Studio 6 workspace options file 243 | *.opt 244 | 245 | # Visual Studio LightSwitch build output 246 | **/*.HTMLClient/GeneratedArtifacts 247 | **/*.DesktopClient/GeneratedArtifacts 248 | **/*.DesktopClient/ModelManifest.xml 249 | **/*.Server/GeneratedArtifacts 250 | **/*.Server/ModelManifest.xml 251 | _Pvt_Extensions 252 | 253 | # Paket dependency manager 254 | .paket/paket.exe 255 | paket-files/ 256 | 257 | # FAKE - F# Make 258 | .fake/ 259 | 260 | # JetBrains Rider 261 | .idea/ 262 | *.sln.iml 263 | 264 | # CodeRush 265 | .cr/ 266 | 267 | # Python Tools for Visual Studio (PTVS) 268 | __pycache__/ 269 | *.pyc 270 | 271 | # Cake - Uncomment if you are using it 272 | # tools/ 273 | 274 | ### Csharp ### 275 | ## 276 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 277 | 278 | # User-specific files 279 | *.rsuser 280 | 281 | # User-specific files (MonoDevelop/Xamarin Studio) 282 | 283 | # Mono auto generated files 284 | mono_crash.* 285 | 286 | # Build results 287 | [Aa][Rr][Mm]/ 288 | [Aa][Rr][Mm]64/ 289 | [Ll]ogs/ 290 | 291 | # Visual Studio 2015/2017 cache/options directory 292 | # Uncomment if you have tasks that create the project's static files in wwwroot 293 | 294 | # Visual Studio 2017 auto generated files 295 | Generated\ Files/ 296 | 297 | # MSTest test Results 298 | 299 | # NUnit 300 | nunit-*.xml 301 | 302 | # Build Results of an ATL Project 303 | 304 | # Benchmark Results 305 | BenchmarkDotNet.Artifacts/ 306 | 307 | # .NET Core 308 | 309 | # StyleCop 310 | StyleCopReport.xml 311 | 312 | # Files built by Visual Studio 313 | *_h.h 314 | *.iobj 315 | *.ipdb 316 | *_wpftmp.csproj 317 | 318 | # Chutzpah Test files 319 | 320 | # Visual C++ cache files 321 | 322 | # Visual Studio profiler 323 | 324 | # Visual Studio Trace Files 325 | *.e2e 326 | 327 | # TFS 2012 Local Workspace 328 | 329 | # Guidance Automation Toolkit 330 | 331 | # ReSharper is a .NET coding add-in 332 | 333 | # TeamCity is a build add-in 334 | 335 | # DotCover is a Code Coverage Tool 336 | 337 | # AxoCover is a Code Coverage Tool 338 | .axoCover/* 339 | !.axoCover/settings.json 340 | 341 | # Coverlet is a free, cross platform Code Coverage Tool 342 | coverage*[.json, .xml, .info] 343 | 344 | # Visual Studio code coverage results 345 | 346 | # NCrunch 347 | 348 | # MightyMoose 349 | 350 | # Web workbench (sass) 351 | 352 | # Installshield output folder 353 | 354 | # DocProject is a documentation generator add-in 355 | 356 | # Click-Once directory 357 | 358 | # Publish Web Output 359 | # Note: Comment the next line if you want to checkin your web deploy settings, 360 | # but database connection strings (with potential passwords) will be unencrypted 361 | 362 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 363 | # checkin your Azure Web App publish settings, but sensitive information contained 364 | # in these scripts will be unencrypted 365 | 366 | # NuGet Packages 367 | # NuGet Symbol Packages 368 | *.snupkg 369 | # The packages folder can be ignored because of Package Restore 370 | **/[Pp]ackages/* 371 | # except build/, which is used as an MSBuild target. 372 | !**/[Pp]ackages/build/ 373 | # Uncomment if necessary however generally it will be regenerated when needed 374 | #!**/[Pp]ackages/repositories.config 375 | # NuGet v3's project.json files produces more ignorable files 376 | 377 | # Microsoft Azure Build Output 378 | 379 | # Microsoft Azure Emulator 380 | 381 | # Windows Store app package directories and files 382 | *.appx 383 | *.appxbundle 384 | *.appxupload 385 | 386 | # Visual Studio cache files 387 | # files ending in .cache can be ignored 388 | # but keep track of directories ending in .cache 389 | !?*.[Cc]ache/ 390 | 391 | # Others 392 | 393 | # Including strong name files can present a security risk 394 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 395 | #*.snk 396 | 397 | # Since there are multiple workflows, uncomment next line to ignore bower_components 398 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 399 | 400 | # RIA/Silverlight projects 401 | 402 | # Backup & report files from converting an old project file 403 | # to a newer Visual Studio version. Backup files are not needed, 404 | # because we have git ;-) 405 | ServiceFabricBackup/ 406 | *.rptproj.bak 407 | 408 | # SQL Server files 409 | *.ndf 410 | 411 | # Business Intelligence projects 412 | *.rptproj.rsuser 413 | *- [Bb]ackup.rdl 414 | *- [Bb]ackup ([0-9]).rdl 415 | *- [Bb]ackup ([0-9][0-9]).rdl 416 | 417 | # Microsoft Fakes 418 | 419 | # GhostDoc plugin setting file 420 | 421 | # Node.js Tools for Visual Studio 422 | 423 | # Visual Studio 6 build log 424 | 425 | # Visual Studio 6 workspace options file 426 | 427 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 428 | *.vbw 429 | 430 | # Visual Studio LightSwitch build output 431 | 432 | # Paket dependency manager 433 | 434 | # FAKE - F# Make 435 | 436 | # CodeRush personal settings 437 | .cr/personal 438 | 439 | # Python Tools for Visual Studio (PTVS) 440 | 441 | # Cake - Uncomment if you are using it 442 | # tools/** 443 | # !tools/packages.config 444 | 445 | # Tabs Studio 446 | *.tss 447 | 448 | # Telerik's JustMock configuration file 449 | *.jmconfig 450 | 451 | # BizTalk build output 452 | *.btp.cs 453 | *.btm.cs 454 | *.odx.cs 455 | *.xsd.cs 456 | 457 | # OpenCover UI analysis results 458 | OpenCover/ 459 | 460 | # Azure Stream Analytics local run output 461 | ASALocalRun/ 462 | 463 | # MSBuild Binary and Structured Log 464 | *.binlog 465 | 466 | # NVidia Nsight GPU debugger configuration file 467 | *.nvuser 468 | 469 | # MFractors (Xamarin productivity tool) working folder 470 | .mfractor/ 471 | 472 | # Local History for Visual Studio 473 | .localhistory/ 474 | 475 | # BeatPulse healthcheck temp database 476 | healthchecksdb 477 | 478 | # Backup folder for Package Reference Convert tool in Visual Studio 2017 479 | MigrationBackup/ 480 | 481 | # Ionide (cross platform F# VS Code tools) working folder 482 | .ionide/ 483 | 484 | ### DotnetCore ### 485 | # .NET Core build folders 486 | bin/ 487 | obj/ 488 | 489 | # Common node modules locations 490 | /node_modules 491 | /wwwroot/node_modules 492 | 493 | ### macOS ### 494 | # General 495 | .DS_Store 496 | .AppleDouble 497 | .LSOverride 498 | 499 | # Icon must end with two \r 500 | Icon 501 | 502 | # Thumbnails 503 | ._* 504 | 505 | # Files that might appear in the root of a volume 506 | .DocumentRevisions-V100 507 | .fseventsd 508 | .Spotlight-V100 509 | .TemporaryItems 510 | .Trashes 511 | .VolumeIcon.icns 512 | .com.apple.timemachine.donotpresent 513 | 514 | # Directories potentially created on remote AFP share 515 | .AppleDB 516 | .AppleDesktop 517 | Network Trash Folder 518 | Temporary Items 519 | .apdisk 520 | 521 | ### VisualStudioCode ### 522 | .vscode/* 523 | !.vscode/settings.json 524 | !.vscode/tasks.json 525 | !.vscode/launch.json 526 | !.vscode/extensions.json 527 | *.code-workspace 528 | 529 | ### VisualStudioCode Patch ### 530 | # Ignore all local history of files 531 | .history 532 | .ionide 533 | 534 | ### vscode ### 535 | 536 | # End of https://www.toptal.com/developers/gitignore/api/aspnetcore,csharp,dotnetcore,visualstudiocode,vscode,macos 537 | -------------------------------------------------------------------------------- /utils/mountebank/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "utils", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "version": "1.0.0", 9 | "license": "ISC", 10 | "dependencies": { 11 | "mountebank": "^2.3.3", 12 | "node-fetch": "^2.6.1" 13 | } 14 | }, 15 | "node_modules/@tootallnate/once": { 16 | "version": "1.1.2", 17 | "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", 18 | "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", 19 | "engines": { 20 | "node": ">= 6" 21 | } 22 | }, 23 | "node_modules/accepts": { 24 | "version": "1.3.7", 25 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 26 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 27 | "dependencies": { 28 | "mime-types": "~2.1.24", 29 | "negotiator": "0.6.2" 30 | }, 31 | "engines": { 32 | "node": ">= 0.6" 33 | } 34 | }, 35 | "node_modules/agent-base": { 36 | "version": "6.0.2", 37 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 38 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 39 | "dependencies": { 40 | "debug": "4" 41 | }, 42 | "engines": { 43 | "node": ">= 6.0.0" 44 | } 45 | }, 46 | "node_modules/agent-base/node_modules/debug": { 47 | "version": "4.3.1", 48 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 49 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 50 | "dependencies": { 51 | "ms": "2.1.2" 52 | }, 53 | "engines": { 54 | "node": ">=6.0" 55 | }, 56 | "peerDependenciesMeta": { 57 | "supports-color": { 58 | "optional": true 59 | } 60 | } 61 | }, 62 | "node_modules/agent-base/node_modules/ms": { 63 | "version": "2.1.2", 64 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 65 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 66 | }, 67 | "node_modules/ansi-regex": { 68 | "version": "5.0.0", 69 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 70 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 71 | "engines": { 72 | "node": ">=8" 73 | } 74 | }, 75 | "node_modules/ansi-styles": { 76 | "version": "4.3.0", 77 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 78 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 79 | "dependencies": { 80 | "color-convert": "^2.0.1" 81 | }, 82 | "engines": { 83 | "node": ">=8" 84 | }, 85 | "funding": { 86 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 87 | } 88 | }, 89 | "node_modules/ansi-styles/node_modules/color-convert": { 90 | "version": "2.0.1", 91 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 92 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 93 | "dependencies": { 94 | "color-name": "~1.1.4" 95 | }, 96 | "engines": { 97 | "node": ">=7.0.0" 98 | } 99 | }, 100 | "node_modules/ansi-styles/node_modules/color-name": { 101 | "version": "1.1.4", 102 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 103 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 104 | }, 105 | "node_modules/array-flatten": { 106 | "version": "1.1.1", 107 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 108 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 109 | }, 110 | "node_modules/async": { 111 | "version": "2.6.3", 112 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", 113 | "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", 114 | "dependencies": { 115 | "lodash": "^4.17.14" 116 | } 117 | }, 118 | "node_modules/base32.js": { 119 | "version": "0.1.0", 120 | "resolved": "https://registry.npmjs.org/base32.js/-/base32.js-0.1.0.tgz", 121 | "integrity": "sha1-tYLexpPC8R6JPPBk7mrFthMaIgI=", 122 | "engines": { 123 | "node": ">=0.12.0" 124 | } 125 | }, 126 | "node_modules/body-parser": { 127 | "version": "1.19.0", 128 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 129 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 130 | "dependencies": { 131 | "bytes": "3.1.0", 132 | "content-type": "~1.0.4", 133 | "debug": "2.6.9", 134 | "depd": "~1.1.2", 135 | "http-errors": "1.7.2", 136 | "iconv-lite": "0.4.24", 137 | "on-finished": "~2.3.0", 138 | "qs": "6.7.0", 139 | "raw-body": "2.4.0", 140 | "type-is": "~1.6.17" 141 | }, 142 | "engines": { 143 | "node": ">= 0.8" 144 | } 145 | }, 146 | "node_modules/bytes": { 147 | "version": "3.1.0", 148 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 149 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", 150 | "engines": { 151 | "node": ">= 0.8" 152 | } 153 | }, 154 | "node_modules/camelcase": { 155 | "version": "5.3.1", 156 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 157 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 158 | "engines": { 159 | "node": ">=6" 160 | } 161 | }, 162 | "node_modules/cliui": { 163 | "version": "6.0.0", 164 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", 165 | "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", 166 | "dependencies": { 167 | "string-width": "^4.2.0", 168 | "strip-ansi": "^6.0.0", 169 | "wrap-ansi": "^6.2.0" 170 | } 171 | }, 172 | "node_modules/color": { 173 | "version": "3.0.0", 174 | "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", 175 | "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", 176 | "dependencies": { 177 | "color-convert": "^1.9.1", 178 | "color-string": "^1.5.2" 179 | } 180 | }, 181 | "node_modules/color-convert": { 182 | "version": "1.9.3", 183 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 184 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 185 | "dependencies": { 186 | "color-name": "1.1.3" 187 | } 188 | }, 189 | "node_modules/color-name": { 190 | "version": "1.1.3", 191 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 192 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 193 | }, 194 | "node_modules/color-string": { 195 | "version": "1.5.4", 196 | "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz", 197 | "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==", 198 | "dependencies": { 199 | "color-name": "^1.0.0", 200 | "simple-swizzle": "^0.2.2" 201 | } 202 | }, 203 | "node_modules/colornames": { 204 | "version": "1.1.1", 205 | "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz", 206 | "integrity": "sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y=" 207 | }, 208 | "node_modules/colors": { 209 | "version": "1.4.0", 210 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", 211 | "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", 212 | "engines": { 213 | "node": ">=0.1.90" 214 | } 215 | }, 216 | "node_modules/colorspace": { 217 | "version": "1.1.2", 218 | "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", 219 | "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", 220 | "dependencies": { 221 | "color": "3.0.x", 222 | "text-hex": "1.0.x" 223 | } 224 | }, 225 | "node_modules/content-disposition": { 226 | "version": "0.5.3", 227 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 228 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 229 | "dependencies": { 230 | "safe-buffer": "5.1.2" 231 | }, 232 | "engines": { 233 | "node": ">= 0.6" 234 | } 235 | }, 236 | "node_modules/content-type": { 237 | "version": "1.0.4", 238 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 239 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", 240 | "engines": { 241 | "node": ">= 0.6" 242 | } 243 | }, 244 | "node_modules/cookie": { 245 | "version": "0.4.0", 246 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 247 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", 248 | "engines": { 249 | "node": ">= 0.6" 250 | } 251 | }, 252 | "node_modules/cookie-signature": { 253 | "version": "1.0.6", 254 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 255 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 256 | }, 257 | "node_modules/core-util-is": { 258 | "version": "1.0.2", 259 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 260 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 261 | }, 262 | "node_modules/cors": { 263 | "version": "2.8.5", 264 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 265 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 266 | "dependencies": { 267 | "object-assign": "^4", 268 | "vary": "^1" 269 | }, 270 | "engines": { 271 | "node": ">= 0.10" 272 | } 273 | }, 274 | "node_modules/csv-parse": { 275 | "version": "4.9.0", 276 | "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-4.9.0.tgz", 277 | "integrity": "sha512-SaFMvRWzobY9z0Nxg+q5pXvU2JY7p++icb1Bb/ZwGSLv058cLabhGg3YNpLPI2KALtZnoe/oNBCfWX9xgTkcaA==" 278 | }, 279 | "node_modules/debug": { 280 | "version": "2.6.9", 281 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 282 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 283 | "dependencies": { 284 | "ms": "2.0.0" 285 | } 286 | }, 287 | "node_modules/decamelize": { 288 | "version": "1.2.0", 289 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 290 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 291 | "engines": { 292 | "node": ">=0.10.0" 293 | } 294 | }, 295 | "node_modules/decode-uri-component": { 296 | "version": "0.2.0", 297 | "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", 298 | "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", 299 | "engines": { 300 | "node": ">=0.10" 301 | } 302 | }, 303 | "node_modules/depd": { 304 | "version": "1.1.2", 305 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 306 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", 307 | "engines": { 308 | "node": ">= 0.6" 309 | } 310 | }, 311 | "node_modules/destroy": { 312 | "version": "1.0.4", 313 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 314 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 315 | }, 316 | "node_modules/diagnostics": { 317 | "version": "1.1.1", 318 | "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", 319 | "integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==", 320 | "dependencies": { 321 | "colorspace": "1.1.x", 322 | "enabled": "1.0.x", 323 | "kuler": "1.0.x" 324 | } 325 | }, 326 | "node_modules/dom-serializer": { 327 | "version": "0.2.2", 328 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", 329 | "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", 330 | "dependencies": { 331 | "domelementtype": "^2.0.1", 332 | "entities": "^2.0.0" 333 | } 334 | }, 335 | "node_modules/dom-serializer/node_modules/domelementtype": { 336 | "version": "2.0.2", 337 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.2.tgz", 338 | "integrity": "sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==", 339 | "funding": [ 340 | { 341 | "type": "github", 342 | "url": "https://github.com/sponsors/fb55" 343 | } 344 | ] 345 | }, 346 | "node_modules/dom-serializer/node_modules/entities": { 347 | "version": "2.1.0", 348 | "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", 349 | "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", 350 | "funding": { 351 | "url": "https://github.com/fb55/entities?sponsor=1" 352 | } 353 | }, 354 | "node_modules/domelementtype": { 355 | "version": "1.3.1", 356 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", 357 | "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" 358 | }, 359 | "node_modules/domhandler": { 360 | "version": "2.4.2", 361 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", 362 | "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", 363 | "dependencies": { 364 | "domelementtype": "1" 365 | } 366 | }, 367 | "node_modules/domutils": { 368 | "version": "1.7.0", 369 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", 370 | "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", 371 | "dependencies": { 372 | "dom-serializer": "0", 373 | "domelementtype": "1" 374 | } 375 | }, 376 | "node_modules/ee-first": { 377 | "version": "1.1.1", 378 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 379 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 380 | }, 381 | "node_modules/ejs": { 382 | "version": "2.7.4", 383 | "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", 384 | "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", 385 | "hasInstallScript": true, 386 | "engines": { 387 | "node": ">=0.10.0" 388 | } 389 | }, 390 | "node_modules/emoji-regex": { 391 | "version": "8.0.0", 392 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 393 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 394 | }, 395 | "node_modules/enabled": { 396 | "version": "1.0.2", 397 | "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", 398 | "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", 399 | "dependencies": { 400 | "env-variable": "0.0.x" 401 | } 402 | }, 403 | "node_modules/encodeurl": { 404 | "version": "1.0.2", 405 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 406 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", 407 | "engines": { 408 | "node": ">= 0.8" 409 | } 410 | }, 411 | "node_modules/encoding-japanese": { 412 | "version": "1.0.30", 413 | "resolved": "https://registry.npmjs.org/encoding-japanese/-/encoding-japanese-1.0.30.tgz", 414 | "integrity": "sha512-bd/DFLAoJetvv7ar/KIpE3CNO8wEuyrt9Xuw6nSMiZ+Vrz/Q21BPsMHvARL2Wz6IKHKXgb+DWZqtRg1vql9cBg==" 415 | }, 416 | "node_modules/entities": { 417 | "version": "1.1.2", 418 | "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", 419 | "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" 420 | }, 421 | "node_modules/env-variable": { 422 | "version": "0.0.6", 423 | "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.6.tgz", 424 | "integrity": "sha512-bHz59NlBbtS0NhftmR8+ExBEekE7br0e01jw+kk0NDro7TtZzBYZ5ScGPs3OmwnpyfHTHOtr1Y6uedCdrIldtg==" 425 | }, 426 | "node_modules/errorhandler": { 427 | "version": "1.5.1", 428 | "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", 429 | "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==", 430 | "dependencies": { 431 | "accepts": "~1.3.7", 432 | "escape-html": "~1.0.3" 433 | }, 434 | "engines": { 435 | "node": ">= 0.8" 436 | } 437 | }, 438 | "node_modules/escape-html": { 439 | "version": "1.0.3", 440 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 441 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 442 | }, 443 | "node_modules/etag": { 444 | "version": "1.8.1", 445 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 446 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", 447 | "engines": { 448 | "node": ">= 0.6" 449 | } 450 | }, 451 | "node_modules/express": { 452 | "version": "4.17.1", 453 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 454 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 455 | "dependencies": { 456 | "accepts": "~1.3.7", 457 | "array-flatten": "1.1.1", 458 | "body-parser": "1.19.0", 459 | "content-disposition": "0.5.3", 460 | "content-type": "~1.0.4", 461 | "cookie": "0.4.0", 462 | "cookie-signature": "1.0.6", 463 | "debug": "2.6.9", 464 | "depd": "~1.1.2", 465 | "encodeurl": "~1.0.2", 466 | "escape-html": "~1.0.3", 467 | "etag": "~1.8.1", 468 | "finalhandler": "~1.1.2", 469 | "fresh": "0.5.2", 470 | "merge-descriptors": "1.0.1", 471 | "methods": "~1.1.2", 472 | "on-finished": "~2.3.0", 473 | "parseurl": "~1.3.3", 474 | "path-to-regexp": "0.1.7", 475 | "proxy-addr": "~2.0.5", 476 | "qs": "6.7.0", 477 | "range-parser": "~1.2.1", 478 | "safe-buffer": "5.1.2", 479 | "send": "0.17.1", 480 | "serve-static": "1.14.1", 481 | "setprototypeof": "1.1.1", 482 | "statuses": "~1.5.0", 483 | "type-is": "~1.6.18", 484 | "utils-merge": "1.0.1", 485 | "vary": "~1.1.2" 486 | }, 487 | "engines": { 488 | "node": ">= 0.10.0" 489 | } 490 | }, 491 | "node_modules/fast-safe-stringify": { 492 | "version": "2.0.7", 493 | "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", 494 | "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" 495 | }, 496 | "node_modules/fecha": { 497 | "version": "4.2.0", 498 | "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.0.tgz", 499 | "integrity": "sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg==" 500 | }, 501 | "node_modules/finalhandler": { 502 | "version": "1.1.2", 503 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 504 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 505 | "dependencies": { 506 | "debug": "2.6.9", 507 | "encodeurl": "~1.0.2", 508 | "escape-html": "~1.0.3", 509 | "on-finished": "~2.3.0", 510 | "parseurl": "~1.3.3", 511 | "statuses": "~1.5.0", 512 | "unpipe": "~1.0.0" 513 | }, 514 | "engines": { 515 | "node": ">= 0.8" 516 | } 517 | }, 518 | "node_modules/find-up": { 519 | "version": "4.1.0", 520 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 521 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 522 | "dependencies": { 523 | "locate-path": "^5.0.0", 524 | "path-exists": "^4.0.0" 525 | }, 526 | "engines": { 527 | "node": ">=8" 528 | } 529 | }, 530 | "node_modules/forwarded": { 531 | "version": "0.1.2", 532 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 533 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", 534 | "engines": { 535 | "node": ">= 0.6" 536 | } 537 | }, 538 | "node_modules/fresh": { 539 | "version": "0.5.2", 540 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 541 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", 542 | "engines": { 543 | "node": ">= 0.6" 544 | } 545 | }, 546 | "node_modules/fs-extra": { 547 | "version": "8.1.0", 548 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", 549 | "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", 550 | "dependencies": { 551 | "graceful-fs": "^4.2.0", 552 | "jsonfile": "^4.0.0", 553 | "universalify": "^0.1.0" 554 | }, 555 | "engines": { 556 | "node": ">=6 <7 || >=8" 557 | } 558 | }, 559 | "node_modules/get-caller-file": { 560 | "version": "2.0.5", 561 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 562 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 563 | "engines": { 564 | "node": "6.* || 8.* || >= 10.*" 565 | } 566 | }, 567 | "node_modules/graceful-fs": { 568 | "version": "4.2.4", 569 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", 570 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" 571 | }, 572 | "node_modules/he": { 573 | "version": "1.2.0", 574 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 575 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 576 | "bin": { 577 | "he": "bin/he" 578 | } 579 | }, 580 | "node_modules/html-to-text": { 581 | "version": "5.1.1", 582 | "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-5.1.1.tgz", 583 | "integrity": "sha512-Bci6bD/JIfZSvG4s0gW/9mMKwBRoe/1RWLxUME/d6WUSZCdY7T60bssf/jFf7EYXRyqU4P5xdClVqiYU0/ypdA==", 584 | "dependencies": { 585 | "he": "^1.2.0", 586 | "htmlparser2": "^3.10.1", 587 | "lodash": "^4.17.11", 588 | "minimist": "^1.2.0" 589 | }, 590 | "bin": { 591 | "html-to-text": "bin/cli.js" 592 | }, 593 | "engines": { 594 | "node": ">= 4.0.0" 595 | } 596 | }, 597 | "node_modules/htmlparser2": { 598 | "version": "3.10.1", 599 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", 600 | "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", 601 | "dependencies": { 602 | "domelementtype": "^1.3.1", 603 | "domhandler": "^2.3.0", 604 | "domutils": "^1.5.1", 605 | "entities": "^1.1.1", 606 | "inherits": "^2.0.1", 607 | "readable-stream": "^3.1.1" 608 | } 609 | }, 610 | "node_modules/http-errors": { 611 | "version": "1.7.2", 612 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 613 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 614 | "dependencies": { 615 | "depd": "~1.1.2", 616 | "inherits": "2.0.3", 617 | "setprototypeof": "1.1.1", 618 | "statuses": ">= 1.5.0 < 2", 619 | "toidentifier": "1.0.0" 620 | }, 621 | "engines": { 622 | "node": ">= 0.6" 623 | } 624 | }, 625 | "node_modules/http-proxy-agent": { 626 | "version": "4.0.1", 627 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", 628 | "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", 629 | "dependencies": { 630 | "@tootallnate/once": "1", 631 | "agent-base": "6", 632 | "debug": "4" 633 | }, 634 | "engines": { 635 | "node": ">= 6" 636 | } 637 | }, 638 | "node_modules/http-proxy-agent/node_modules/debug": { 639 | "version": "4.3.1", 640 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 641 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 642 | "dependencies": { 643 | "ms": "2.1.2" 644 | }, 645 | "engines": { 646 | "node": ">=6.0" 647 | }, 648 | "peerDependenciesMeta": { 649 | "supports-color": { 650 | "optional": true 651 | } 652 | } 653 | }, 654 | "node_modules/http-proxy-agent/node_modules/ms": { 655 | "version": "2.1.2", 656 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 657 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 658 | }, 659 | "node_modules/https-proxy-agent": { 660 | "version": "5.0.0", 661 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", 662 | "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", 663 | "dependencies": { 664 | "agent-base": "6", 665 | "debug": "4" 666 | }, 667 | "engines": { 668 | "node": ">= 6" 669 | } 670 | }, 671 | "node_modules/https-proxy-agent/node_modules/debug": { 672 | "version": "4.3.1", 673 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 674 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 675 | "dependencies": { 676 | "ms": "2.1.2" 677 | }, 678 | "engines": { 679 | "node": ">=6.0" 680 | }, 681 | "peerDependenciesMeta": { 682 | "supports-color": { 683 | "optional": true 684 | } 685 | } 686 | }, 687 | "node_modules/https-proxy-agent/node_modules/ms": { 688 | "version": "2.1.2", 689 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 690 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 691 | }, 692 | "node_modules/iconv-lite": { 693 | "version": "0.4.24", 694 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 695 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 696 | "dependencies": { 697 | "safer-buffer": ">= 2.1.2 < 3" 698 | }, 699 | "engines": { 700 | "node": ">=0.10.0" 701 | } 702 | }, 703 | "node_modules/inherits": { 704 | "version": "2.0.3", 705 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 706 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 707 | }, 708 | "node_modules/ipaddr.js": { 709 | "version": "1.9.1", 710 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 711 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 712 | "engines": { 713 | "node": ">= 0.10" 714 | } 715 | }, 716 | "node_modules/ipv6-normalize": { 717 | "version": "1.0.1", 718 | "resolved": "https://registry.npmjs.org/ipv6-normalize/-/ipv6-normalize-1.0.1.tgz", 719 | "integrity": "sha1-GzJYKQ02X6gyOeiZB93kWS52IKg=" 720 | }, 721 | "node_modules/is-arrayish": { 722 | "version": "0.3.2", 723 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", 724 | "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" 725 | }, 726 | "node_modules/is-fullwidth-code-point": { 727 | "version": "3.0.0", 728 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 729 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 730 | "engines": { 731 | "node": ">=8" 732 | } 733 | }, 734 | "node_modules/is-stream": { 735 | "version": "1.1.0", 736 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 737 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", 738 | "engines": { 739 | "node": ">=0.10.0" 740 | } 741 | }, 742 | "node_modules/isarray": { 743 | "version": "1.0.0", 744 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 745 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 746 | }, 747 | "node_modules/json-stable-stringify": { 748 | "version": "1.0.1", 749 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", 750 | "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", 751 | "dependencies": { 752 | "jsonify": "~0.0.0" 753 | } 754 | }, 755 | "node_modules/jsonfile": { 756 | "version": "4.0.0", 757 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 758 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 759 | "dependencies": { 760 | "graceful-fs": "^4.1.6" 761 | }, 762 | "optionalDependencies": { 763 | "graceful-fs": "^4.1.6" 764 | } 765 | }, 766 | "node_modules/jsonify": { 767 | "version": "0.0.0", 768 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 769 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", 770 | "engines": { 771 | "node": "*" 772 | } 773 | }, 774 | "node_modules/jsonpath-plus": { 775 | "version": "4.0.0", 776 | "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-4.0.0.tgz", 777 | "integrity": "sha512-e0Jtg4KAzDJKKwzbLaUtinCn0RZseWBVRTRGihSpvFlM3wTR7ExSp+PTdeTsDrLNJUe7L7JYJe8mblHX5SCT6A==", 778 | "engines": { 779 | "node": ">=10.0" 780 | } 781 | }, 782 | "node_modules/kuler": { 783 | "version": "1.0.1", 784 | "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz", 785 | "integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==", 786 | "dependencies": { 787 | "colornames": "^1.1.1" 788 | } 789 | }, 790 | "node_modules/libbase64": { 791 | "version": "1.2.1", 792 | "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-1.2.1.tgz", 793 | "integrity": "sha512-l+nePcPbIG1fNlqMzrh68MLkX/gTxk/+vdvAb388Ssi7UuUN31MI44w4Yf33mM3Cm4xDfw48mdf3rkdHszLNew==" 794 | }, 795 | "node_modules/libmime": { 796 | "version": "5.0.0", 797 | "resolved": "https://registry.npmjs.org/libmime/-/libmime-5.0.0.tgz", 798 | "integrity": "sha512-2Bm96d5ktnE217Ib1FldvUaPAaOst6GtZrsxJCwnJgi9lnsoAKIHyU0sae8rNx6DNYbjdqqh8lv5/b9poD8qOg==", 799 | "dependencies": { 800 | "encoding-japanese": "1.0.30", 801 | "iconv-lite": "0.6.2", 802 | "libbase64": "1.2.1", 803 | "libqp": "1.1.0" 804 | } 805 | }, 806 | "node_modules/libmime/node_modules/iconv-lite": { 807 | "version": "0.6.2", 808 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", 809 | "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", 810 | "dependencies": { 811 | "safer-buffer": ">= 2.1.2 < 3.0.0" 812 | }, 813 | "engines": { 814 | "node": ">=0.10.0" 815 | } 816 | }, 817 | "node_modules/libqp": { 818 | "version": "1.1.0", 819 | "resolved": "https://registry.npmjs.org/libqp/-/libqp-1.1.0.tgz", 820 | "integrity": "sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g=" 821 | }, 822 | "node_modules/linkify-it": { 823 | "version": "3.0.2", 824 | "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.2.tgz", 825 | "integrity": "sha512-gDBO4aHNZS6coiZCKVhSNh43F9ioIL4JwRjLZPkoLIY4yZFwg264Y5lu2x6rb1Js42Gh6Yqm2f6L2AJcnkzinQ==", 826 | "dependencies": { 827 | "uc.micro": "^1.0.1" 828 | } 829 | }, 830 | "node_modules/locate-path": { 831 | "version": "5.0.0", 832 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 833 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 834 | "dependencies": { 835 | "p-locate": "^4.1.0" 836 | }, 837 | "engines": { 838 | "node": ">=8" 839 | } 840 | }, 841 | "node_modules/lodash": { 842 | "version": "4.17.20", 843 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", 844 | "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" 845 | }, 846 | "node_modules/logform": { 847 | "version": "2.2.0", 848 | "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", 849 | "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==", 850 | "dependencies": { 851 | "colors": "^1.2.1", 852 | "fast-safe-stringify": "^2.0.4", 853 | "fecha": "^4.2.0", 854 | "ms": "^2.1.1", 855 | "triple-beam": "^1.3.0" 856 | } 857 | }, 858 | "node_modules/logform/node_modules/ms": { 859 | "version": "2.1.2", 860 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 861 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 862 | }, 863 | "node_modules/mailparser": { 864 | "version": "2.8.1", 865 | "resolved": "https://registry.npmjs.org/mailparser/-/mailparser-2.8.1.tgz", 866 | "integrity": "sha512-H/CYAO9dsw6SFNbEGGpZsejVSWDcFlyHjb1OkHUWg0wggUekva1tNc28trB155nSqM8rhtbwTKt//orX0AmJxQ==", 867 | "dependencies": { 868 | "encoding-japanese": "1.0.30", 869 | "he": "1.2.0", 870 | "html-to-text": "5.1.1", 871 | "iconv-lite": "0.6.2", 872 | "libmime": "5.0.0", 873 | "linkify-it": "3.0.2", 874 | "mailsplit": "5.0.0", 875 | "nodemailer": "6.4.11", 876 | "tlds": "1.208.0" 877 | } 878 | }, 879 | "node_modules/mailparser/node_modules/iconv-lite": { 880 | "version": "0.6.2", 881 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", 882 | "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", 883 | "dependencies": { 884 | "safer-buffer": ">= 2.1.2 < 3.0.0" 885 | }, 886 | "engines": { 887 | "node": ">=0.10.0" 888 | } 889 | }, 890 | "node_modules/mailparser/node_modules/nodemailer": { 891 | "version": "6.4.11", 892 | "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.4.11.tgz", 893 | "integrity": "sha512-BVZBDi+aJV4O38rxsUh164Dk1NCqgh6Cm0rQSb9SK/DHGll/DrCMnycVDD7msJgZCnmVa8ASo8EZzR7jsgTukQ==", 894 | "hasInstallScript": true, 895 | "engines": { 896 | "node": ">=6.0.0" 897 | } 898 | }, 899 | "node_modules/mailsplit": { 900 | "version": "5.0.0", 901 | "resolved": "https://registry.npmjs.org/mailsplit/-/mailsplit-5.0.0.tgz", 902 | "integrity": "sha512-HeXA0eyCKBtZqbr7uoeb3Nn2L7VV8Vm27x6/YBb0ZiNzRzLoNS2PqRgGYADwh0cBzLYtqddq40bSSirqLO2LGw==", 903 | "dependencies": { 904 | "libbase64": "1.2.1", 905 | "libmime": "4.2.1", 906 | "libqp": "1.1.0" 907 | } 908 | }, 909 | "node_modules/mailsplit/node_modules/iconv-lite": { 910 | "version": "0.5.0", 911 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.0.tgz", 912 | "integrity": "sha512-NnEhI9hIEKHOzJ4f697DMz9IQEXr/MMJ5w64vN2/4Ai+wRnvV7SBrL0KLoRlwaKVghOc7LQ5YkPLuX146b6Ydw==", 913 | "dependencies": { 914 | "safer-buffer": ">= 2.1.2 < 3" 915 | }, 916 | "engines": { 917 | "node": ">=0.10.0" 918 | } 919 | }, 920 | "node_modules/mailsplit/node_modules/libmime": { 921 | "version": "4.2.1", 922 | "resolved": "https://registry.npmjs.org/libmime/-/libmime-4.2.1.tgz", 923 | "integrity": "sha512-09y7zjSc5im1aNsq815zgo4/G3DnIzym3aDOHsGq4Ee5vrX4PdgQRybAsztz9Rv0NhO+J5C0llEUloa3sUmjmA==", 924 | "dependencies": { 925 | "encoding-japanese": "1.0.30", 926 | "iconv-lite": "0.5.0", 927 | "libbase64": "1.2.1", 928 | "libqp": "1.1.0" 929 | } 930 | }, 931 | "node_modules/media-typer": { 932 | "version": "0.3.0", 933 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 934 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", 935 | "engines": { 936 | "node": ">= 0.6" 937 | } 938 | }, 939 | "node_modules/merge-descriptors": { 940 | "version": "1.0.1", 941 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 942 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 943 | }, 944 | "node_modules/methods": { 945 | "version": "1.1.2", 946 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 947 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", 948 | "engines": { 949 | "node": ">= 0.6" 950 | } 951 | }, 952 | "node_modules/mime": { 953 | "version": "1.6.0", 954 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 955 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 956 | "bin": { 957 | "mime": "cli.js" 958 | }, 959 | "engines": { 960 | "node": ">=4" 961 | } 962 | }, 963 | "node_modules/mime-db": { 964 | "version": "1.44.0", 965 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 966 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", 967 | "engines": { 968 | "node": ">= 0.6" 969 | } 970 | }, 971 | "node_modules/mime-types": { 972 | "version": "2.1.27", 973 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", 974 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", 975 | "dependencies": { 976 | "mime-db": "1.44.0" 977 | }, 978 | "engines": { 979 | "node": ">= 0.6" 980 | } 981 | }, 982 | "node_modules/minimist": { 983 | "version": "1.2.5", 984 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 985 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 986 | }, 987 | "node_modules/mountebank": { 988 | "version": "2.3.3", 989 | "resolved": "https://registry.npmjs.org/mountebank/-/mountebank-2.3.3.tgz", 990 | "integrity": "sha512-j3Q6rYRpVUvm2sMv7srwD7NQthN2uh4IaJYiv+bi4BMybjkQLl91p2Vto9FR+U5B705rLYeA5Zcy08H2+lY0CA==", 991 | "dependencies": { 992 | "cors": "~2.8.5", 993 | "csv-parse": "4.9.0", 994 | "ejs": "^2.7.4", 995 | "errorhandler": "1.5.1", 996 | "escape-html": "^1.0.3", 997 | "express": "^4.17.1", 998 | "fs-extra": "8.1.0", 999 | "http-proxy-agent": "^4.0.1", 1000 | "https-proxy-agent": "^5.0.0", 1001 | "json-stable-stringify": "1.0.1", 1002 | "jsonpath-plus": "^4.0.0", 1003 | "mailparser": "^2.7.7", 1004 | "nodemailer": "^6.4.6", 1005 | "proper-lockfile": "^4.1.1", 1006 | "q": "1.5.1", 1007 | "query-string": "6.12.0", 1008 | "smtp-server": "^3.6.0", 1009 | "winston": "3.2.1", 1010 | "xmldom": "0.3.0", 1011 | "xpath": "0.0.27", 1012 | "yargs": "15.3.0" 1013 | }, 1014 | "bin": { 1015 | "mb": "bin/mb" 1016 | }, 1017 | "engines": { 1018 | "node": ">=10" 1019 | } 1020 | }, 1021 | "node_modules/ms": { 1022 | "version": "2.0.0", 1023 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1024 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1025 | }, 1026 | "node_modules/negotiator": { 1027 | "version": "0.6.2", 1028 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 1029 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", 1030 | "engines": { 1031 | "node": ">= 0.6" 1032 | } 1033 | }, 1034 | "node_modules/node-fetch": { 1035 | "version": "2.6.1", 1036 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 1037 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", 1038 | "engines": { 1039 | "node": "4.x || >=6.0.0" 1040 | } 1041 | }, 1042 | "node_modules/nodemailer": { 1043 | "version": "6.4.16", 1044 | "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.4.16.tgz", 1045 | "integrity": "sha512-68K0LgZ6hmZ7PVmwL78gzNdjpj5viqBdFqKrTtr9bZbJYj6BRj5W6WGkxXrEnUl3Co3CBXi3CZBUlpV/foGnOQ==", 1046 | "engines": { 1047 | "node": ">=6.0.0" 1048 | } 1049 | }, 1050 | "node_modules/object-assign": { 1051 | "version": "4.1.1", 1052 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1053 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1054 | "engines": { 1055 | "node": ">=0.10.0" 1056 | } 1057 | }, 1058 | "node_modules/on-finished": { 1059 | "version": "2.3.0", 1060 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 1061 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 1062 | "dependencies": { 1063 | "ee-first": "1.1.1" 1064 | }, 1065 | "engines": { 1066 | "node": ">= 0.8" 1067 | } 1068 | }, 1069 | "node_modules/one-time": { 1070 | "version": "0.0.4", 1071 | "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", 1072 | "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=" 1073 | }, 1074 | "node_modules/p-limit": { 1075 | "version": "2.3.0", 1076 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 1077 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 1078 | "dependencies": { 1079 | "p-try": "^2.0.0" 1080 | }, 1081 | "engines": { 1082 | "node": ">=6" 1083 | }, 1084 | "funding": { 1085 | "url": "https://github.com/sponsors/sindresorhus" 1086 | } 1087 | }, 1088 | "node_modules/p-locate": { 1089 | "version": "4.1.0", 1090 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 1091 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 1092 | "dependencies": { 1093 | "p-limit": "^2.2.0" 1094 | }, 1095 | "engines": { 1096 | "node": ">=8" 1097 | } 1098 | }, 1099 | "node_modules/p-try": { 1100 | "version": "2.2.0", 1101 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 1102 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 1103 | "engines": { 1104 | "node": ">=6" 1105 | } 1106 | }, 1107 | "node_modules/parseurl": { 1108 | "version": "1.3.3", 1109 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1110 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 1111 | "engines": { 1112 | "node": ">= 0.8" 1113 | } 1114 | }, 1115 | "node_modules/path-exists": { 1116 | "version": "4.0.0", 1117 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1118 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1119 | "engines": { 1120 | "node": ">=8" 1121 | } 1122 | }, 1123 | "node_modules/path-to-regexp": { 1124 | "version": "0.1.7", 1125 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1126 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 1127 | }, 1128 | "node_modules/process-nextick-args": { 1129 | "version": "2.0.1", 1130 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1131 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 1132 | }, 1133 | "node_modules/proper-lockfile": { 1134 | "version": "4.1.1", 1135 | "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.1.tgz", 1136 | "integrity": "sha512-1w6rxXodisVpn7QYvLk706mzprPTAPCYAqxMvctmPN3ekuRk/kuGkGc82pangZiAt4R3lwSuUzheTTn0/Yb7Zg==", 1137 | "dependencies": { 1138 | "graceful-fs": "^4.1.11", 1139 | "retry": "^0.12.0", 1140 | "signal-exit": "^3.0.2" 1141 | } 1142 | }, 1143 | "node_modules/proxy-addr": { 1144 | "version": "2.0.6", 1145 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", 1146 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", 1147 | "dependencies": { 1148 | "forwarded": "~0.1.2", 1149 | "ipaddr.js": "1.9.1" 1150 | }, 1151 | "engines": { 1152 | "node": ">= 0.10" 1153 | } 1154 | }, 1155 | "node_modules/q": { 1156 | "version": "1.5.1", 1157 | "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", 1158 | "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", 1159 | "engines": { 1160 | "node": ">=0.6.0", 1161 | "teleport": ">=0.2.0" 1162 | } 1163 | }, 1164 | "node_modules/qs": { 1165 | "version": "6.7.0", 1166 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 1167 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", 1168 | "engines": { 1169 | "node": ">=0.6" 1170 | } 1171 | }, 1172 | "node_modules/query-string": { 1173 | "version": "6.12.0", 1174 | "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.12.0.tgz", 1175 | "integrity": "sha512-aoiFW9ZU7jP8Itjqfpw80Qe7RoyCIhFrW522sdsp9LG92pat6CCG3d8qNZBaUi71FsEjIfLjx9Ky347FtVoqXA==", 1176 | "dependencies": { 1177 | "decode-uri-component": "^0.2.0", 1178 | "split-on-first": "^1.0.0", 1179 | "strict-uri-encode": "^2.0.0" 1180 | }, 1181 | "engines": { 1182 | "node": ">=6" 1183 | }, 1184 | "funding": { 1185 | "url": "https://github.com/sponsors/sindresorhus" 1186 | } 1187 | }, 1188 | "node_modules/range-parser": { 1189 | "version": "1.2.1", 1190 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1191 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 1192 | "engines": { 1193 | "node": ">= 0.6" 1194 | } 1195 | }, 1196 | "node_modules/raw-body": { 1197 | "version": "2.4.0", 1198 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 1199 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 1200 | "dependencies": { 1201 | "bytes": "3.1.0", 1202 | "http-errors": "1.7.2", 1203 | "iconv-lite": "0.4.24", 1204 | "unpipe": "1.0.0" 1205 | }, 1206 | "engines": { 1207 | "node": ">= 0.8" 1208 | } 1209 | }, 1210 | "node_modules/readable-stream": { 1211 | "version": "3.6.0", 1212 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1213 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1214 | "dependencies": { 1215 | "inherits": "^2.0.3", 1216 | "string_decoder": "^1.1.1", 1217 | "util-deprecate": "^1.0.1" 1218 | }, 1219 | "engines": { 1220 | "node": ">= 6" 1221 | } 1222 | }, 1223 | "node_modules/require-directory": { 1224 | "version": "2.1.1", 1225 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1226 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 1227 | "engines": { 1228 | "node": ">=0.10.0" 1229 | } 1230 | }, 1231 | "node_modules/require-main-filename": { 1232 | "version": "2.0.0", 1233 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 1234 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" 1235 | }, 1236 | "node_modules/retry": { 1237 | "version": "0.12.0", 1238 | "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", 1239 | "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", 1240 | "engines": { 1241 | "node": ">= 4" 1242 | } 1243 | }, 1244 | "node_modules/safe-buffer": { 1245 | "version": "5.1.2", 1246 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1247 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1248 | }, 1249 | "node_modules/safer-buffer": { 1250 | "version": "2.1.2", 1251 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1252 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1253 | }, 1254 | "node_modules/send": { 1255 | "version": "0.17.1", 1256 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 1257 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 1258 | "dependencies": { 1259 | "debug": "2.6.9", 1260 | "depd": "~1.1.2", 1261 | "destroy": "~1.0.4", 1262 | "encodeurl": "~1.0.2", 1263 | "escape-html": "~1.0.3", 1264 | "etag": "~1.8.1", 1265 | "fresh": "0.5.2", 1266 | "http-errors": "~1.7.2", 1267 | "mime": "1.6.0", 1268 | "ms": "2.1.1", 1269 | "on-finished": "~2.3.0", 1270 | "range-parser": "~1.2.1", 1271 | "statuses": "~1.5.0" 1272 | }, 1273 | "engines": { 1274 | "node": ">= 0.8.0" 1275 | } 1276 | }, 1277 | "node_modules/send/node_modules/ms": { 1278 | "version": "2.1.1", 1279 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 1280 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 1281 | }, 1282 | "node_modules/serve-static": { 1283 | "version": "1.14.1", 1284 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 1285 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 1286 | "dependencies": { 1287 | "encodeurl": "~1.0.2", 1288 | "escape-html": "~1.0.3", 1289 | "parseurl": "~1.3.3", 1290 | "send": "0.17.1" 1291 | }, 1292 | "engines": { 1293 | "node": ">= 0.8.0" 1294 | } 1295 | }, 1296 | "node_modules/set-blocking": { 1297 | "version": "2.0.0", 1298 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1299 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 1300 | }, 1301 | "node_modules/setprototypeof": { 1302 | "version": "1.1.1", 1303 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 1304 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 1305 | }, 1306 | "node_modules/signal-exit": { 1307 | "version": "3.0.3", 1308 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 1309 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" 1310 | }, 1311 | "node_modules/simple-swizzle": { 1312 | "version": "0.2.2", 1313 | "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", 1314 | "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", 1315 | "dependencies": { 1316 | "is-arrayish": "^0.3.1" 1317 | } 1318 | }, 1319 | "node_modules/smtp-server": { 1320 | "version": "3.8.0", 1321 | "resolved": "https://registry.npmjs.org/smtp-server/-/smtp-server-3.8.0.tgz", 1322 | "integrity": "sha512-MuHxJj6vyInpFZTt0J8kkPHEw+VrJTYLcadu5N/8xmU0AowPdZonTptRQvYxC1MGQ5FlC1YtbtMXeeY+TV5aNg==", 1323 | "dependencies": { 1324 | "base32.js": "0.1.0", 1325 | "ipv6-normalize": "1.0.1", 1326 | "nodemailer": "6.4.16" 1327 | }, 1328 | "engines": { 1329 | "node": ">=6.0.0" 1330 | } 1331 | }, 1332 | "node_modules/split-on-first": { 1333 | "version": "1.1.0", 1334 | "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", 1335 | "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", 1336 | "engines": { 1337 | "node": ">=6" 1338 | } 1339 | }, 1340 | "node_modules/stack-trace": { 1341 | "version": "0.0.10", 1342 | "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", 1343 | "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", 1344 | "engines": { 1345 | "node": "*" 1346 | } 1347 | }, 1348 | "node_modules/statuses": { 1349 | "version": "1.5.0", 1350 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1351 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", 1352 | "engines": { 1353 | "node": ">= 0.6" 1354 | } 1355 | }, 1356 | "node_modules/strict-uri-encode": { 1357 | "version": "2.0.0", 1358 | "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", 1359 | "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=", 1360 | "engines": { 1361 | "node": ">=4" 1362 | } 1363 | }, 1364 | "node_modules/string_decoder": { 1365 | "version": "1.3.0", 1366 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1367 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1368 | "dependencies": { 1369 | "safe-buffer": "~5.2.0" 1370 | } 1371 | }, 1372 | "node_modules/string_decoder/node_modules/safe-buffer": { 1373 | "version": "5.2.1", 1374 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1375 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1376 | "funding": [ 1377 | { 1378 | "type": "github", 1379 | "url": "https://github.com/sponsors/feross" 1380 | }, 1381 | { 1382 | "type": "patreon", 1383 | "url": "https://www.patreon.com/feross" 1384 | }, 1385 | { 1386 | "type": "consulting", 1387 | "url": "https://feross.org/support" 1388 | } 1389 | ] 1390 | }, 1391 | "node_modules/string-width": { 1392 | "version": "4.2.0", 1393 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", 1394 | "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", 1395 | "dependencies": { 1396 | "emoji-regex": "^8.0.0", 1397 | "is-fullwidth-code-point": "^3.0.0", 1398 | "strip-ansi": "^6.0.0" 1399 | }, 1400 | "engines": { 1401 | "node": ">=8" 1402 | } 1403 | }, 1404 | "node_modules/strip-ansi": { 1405 | "version": "6.0.0", 1406 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 1407 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 1408 | "dependencies": { 1409 | "ansi-regex": "^5.0.0" 1410 | }, 1411 | "engines": { 1412 | "node": ">=8" 1413 | } 1414 | }, 1415 | "node_modules/text-hex": { 1416 | "version": "1.0.0", 1417 | "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", 1418 | "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" 1419 | }, 1420 | "node_modules/tlds": { 1421 | "version": "1.208.0", 1422 | "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.208.0.tgz", 1423 | "integrity": "sha512-6kbY7GJpRQXwBddSOAbVUZXjObbCGFXliWWN+kOSEoRWIOyRWLB6zdeKC/Tguwwenl/KsUx016XR50EdHYsxZw==", 1424 | "bin": { 1425 | "tlds": "bin.js" 1426 | } 1427 | }, 1428 | "node_modules/toidentifier": { 1429 | "version": "1.0.0", 1430 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 1431 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", 1432 | "engines": { 1433 | "node": ">=0.6" 1434 | } 1435 | }, 1436 | "node_modules/triple-beam": { 1437 | "version": "1.3.0", 1438 | "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", 1439 | "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" 1440 | }, 1441 | "node_modules/type-is": { 1442 | "version": "1.6.18", 1443 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1444 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1445 | "dependencies": { 1446 | "media-typer": "0.3.0", 1447 | "mime-types": "~2.1.24" 1448 | }, 1449 | "engines": { 1450 | "node": ">= 0.6" 1451 | } 1452 | }, 1453 | "node_modules/uc.micro": { 1454 | "version": "1.0.6", 1455 | "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", 1456 | "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" 1457 | }, 1458 | "node_modules/universalify": { 1459 | "version": "0.1.2", 1460 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 1461 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", 1462 | "engines": { 1463 | "node": ">= 4.0.0" 1464 | } 1465 | }, 1466 | "node_modules/unpipe": { 1467 | "version": "1.0.0", 1468 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1469 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", 1470 | "engines": { 1471 | "node": ">= 0.8" 1472 | } 1473 | }, 1474 | "node_modules/util-deprecate": { 1475 | "version": "1.0.2", 1476 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1477 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1478 | }, 1479 | "node_modules/utils-merge": { 1480 | "version": "1.0.1", 1481 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1482 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", 1483 | "engines": { 1484 | "node": ">= 0.4.0" 1485 | } 1486 | }, 1487 | "node_modules/vary": { 1488 | "version": "1.1.2", 1489 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1490 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", 1491 | "engines": { 1492 | "node": ">= 0.8" 1493 | } 1494 | }, 1495 | "node_modules/which-module": { 1496 | "version": "2.0.0", 1497 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 1498 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" 1499 | }, 1500 | "node_modules/winston": { 1501 | "version": "3.2.1", 1502 | "resolved": "https://registry.npmjs.org/winston/-/winston-3.2.1.tgz", 1503 | "integrity": "sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw==", 1504 | "dependencies": { 1505 | "async": "^2.6.1", 1506 | "diagnostics": "^1.1.1", 1507 | "is-stream": "^1.1.0", 1508 | "logform": "^2.1.1", 1509 | "one-time": "0.0.4", 1510 | "readable-stream": "^3.1.1", 1511 | "stack-trace": "0.0.x", 1512 | "triple-beam": "^1.3.0", 1513 | "winston-transport": "^4.3.0" 1514 | }, 1515 | "engines": { 1516 | "node": ">= 6.4.0" 1517 | } 1518 | }, 1519 | "node_modules/winston-transport": { 1520 | "version": "4.4.0", 1521 | "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", 1522 | "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", 1523 | "dependencies": { 1524 | "readable-stream": "^2.3.7", 1525 | "triple-beam": "^1.2.0" 1526 | }, 1527 | "engines": { 1528 | "node": ">= 6.4.0" 1529 | } 1530 | }, 1531 | "node_modules/winston-transport/node_modules/readable-stream": { 1532 | "version": "2.3.7", 1533 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1534 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1535 | "dependencies": { 1536 | "core-util-is": "~1.0.0", 1537 | "inherits": "~2.0.3", 1538 | "isarray": "~1.0.0", 1539 | "process-nextick-args": "~2.0.0", 1540 | "safe-buffer": "~5.1.1", 1541 | "string_decoder": "~1.1.1", 1542 | "util-deprecate": "~1.0.1" 1543 | } 1544 | }, 1545 | "node_modules/winston-transport/node_modules/string_decoder": { 1546 | "version": "1.1.1", 1547 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1548 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1549 | "dependencies": { 1550 | "safe-buffer": "~5.1.0" 1551 | } 1552 | }, 1553 | "node_modules/wrap-ansi": { 1554 | "version": "6.2.0", 1555 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", 1556 | "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", 1557 | "dependencies": { 1558 | "ansi-styles": "^4.0.0", 1559 | "string-width": "^4.1.0", 1560 | "strip-ansi": "^6.0.0" 1561 | }, 1562 | "engines": { 1563 | "node": ">=8" 1564 | } 1565 | }, 1566 | "node_modules/xmldom": { 1567 | "version": "0.3.0", 1568 | "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.3.0.tgz", 1569 | "integrity": "sha512-z9s6k3wxE+aZHgXYxSTpGDo7BYOUfJsIRyoZiX6HTjwpwfS2wpQBQKa2fD+ShLyPkqDYo5ud7KitmLZ2Cd6r0g==", 1570 | "engines": { 1571 | "node": ">=10.0.0" 1572 | } 1573 | }, 1574 | "node_modules/xpath": { 1575 | "version": "0.0.27", 1576 | "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.27.tgz", 1577 | "integrity": "sha512-fg03WRxtkCV6ohClePNAECYsmpKKTv5L8y/X3Dn1hQrec3POx2jHZ/0P2qQ6HvsrU1BmeqXcof3NGGueG6LxwQ==", 1578 | "engines": { 1579 | "node": ">=0.6.0" 1580 | } 1581 | }, 1582 | "node_modules/y18n": { 1583 | "version": "4.0.0", 1584 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", 1585 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" 1586 | }, 1587 | "node_modules/yargs": { 1588 | "version": "15.3.0", 1589 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.0.tgz", 1590 | "integrity": "sha512-g/QCnmjgOl1YJjGsnUg2SatC7NUYEiLXJqxNOQU9qSpjzGtGXda9b+OKccr1kLTy8BN9yqEyqfq5lxlwdc13TA==", 1591 | "dependencies": { 1592 | "cliui": "^6.0.0", 1593 | "decamelize": "^1.2.0", 1594 | "find-up": "^4.1.0", 1595 | "get-caller-file": "^2.0.1", 1596 | "require-directory": "^2.1.1", 1597 | "require-main-filename": "^2.0.0", 1598 | "set-blocking": "^2.0.0", 1599 | "string-width": "^4.2.0", 1600 | "which-module": "^2.0.0", 1601 | "y18n": "^4.0.0", 1602 | "yargs-parser": "^18.1.0" 1603 | }, 1604 | "engines": { 1605 | "node": ">=8" 1606 | } 1607 | }, 1608 | "node_modules/yargs-parser": { 1609 | "version": "18.1.3", 1610 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", 1611 | "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", 1612 | "dependencies": { 1613 | "camelcase": "^5.0.0", 1614 | "decamelize": "^1.2.0" 1615 | }, 1616 | "engines": { 1617 | "node": ">=6" 1618 | } 1619 | } 1620 | }, 1621 | "dependencies": { 1622 | "@tootallnate/once": { 1623 | "version": "1.1.2", 1624 | "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", 1625 | "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" 1626 | }, 1627 | "accepts": { 1628 | "version": "1.3.7", 1629 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 1630 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 1631 | "requires": { 1632 | "mime-types": "~2.1.24", 1633 | "negotiator": "0.6.2" 1634 | } 1635 | }, 1636 | "agent-base": { 1637 | "version": "6.0.2", 1638 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 1639 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 1640 | "requires": { 1641 | "debug": "4" 1642 | }, 1643 | "dependencies": { 1644 | "debug": { 1645 | "version": "4.3.1", 1646 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 1647 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 1648 | "requires": { 1649 | "ms": "2.1.2" 1650 | } 1651 | }, 1652 | "ms": { 1653 | "version": "2.1.2", 1654 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1655 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1656 | } 1657 | } 1658 | }, 1659 | "ansi-regex": { 1660 | "version": "5.0.0", 1661 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 1662 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" 1663 | }, 1664 | "ansi-styles": { 1665 | "version": "4.3.0", 1666 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1667 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1668 | "requires": { 1669 | "color-convert": "^2.0.1" 1670 | }, 1671 | "dependencies": { 1672 | "color-convert": { 1673 | "version": "2.0.1", 1674 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1675 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1676 | "requires": { 1677 | "color-name": "~1.1.4" 1678 | } 1679 | }, 1680 | "color-name": { 1681 | "version": "1.1.4", 1682 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1683 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 1684 | } 1685 | } 1686 | }, 1687 | "array-flatten": { 1688 | "version": "1.1.1", 1689 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 1690 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 1691 | }, 1692 | "async": { 1693 | "version": "2.6.3", 1694 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", 1695 | "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", 1696 | "requires": { 1697 | "lodash": "^4.17.14" 1698 | } 1699 | }, 1700 | "base32.js": { 1701 | "version": "0.1.0", 1702 | "resolved": "https://registry.npmjs.org/base32.js/-/base32.js-0.1.0.tgz", 1703 | "integrity": "sha1-tYLexpPC8R6JPPBk7mrFthMaIgI=" 1704 | }, 1705 | "body-parser": { 1706 | "version": "1.19.0", 1707 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 1708 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 1709 | "requires": { 1710 | "bytes": "3.1.0", 1711 | "content-type": "~1.0.4", 1712 | "debug": "2.6.9", 1713 | "depd": "~1.1.2", 1714 | "http-errors": "1.7.2", 1715 | "iconv-lite": "0.4.24", 1716 | "on-finished": "~2.3.0", 1717 | "qs": "6.7.0", 1718 | "raw-body": "2.4.0", 1719 | "type-is": "~1.6.17" 1720 | } 1721 | }, 1722 | "bytes": { 1723 | "version": "3.1.0", 1724 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 1725 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 1726 | }, 1727 | "camelcase": { 1728 | "version": "5.3.1", 1729 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 1730 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" 1731 | }, 1732 | "cliui": { 1733 | "version": "6.0.0", 1734 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", 1735 | "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", 1736 | "requires": { 1737 | "string-width": "^4.2.0", 1738 | "strip-ansi": "^6.0.0", 1739 | "wrap-ansi": "^6.2.0" 1740 | } 1741 | }, 1742 | "color": { 1743 | "version": "3.0.0", 1744 | "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", 1745 | "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", 1746 | "requires": { 1747 | "color-convert": "^1.9.1", 1748 | "color-string": "^1.5.2" 1749 | } 1750 | }, 1751 | "color-convert": { 1752 | "version": "1.9.3", 1753 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 1754 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 1755 | "requires": { 1756 | "color-name": "1.1.3" 1757 | } 1758 | }, 1759 | "color-name": { 1760 | "version": "1.1.3", 1761 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 1762 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 1763 | }, 1764 | "color-string": { 1765 | "version": "1.5.4", 1766 | "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz", 1767 | "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==", 1768 | "requires": { 1769 | "color-name": "^1.0.0", 1770 | "simple-swizzle": "^0.2.2" 1771 | } 1772 | }, 1773 | "colornames": { 1774 | "version": "1.1.1", 1775 | "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz", 1776 | "integrity": "sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y=" 1777 | }, 1778 | "colors": { 1779 | "version": "1.4.0", 1780 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", 1781 | "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" 1782 | }, 1783 | "colorspace": { 1784 | "version": "1.1.2", 1785 | "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", 1786 | "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", 1787 | "requires": { 1788 | "color": "3.0.x", 1789 | "text-hex": "1.0.x" 1790 | } 1791 | }, 1792 | "content-disposition": { 1793 | "version": "0.5.3", 1794 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 1795 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 1796 | "requires": { 1797 | "safe-buffer": "5.1.2" 1798 | } 1799 | }, 1800 | "content-type": { 1801 | "version": "1.0.4", 1802 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 1803 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 1804 | }, 1805 | "cookie": { 1806 | "version": "0.4.0", 1807 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 1808 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 1809 | }, 1810 | "cookie-signature": { 1811 | "version": "1.0.6", 1812 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 1813 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 1814 | }, 1815 | "core-util-is": { 1816 | "version": "1.0.2", 1817 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 1818 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 1819 | }, 1820 | "cors": { 1821 | "version": "2.8.5", 1822 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 1823 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 1824 | "requires": { 1825 | "object-assign": "^4", 1826 | "vary": "^1" 1827 | } 1828 | }, 1829 | "csv-parse": { 1830 | "version": "4.9.0", 1831 | "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-4.9.0.tgz", 1832 | "integrity": "sha512-SaFMvRWzobY9z0Nxg+q5pXvU2JY7p++icb1Bb/ZwGSLv058cLabhGg3YNpLPI2KALtZnoe/oNBCfWX9xgTkcaA==" 1833 | }, 1834 | "debug": { 1835 | "version": "2.6.9", 1836 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1837 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1838 | "requires": { 1839 | "ms": "2.0.0" 1840 | } 1841 | }, 1842 | "decamelize": { 1843 | "version": "1.2.0", 1844 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 1845 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 1846 | }, 1847 | "decode-uri-component": { 1848 | "version": "0.2.0", 1849 | "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", 1850 | "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" 1851 | }, 1852 | "depd": { 1853 | "version": "1.1.2", 1854 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 1855 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 1856 | }, 1857 | "destroy": { 1858 | "version": "1.0.4", 1859 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 1860 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 1861 | }, 1862 | "diagnostics": { 1863 | "version": "1.1.1", 1864 | "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", 1865 | "integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==", 1866 | "requires": { 1867 | "colorspace": "1.1.x", 1868 | "enabled": "1.0.x", 1869 | "kuler": "1.0.x" 1870 | } 1871 | }, 1872 | "dom-serializer": { 1873 | "version": "0.2.2", 1874 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", 1875 | "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", 1876 | "requires": { 1877 | "domelementtype": "^2.0.1", 1878 | "entities": "^2.0.0" 1879 | }, 1880 | "dependencies": { 1881 | "domelementtype": { 1882 | "version": "2.0.2", 1883 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.2.tgz", 1884 | "integrity": "sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==" 1885 | }, 1886 | "entities": { 1887 | "version": "2.1.0", 1888 | "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", 1889 | "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==" 1890 | } 1891 | } 1892 | }, 1893 | "domelementtype": { 1894 | "version": "1.3.1", 1895 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", 1896 | "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" 1897 | }, 1898 | "domhandler": { 1899 | "version": "2.4.2", 1900 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", 1901 | "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", 1902 | "requires": { 1903 | "domelementtype": "1" 1904 | } 1905 | }, 1906 | "domutils": { 1907 | "version": "1.7.0", 1908 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", 1909 | "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", 1910 | "requires": { 1911 | "dom-serializer": "0", 1912 | "domelementtype": "1" 1913 | } 1914 | }, 1915 | "ee-first": { 1916 | "version": "1.1.1", 1917 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 1918 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 1919 | }, 1920 | "ejs": { 1921 | "version": "2.7.4", 1922 | "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", 1923 | "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==" 1924 | }, 1925 | "emoji-regex": { 1926 | "version": "8.0.0", 1927 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1928 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 1929 | }, 1930 | "enabled": { 1931 | "version": "1.0.2", 1932 | "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", 1933 | "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", 1934 | "requires": { 1935 | "env-variable": "0.0.x" 1936 | } 1937 | }, 1938 | "encodeurl": { 1939 | "version": "1.0.2", 1940 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 1941 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 1942 | }, 1943 | "encoding-japanese": { 1944 | "version": "1.0.30", 1945 | "resolved": "https://registry.npmjs.org/encoding-japanese/-/encoding-japanese-1.0.30.tgz", 1946 | "integrity": "sha512-bd/DFLAoJetvv7ar/KIpE3CNO8wEuyrt9Xuw6nSMiZ+Vrz/Q21BPsMHvARL2Wz6IKHKXgb+DWZqtRg1vql9cBg==" 1947 | }, 1948 | "entities": { 1949 | "version": "1.1.2", 1950 | "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", 1951 | "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" 1952 | }, 1953 | "env-variable": { 1954 | "version": "0.0.6", 1955 | "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.6.tgz", 1956 | "integrity": "sha512-bHz59NlBbtS0NhftmR8+ExBEekE7br0e01jw+kk0NDro7TtZzBYZ5ScGPs3OmwnpyfHTHOtr1Y6uedCdrIldtg==" 1957 | }, 1958 | "errorhandler": { 1959 | "version": "1.5.1", 1960 | "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", 1961 | "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==", 1962 | "requires": { 1963 | "accepts": "~1.3.7", 1964 | "escape-html": "~1.0.3" 1965 | } 1966 | }, 1967 | "escape-html": { 1968 | "version": "1.0.3", 1969 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 1970 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 1971 | }, 1972 | "etag": { 1973 | "version": "1.8.1", 1974 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 1975 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 1976 | }, 1977 | "express": { 1978 | "version": "4.17.1", 1979 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 1980 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 1981 | "requires": { 1982 | "accepts": "~1.3.7", 1983 | "array-flatten": "1.1.1", 1984 | "body-parser": "1.19.0", 1985 | "content-disposition": "0.5.3", 1986 | "content-type": "~1.0.4", 1987 | "cookie": "0.4.0", 1988 | "cookie-signature": "1.0.6", 1989 | "debug": "2.6.9", 1990 | "depd": "~1.1.2", 1991 | "encodeurl": "~1.0.2", 1992 | "escape-html": "~1.0.3", 1993 | "etag": "~1.8.1", 1994 | "finalhandler": "~1.1.2", 1995 | "fresh": "0.5.2", 1996 | "merge-descriptors": "1.0.1", 1997 | "methods": "~1.1.2", 1998 | "on-finished": "~2.3.0", 1999 | "parseurl": "~1.3.3", 2000 | "path-to-regexp": "0.1.7", 2001 | "proxy-addr": "~2.0.5", 2002 | "qs": "6.7.0", 2003 | "range-parser": "~1.2.1", 2004 | "safe-buffer": "5.1.2", 2005 | "send": "0.17.1", 2006 | "serve-static": "1.14.1", 2007 | "setprototypeof": "1.1.1", 2008 | "statuses": "~1.5.0", 2009 | "type-is": "~1.6.18", 2010 | "utils-merge": "1.0.1", 2011 | "vary": "~1.1.2" 2012 | } 2013 | }, 2014 | "fast-safe-stringify": { 2015 | "version": "2.0.7", 2016 | "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", 2017 | "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" 2018 | }, 2019 | "fecha": { 2020 | "version": "4.2.0", 2021 | "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.0.tgz", 2022 | "integrity": "sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg==" 2023 | }, 2024 | "finalhandler": { 2025 | "version": "1.1.2", 2026 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 2027 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 2028 | "requires": { 2029 | "debug": "2.6.9", 2030 | "encodeurl": "~1.0.2", 2031 | "escape-html": "~1.0.3", 2032 | "on-finished": "~2.3.0", 2033 | "parseurl": "~1.3.3", 2034 | "statuses": "~1.5.0", 2035 | "unpipe": "~1.0.0" 2036 | } 2037 | }, 2038 | "find-up": { 2039 | "version": "4.1.0", 2040 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 2041 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 2042 | "requires": { 2043 | "locate-path": "^5.0.0", 2044 | "path-exists": "^4.0.0" 2045 | } 2046 | }, 2047 | "forwarded": { 2048 | "version": "0.1.2", 2049 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 2050 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 2051 | }, 2052 | "fresh": { 2053 | "version": "0.5.2", 2054 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 2055 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 2056 | }, 2057 | "fs-extra": { 2058 | "version": "8.1.0", 2059 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", 2060 | "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", 2061 | "requires": { 2062 | "graceful-fs": "^4.2.0", 2063 | "jsonfile": "^4.0.0", 2064 | "universalify": "^0.1.0" 2065 | } 2066 | }, 2067 | "get-caller-file": { 2068 | "version": "2.0.5", 2069 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 2070 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" 2071 | }, 2072 | "graceful-fs": { 2073 | "version": "4.2.4", 2074 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", 2075 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" 2076 | }, 2077 | "he": { 2078 | "version": "1.2.0", 2079 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 2080 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" 2081 | }, 2082 | "html-to-text": { 2083 | "version": "5.1.1", 2084 | "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-5.1.1.tgz", 2085 | "integrity": "sha512-Bci6bD/JIfZSvG4s0gW/9mMKwBRoe/1RWLxUME/d6WUSZCdY7T60bssf/jFf7EYXRyqU4P5xdClVqiYU0/ypdA==", 2086 | "requires": { 2087 | "he": "^1.2.0", 2088 | "htmlparser2": "^3.10.1", 2089 | "lodash": "^4.17.11", 2090 | "minimist": "^1.2.0" 2091 | } 2092 | }, 2093 | "htmlparser2": { 2094 | "version": "3.10.1", 2095 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", 2096 | "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", 2097 | "requires": { 2098 | "domelementtype": "^1.3.1", 2099 | "domhandler": "^2.3.0", 2100 | "domutils": "^1.5.1", 2101 | "entities": "^1.1.1", 2102 | "inherits": "^2.0.1", 2103 | "readable-stream": "^3.1.1" 2104 | } 2105 | }, 2106 | "http-errors": { 2107 | "version": "1.7.2", 2108 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 2109 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 2110 | "requires": { 2111 | "depd": "~1.1.2", 2112 | "inherits": "2.0.3", 2113 | "setprototypeof": "1.1.1", 2114 | "statuses": ">= 1.5.0 < 2", 2115 | "toidentifier": "1.0.0" 2116 | } 2117 | }, 2118 | "http-proxy-agent": { 2119 | "version": "4.0.1", 2120 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", 2121 | "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", 2122 | "requires": { 2123 | "@tootallnate/once": "1", 2124 | "agent-base": "6", 2125 | "debug": "4" 2126 | }, 2127 | "dependencies": { 2128 | "debug": { 2129 | "version": "4.3.1", 2130 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 2131 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 2132 | "requires": { 2133 | "ms": "2.1.2" 2134 | } 2135 | }, 2136 | "ms": { 2137 | "version": "2.1.2", 2138 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2139 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 2140 | } 2141 | } 2142 | }, 2143 | "https-proxy-agent": { 2144 | "version": "5.0.0", 2145 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", 2146 | "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", 2147 | "requires": { 2148 | "agent-base": "6", 2149 | "debug": "4" 2150 | }, 2151 | "dependencies": { 2152 | "debug": { 2153 | "version": "4.3.1", 2154 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 2155 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 2156 | "requires": { 2157 | "ms": "2.1.2" 2158 | } 2159 | }, 2160 | "ms": { 2161 | "version": "2.1.2", 2162 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2163 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 2164 | } 2165 | } 2166 | }, 2167 | "iconv-lite": { 2168 | "version": "0.4.24", 2169 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 2170 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 2171 | "requires": { 2172 | "safer-buffer": ">= 2.1.2 < 3" 2173 | } 2174 | }, 2175 | "inherits": { 2176 | "version": "2.0.3", 2177 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 2178 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 2179 | }, 2180 | "ipaddr.js": { 2181 | "version": "1.9.1", 2182 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 2183 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 2184 | }, 2185 | "ipv6-normalize": { 2186 | "version": "1.0.1", 2187 | "resolved": "https://registry.npmjs.org/ipv6-normalize/-/ipv6-normalize-1.0.1.tgz", 2188 | "integrity": "sha1-GzJYKQ02X6gyOeiZB93kWS52IKg=" 2189 | }, 2190 | "is-arrayish": { 2191 | "version": "0.3.2", 2192 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", 2193 | "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" 2194 | }, 2195 | "is-fullwidth-code-point": { 2196 | "version": "3.0.0", 2197 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 2198 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" 2199 | }, 2200 | "is-stream": { 2201 | "version": "1.1.0", 2202 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 2203 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 2204 | }, 2205 | "isarray": { 2206 | "version": "1.0.0", 2207 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 2208 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 2209 | }, 2210 | "json-stable-stringify": { 2211 | "version": "1.0.1", 2212 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", 2213 | "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", 2214 | "requires": { 2215 | "jsonify": "~0.0.0" 2216 | } 2217 | }, 2218 | "jsonfile": { 2219 | "version": "4.0.0", 2220 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 2221 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 2222 | "requires": { 2223 | "graceful-fs": "^4.1.6" 2224 | } 2225 | }, 2226 | "jsonify": { 2227 | "version": "0.0.0", 2228 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 2229 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" 2230 | }, 2231 | "jsonpath-plus": { 2232 | "version": "4.0.0", 2233 | "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-4.0.0.tgz", 2234 | "integrity": "sha512-e0Jtg4KAzDJKKwzbLaUtinCn0RZseWBVRTRGihSpvFlM3wTR7ExSp+PTdeTsDrLNJUe7L7JYJe8mblHX5SCT6A==" 2235 | }, 2236 | "kuler": { 2237 | "version": "1.0.1", 2238 | "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz", 2239 | "integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==", 2240 | "requires": { 2241 | "colornames": "^1.1.1" 2242 | } 2243 | }, 2244 | "libbase64": { 2245 | "version": "1.2.1", 2246 | "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-1.2.1.tgz", 2247 | "integrity": "sha512-l+nePcPbIG1fNlqMzrh68MLkX/gTxk/+vdvAb388Ssi7UuUN31MI44w4Yf33mM3Cm4xDfw48mdf3rkdHszLNew==" 2248 | }, 2249 | "libmime": { 2250 | "version": "5.0.0", 2251 | "resolved": "https://registry.npmjs.org/libmime/-/libmime-5.0.0.tgz", 2252 | "integrity": "sha512-2Bm96d5ktnE217Ib1FldvUaPAaOst6GtZrsxJCwnJgi9lnsoAKIHyU0sae8rNx6DNYbjdqqh8lv5/b9poD8qOg==", 2253 | "requires": { 2254 | "encoding-japanese": "1.0.30", 2255 | "iconv-lite": "0.6.2", 2256 | "libbase64": "1.2.1", 2257 | "libqp": "1.1.0" 2258 | }, 2259 | "dependencies": { 2260 | "iconv-lite": { 2261 | "version": "0.6.2", 2262 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", 2263 | "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", 2264 | "requires": { 2265 | "safer-buffer": ">= 2.1.2 < 3.0.0" 2266 | } 2267 | } 2268 | } 2269 | }, 2270 | "libqp": { 2271 | "version": "1.1.0", 2272 | "resolved": "https://registry.npmjs.org/libqp/-/libqp-1.1.0.tgz", 2273 | "integrity": "sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g=" 2274 | }, 2275 | "linkify-it": { 2276 | "version": "3.0.2", 2277 | "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.2.tgz", 2278 | "integrity": "sha512-gDBO4aHNZS6coiZCKVhSNh43F9ioIL4JwRjLZPkoLIY4yZFwg264Y5lu2x6rb1Js42Gh6Yqm2f6L2AJcnkzinQ==", 2279 | "requires": { 2280 | "uc.micro": "^1.0.1" 2281 | } 2282 | }, 2283 | "locate-path": { 2284 | "version": "5.0.0", 2285 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 2286 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 2287 | "requires": { 2288 | "p-locate": "^4.1.0" 2289 | } 2290 | }, 2291 | "lodash": { 2292 | "version": "4.17.20", 2293 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", 2294 | "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" 2295 | }, 2296 | "logform": { 2297 | "version": "2.2.0", 2298 | "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", 2299 | "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==", 2300 | "requires": { 2301 | "colors": "^1.2.1", 2302 | "fast-safe-stringify": "^2.0.4", 2303 | "fecha": "^4.2.0", 2304 | "ms": "^2.1.1", 2305 | "triple-beam": "^1.3.0" 2306 | }, 2307 | "dependencies": { 2308 | "ms": { 2309 | "version": "2.1.2", 2310 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2311 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 2312 | } 2313 | } 2314 | }, 2315 | "mailparser": { 2316 | "version": "2.8.1", 2317 | "resolved": "https://registry.npmjs.org/mailparser/-/mailparser-2.8.1.tgz", 2318 | "integrity": "sha512-H/CYAO9dsw6SFNbEGGpZsejVSWDcFlyHjb1OkHUWg0wggUekva1tNc28trB155nSqM8rhtbwTKt//orX0AmJxQ==", 2319 | "requires": { 2320 | "encoding-japanese": "1.0.30", 2321 | "he": "1.2.0", 2322 | "html-to-text": "5.1.1", 2323 | "iconv-lite": "0.6.2", 2324 | "libmime": "5.0.0", 2325 | "linkify-it": "3.0.2", 2326 | "mailsplit": "5.0.0", 2327 | "nodemailer": "6.4.11", 2328 | "tlds": "1.208.0" 2329 | }, 2330 | "dependencies": { 2331 | "iconv-lite": { 2332 | "version": "0.6.2", 2333 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", 2334 | "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", 2335 | "requires": { 2336 | "safer-buffer": ">= 2.1.2 < 3.0.0" 2337 | } 2338 | }, 2339 | "nodemailer": { 2340 | "version": "6.4.11", 2341 | "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.4.11.tgz", 2342 | "integrity": "sha512-BVZBDi+aJV4O38rxsUh164Dk1NCqgh6Cm0rQSb9SK/DHGll/DrCMnycVDD7msJgZCnmVa8ASo8EZzR7jsgTukQ==" 2343 | } 2344 | } 2345 | }, 2346 | "mailsplit": { 2347 | "version": "5.0.0", 2348 | "resolved": "https://registry.npmjs.org/mailsplit/-/mailsplit-5.0.0.tgz", 2349 | "integrity": "sha512-HeXA0eyCKBtZqbr7uoeb3Nn2L7VV8Vm27x6/YBb0ZiNzRzLoNS2PqRgGYADwh0cBzLYtqddq40bSSirqLO2LGw==", 2350 | "requires": { 2351 | "libbase64": "1.2.1", 2352 | "libmime": "4.2.1", 2353 | "libqp": "1.1.0" 2354 | }, 2355 | "dependencies": { 2356 | "iconv-lite": { 2357 | "version": "0.5.0", 2358 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.0.tgz", 2359 | "integrity": "sha512-NnEhI9hIEKHOzJ4f697DMz9IQEXr/MMJ5w64vN2/4Ai+wRnvV7SBrL0KLoRlwaKVghOc7LQ5YkPLuX146b6Ydw==", 2360 | "requires": { 2361 | "safer-buffer": ">= 2.1.2 < 3" 2362 | } 2363 | }, 2364 | "libmime": { 2365 | "version": "4.2.1", 2366 | "resolved": "https://registry.npmjs.org/libmime/-/libmime-4.2.1.tgz", 2367 | "integrity": "sha512-09y7zjSc5im1aNsq815zgo4/G3DnIzym3aDOHsGq4Ee5vrX4PdgQRybAsztz9Rv0NhO+J5C0llEUloa3sUmjmA==", 2368 | "requires": { 2369 | "encoding-japanese": "1.0.30", 2370 | "iconv-lite": "0.5.0", 2371 | "libbase64": "1.2.1", 2372 | "libqp": "1.1.0" 2373 | } 2374 | } 2375 | } 2376 | }, 2377 | "media-typer": { 2378 | "version": "0.3.0", 2379 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 2380 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 2381 | }, 2382 | "merge-descriptors": { 2383 | "version": "1.0.1", 2384 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 2385 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 2386 | }, 2387 | "methods": { 2388 | "version": "1.1.2", 2389 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 2390 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 2391 | }, 2392 | "mime": { 2393 | "version": "1.6.0", 2394 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 2395 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 2396 | }, 2397 | "mime-db": { 2398 | "version": "1.44.0", 2399 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 2400 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" 2401 | }, 2402 | "mime-types": { 2403 | "version": "2.1.27", 2404 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", 2405 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", 2406 | "requires": { 2407 | "mime-db": "1.44.0" 2408 | } 2409 | }, 2410 | "minimist": { 2411 | "version": "1.2.5", 2412 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 2413 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 2414 | }, 2415 | "mountebank": { 2416 | "version": "2.3.3", 2417 | "resolved": "https://registry.npmjs.org/mountebank/-/mountebank-2.3.3.tgz", 2418 | "integrity": "sha512-j3Q6rYRpVUvm2sMv7srwD7NQthN2uh4IaJYiv+bi4BMybjkQLl91p2Vto9FR+U5B705rLYeA5Zcy08H2+lY0CA==", 2419 | "requires": { 2420 | "cors": "~2.8.5", 2421 | "csv-parse": "4.9.0", 2422 | "ejs": "^2.7.4", 2423 | "errorhandler": "1.5.1", 2424 | "escape-html": "^1.0.3", 2425 | "express": "^4.17.1", 2426 | "fs-extra": "8.1.0", 2427 | "http-proxy-agent": "^4.0.1", 2428 | "https-proxy-agent": "^5.0.0", 2429 | "json-stable-stringify": "1.0.1", 2430 | "jsonpath-plus": "^4.0.0", 2431 | "mailparser": "^2.7.7", 2432 | "nodemailer": "^6.4.6", 2433 | "proper-lockfile": "^4.1.1", 2434 | "q": "1.5.1", 2435 | "query-string": "6.12.0", 2436 | "smtp-server": "^3.6.0", 2437 | "winston": "3.2.1", 2438 | "xmldom": "0.3.0", 2439 | "xpath": "0.0.27", 2440 | "yargs": "15.3.0" 2441 | } 2442 | }, 2443 | "ms": { 2444 | "version": "2.0.0", 2445 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2446 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 2447 | }, 2448 | "negotiator": { 2449 | "version": "0.6.2", 2450 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 2451 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 2452 | }, 2453 | "node-fetch": { 2454 | "version": "2.6.1", 2455 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 2456 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" 2457 | }, 2458 | "nodemailer": { 2459 | "version": "6.4.16", 2460 | "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.4.16.tgz", 2461 | "integrity": "sha512-68K0LgZ6hmZ7PVmwL78gzNdjpj5viqBdFqKrTtr9bZbJYj6BRj5W6WGkxXrEnUl3Co3CBXi3CZBUlpV/foGnOQ==" 2462 | }, 2463 | "object-assign": { 2464 | "version": "4.1.1", 2465 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2466 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 2467 | }, 2468 | "on-finished": { 2469 | "version": "2.3.0", 2470 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 2471 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 2472 | "requires": { 2473 | "ee-first": "1.1.1" 2474 | } 2475 | }, 2476 | "one-time": { 2477 | "version": "0.0.4", 2478 | "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", 2479 | "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=" 2480 | }, 2481 | "p-limit": { 2482 | "version": "2.3.0", 2483 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 2484 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 2485 | "requires": { 2486 | "p-try": "^2.0.0" 2487 | } 2488 | }, 2489 | "p-locate": { 2490 | "version": "4.1.0", 2491 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 2492 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 2493 | "requires": { 2494 | "p-limit": "^2.2.0" 2495 | } 2496 | }, 2497 | "p-try": { 2498 | "version": "2.2.0", 2499 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 2500 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" 2501 | }, 2502 | "parseurl": { 2503 | "version": "1.3.3", 2504 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 2505 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 2506 | }, 2507 | "path-exists": { 2508 | "version": "4.0.0", 2509 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2510 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" 2511 | }, 2512 | "path-to-regexp": { 2513 | "version": "0.1.7", 2514 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 2515 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 2516 | }, 2517 | "process-nextick-args": { 2518 | "version": "2.0.1", 2519 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 2520 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 2521 | }, 2522 | "proper-lockfile": { 2523 | "version": "4.1.1", 2524 | "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.1.tgz", 2525 | "integrity": "sha512-1w6rxXodisVpn7QYvLk706mzprPTAPCYAqxMvctmPN3ekuRk/kuGkGc82pangZiAt4R3lwSuUzheTTn0/Yb7Zg==", 2526 | "requires": { 2527 | "graceful-fs": "^4.1.11", 2528 | "retry": "^0.12.0", 2529 | "signal-exit": "^3.0.2" 2530 | } 2531 | }, 2532 | "proxy-addr": { 2533 | "version": "2.0.6", 2534 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", 2535 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", 2536 | "requires": { 2537 | "forwarded": "~0.1.2", 2538 | "ipaddr.js": "1.9.1" 2539 | } 2540 | }, 2541 | "q": { 2542 | "version": "1.5.1", 2543 | "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", 2544 | "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" 2545 | }, 2546 | "qs": { 2547 | "version": "6.7.0", 2548 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 2549 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 2550 | }, 2551 | "query-string": { 2552 | "version": "6.12.0", 2553 | "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.12.0.tgz", 2554 | "integrity": "sha512-aoiFW9ZU7jP8Itjqfpw80Qe7RoyCIhFrW522sdsp9LG92pat6CCG3d8qNZBaUi71FsEjIfLjx9Ky347FtVoqXA==", 2555 | "requires": { 2556 | "decode-uri-component": "^0.2.0", 2557 | "split-on-first": "^1.0.0", 2558 | "strict-uri-encode": "^2.0.0" 2559 | } 2560 | }, 2561 | "range-parser": { 2562 | "version": "1.2.1", 2563 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 2564 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 2565 | }, 2566 | "raw-body": { 2567 | "version": "2.4.0", 2568 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 2569 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 2570 | "requires": { 2571 | "bytes": "3.1.0", 2572 | "http-errors": "1.7.2", 2573 | "iconv-lite": "0.4.24", 2574 | "unpipe": "1.0.0" 2575 | } 2576 | }, 2577 | "readable-stream": { 2578 | "version": "3.6.0", 2579 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 2580 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 2581 | "requires": { 2582 | "inherits": "^2.0.3", 2583 | "string_decoder": "^1.1.1", 2584 | "util-deprecate": "^1.0.1" 2585 | } 2586 | }, 2587 | "require-directory": { 2588 | "version": "2.1.1", 2589 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 2590 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" 2591 | }, 2592 | "require-main-filename": { 2593 | "version": "2.0.0", 2594 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 2595 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" 2596 | }, 2597 | "retry": { 2598 | "version": "0.12.0", 2599 | "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", 2600 | "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" 2601 | }, 2602 | "safe-buffer": { 2603 | "version": "5.1.2", 2604 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2605 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 2606 | }, 2607 | "safer-buffer": { 2608 | "version": "2.1.2", 2609 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2610 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 2611 | }, 2612 | "send": { 2613 | "version": "0.17.1", 2614 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 2615 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 2616 | "requires": { 2617 | "debug": "2.6.9", 2618 | "depd": "~1.1.2", 2619 | "destroy": "~1.0.4", 2620 | "encodeurl": "~1.0.2", 2621 | "escape-html": "~1.0.3", 2622 | "etag": "~1.8.1", 2623 | "fresh": "0.5.2", 2624 | "http-errors": "~1.7.2", 2625 | "mime": "1.6.0", 2626 | "ms": "2.1.1", 2627 | "on-finished": "~2.3.0", 2628 | "range-parser": "~1.2.1", 2629 | "statuses": "~1.5.0" 2630 | }, 2631 | "dependencies": { 2632 | "ms": { 2633 | "version": "2.1.1", 2634 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 2635 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 2636 | } 2637 | } 2638 | }, 2639 | "serve-static": { 2640 | "version": "1.14.1", 2641 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 2642 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 2643 | "requires": { 2644 | "encodeurl": "~1.0.2", 2645 | "escape-html": "~1.0.3", 2646 | "parseurl": "~1.3.3", 2647 | "send": "0.17.1" 2648 | } 2649 | }, 2650 | "set-blocking": { 2651 | "version": "2.0.0", 2652 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 2653 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 2654 | }, 2655 | "setprototypeof": { 2656 | "version": "1.1.1", 2657 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 2658 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 2659 | }, 2660 | "signal-exit": { 2661 | "version": "3.0.3", 2662 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 2663 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" 2664 | }, 2665 | "simple-swizzle": { 2666 | "version": "0.2.2", 2667 | "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", 2668 | "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", 2669 | "requires": { 2670 | "is-arrayish": "^0.3.1" 2671 | } 2672 | }, 2673 | "smtp-server": { 2674 | "version": "3.8.0", 2675 | "resolved": "https://registry.npmjs.org/smtp-server/-/smtp-server-3.8.0.tgz", 2676 | "integrity": "sha512-MuHxJj6vyInpFZTt0J8kkPHEw+VrJTYLcadu5N/8xmU0AowPdZonTptRQvYxC1MGQ5FlC1YtbtMXeeY+TV5aNg==", 2677 | "requires": { 2678 | "base32.js": "0.1.0", 2679 | "ipv6-normalize": "1.0.1", 2680 | "nodemailer": "6.4.16" 2681 | } 2682 | }, 2683 | "split-on-first": { 2684 | "version": "1.1.0", 2685 | "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", 2686 | "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==" 2687 | }, 2688 | "stack-trace": { 2689 | "version": "0.0.10", 2690 | "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", 2691 | "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" 2692 | }, 2693 | "statuses": { 2694 | "version": "1.5.0", 2695 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 2696 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 2697 | }, 2698 | "strict-uri-encode": { 2699 | "version": "2.0.0", 2700 | "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", 2701 | "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=" 2702 | }, 2703 | "string_decoder": { 2704 | "version": "1.3.0", 2705 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 2706 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 2707 | "requires": { 2708 | "safe-buffer": "~5.2.0" 2709 | }, 2710 | "dependencies": { 2711 | "safe-buffer": { 2712 | "version": "5.2.1", 2713 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2714 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 2715 | } 2716 | } 2717 | }, 2718 | "string-width": { 2719 | "version": "4.2.0", 2720 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", 2721 | "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", 2722 | "requires": { 2723 | "emoji-regex": "^8.0.0", 2724 | "is-fullwidth-code-point": "^3.0.0", 2725 | "strip-ansi": "^6.0.0" 2726 | } 2727 | }, 2728 | "strip-ansi": { 2729 | "version": "6.0.0", 2730 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 2731 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 2732 | "requires": { 2733 | "ansi-regex": "^5.0.0" 2734 | } 2735 | }, 2736 | "text-hex": { 2737 | "version": "1.0.0", 2738 | "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", 2739 | "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" 2740 | }, 2741 | "tlds": { 2742 | "version": "1.208.0", 2743 | "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.208.0.tgz", 2744 | "integrity": "sha512-6kbY7GJpRQXwBddSOAbVUZXjObbCGFXliWWN+kOSEoRWIOyRWLB6zdeKC/Tguwwenl/KsUx016XR50EdHYsxZw==" 2745 | }, 2746 | "toidentifier": { 2747 | "version": "1.0.0", 2748 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 2749 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 2750 | }, 2751 | "triple-beam": { 2752 | "version": "1.3.0", 2753 | "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", 2754 | "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" 2755 | }, 2756 | "type-is": { 2757 | "version": "1.6.18", 2758 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 2759 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 2760 | "requires": { 2761 | "media-typer": "0.3.0", 2762 | "mime-types": "~2.1.24" 2763 | } 2764 | }, 2765 | "uc.micro": { 2766 | "version": "1.0.6", 2767 | "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", 2768 | "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" 2769 | }, 2770 | "universalify": { 2771 | "version": "0.1.2", 2772 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 2773 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" 2774 | }, 2775 | "unpipe": { 2776 | "version": "1.0.0", 2777 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 2778 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 2779 | }, 2780 | "util-deprecate": { 2781 | "version": "1.0.2", 2782 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2783 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 2784 | }, 2785 | "utils-merge": { 2786 | "version": "1.0.1", 2787 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 2788 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 2789 | }, 2790 | "vary": { 2791 | "version": "1.1.2", 2792 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 2793 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 2794 | }, 2795 | "which-module": { 2796 | "version": "2.0.0", 2797 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 2798 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" 2799 | }, 2800 | "winston": { 2801 | "version": "3.2.1", 2802 | "resolved": "https://registry.npmjs.org/winston/-/winston-3.2.1.tgz", 2803 | "integrity": "sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw==", 2804 | "requires": { 2805 | "async": "^2.6.1", 2806 | "diagnostics": "^1.1.1", 2807 | "is-stream": "^1.1.0", 2808 | "logform": "^2.1.1", 2809 | "one-time": "0.0.4", 2810 | "readable-stream": "^3.1.1", 2811 | "stack-trace": "0.0.x", 2812 | "triple-beam": "^1.3.0", 2813 | "winston-transport": "^4.3.0" 2814 | } 2815 | }, 2816 | "winston-transport": { 2817 | "version": "4.4.0", 2818 | "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", 2819 | "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", 2820 | "requires": { 2821 | "readable-stream": "^2.3.7", 2822 | "triple-beam": "^1.2.0" 2823 | }, 2824 | "dependencies": { 2825 | "readable-stream": { 2826 | "version": "2.3.7", 2827 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 2828 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 2829 | "requires": { 2830 | "core-util-is": "~1.0.0", 2831 | "inherits": "~2.0.3", 2832 | "isarray": "~1.0.0", 2833 | "process-nextick-args": "~2.0.0", 2834 | "safe-buffer": "~5.1.1", 2835 | "string_decoder": "~1.1.1", 2836 | "util-deprecate": "~1.0.1" 2837 | } 2838 | }, 2839 | "string_decoder": { 2840 | "version": "1.1.1", 2841 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2842 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2843 | "requires": { 2844 | "safe-buffer": "~5.1.0" 2845 | } 2846 | } 2847 | } 2848 | }, 2849 | "wrap-ansi": { 2850 | "version": "6.2.0", 2851 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", 2852 | "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", 2853 | "requires": { 2854 | "ansi-styles": "^4.0.0", 2855 | "string-width": "^4.1.0", 2856 | "strip-ansi": "^6.0.0" 2857 | } 2858 | }, 2859 | "xmldom": { 2860 | "version": "0.3.0", 2861 | "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.3.0.tgz", 2862 | "integrity": "sha512-z9s6k3wxE+aZHgXYxSTpGDo7BYOUfJsIRyoZiX6HTjwpwfS2wpQBQKa2fD+ShLyPkqDYo5ud7KitmLZ2Cd6r0g==" 2863 | }, 2864 | "xpath": { 2865 | "version": "0.0.27", 2866 | "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.27.tgz", 2867 | "integrity": "sha512-fg03WRxtkCV6ohClePNAECYsmpKKTv5L8y/X3Dn1hQrec3POx2jHZ/0P2qQ6HvsrU1BmeqXcof3NGGueG6LxwQ==" 2868 | }, 2869 | "y18n": { 2870 | "version": "4.0.0", 2871 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", 2872 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" 2873 | }, 2874 | "yargs": { 2875 | "version": "15.3.0", 2876 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.0.tgz", 2877 | "integrity": "sha512-g/QCnmjgOl1YJjGsnUg2SatC7NUYEiLXJqxNOQU9qSpjzGtGXda9b+OKccr1kLTy8BN9yqEyqfq5lxlwdc13TA==", 2878 | "requires": { 2879 | "cliui": "^6.0.0", 2880 | "decamelize": "^1.2.0", 2881 | "find-up": "^4.1.0", 2882 | "get-caller-file": "^2.0.1", 2883 | "require-directory": "^2.1.1", 2884 | "require-main-filename": "^2.0.0", 2885 | "set-blocking": "^2.0.0", 2886 | "string-width": "^4.2.0", 2887 | "which-module": "^2.0.0", 2888 | "y18n": "^4.0.0", 2889 | "yargs-parser": "^18.1.0" 2890 | } 2891 | }, 2892 | "yargs-parser": { 2893 | "version": "18.1.3", 2894 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", 2895 | "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", 2896 | "requires": { 2897 | "camelcase": "^5.0.0", 2898 | "decamelize": "^1.2.0" 2899 | } 2900 | } 2901 | } 2902 | } 2903 | --------------------------------------------------------------------------------