├── LICENSE ├── README.md ├── aula_03 ├── cpf.ts ├── produto.ts ├── venda.ts └── vendedor.ts ├── aula_04 └── usecase.ts ├── aula_05 ├── api │ └── users.ts ├── application.ts ├── controller │ └── application.ts ├── gateway │ └── postgresgateway.ts ├── interfaces │ └── dbconnection.ts ├── package-lock.json ├── package.json └── presenter │ └── index.ts ├── aula_07 ├── backend_for_frontend.ts ├── controller_refatorado.ts ├── controllers.ts ├── fat_controller.ts └── types.ts └── aula_08 ├── ensino.sqlite3 ├── package-lock.json ├── package.json ├── requirements.md ├── src ├── adapters │ ├── disciplina.ts │ ├── estudante.ts │ └── index.ts ├── api │ └── index.ts ├── controllers │ ├── disciplina.ts │ ├── estudante.ts │ └── matricula.ts ├── entities │ ├── disciplina.ts │ ├── estudante.ts │ ├── index.ts │ └── matricula.ts ├── external │ └── sqlite_database.ts ├── gateways │ ├── disciplina.ts │ ├── estudante.ts │ ├── index.ts │ └── matricula.ts ├── index.ts ├── interfaces │ ├── dbconnection.ts │ └── gateways.ts ├── types │ ├── index.ts │ ├── matriculadados.ts │ └── parametrobd.ts └── usecases │ ├── disciplina.ts │ ├── estudante.ts │ ├── index.ts │ └── matricula.ts └── tsconfig.json /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 FIAP - Faculdade de Informática e Administração Paulista 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # POSTECH_SOAT_CleanArchitecture 2 | Códigos utilizados na disciplina de Clean Architecture 3 | 4 | Gentilmente cedidos pelo Prof. Erick Muller -------------------------------------------------------------------------------- /aula_03/cpf.ts: -------------------------------------------------------------------------------- 1 | class CPF { 2 | numero_cpf: string; 3 | 4 | constructor(numero_cpf: string) { 5 | if (!this.validar(numero_cpf)) { 6 | throw new Error("Numero de CPF inválido") 7 | } 8 | this.numero_cpf = numero_cpf; 9 | } 10 | 11 | validar(numero_cpf: string): boolean { 12 | let ehValido = true; 13 | 14 | // fazer a lógica de validação, e atualizar o valor 15 | // de 'ehValido' de acordo com a validação 16 | return ehValido; 17 | } 18 | } -------------------------------------------------------------------------------- /aula_03/produto.ts: -------------------------------------------------------------------------------- 1 | class Produto { 2 | nome: string; 3 | 4 | private _preco: number; 5 | private _desconto: number = 1; 6 | 7 | constructor(nome: string, preco: number) { 8 | this.nome = nome; 9 | this._preco = preco; 10 | } 11 | 12 | setDesconto(porcentagem: number) { 13 | this._desconto = 1 - porcentagem/100; 14 | } 15 | 16 | get preco(): number { // aqui estamos encapsulando o calculo do preço como propriedade 17 | return this._preco * this._desconto; 18 | } 19 | } 20 | 21 | export {Produto} -------------------------------------------------------------------------------- /aula_03/venda.ts: -------------------------------------------------------------------------------- 1 | import { Produto } from "./produto"; 2 | import { Vendedor } from "./vendedor"; 3 | 4 | const MAX_PRODUTOS = 10; 5 | 6 | class Venda { 7 | data: Date; 8 | itens: Produto[]; 9 | vendedor: Vendedor; 10 | desconto: number = 1; 11 | 12 | constructor(vendedor: Vendedor) { 13 | this.data = new Date(); 14 | this.vendedor = vendedor; 15 | this.itens = []; 16 | } 17 | 18 | addProduto(produto: Produto) { 19 | if (this.itens.length >= MAX_PRODUTOS) { 20 | throw new Error("Maximo de produtos atingido") 21 | } 22 | this.itens.push(produto); 23 | } 24 | 25 | setDesconto(porcentagem: number) { 26 | this.desconto = 1 - porcentagem/100; 27 | } 28 | 29 | getTotalVenda() { 30 | let valorTotalVenda: number = 0; 31 | for (let p of this.itens) { 32 | valorTotalVenda += p.preco; 33 | } 34 | 35 | return valorTotalVenda; 36 | } 37 | 38 | getTotalVendaComDesconto() { 39 | const totalVenda = this.getTotalVenda(); 40 | return totalVenda * this.desconto; 41 | } 42 | } -------------------------------------------------------------------------------- /aula_03/vendedor.ts: -------------------------------------------------------------------------------- 1 | class Vendedor { 2 | nome: string; 3 | identificacao: string; 4 | 5 | constructor(nome: string, identificacao: string) { 6 | this.nome = nome; 7 | this.identificacao = identificacao; 8 | } 9 | } 10 | 11 | 12 | export { Vendedor } -------------------------------------------------------------------------------- /aula_04/usecase.ts: -------------------------------------------------------------------------------- 1 | class EstudanteUseCases { 2 | public static registrarEstudante(p: Pessoa, estudanteRepositorio: EstudanteRepositorio) { 3 | if (EstudanteUseCases.verificarPessoaEstudante(p, estudanteRepositorio) !== null) { 4 | throw new Error("Pessoa ja é estudante.") 5 | } 6 | return new Estudante(p.nome, p.identificacao, 'nova_matricula'); 7 | } 8 | 9 | public static verificarPessoaEstudante(p: Pessoa, estudanteRepositorio: EstudanteRepositorio) { 10 | return estudanteRepositorio.buscarPorPessoa(p.identificacao); 11 | } 12 | } -------------------------------------------------------------------------------- /aula_05/api/users.ts: -------------------------------------------------------------------------------- 1 | class UsersAPI { 2 | public listUser(): string { 3 | // 1. a API está no mesmo nível que o banco de dados, então pode acessar 4 | const userRepository = new MySqlUserRepository(); 5 | // 2. Criamos o UserController INJETANDO o userRepository. 6 | // O MySqlUserRepository implementa a interface 7 | const userController = new UserController(userRepository); 8 | // 3. userController consegue usar o repositorio sem se importar 9 | // como ele funciona. Por isso consegue obter os dados, validar e 10 | // retornar. 11 | const all_users = userController.getUsers(); 12 | return JSON.stringify(all_users); 13 | } 14 | } 15 | 16 | class UserController implements IUserController { 17 | repository: IUserRepository; 18 | 19 | constructor(userRepository: IUserRepository) { 20 | this.repository = userRepository 21 | } 22 | public getUsers(): any[][] { 23 | const all_users = this.repository.returnAllUsers(); 24 | // validar os dados usando os usecases e Entities 25 | // criados com os dados que vem do repositorio. 26 | 27 | // adaptar e retornar os dados. 28 | } ; 29 | } 30 | 31 | interface IUserRepository { 32 | returnAllUsers(): any[][]; 33 | } 34 | 35 | interface IUserController { } 36 | 37 | class MySqlUserRepository implements IUserRepository { 38 | // ... 39 | 40 | public returnAllUsers(): any[][] { 41 | // busca no banco de dados 42 | } 43 | } -------------------------------------------------------------------------------- /aula_05/application.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FIAP/POSTECH_SOAT_CleanArchitecture/b67a5cc5bd4ee81caa4d16d397e11a3d98924a8d/aula_05/application.ts -------------------------------------------------------------------------------- /aula_05/controller/application.ts: -------------------------------------------------------------------------------- 1 | import { IAlunoPresenter, IDisciplinaPresenter, IMatriculaPresenter } from "../presenter"; 2 | 3 | 4 | class ApplicationController { 5 | cadastrarAluno(alunoDAO): IAlunoPresenter { 6 | /** 7 | * Recebe sempre um DAO, objeto de dados 8 | * e retorna um presenter, que entrega os dados como necessário. 9 | */ 10 | return {} 11 | } 12 | 13 | cadastrarDisciplina(disciplinaDAO): IDisciplinaPresenter { 14 | /* ... */ 15 | return {} 16 | } 17 | 18 | matricularAluno(alunoId, disciplinaId): IMatriculaPresenter { 19 | /* ... */ 20 | return {} 21 | } 22 | } -------------------------------------------------------------------------------- /aula_05/gateway/postgresgateway.ts: -------------------------------------------------------------------------------- 1 | import { Client, ResultRow } from 'ts-postgres'; 2 | 3 | class PostgresGateway { 4 | private dsn: string; 5 | private client: Client; 6 | 7 | constructor(dsn: string) { 8 | this.dsn = dsn; 9 | const client = new Client(); 10 | } 11 | 12 | public async getClientsById(clientId: string): Promise { 13 | const sqlQuery = "SELECT id, name, status FROM clients WHERE id = $1"; 14 | await this.client.connect(); 15 | 16 | let clientData: ResultRow | null = null; 17 | 18 | try { 19 | 20 | const result = await this.client.query(sqlQuery, [clientId,]); 21 | const rows = [...result]; 22 | if (rows.length > 0) { 23 | clientData = rows[0]; 24 | } 25 | } 26 | finally { 27 | this.client.end(); 28 | } 29 | 30 | return clientData; 31 | } 32 | } -------------------------------------------------------------------------------- /aula_05/interfaces/dbconnection.ts: -------------------------------------------------------------------------------- 1 | interface Transaction { } 2 | 3 | interface DBConnection { 4 | sendQuery(query: string, params: any[], transaction: Transaction|null): any[]; 5 | sendCommand(command: string, params: any[]): boolean; 6 | startTransaction(): Transaction; 7 | commitTransaction(t: Transaction): void; 8 | rollbackTransaction(t: Transaction): void; 9 | } -------------------------------------------------------------------------------- /aula_05/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aula_05", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "aula_05", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "ts-postgres": "^1.3.0" 13 | } 14 | }, 15 | "node_modules/ts-postgres": { 16 | "version": "1.3.0", 17 | "resolved": "https://registry.npmjs.org/ts-postgres/-/ts-postgres-1.3.0.tgz", 18 | "integrity": "sha512-YQY6omZM9RiMeJpzyVn36ankicZnTbSTkHaq+NTkqrLHSRYigsNW9JsPwrZXxLt1es3mV+V6/VUj0eOVcYXq1g==", 19 | "dependencies": { 20 | "ts-typed-events": "^3.0.0" 21 | }, 22 | "engines": { 23 | "node": ">=10.7.0" 24 | } 25 | }, 26 | "node_modules/ts-typed-events": { 27 | "version": "3.0.0", 28 | "resolved": "https://registry.npmjs.org/ts-typed-events/-/ts-typed-events-3.0.0.tgz", 29 | "integrity": "sha512-+2FZ0XPX+UPR7PO8ZQjuvnuDMYRhzrDaCRaNHaBG1xSL//0oPa3XMU5yxgDTzW67VzkE33fQpx1YxWBdkaF7Zw==" 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /aula_05/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aula_05", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "ts-postgres": "^1.3.0" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /aula_05/presenter/index.ts: -------------------------------------------------------------------------------- 1 | interface IAlunoPresenter { /* ... */ } 2 | interface IDisciplinaPresenter { /* ... */ } 3 | interface IMatriculaPresenter { /* ... */ } 4 | 5 | export { IAlunoPresenter, IDisciplinaPresenter, IMatriculaPresenter} -------------------------------------------------------------------------------- /aula_07/backend_for_frontend.ts: -------------------------------------------------------------------------------- 1 | import { ProductsController } from "./controllers"; 2 | import { MyApi } from "./types"; 3 | 4 | let app = new MyApi 5 | 6 | app.get('/mobile/products', (_req, _res) => { 7 | const pc = new ProductsController(); 8 | const all_products = pc.GetAllWithFields(['name', 'identifier']); 9 | return JSON.stringify(all_products); 10 | }); 11 | 12 | app.get('/browser/products', (_req, _res) => { 13 | const pc = new ProductsController(); 14 | const all_products = pc.GetAll(); 15 | return JSON.stringify(all_products); 16 | }); -------------------------------------------------------------------------------- /aula_07/controller_refatorado.ts: -------------------------------------------------------------------------------- 1 | import { Cliente, Venda, Vendedor } from "./types"; 2 | 3 | class ApplicationController { 4 | public vendaController: IVendaController; 5 | public clienteController: IClienteController; 6 | public vendedorController: IVendedorController; 7 | 8 | constructor( 9 | vendaController: IVendaController, 10 | clienteController: IClienteController, 11 | vendedorController: IVendedorController 12 | ) { 13 | /* ... */ 14 | } 15 | } 16 | 17 | interface IVendaController { 18 | iniciar(clienteDAO, vendedorDAO): VideoEncoderBitrateMode; 19 | finalizar(Venda): void; 20 | buscarPorCliente(clienteDAO): Venda[]; 21 | } 22 | 23 | interface IClienteController { 24 | cadastrar(pessoaDAO): Cliente; 25 | buscar(clienteDAO): Cliente; 26 | } 27 | 28 | interface IVendedorController { 29 | registrar(vendedorDAO): Vendedor; 30 | listarVendasDeHoje(vendedorDAO): Venda[]; 31 | } 32 | 33 | -------------------------------------------------------------------------------- /aula_07/controllers.ts: -------------------------------------------------------------------------------- 1 | class ProductsController { 2 | GetAllWithFields(fields: string[]): any[][] | null { 3 | return null; 4 | }; 5 | GetAll(): any[][] | null { 6 | return null 7 | }; 8 | } 9 | 10 | export { ProductsController }; -------------------------------------------------------------------------------- /aula_07/fat_controller.ts: -------------------------------------------------------------------------------- 1 | class ApplicationControllerFat { 2 | iniciarVenda(clienteDAO, vendedorDAO) { 3 | /* ... */ 4 | } 5 | 6 | finalizarVenda(venda) { 7 | /* ... */ 8 | } 9 | 10 | buscarVendaPorClient(clienteDAO) { 11 | /* ... */ 12 | } 13 | 14 | cadastrarCliente(pessoaDAO) { 15 | /* ... */ 16 | } 17 | 18 | buscarCliente(clienteDAO) { 19 | /* ... */ 20 | } 21 | 22 | registrarVendedor(vendedorDAO) { 23 | /* ... */ 24 | } 25 | 26 | listarVendasDoVendedorHoje(vendedorDAO) { 27 | /* ... */ 28 | } 29 | } -------------------------------------------------------------------------------- /aula_07/types.ts: -------------------------------------------------------------------------------- 1 | type Venda = {}; 2 | type Cliente = {}; 3 | type Vendedor = {}; 4 | 5 | class MyApi { 6 | get(path: string, callback): any[] { return [] }; 7 | } 8 | 9 | export { Cliente, Venda, Vendedor, MyApi }; -------------------------------------------------------------------------------- /aula_08/ensino.sqlite3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FIAP/POSTECH_SOAT_CleanArchitecture/b67a5cc5bd4ee81caa4d16d397e11a3d98924a8d/aula_08/ensino.sqlite3 -------------------------------------------------------------------------------- /aula_08/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "clean-architecture", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "clean-architecture", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@types/express": "^4.17.17", 13 | "body-parser": "^1.20.2", 14 | "express": "^4.18.2", 15 | "sqlite": "^4.2.1", 16 | "sqlite3": "^5.1.6", 17 | "tsconfig-paths": "^4.2.0" 18 | }, 19 | "devDependencies": { 20 | "@types/node": "^20.2.5", 21 | "@types/sqlite3": "^3.1.8", 22 | "rimraf": "^5.0.1", 23 | "ts-node": "^10.9.1", 24 | "ts-node-dev": "^2.0.0", 25 | "typescript": "^5.1.3" 26 | } 27 | }, 28 | "node_modules/@cspotcode/source-map-support": { 29 | "version": "0.8.1", 30 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 31 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 32 | "dev": true, 33 | "dependencies": { 34 | "@jridgewell/trace-mapping": "0.3.9" 35 | }, 36 | "engines": { 37 | "node": ">=12" 38 | } 39 | }, 40 | "node_modules/@gar/promisify": { 41 | "version": "1.1.3", 42 | "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", 43 | "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", 44 | "optional": true 45 | }, 46 | "node_modules/@isaacs/cliui": { 47 | "version": "8.0.2", 48 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 49 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 50 | "dev": true, 51 | "dependencies": { 52 | "string-width": "^5.1.2", 53 | "string-width-cjs": "npm:string-width@^4.2.0", 54 | "strip-ansi": "^7.0.1", 55 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 56 | "wrap-ansi": "^8.1.0", 57 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 58 | }, 59 | "engines": { 60 | "node": ">=12" 61 | } 62 | }, 63 | "node_modules/@jridgewell/resolve-uri": { 64 | "version": "3.1.1", 65 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", 66 | "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", 67 | "dev": true, 68 | "engines": { 69 | "node": ">=6.0.0" 70 | } 71 | }, 72 | "node_modules/@jridgewell/sourcemap-codec": { 73 | "version": "1.4.15", 74 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 75 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", 76 | "dev": true 77 | }, 78 | "node_modules/@jridgewell/trace-mapping": { 79 | "version": "0.3.9", 80 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 81 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 82 | "dev": true, 83 | "dependencies": { 84 | "@jridgewell/resolve-uri": "^3.0.3", 85 | "@jridgewell/sourcemap-codec": "^1.4.10" 86 | } 87 | }, 88 | "node_modules/@mapbox/node-pre-gyp": { 89 | "version": "1.0.10", 90 | "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", 91 | "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", 92 | "dependencies": { 93 | "detect-libc": "^2.0.0", 94 | "https-proxy-agent": "^5.0.0", 95 | "make-dir": "^3.1.0", 96 | "node-fetch": "^2.6.7", 97 | "nopt": "^5.0.0", 98 | "npmlog": "^5.0.1", 99 | "rimraf": "^3.0.2", 100 | "semver": "^7.3.5", 101 | "tar": "^6.1.11" 102 | }, 103 | "bin": { 104 | "node-pre-gyp": "bin/node-pre-gyp" 105 | } 106 | }, 107 | "node_modules/@mapbox/node-pre-gyp/node_modules/brace-expansion": { 108 | "version": "1.1.11", 109 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 110 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 111 | "dependencies": { 112 | "balanced-match": "^1.0.0", 113 | "concat-map": "0.0.1" 114 | } 115 | }, 116 | "node_modules/@mapbox/node-pre-gyp/node_modules/glob": { 117 | "version": "7.2.3", 118 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 119 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 120 | "dependencies": { 121 | "fs.realpath": "^1.0.0", 122 | "inflight": "^1.0.4", 123 | "inherits": "2", 124 | "minimatch": "^3.1.1", 125 | "once": "^1.3.0", 126 | "path-is-absolute": "^1.0.0" 127 | }, 128 | "engines": { 129 | "node": "*" 130 | }, 131 | "funding": { 132 | "url": "https://github.com/sponsors/isaacs" 133 | } 134 | }, 135 | "node_modules/@mapbox/node-pre-gyp/node_modules/minimatch": { 136 | "version": "3.1.2", 137 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 138 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 139 | "dependencies": { 140 | "brace-expansion": "^1.1.7" 141 | }, 142 | "engines": { 143 | "node": "*" 144 | } 145 | }, 146 | "node_modules/@mapbox/node-pre-gyp/node_modules/rimraf": { 147 | "version": "3.0.2", 148 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 149 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 150 | "dependencies": { 151 | "glob": "^7.1.3" 152 | }, 153 | "bin": { 154 | "rimraf": "bin.js" 155 | }, 156 | "funding": { 157 | "url": "https://github.com/sponsors/isaacs" 158 | } 159 | }, 160 | "node_modules/@npmcli/fs": { 161 | "version": "1.1.1", 162 | "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", 163 | "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", 164 | "optional": true, 165 | "dependencies": { 166 | "@gar/promisify": "^1.0.1", 167 | "semver": "^7.3.5" 168 | } 169 | }, 170 | "node_modules/@npmcli/move-file": { 171 | "version": "1.1.2", 172 | "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", 173 | "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", 174 | "deprecated": "This functionality has been moved to @npmcli/fs", 175 | "optional": true, 176 | "dependencies": { 177 | "mkdirp": "^1.0.4", 178 | "rimraf": "^3.0.2" 179 | }, 180 | "engines": { 181 | "node": ">=10" 182 | } 183 | }, 184 | "node_modules/@npmcli/move-file/node_modules/brace-expansion": { 185 | "version": "1.1.11", 186 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 187 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 188 | "optional": true, 189 | "dependencies": { 190 | "balanced-match": "^1.0.0", 191 | "concat-map": "0.0.1" 192 | } 193 | }, 194 | "node_modules/@npmcli/move-file/node_modules/glob": { 195 | "version": "7.2.3", 196 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 197 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 198 | "optional": true, 199 | "dependencies": { 200 | "fs.realpath": "^1.0.0", 201 | "inflight": "^1.0.4", 202 | "inherits": "2", 203 | "minimatch": "^3.1.1", 204 | "once": "^1.3.0", 205 | "path-is-absolute": "^1.0.0" 206 | }, 207 | "engines": { 208 | "node": "*" 209 | }, 210 | "funding": { 211 | "url": "https://github.com/sponsors/isaacs" 212 | } 213 | }, 214 | "node_modules/@npmcli/move-file/node_modules/minimatch": { 215 | "version": "3.1.2", 216 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 217 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 218 | "optional": true, 219 | "dependencies": { 220 | "brace-expansion": "^1.1.7" 221 | }, 222 | "engines": { 223 | "node": "*" 224 | } 225 | }, 226 | "node_modules/@npmcli/move-file/node_modules/rimraf": { 227 | "version": "3.0.2", 228 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 229 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 230 | "optional": true, 231 | "dependencies": { 232 | "glob": "^7.1.3" 233 | }, 234 | "bin": { 235 | "rimraf": "bin.js" 236 | }, 237 | "funding": { 238 | "url": "https://github.com/sponsors/isaacs" 239 | } 240 | }, 241 | "node_modules/@pkgjs/parseargs": { 242 | "version": "0.11.0", 243 | "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", 244 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", 245 | "dev": true, 246 | "optional": true, 247 | "engines": { 248 | "node": ">=14" 249 | } 250 | }, 251 | "node_modules/@tootallnate/once": { 252 | "version": "1.1.2", 253 | "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", 254 | "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", 255 | "optional": true, 256 | "engines": { 257 | "node": ">= 6" 258 | } 259 | }, 260 | "node_modules/@tsconfig/node10": { 261 | "version": "1.0.9", 262 | "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", 263 | "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", 264 | "dev": true 265 | }, 266 | "node_modules/@tsconfig/node12": { 267 | "version": "1.0.11", 268 | "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", 269 | "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", 270 | "dev": true 271 | }, 272 | "node_modules/@tsconfig/node14": { 273 | "version": "1.0.3", 274 | "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", 275 | "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", 276 | "dev": true 277 | }, 278 | "node_modules/@tsconfig/node16": { 279 | "version": "1.0.4", 280 | "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", 281 | "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", 282 | "dev": true 283 | }, 284 | "node_modules/@types/body-parser": { 285 | "version": "1.19.2", 286 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", 287 | "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", 288 | "dependencies": { 289 | "@types/connect": "*", 290 | "@types/node": "*" 291 | } 292 | }, 293 | "node_modules/@types/connect": { 294 | "version": "3.4.35", 295 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", 296 | "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", 297 | "dependencies": { 298 | "@types/node": "*" 299 | } 300 | }, 301 | "node_modules/@types/express": { 302 | "version": "4.17.17", 303 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", 304 | "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", 305 | "dependencies": { 306 | "@types/body-parser": "*", 307 | "@types/express-serve-static-core": "^4.17.33", 308 | "@types/qs": "*", 309 | "@types/serve-static": "*" 310 | } 311 | }, 312 | "node_modules/@types/express-serve-static-core": { 313 | "version": "4.17.35", 314 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", 315 | "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", 316 | "dependencies": { 317 | "@types/node": "*", 318 | "@types/qs": "*", 319 | "@types/range-parser": "*", 320 | "@types/send": "*" 321 | } 322 | }, 323 | "node_modules/@types/mime": { 324 | "version": "1.3.2", 325 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", 326 | "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" 327 | }, 328 | "node_modules/@types/node": { 329 | "version": "20.2.5", 330 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz", 331 | "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==" 332 | }, 333 | "node_modules/@types/qs": { 334 | "version": "6.9.7", 335 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", 336 | "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" 337 | }, 338 | "node_modules/@types/range-parser": { 339 | "version": "1.2.4", 340 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", 341 | "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" 342 | }, 343 | "node_modules/@types/send": { 344 | "version": "0.17.1", 345 | "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", 346 | "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", 347 | "dependencies": { 348 | "@types/mime": "^1", 349 | "@types/node": "*" 350 | } 351 | }, 352 | "node_modules/@types/serve-static": { 353 | "version": "1.15.1", 354 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", 355 | "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", 356 | "dependencies": { 357 | "@types/mime": "*", 358 | "@types/node": "*" 359 | } 360 | }, 361 | "node_modules/@types/sqlite3": { 362 | "version": "3.1.8", 363 | "resolved": "https://registry.npmjs.org/@types/sqlite3/-/sqlite3-3.1.8.tgz", 364 | "integrity": "sha512-sQMt/qnyUWnqiTcJXm5ZfNPIBeJ/DVvJDwxw+0tAxPJvadzfiP1QhryO1JOR6t1yfb8NpzQb/Rud06mob5laIA==", 365 | "dev": true, 366 | "dependencies": { 367 | "@types/node": "*" 368 | } 369 | }, 370 | "node_modules/@types/strip-bom": { 371 | "version": "3.0.0", 372 | "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", 373 | "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==", 374 | "dev": true 375 | }, 376 | "node_modules/@types/strip-json-comments": { 377 | "version": "0.0.30", 378 | "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", 379 | "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", 380 | "dev": true 381 | }, 382 | "node_modules/abbrev": { 383 | "version": "1.1.1", 384 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 385 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" 386 | }, 387 | "node_modules/accepts": { 388 | "version": "1.3.8", 389 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 390 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 391 | "dependencies": { 392 | "mime-types": "~2.1.34", 393 | "negotiator": "0.6.3" 394 | }, 395 | "engines": { 396 | "node": ">= 0.6" 397 | } 398 | }, 399 | "node_modules/acorn": { 400 | "version": "8.8.2", 401 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", 402 | "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", 403 | "dev": true, 404 | "bin": { 405 | "acorn": "bin/acorn" 406 | }, 407 | "engines": { 408 | "node": ">=0.4.0" 409 | } 410 | }, 411 | "node_modules/acorn-walk": { 412 | "version": "8.2.0", 413 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", 414 | "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", 415 | "dev": true, 416 | "engines": { 417 | "node": ">=0.4.0" 418 | } 419 | }, 420 | "node_modules/agent-base": { 421 | "version": "6.0.2", 422 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 423 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 424 | "dependencies": { 425 | "debug": "4" 426 | }, 427 | "engines": { 428 | "node": ">= 6.0.0" 429 | } 430 | }, 431 | "node_modules/agent-base/node_modules/debug": { 432 | "version": "4.3.4", 433 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 434 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 435 | "dependencies": { 436 | "ms": "2.1.2" 437 | }, 438 | "engines": { 439 | "node": ">=6.0" 440 | }, 441 | "peerDependenciesMeta": { 442 | "supports-color": { 443 | "optional": true 444 | } 445 | } 446 | }, 447 | "node_modules/agent-base/node_modules/ms": { 448 | "version": "2.1.2", 449 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 450 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 451 | }, 452 | "node_modules/agentkeepalive": { 453 | "version": "4.3.0", 454 | "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz", 455 | "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==", 456 | "optional": true, 457 | "dependencies": { 458 | "debug": "^4.1.0", 459 | "depd": "^2.0.0", 460 | "humanize-ms": "^1.2.1" 461 | }, 462 | "engines": { 463 | "node": ">= 8.0.0" 464 | } 465 | }, 466 | "node_modules/agentkeepalive/node_modules/debug": { 467 | "version": "4.3.4", 468 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 469 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 470 | "optional": true, 471 | "dependencies": { 472 | "ms": "2.1.2" 473 | }, 474 | "engines": { 475 | "node": ">=6.0" 476 | }, 477 | "peerDependenciesMeta": { 478 | "supports-color": { 479 | "optional": true 480 | } 481 | } 482 | }, 483 | "node_modules/agentkeepalive/node_modules/ms": { 484 | "version": "2.1.2", 485 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 486 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 487 | "optional": true 488 | }, 489 | "node_modules/aggregate-error": { 490 | "version": "3.1.0", 491 | "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", 492 | "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", 493 | "optional": true, 494 | "dependencies": { 495 | "clean-stack": "^2.0.0", 496 | "indent-string": "^4.0.0" 497 | }, 498 | "engines": { 499 | "node": ">=8" 500 | } 501 | }, 502 | "node_modules/ansi-regex": { 503 | "version": "6.0.1", 504 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", 505 | "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", 506 | "dev": true, 507 | "engines": { 508 | "node": ">=12" 509 | }, 510 | "funding": { 511 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 512 | } 513 | }, 514 | "node_modules/ansi-styles": { 515 | "version": "6.2.1", 516 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 517 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 518 | "dev": true, 519 | "engines": { 520 | "node": ">=12" 521 | }, 522 | "funding": { 523 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 524 | } 525 | }, 526 | "node_modules/anymatch": { 527 | "version": "3.1.3", 528 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 529 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 530 | "dev": true, 531 | "dependencies": { 532 | "normalize-path": "^3.0.0", 533 | "picomatch": "^2.0.4" 534 | }, 535 | "engines": { 536 | "node": ">= 8" 537 | } 538 | }, 539 | "node_modules/aproba": { 540 | "version": "2.0.0", 541 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", 542 | "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" 543 | }, 544 | "node_modules/are-we-there-yet": { 545 | "version": "2.0.0", 546 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", 547 | "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", 548 | "dependencies": { 549 | "delegates": "^1.0.0", 550 | "readable-stream": "^3.6.0" 551 | }, 552 | "engines": { 553 | "node": ">=10" 554 | } 555 | }, 556 | "node_modules/arg": { 557 | "version": "4.1.3", 558 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 559 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 560 | "dev": true 561 | }, 562 | "node_modules/array-flatten": { 563 | "version": "1.1.1", 564 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 565 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 566 | }, 567 | "node_modules/balanced-match": { 568 | "version": "1.0.2", 569 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 570 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 571 | }, 572 | "node_modules/binary-extensions": { 573 | "version": "2.2.0", 574 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 575 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 576 | "dev": true, 577 | "engines": { 578 | "node": ">=8" 579 | } 580 | }, 581 | "node_modules/body-parser": { 582 | "version": "1.20.2", 583 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", 584 | "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", 585 | "dependencies": { 586 | "bytes": "3.1.2", 587 | "content-type": "~1.0.5", 588 | "debug": "2.6.9", 589 | "depd": "2.0.0", 590 | "destroy": "1.2.0", 591 | "http-errors": "2.0.0", 592 | "iconv-lite": "0.4.24", 593 | "on-finished": "2.4.1", 594 | "qs": "6.11.0", 595 | "raw-body": "2.5.2", 596 | "type-is": "~1.6.18", 597 | "unpipe": "1.0.0" 598 | }, 599 | "engines": { 600 | "node": ">= 0.8", 601 | "npm": "1.2.8000 || >= 1.4.16" 602 | } 603 | }, 604 | "node_modules/brace-expansion": { 605 | "version": "2.0.1", 606 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 607 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 608 | "dev": true, 609 | "dependencies": { 610 | "balanced-match": "^1.0.0" 611 | } 612 | }, 613 | "node_modules/braces": { 614 | "version": "3.0.2", 615 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 616 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 617 | "dev": true, 618 | "dependencies": { 619 | "fill-range": "^7.0.1" 620 | }, 621 | "engines": { 622 | "node": ">=8" 623 | } 624 | }, 625 | "node_modules/buffer-from": { 626 | "version": "1.1.2", 627 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 628 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", 629 | "dev": true 630 | }, 631 | "node_modules/bytes": { 632 | "version": "3.1.2", 633 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 634 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 635 | "engines": { 636 | "node": ">= 0.8" 637 | } 638 | }, 639 | "node_modules/cacache": { 640 | "version": "15.3.0", 641 | "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", 642 | "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", 643 | "optional": true, 644 | "dependencies": { 645 | "@npmcli/fs": "^1.0.0", 646 | "@npmcli/move-file": "^1.0.1", 647 | "chownr": "^2.0.0", 648 | "fs-minipass": "^2.0.0", 649 | "glob": "^7.1.4", 650 | "infer-owner": "^1.0.4", 651 | "lru-cache": "^6.0.0", 652 | "minipass": "^3.1.1", 653 | "minipass-collect": "^1.0.2", 654 | "minipass-flush": "^1.0.5", 655 | "minipass-pipeline": "^1.2.2", 656 | "mkdirp": "^1.0.3", 657 | "p-map": "^4.0.0", 658 | "promise-inflight": "^1.0.1", 659 | "rimraf": "^3.0.2", 660 | "ssri": "^8.0.1", 661 | "tar": "^6.0.2", 662 | "unique-filename": "^1.1.1" 663 | }, 664 | "engines": { 665 | "node": ">= 10" 666 | } 667 | }, 668 | "node_modules/cacache/node_modules/brace-expansion": { 669 | "version": "1.1.11", 670 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 671 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 672 | "optional": true, 673 | "dependencies": { 674 | "balanced-match": "^1.0.0", 675 | "concat-map": "0.0.1" 676 | } 677 | }, 678 | "node_modules/cacache/node_modules/glob": { 679 | "version": "7.2.3", 680 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 681 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 682 | "optional": true, 683 | "dependencies": { 684 | "fs.realpath": "^1.0.0", 685 | "inflight": "^1.0.4", 686 | "inherits": "2", 687 | "minimatch": "^3.1.1", 688 | "once": "^1.3.0", 689 | "path-is-absolute": "^1.0.0" 690 | }, 691 | "engines": { 692 | "node": "*" 693 | }, 694 | "funding": { 695 | "url": "https://github.com/sponsors/isaacs" 696 | } 697 | }, 698 | "node_modules/cacache/node_modules/lru-cache": { 699 | "version": "6.0.0", 700 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 701 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 702 | "optional": true, 703 | "dependencies": { 704 | "yallist": "^4.0.0" 705 | }, 706 | "engines": { 707 | "node": ">=10" 708 | } 709 | }, 710 | "node_modules/cacache/node_modules/minimatch": { 711 | "version": "3.1.2", 712 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 713 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 714 | "optional": true, 715 | "dependencies": { 716 | "brace-expansion": "^1.1.7" 717 | }, 718 | "engines": { 719 | "node": "*" 720 | } 721 | }, 722 | "node_modules/cacache/node_modules/minipass": { 723 | "version": "3.3.6", 724 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", 725 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 726 | "optional": true, 727 | "dependencies": { 728 | "yallist": "^4.0.0" 729 | }, 730 | "engines": { 731 | "node": ">=8" 732 | } 733 | }, 734 | "node_modules/cacache/node_modules/rimraf": { 735 | "version": "3.0.2", 736 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 737 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 738 | "optional": true, 739 | "dependencies": { 740 | "glob": "^7.1.3" 741 | }, 742 | "bin": { 743 | "rimraf": "bin.js" 744 | }, 745 | "funding": { 746 | "url": "https://github.com/sponsors/isaacs" 747 | } 748 | }, 749 | "node_modules/call-bind": { 750 | "version": "1.0.2", 751 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 752 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 753 | "dependencies": { 754 | "function-bind": "^1.1.1", 755 | "get-intrinsic": "^1.0.2" 756 | }, 757 | "funding": { 758 | "url": "https://github.com/sponsors/ljharb" 759 | } 760 | }, 761 | "node_modules/chokidar": { 762 | "version": "3.5.3", 763 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 764 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 765 | "dev": true, 766 | "funding": [ 767 | { 768 | "type": "individual", 769 | "url": "https://paulmillr.com/funding/" 770 | } 771 | ], 772 | "dependencies": { 773 | "anymatch": "~3.1.2", 774 | "braces": "~3.0.2", 775 | "glob-parent": "~5.1.2", 776 | "is-binary-path": "~2.1.0", 777 | "is-glob": "~4.0.1", 778 | "normalize-path": "~3.0.0", 779 | "readdirp": "~3.6.0" 780 | }, 781 | "engines": { 782 | "node": ">= 8.10.0" 783 | }, 784 | "optionalDependencies": { 785 | "fsevents": "~2.3.2" 786 | } 787 | }, 788 | "node_modules/chownr": { 789 | "version": "2.0.0", 790 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", 791 | "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", 792 | "engines": { 793 | "node": ">=10" 794 | } 795 | }, 796 | "node_modules/clean-stack": { 797 | "version": "2.2.0", 798 | "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", 799 | "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", 800 | "optional": true, 801 | "engines": { 802 | "node": ">=6" 803 | } 804 | }, 805 | "node_modules/color-convert": { 806 | "version": "2.0.1", 807 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 808 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 809 | "dev": true, 810 | "dependencies": { 811 | "color-name": "~1.1.4" 812 | }, 813 | "engines": { 814 | "node": ">=7.0.0" 815 | } 816 | }, 817 | "node_modules/color-name": { 818 | "version": "1.1.4", 819 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 820 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 821 | "dev": true 822 | }, 823 | "node_modules/color-support": { 824 | "version": "1.1.3", 825 | "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", 826 | "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", 827 | "bin": { 828 | "color-support": "bin.js" 829 | } 830 | }, 831 | "node_modules/concat-map": { 832 | "version": "0.0.1", 833 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 834 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" 835 | }, 836 | "node_modules/console-control-strings": { 837 | "version": "1.1.0", 838 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 839 | "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" 840 | }, 841 | "node_modules/content-disposition": { 842 | "version": "0.5.4", 843 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 844 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 845 | "dependencies": { 846 | "safe-buffer": "5.2.1" 847 | }, 848 | "engines": { 849 | "node": ">= 0.6" 850 | } 851 | }, 852 | "node_modules/content-type": { 853 | "version": "1.0.5", 854 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 855 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 856 | "engines": { 857 | "node": ">= 0.6" 858 | } 859 | }, 860 | "node_modules/cookie": { 861 | "version": "0.5.0", 862 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 863 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 864 | "engines": { 865 | "node": ">= 0.6" 866 | } 867 | }, 868 | "node_modules/cookie-signature": { 869 | "version": "1.0.6", 870 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 871 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 872 | }, 873 | "node_modules/create-require": { 874 | "version": "1.1.1", 875 | "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", 876 | "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", 877 | "dev": true 878 | }, 879 | "node_modules/cross-spawn": { 880 | "version": "7.0.3", 881 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 882 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 883 | "dev": true, 884 | "dependencies": { 885 | "path-key": "^3.1.0", 886 | "shebang-command": "^2.0.0", 887 | "which": "^2.0.1" 888 | }, 889 | "engines": { 890 | "node": ">= 8" 891 | } 892 | }, 893 | "node_modules/debug": { 894 | "version": "2.6.9", 895 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 896 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 897 | "dependencies": { 898 | "ms": "2.0.0" 899 | } 900 | }, 901 | "node_modules/delegates": { 902 | "version": "1.0.0", 903 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 904 | "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" 905 | }, 906 | "node_modules/depd": { 907 | "version": "2.0.0", 908 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 909 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 910 | "engines": { 911 | "node": ">= 0.8" 912 | } 913 | }, 914 | "node_modules/destroy": { 915 | "version": "1.2.0", 916 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 917 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 918 | "engines": { 919 | "node": ">= 0.8", 920 | "npm": "1.2.8000 || >= 1.4.16" 921 | } 922 | }, 923 | "node_modules/detect-libc": { 924 | "version": "2.0.1", 925 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", 926 | "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", 927 | "engines": { 928 | "node": ">=8" 929 | } 930 | }, 931 | "node_modules/diff": { 932 | "version": "4.0.2", 933 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 934 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 935 | "dev": true, 936 | "engines": { 937 | "node": ">=0.3.1" 938 | } 939 | }, 940 | "node_modules/dynamic-dedupe": { 941 | "version": "0.3.0", 942 | "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", 943 | "integrity": "sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==", 944 | "dev": true, 945 | "dependencies": { 946 | "xtend": "^4.0.0" 947 | } 948 | }, 949 | "node_modules/eastasianwidth": { 950 | "version": "0.2.0", 951 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 952 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 953 | "dev": true 954 | }, 955 | "node_modules/ee-first": { 956 | "version": "1.1.1", 957 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 958 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 959 | }, 960 | "node_modules/emoji-regex": { 961 | "version": "9.2.2", 962 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 963 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 964 | "dev": true 965 | }, 966 | "node_modules/encodeurl": { 967 | "version": "1.0.2", 968 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 969 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 970 | "engines": { 971 | "node": ">= 0.8" 972 | } 973 | }, 974 | "node_modules/encoding": { 975 | "version": "0.1.13", 976 | "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", 977 | "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", 978 | "optional": true, 979 | "dependencies": { 980 | "iconv-lite": "^0.6.2" 981 | } 982 | }, 983 | "node_modules/encoding/node_modules/iconv-lite": { 984 | "version": "0.6.3", 985 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 986 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 987 | "optional": true, 988 | "dependencies": { 989 | "safer-buffer": ">= 2.1.2 < 3.0.0" 990 | }, 991 | "engines": { 992 | "node": ">=0.10.0" 993 | } 994 | }, 995 | "node_modules/env-paths": { 996 | "version": "2.2.1", 997 | "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", 998 | "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", 999 | "optional": true, 1000 | "engines": { 1001 | "node": ">=6" 1002 | } 1003 | }, 1004 | "node_modules/err-code": { 1005 | "version": "2.0.3", 1006 | "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", 1007 | "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", 1008 | "optional": true 1009 | }, 1010 | "node_modules/escape-html": { 1011 | "version": "1.0.3", 1012 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 1013 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 1014 | }, 1015 | "node_modules/etag": { 1016 | "version": "1.8.1", 1017 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 1018 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 1019 | "engines": { 1020 | "node": ">= 0.6" 1021 | } 1022 | }, 1023 | "node_modules/express": { 1024 | "version": "4.18.2", 1025 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", 1026 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", 1027 | "dependencies": { 1028 | "accepts": "~1.3.8", 1029 | "array-flatten": "1.1.1", 1030 | "body-parser": "1.20.1", 1031 | "content-disposition": "0.5.4", 1032 | "content-type": "~1.0.4", 1033 | "cookie": "0.5.0", 1034 | "cookie-signature": "1.0.6", 1035 | "debug": "2.6.9", 1036 | "depd": "2.0.0", 1037 | "encodeurl": "~1.0.2", 1038 | "escape-html": "~1.0.3", 1039 | "etag": "~1.8.1", 1040 | "finalhandler": "1.2.0", 1041 | "fresh": "0.5.2", 1042 | "http-errors": "2.0.0", 1043 | "merge-descriptors": "1.0.1", 1044 | "methods": "~1.1.2", 1045 | "on-finished": "2.4.1", 1046 | "parseurl": "~1.3.3", 1047 | "path-to-regexp": "0.1.7", 1048 | "proxy-addr": "~2.0.7", 1049 | "qs": "6.11.0", 1050 | "range-parser": "~1.2.1", 1051 | "safe-buffer": "5.2.1", 1052 | "send": "0.18.0", 1053 | "serve-static": "1.15.0", 1054 | "setprototypeof": "1.2.0", 1055 | "statuses": "2.0.1", 1056 | "type-is": "~1.6.18", 1057 | "utils-merge": "1.0.1", 1058 | "vary": "~1.1.2" 1059 | }, 1060 | "engines": { 1061 | "node": ">= 0.10.0" 1062 | } 1063 | }, 1064 | "node_modules/express/node_modules/body-parser": { 1065 | "version": "1.20.1", 1066 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", 1067 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", 1068 | "dependencies": { 1069 | "bytes": "3.1.2", 1070 | "content-type": "~1.0.4", 1071 | "debug": "2.6.9", 1072 | "depd": "2.0.0", 1073 | "destroy": "1.2.0", 1074 | "http-errors": "2.0.0", 1075 | "iconv-lite": "0.4.24", 1076 | "on-finished": "2.4.1", 1077 | "qs": "6.11.0", 1078 | "raw-body": "2.5.1", 1079 | "type-is": "~1.6.18", 1080 | "unpipe": "1.0.0" 1081 | }, 1082 | "engines": { 1083 | "node": ">= 0.8", 1084 | "npm": "1.2.8000 || >= 1.4.16" 1085 | } 1086 | }, 1087 | "node_modules/express/node_modules/raw-body": { 1088 | "version": "2.5.1", 1089 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 1090 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 1091 | "dependencies": { 1092 | "bytes": "3.1.2", 1093 | "http-errors": "2.0.0", 1094 | "iconv-lite": "0.4.24", 1095 | "unpipe": "1.0.0" 1096 | }, 1097 | "engines": { 1098 | "node": ">= 0.8" 1099 | } 1100 | }, 1101 | "node_modules/fill-range": { 1102 | "version": "7.0.1", 1103 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1104 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1105 | "dev": true, 1106 | "dependencies": { 1107 | "to-regex-range": "^5.0.1" 1108 | }, 1109 | "engines": { 1110 | "node": ">=8" 1111 | } 1112 | }, 1113 | "node_modules/finalhandler": { 1114 | "version": "1.2.0", 1115 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 1116 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 1117 | "dependencies": { 1118 | "debug": "2.6.9", 1119 | "encodeurl": "~1.0.2", 1120 | "escape-html": "~1.0.3", 1121 | "on-finished": "2.4.1", 1122 | "parseurl": "~1.3.3", 1123 | "statuses": "2.0.1", 1124 | "unpipe": "~1.0.0" 1125 | }, 1126 | "engines": { 1127 | "node": ">= 0.8" 1128 | } 1129 | }, 1130 | "node_modules/foreground-child": { 1131 | "version": "3.1.1", 1132 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", 1133 | "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", 1134 | "dev": true, 1135 | "dependencies": { 1136 | "cross-spawn": "^7.0.0", 1137 | "signal-exit": "^4.0.1" 1138 | }, 1139 | "engines": { 1140 | "node": ">=14" 1141 | }, 1142 | "funding": { 1143 | "url": "https://github.com/sponsors/isaacs" 1144 | } 1145 | }, 1146 | "node_modules/forwarded": { 1147 | "version": "0.2.0", 1148 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 1149 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 1150 | "engines": { 1151 | "node": ">= 0.6" 1152 | } 1153 | }, 1154 | "node_modules/fresh": { 1155 | "version": "0.5.2", 1156 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 1157 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 1158 | "engines": { 1159 | "node": ">= 0.6" 1160 | } 1161 | }, 1162 | "node_modules/fs-minipass": { 1163 | "version": "2.1.0", 1164 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", 1165 | "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", 1166 | "dependencies": { 1167 | "minipass": "^3.0.0" 1168 | }, 1169 | "engines": { 1170 | "node": ">= 8" 1171 | } 1172 | }, 1173 | "node_modules/fs-minipass/node_modules/minipass": { 1174 | "version": "3.3.6", 1175 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", 1176 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 1177 | "dependencies": { 1178 | "yallist": "^4.0.0" 1179 | }, 1180 | "engines": { 1181 | "node": ">=8" 1182 | } 1183 | }, 1184 | "node_modules/fs.realpath": { 1185 | "version": "1.0.0", 1186 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1187 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" 1188 | }, 1189 | "node_modules/fsevents": { 1190 | "version": "2.3.2", 1191 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1192 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1193 | "dev": true, 1194 | "hasInstallScript": true, 1195 | "optional": true, 1196 | "os": [ 1197 | "darwin" 1198 | ], 1199 | "engines": { 1200 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1201 | } 1202 | }, 1203 | "node_modules/function-bind": { 1204 | "version": "1.1.1", 1205 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1206 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 1207 | }, 1208 | "node_modules/gauge": { 1209 | "version": "3.0.2", 1210 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", 1211 | "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", 1212 | "dependencies": { 1213 | "aproba": "^1.0.3 || ^2.0.0", 1214 | "color-support": "^1.1.2", 1215 | "console-control-strings": "^1.0.0", 1216 | "has-unicode": "^2.0.1", 1217 | "object-assign": "^4.1.1", 1218 | "signal-exit": "^3.0.0", 1219 | "string-width": "^4.2.3", 1220 | "strip-ansi": "^6.0.1", 1221 | "wide-align": "^1.1.2" 1222 | }, 1223 | "engines": { 1224 | "node": ">=10" 1225 | } 1226 | }, 1227 | "node_modules/gauge/node_modules/ansi-regex": { 1228 | "version": "5.0.1", 1229 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1230 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1231 | "engines": { 1232 | "node": ">=8" 1233 | } 1234 | }, 1235 | "node_modules/gauge/node_modules/emoji-regex": { 1236 | "version": "8.0.0", 1237 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1238 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 1239 | }, 1240 | "node_modules/gauge/node_modules/signal-exit": { 1241 | "version": "3.0.7", 1242 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 1243 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" 1244 | }, 1245 | "node_modules/gauge/node_modules/string-width": { 1246 | "version": "4.2.3", 1247 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1248 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1249 | "dependencies": { 1250 | "emoji-regex": "^8.0.0", 1251 | "is-fullwidth-code-point": "^3.0.0", 1252 | "strip-ansi": "^6.0.1" 1253 | }, 1254 | "engines": { 1255 | "node": ">=8" 1256 | } 1257 | }, 1258 | "node_modules/gauge/node_modules/strip-ansi": { 1259 | "version": "6.0.1", 1260 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1261 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1262 | "dependencies": { 1263 | "ansi-regex": "^5.0.1" 1264 | }, 1265 | "engines": { 1266 | "node": ">=8" 1267 | } 1268 | }, 1269 | "node_modules/get-intrinsic": { 1270 | "version": "1.2.1", 1271 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", 1272 | "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", 1273 | "dependencies": { 1274 | "function-bind": "^1.1.1", 1275 | "has": "^1.0.3", 1276 | "has-proto": "^1.0.1", 1277 | "has-symbols": "^1.0.3" 1278 | }, 1279 | "funding": { 1280 | "url": "https://github.com/sponsors/ljharb" 1281 | } 1282 | }, 1283 | "node_modules/glob": { 1284 | "version": "10.2.6", 1285 | "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.6.tgz", 1286 | "integrity": "sha512-U/rnDpXJGF414QQQZv5uVsabTVxMSwzS5CH0p3DRCIV6ownl4f7PzGnkGmvlum2wB+9RlJWJZ6ACU1INnBqiPA==", 1287 | "dev": true, 1288 | "dependencies": { 1289 | "foreground-child": "^3.1.0", 1290 | "jackspeak": "^2.0.3", 1291 | "minimatch": "^9.0.1", 1292 | "minipass": "^5.0.0 || ^6.0.2", 1293 | "path-scurry": "^1.7.0" 1294 | }, 1295 | "bin": { 1296 | "glob": "dist/cjs/src/bin.js" 1297 | }, 1298 | "engines": { 1299 | "node": ">=16 || 14 >=14.17" 1300 | }, 1301 | "funding": { 1302 | "url": "https://github.com/sponsors/isaacs" 1303 | } 1304 | }, 1305 | "node_modules/glob-parent": { 1306 | "version": "5.1.2", 1307 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1308 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1309 | "dev": true, 1310 | "dependencies": { 1311 | "is-glob": "^4.0.1" 1312 | }, 1313 | "engines": { 1314 | "node": ">= 6" 1315 | } 1316 | }, 1317 | "node_modules/graceful-fs": { 1318 | "version": "4.2.11", 1319 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 1320 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 1321 | "optional": true 1322 | }, 1323 | "node_modules/has": { 1324 | "version": "1.0.3", 1325 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1326 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1327 | "dependencies": { 1328 | "function-bind": "^1.1.1" 1329 | }, 1330 | "engines": { 1331 | "node": ">= 0.4.0" 1332 | } 1333 | }, 1334 | "node_modules/has-proto": { 1335 | "version": "1.0.1", 1336 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", 1337 | "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", 1338 | "engines": { 1339 | "node": ">= 0.4" 1340 | }, 1341 | "funding": { 1342 | "url": "https://github.com/sponsors/ljharb" 1343 | } 1344 | }, 1345 | "node_modules/has-symbols": { 1346 | "version": "1.0.3", 1347 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 1348 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 1349 | "engines": { 1350 | "node": ">= 0.4" 1351 | }, 1352 | "funding": { 1353 | "url": "https://github.com/sponsors/ljharb" 1354 | } 1355 | }, 1356 | "node_modules/has-unicode": { 1357 | "version": "2.0.1", 1358 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 1359 | "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" 1360 | }, 1361 | "node_modules/http-cache-semantics": { 1362 | "version": "4.1.1", 1363 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", 1364 | "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", 1365 | "optional": true 1366 | }, 1367 | "node_modules/http-errors": { 1368 | "version": "2.0.0", 1369 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 1370 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 1371 | "dependencies": { 1372 | "depd": "2.0.0", 1373 | "inherits": "2.0.4", 1374 | "setprototypeof": "1.2.0", 1375 | "statuses": "2.0.1", 1376 | "toidentifier": "1.0.1" 1377 | }, 1378 | "engines": { 1379 | "node": ">= 0.8" 1380 | } 1381 | }, 1382 | "node_modules/http-proxy-agent": { 1383 | "version": "4.0.1", 1384 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", 1385 | "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", 1386 | "optional": true, 1387 | "dependencies": { 1388 | "@tootallnate/once": "1", 1389 | "agent-base": "6", 1390 | "debug": "4" 1391 | }, 1392 | "engines": { 1393 | "node": ">= 6" 1394 | } 1395 | }, 1396 | "node_modules/http-proxy-agent/node_modules/debug": { 1397 | "version": "4.3.4", 1398 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1399 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1400 | "optional": true, 1401 | "dependencies": { 1402 | "ms": "2.1.2" 1403 | }, 1404 | "engines": { 1405 | "node": ">=6.0" 1406 | }, 1407 | "peerDependenciesMeta": { 1408 | "supports-color": { 1409 | "optional": true 1410 | } 1411 | } 1412 | }, 1413 | "node_modules/http-proxy-agent/node_modules/ms": { 1414 | "version": "2.1.2", 1415 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1416 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1417 | "optional": true 1418 | }, 1419 | "node_modules/https-proxy-agent": { 1420 | "version": "5.0.1", 1421 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", 1422 | "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", 1423 | "dependencies": { 1424 | "agent-base": "6", 1425 | "debug": "4" 1426 | }, 1427 | "engines": { 1428 | "node": ">= 6" 1429 | } 1430 | }, 1431 | "node_modules/https-proxy-agent/node_modules/debug": { 1432 | "version": "4.3.4", 1433 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1434 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1435 | "dependencies": { 1436 | "ms": "2.1.2" 1437 | }, 1438 | "engines": { 1439 | "node": ">=6.0" 1440 | }, 1441 | "peerDependenciesMeta": { 1442 | "supports-color": { 1443 | "optional": true 1444 | } 1445 | } 1446 | }, 1447 | "node_modules/https-proxy-agent/node_modules/ms": { 1448 | "version": "2.1.2", 1449 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1450 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1451 | }, 1452 | "node_modules/humanize-ms": { 1453 | "version": "1.2.1", 1454 | "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", 1455 | "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", 1456 | "optional": true, 1457 | "dependencies": { 1458 | "ms": "^2.0.0" 1459 | } 1460 | }, 1461 | "node_modules/iconv-lite": { 1462 | "version": "0.4.24", 1463 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1464 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1465 | "dependencies": { 1466 | "safer-buffer": ">= 2.1.2 < 3" 1467 | }, 1468 | "engines": { 1469 | "node": ">=0.10.0" 1470 | } 1471 | }, 1472 | "node_modules/imurmurhash": { 1473 | "version": "0.1.4", 1474 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1475 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 1476 | "optional": true, 1477 | "engines": { 1478 | "node": ">=0.8.19" 1479 | } 1480 | }, 1481 | "node_modules/indent-string": { 1482 | "version": "4.0.0", 1483 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", 1484 | "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", 1485 | "optional": true, 1486 | "engines": { 1487 | "node": ">=8" 1488 | } 1489 | }, 1490 | "node_modules/infer-owner": { 1491 | "version": "1.0.4", 1492 | "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", 1493 | "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", 1494 | "optional": true 1495 | }, 1496 | "node_modules/inflight": { 1497 | "version": "1.0.6", 1498 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1499 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1500 | "dependencies": { 1501 | "once": "^1.3.0", 1502 | "wrappy": "1" 1503 | } 1504 | }, 1505 | "node_modules/inherits": { 1506 | "version": "2.0.4", 1507 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1508 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1509 | }, 1510 | "node_modules/ip": { 1511 | "version": "2.0.0", 1512 | "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", 1513 | "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", 1514 | "optional": true 1515 | }, 1516 | "node_modules/ipaddr.js": { 1517 | "version": "1.9.1", 1518 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1519 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 1520 | "engines": { 1521 | "node": ">= 0.10" 1522 | } 1523 | }, 1524 | "node_modules/is-binary-path": { 1525 | "version": "2.1.0", 1526 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1527 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1528 | "dev": true, 1529 | "dependencies": { 1530 | "binary-extensions": "^2.0.0" 1531 | }, 1532 | "engines": { 1533 | "node": ">=8" 1534 | } 1535 | }, 1536 | "node_modules/is-core-module": { 1537 | "version": "2.12.1", 1538 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", 1539 | "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", 1540 | "dev": true, 1541 | "dependencies": { 1542 | "has": "^1.0.3" 1543 | }, 1544 | "funding": { 1545 | "url": "https://github.com/sponsors/ljharb" 1546 | } 1547 | }, 1548 | "node_modules/is-extglob": { 1549 | "version": "2.1.1", 1550 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1551 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1552 | "dev": true, 1553 | "engines": { 1554 | "node": ">=0.10.0" 1555 | } 1556 | }, 1557 | "node_modules/is-fullwidth-code-point": { 1558 | "version": "3.0.0", 1559 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1560 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1561 | "engines": { 1562 | "node": ">=8" 1563 | } 1564 | }, 1565 | "node_modules/is-glob": { 1566 | "version": "4.0.3", 1567 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1568 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1569 | "dev": true, 1570 | "dependencies": { 1571 | "is-extglob": "^2.1.1" 1572 | }, 1573 | "engines": { 1574 | "node": ">=0.10.0" 1575 | } 1576 | }, 1577 | "node_modules/is-lambda": { 1578 | "version": "1.0.1", 1579 | "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", 1580 | "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", 1581 | "optional": true 1582 | }, 1583 | "node_modules/is-number": { 1584 | "version": "7.0.0", 1585 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1586 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1587 | "dev": true, 1588 | "engines": { 1589 | "node": ">=0.12.0" 1590 | } 1591 | }, 1592 | "node_modules/isexe": { 1593 | "version": "2.0.0", 1594 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1595 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1596 | "devOptional": true 1597 | }, 1598 | "node_modules/jackspeak": { 1599 | "version": "2.2.1", 1600 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.1.tgz", 1601 | "integrity": "sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==", 1602 | "dev": true, 1603 | "dependencies": { 1604 | "@isaacs/cliui": "^8.0.2" 1605 | }, 1606 | "engines": { 1607 | "node": ">=14" 1608 | }, 1609 | "funding": { 1610 | "url": "https://github.com/sponsors/isaacs" 1611 | }, 1612 | "optionalDependencies": { 1613 | "@pkgjs/parseargs": "^0.11.0" 1614 | } 1615 | }, 1616 | "node_modules/json5": { 1617 | "version": "2.2.3", 1618 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", 1619 | "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", 1620 | "bin": { 1621 | "json5": "lib/cli.js" 1622 | }, 1623 | "engines": { 1624 | "node": ">=6" 1625 | } 1626 | }, 1627 | "node_modules/lru-cache": { 1628 | "version": "9.1.2", 1629 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.2.tgz", 1630 | "integrity": "sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==", 1631 | "dev": true, 1632 | "engines": { 1633 | "node": "14 || >=16.14" 1634 | } 1635 | }, 1636 | "node_modules/make-dir": { 1637 | "version": "3.1.0", 1638 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 1639 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 1640 | "dependencies": { 1641 | "semver": "^6.0.0" 1642 | }, 1643 | "engines": { 1644 | "node": ">=8" 1645 | }, 1646 | "funding": { 1647 | "url": "https://github.com/sponsors/sindresorhus" 1648 | } 1649 | }, 1650 | "node_modules/make-dir/node_modules/semver": { 1651 | "version": "6.3.0", 1652 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1653 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 1654 | "bin": { 1655 | "semver": "bin/semver.js" 1656 | } 1657 | }, 1658 | "node_modules/make-error": { 1659 | "version": "1.3.6", 1660 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 1661 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 1662 | "dev": true 1663 | }, 1664 | "node_modules/make-fetch-happen": { 1665 | "version": "9.1.0", 1666 | "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", 1667 | "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", 1668 | "optional": true, 1669 | "dependencies": { 1670 | "agentkeepalive": "^4.1.3", 1671 | "cacache": "^15.2.0", 1672 | "http-cache-semantics": "^4.1.0", 1673 | "http-proxy-agent": "^4.0.1", 1674 | "https-proxy-agent": "^5.0.0", 1675 | "is-lambda": "^1.0.1", 1676 | "lru-cache": "^6.0.0", 1677 | "minipass": "^3.1.3", 1678 | "minipass-collect": "^1.0.2", 1679 | "minipass-fetch": "^1.3.2", 1680 | "minipass-flush": "^1.0.5", 1681 | "minipass-pipeline": "^1.2.4", 1682 | "negotiator": "^0.6.2", 1683 | "promise-retry": "^2.0.1", 1684 | "socks-proxy-agent": "^6.0.0", 1685 | "ssri": "^8.0.0" 1686 | }, 1687 | "engines": { 1688 | "node": ">= 10" 1689 | } 1690 | }, 1691 | "node_modules/make-fetch-happen/node_modules/lru-cache": { 1692 | "version": "6.0.0", 1693 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1694 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1695 | "optional": true, 1696 | "dependencies": { 1697 | "yallist": "^4.0.0" 1698 | }, 1699 | "engines": { 1700 | "node": ">=10" 1701 | } 1702 | }, 1703 | "node_modules/make-fetch-happen/node_modules/minipass": { 1704 | "version": "3.3.6", 1705 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", 1706 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 1707 | "optional": true, 1708 | "dependencies": { 1709 | "yallist": "^4.0.0" 1710 | }, 1711 | "engines": { 1712 | "node": ">=8" 1713 | } 1714 | }, 1715 | "node_modules/media-typer": { 1716 | "version": "0.3.0", 1717 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1718 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 1719 | "engines": { 1720 | "node": ">= 0.6" 1721 | } 1722 | }, 1723 | "node_modules/merge-descriptors": { 1724 | "version": "1.0.1", 1725 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1726 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 1727 | }, 1728 | "node_modules/methods": { 1729 | "version": "1.1.2", 1730 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1731 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 1732 | "engines": { 1733 | "node": ">= 0.6" 1734 | } 1735 | }, 1736 | "node_modules/mime": { 1737 | "version": "1.6.0", 1738 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1739 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 1740 | "bin": { 1741 | "mime": "cli.js" 1742 | }, 1743 | "engines": { 1744 | "node": ">=4" 1745 | } 1746 | }, 1747 | "node_modules/mime-db": { 1748 | "version": "1.52.0", 1749 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1750 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 1751 | "engines": { 1752 | "node": ">= 0.6" 1753 | } 1754 | }, 1755 | "node_modules/mime-types": { 1756 | "version": "2.1.35", 1757 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1758 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1759 | "dependencies": { 1760 | "mime-db": "1.52.0" 1761 | }, 1762 | "engines": { 1763 | "node": ">= 0.6" 1764 | } 1765 | }, 1766 | "node_modules/minimatch": { 1767 | "version": "9.0.1", 1768 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", 1769 | "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", 1770 | "dev": true, 1771 | "dependencies": { 1772 | "brace-expansion": "^2.0.1" 1773 | }, 1774 | "engines": { 1775 | "node": ">=16 || 14 >=14.17" 1776 | }, 1777 | "funding": { 1778 | "url": "https://github.com/sponsors/isaacs" 1779 | } 1780 | }, 1781 | "node_modules/minimist": { 1782 | "version": "1.2.8", 1783 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 1784 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 1785 | "funding": { 1786 | "url": "https://github.com/sponsors/ljharb" 1787 | } 1788 | }, 1789 | "node_modules/minipass": { 1790 | "version": "6.0.2", 1791 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz", 1792 | "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==", 1793 | "dev": true, 1794 | "engines": { 1795 | "node": ">=16 || 14 >=14.17" 1796 | } 1797 | }, 1798 | "node_modules/minipass-collect": { 1799 | "version": "1.0.2", 1800 | "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", 1801 | "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", 1802 | "optional": true, 1803 | "dependencies": { 1804 | "minipass": "^3.0.0" 1805 | }, 1806 | "engines": { 1807 | "node": ">= 8" 1808 | } 1809 | }, 1810 | "node_modules/minipass-collect/node_modules/minipass": { 1811 | "version": "3.3.6", 1812 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", 1813 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 1814 | "optional": true, 1815 | "dependencies": { 1816 | "yallist": "^4.0.0" 1817 | }, 1818 | "engines": { 1819 | "node": ">=8" 1820 | } 1821 | }, 1822 | "node_modules/minipass-fetch": { 1823 | "version": "1.4.1", 1824 | "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", 1825 | "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", 1826 | "optional": true, 1827 | "dependencies": { 1828 | "minipass": "^3.1.0", 1829 | "minipass-sized": "^1.0.3", 1830 | "minizlib": "^2.0.0" 1831 | }, 1832 | "engines": { 1833 | "node": ">=8" 1834 | }, 1835 | "optionalDependencies": { 1836 | "encoding": "^0.1.12" 1837 | } 1838 | }, 1839 | "node_modules/minipass-fetch/node_modules/minipass": { 1840 | "version": "3.3.6", 1841 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", 1842 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 1843 | "optional": true, 1844 | "dependencies": { 1845 | "yallist": "^4.0.0" 1846 | }, 1847 | "engines": { 1848 | "node": ">=8" 1849 | } 1850 | }, 1851 | "node_modules/minipass-flush": { 1852 | "version": "1.0.5", 1853 | "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", 1854 | "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", 1855 | "optional": true, 1856 | "dependencies": { 1857 | "minipass": "^3.0.0" 1858 | }, 1859 | "engines": { 1860 | "node": ">= 8" 1861 | } 1862 | }, 1863 | "node_modules/minipass-flush/node_modules/minipass": { 1864 | "version": "3.3.6", 1865 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", 1866 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 1867 | "optional": true, 1868 | "dependencies": { 1869 | "yallist": "^4.0.0" 1870 | }, 1871 | "engines": { 1872 | "node": ">=8" 1873 | } 1874 | }, 1875 | "node_modules/minipass-pipeline": { 1876 | "version": "1.2.4", 1877 | "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", 1878 | "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", 1879 | "optional": true, 1880 | "dependencies": { 1881 | "minipass": "^3.0.0" 1882 | }, 1883 | "engines": { 1884 | "node": ">=8" 1885 | } 1886 | }, 1887 | "node_modules/minipass-pipeline/node_modules/minipass": { 1888 | "version": "3.3.6", 1889 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", 1890 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 1891 | "optional": true, 1892 | "dependencies": { 1893 | "yallist": "^4.0.0" 1894 | }, 1895 | "engines": { 1896 | "node": ">=8" 1897 | } 1898 | }, 1899 | "node_modules/minipass-sized": { 1900 | "version": "1.0.3", 1901 | "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", 1902 | "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", 1903 | "optional": true, 1904 | "dependencies": { 1905 | "minipass": "^3.0.0" 1906 | }, 1907 | "engines": { 1908 | "node": ">=8" 1909 | } 1910 | }, 1911 | "node_modules/minipass-sized/node_modules/minipass": { 1912 | "version": "3.3.6", 1913 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", 1914 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 1915 | "optional": true, 1916 | "dependencies": { 1917 | "yallist": "^4.0.0" 1918 | }, 1919 | "engines": { 1920 | "node": ">=8" 1921 | } 1922 | }, 1923 | "node_modules/minizlib": { 1924 | "version": "2.1.2", 1925 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", 1926 | "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", 1927 | "dependencies": { 1928 | "minipass": "^3.0.0", 1929 | "yallist": "^4.0.0" 1930 | }, 1931 | "engines": { 1932 | "node": ">= 8" 1933 | } 1934 | }, 1935 | "node_modules/minizlib/node_modules/minipass": { 1936 | "version": "3.3.6", 1937 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", 1938 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 1939 | "dependencies": { 1940 | "yallist": "^4.0.0" 1941 | }, 1942 | "engines": { 1943 | "node": ">=8" 1944 | } 1945 | }, 1946 | "node_modules/mkdirp": { 1947 | "version": "1.0.4", 1948 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 1949 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", 1950 | "bin": { 1951 | "mkdirp": "bin/cmd.js" 1952 | }, 1953 | "engines": { 1954 | "node": ">=10" 1955 | } 1956 | }, 1957 | "node_modules/ms": { 1958 | "version": "2.0.0", 1959 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1960 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 1961 | }, 1962 | "node_modules/negotiator": { 1963 | "version": "0.6.3", 1964 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1965 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 1966 | "engines": { 1967 | "node": ">= 0.6" 1968 | } 1969 | }, 1970 | "node_modules/node-addon-api": { 1971 | "version": "4.3.0", 1972 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", 1973 | "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==" 1974 | }, 1975 | "node_modules/node-fetch": { 1976 | "version": "2.6.11", 1977 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", 1978 | "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", 1979 | "dependencies": { 1980 | "whatwg-url": "^5.0.0" 1981 | }, 1982 | "engines": { 1983 | "node": "4.x || >=6.0.0" 1984 | }, 1985 | "peerDependencies": { 1986 | "encoding": "^0.1.0" 1987 | }, 1988 | "peerDependenciesMeta": { 1989 | "encoding": { 1990 | "optional": true 1991 | } 1992 | } 1993 | }, 1994 | "node_modules/node-gyp": { 1995 | "version": "8.4.1", 1996 | "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", 1997 | "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", 1998 | "optional": true, 1999 | "dependencies": { 2000 | "env-paths": "^2.2.0", 2001 | "glob": "^7.1.4", 2002 | "graceful-fs": "^4.2.6", 2003 | "make-fetch-happen": "^9.1.0", 2004 | "nopt": "^5.0.0", 2005 | "npmlog": "^6.0.0", 2006 | "rimraf": "^3.0.2", 2007 | "semver": "^7.3.5", 2008 | "tar": "^6.1.2", 2009 | "which": "^2.0.2" 2010 | }, 2011 | "bin": { 2012 | "node-gyp": "bin/node-gyp.js" 2013 | }, 2014 | "engines": { 2015 | "node": ">= 10.12.0" 2016 | } 2017 | }, 2018 | "node_modules/node-gyp/node_modules/ansi-regex": { 2019 | "version": "5.0.1", 2020 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2021 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2022 | "optional": true, 2023 | "engines": { 2024 | "node": ">=8" 2025 | } 2026 | }, 2027 | "node_modules/node-gyp/node_modules/are-we-there-yet": { 2028 | "version": "3.0.1", 2029 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", 2030 | "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", 2031 | "optional": true, 2032 | "dependencies": { 2033 | "delegates": "^1.0.0", 2034 | "readable-stream": "^3.6.0" 2035 | }, 2036 | "engines": { 2037 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 2038 | } 2039 | }, 2040 | "node_modules/node-gyp/node_modules/brace-expansion": { 2041 | "version": "1.1.11", 2042 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 2043 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 2044 | "optional": true, 2045 | "dependencies": { 2046 | "balanced-match": "^1.0.0", 2047 | "concat-map": "0.0.1" 2048 | } 2049 | }, 2050 | "node_modules/node-gyp/node_modules/emoji-regex": { 2051 | "version": "8.0.0", 2052 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2053 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 2054 | "optional": true 2055 | }, 2056 | "node_modules/node-gyp/node_modules/gauge": { 2057 | "version": "4.0.4", 2058 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", 2059 | "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", 2060 | "optional": true, 2061 | "dependencies": { 2062 | "aproba": "^1.0.3 || ^2.0.0", 2063 | "color-support": "^1.1.3", 2064 | "console-control-strings": "^1.1.0", 2065 | "has-unicode": "^2.0.1", 2066 | "signal-exit": "^3.0.7", 2067 | "string-width": "^4.2.3", 2068 | "strip-ansi": "^6.0.1", 2069 | "wide-align": "^1.1.5" 2070 | }, 2071 | "engines": { 2072 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 2073 | } 2074 | }, 2075 | "node_modules/node-gyp/node_modules/glob": { 2076 | "version": "7.2.3", 2077 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 2078 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 2079 | "optional": true, 2080 | "dependencies": { 2081 | "fs.realpath": "^1.0.0", 2082 | "inflight": "^1.0.4", 2083 | "inherits": "2", 2084 | "minimatch": "^3.1.1", 2085 | "once": "^1.3.0", 2086 | "path-is-absolute": "^1.0.0" 2087 | }, 2088 | "engines": { 2089 | "node": "*" 2090 | }, 2091 | "funding": { 2092 | "url": "https://github.com/sponsors/isaacs" 2093 | } 2094 | }, 2095 | "node_modules/node-gyp/node_modules/minimatch": { 2096 | "version": "3.1.2", 2097 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2098 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2099 | "optional": true, 2100 | "dependencies": { 2101 | "brace-expansion": "^1.1.7" 2102 | }, 2103 | "engines": { 2104 | "node": "*" 2105 | } 2106 | }, 2107 | "node_modules/node-gyp/node_modules/npmlog": { 2108 | "version": "6.0.2", 2109 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", 2110 | "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", 2111 | "optional": true, 2112 | "dependencies": { 2113 | "are-we-there-yet": "^3.0.0", 2114 | "console-control-strings": "^1.1.0", 2115 | "gauge": "^4.0.3", 2116 | "set-blocking": "^2.0.0" 2117 | }, 2118 | "engines": { 2119 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 2120 | } 2121 | }, 2122 | "node_modules/node-gyp/node_modules/rimraf": { 2123 | "version": "3.0.2", 2124 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 2125 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 2126 | "optional": true, 2127 | "dependencies": { 2128 | "glob": "^7.1.3" 2129 | }, 2130 | "bin": { 2131 | "rimraf": "bin.js" 2132 | }, 2133 | "funding": { 2134 | "url": "https://github.com/sponsors/isaacs" 2135 | } 2136 | }, 2137 | "node_modules/node-gyp/node_modules/signal-exit": { 2138 | "version": "3.0.7", 2139 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 2140 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 2141 | "optional": true 2142 | }, 2143 | "node_modules/node-gyp/node_modules/string-width": { 2144 | "version": "4.2.3", 2145 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2146 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2147 | "optional": true, 2148 | "dependencies": { 2149 | "emoji-regex": "^8.0.0", 2150 | "is-fullwidth-code-point": "^3.0.0", 2151 | "strip-ansi": "^6.0.1" 2152 | }, 2153 | "engines": { 2154 | "node": ">=8" 2155 | } 2156 | }, 2157 | "node_modules/node-gyp/node_modules/strip-ansi": { 2158 | "version": "6.0.1", 2159 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2160 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2161 | "optional": true, 2162 | "dependencies": { 2163 | "ansi-regex": "^5.0.1" 2164 | }, 2165 | "engines": { 2166 | "node": ">=8" 2167 | } 2168 | }, 2169 | "node_modules/nopt": { 2170 | "version": "5.0.0", 2171 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", 2172 | "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", 2173 | "dependencies": { 2174 | "abbrev": "1" 2175 | }, 2176 | "bin": { 2177 | "nopt": "bin/nopt.js" 2178 | }, 2179 | "engines": { 2180 | "node": ">=6" 2181 | } 2182 | }, 2183 | "node_modules/normalize-path": { 2184 | "version": "3.0.0", 2185 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2186 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 2187 | "dev": true, 2188 | "engines": { 2189 | "node": ">=0.10.0" 2190 | } 2191 | }, 2192 | "node_modules/npmlog": { 2193 | "version": "5.0.1", 2194 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", 2195 | "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", 2196 | "dependencies": { 2197 | "are-we-there-yet": "^2.0.0", 2198 | "console-control-strings": "^1.1.0", 2199 | "gauge": "^3.0.0", 2200 | "set-blocking": "^2.0.0" 2201 | } 2202 | }, 2203 | "node_modules/object-assign": { 2204 | "version": "4.1.1", 2205 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2206 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 2207 | "engines": { 2208 | "node": ">=0.10.0" 2209 | } 2210 | }, 2211 | "node_modules/object-inspect": { 2212 | "version": "1.12.3", 2213 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", 2214 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", 2215 | "funding": { 2216 | "url": "https://github.com/sponsors/ljharb" 2217 | } 2218 | }, 2219 | "node_modules/on-finished": { 2220 | "version": "2.4.1", 2221 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 2222 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 2223 | "dependencies": { 2224 | "ee-first": "1.1.1" 2225 | }, 2226 | "engines": { 2227 | "node": ">= 0.8" 2228 | } 2229 | }, 2230 | "node_modules/once": { 2231 | "version": "1.4.0", 2232 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2233 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 2234 | "dependencies": { 2235 | "wrappy": "1" 2236 | } 2237 | }, 2238 | "node_modules/p-map": { 2239 | "version": "4.0.0", 2240 | "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", 2241 | "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", 2242 | "optional": true, 2243 | "dependencies": { 2244 | "aggregate-error": "^3.0.0" 2245 | }, 2246 | "engines": { 2247 | "node": ">=10" 2248 | }, 2249 | "funding": { 2250 | "url": "https://github.com/sponsors/sindresorhus" 2251 | } 2252 | }, 2253 | "node_modules/parseurl": { 2254 | "version": "1.3.3", 2255 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 2256 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 2257 | "engines": { 2258 | "node": ">= 0.8" 2259 | } 2260 | }, 2261 | "node_modules/path-is-absolute": { 2262 | "version": "1.0.1", 2263 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2264 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 2265 | "engines": { 2266 | "node": ">=0.10.0" 2267 | } 2268 | }, 2269 | "node_modules/path-key": { 2270 | "version": "3.1.1", 2271 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2272 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2273 | "dev": true, 2274 | "engines": { 2275 | "node": ">=8" 2276 | } 2277 | }, 2278 | "node_modules/path-parse": { 2279 | "version": "1.0.7", 2280 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 2281 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 2282 | "dev": true 2283 | }, 2284 | "node_modules/path-scurry": { 2285 | "version": "1.9.2", 2286 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.9.2.tgz", 2287 | "integrity": "sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==", 2288 | "dev": true, 2289 | "dependencies": { 2290 | "lru-cache": "^9.1.1", 2291 | "minipass": "^5.0.0 || ^6.0.2" 2292 | }, 2293 | "engines": { 2294 | "node": ">=16 || 14 >=14.17" 2295 | }, 2296 | "funding": { 2297 | "url": "https://github.com/sponsors/isaacs" 2298 | } 2299 | }, 2300 | "node_modules/path-to-regexp": { 2301 | "version": "0.1.7", 2302 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 2303 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 2304 | }, 2305 | "node_modules/picomatch": { 2306 | "version": "2.3.1", 2307 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2308 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2309 | "dev": true, 2310 | "engines": { 2311 | "node": ">=8.6" 2312 | }, 2313 | "funding": { 2314 | "url": "https://github.com/sponsors/jonschlinkert" 2315 | } 2316 | }, 2317 | "node_modules/promise-inflight": { 2318 | "version": "1.0.1", 2319 | "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", 2320 | "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", 2321 | "optional": true 2322 | }, 2323 | "node_modules/promise-retry": { 2324 | "version": "2.0.1", 2325 | "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", 2326 | "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", 2327 | "optional": true, 2328 | "dependencies": { 2329 | "err-code": "^2.0.2", 2330 | "retry": "^0.12.0" 2331 | }, 2332 | "engines": { 2333 | "node": ">=10" 2334 | } 2335 | }, 2336 | "node_modules/proxy-addr": { 2337 | "version": "2.0.7", 2338 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 2339 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 2340 | "dependencies": { 2341 | "forwarded": "0.2.0", 2342 | "ipaddr.js": "1.9.1" 2343 | }, 2344 | "engines": { 2345 | "node": ">= 0.10" 2346 | } 2347 | }, 2348 | "node_modules/qs": { 2349 | "version": "6.11.0", 2350 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 2351 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 2352 | "dependencies": { 2353 | "side-channel": "^1.0.4" 2354 | }, 2355 | "engines": { 2356 | "node": ">=0.6" 2357 | }, 2358 | "funding": { 2359 | "url": "https://github.com/sponsors/ljharb" 2360 | } 2361 | }, 2362 | "node_modules/range-parser": { 2363 | "version": "1.2.1", 2364 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 2365 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 2366 | "engines": { 2367 | "node": ">= 0.6" 2368 | } 2369 | }, 2370 | "node_modules/raw-body": { 2371 | "version": "2.5.2", 2372 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", 2373 | "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", 2374 | "dependencies": { 2375 | "bytes": "3.1.2", 2376 | "http-errors": "2.0.0", 2377 | "iconv-lite": "0.4.24", 2378 | "unpipe": "1.0.0" 2379 | }, 2380 | "engines": { 2381 | "node": ">= 0.8" 2382 | } 2383 | }, 2384 | "node_modules/readable-stream": { 2385 | "version": "3.6.2", 2386 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", 2387 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", 2388 | "dependencies": { 2389 | "inherits": "^2.0.3", 2390 | "string_decoder": "^1.1.1", 2391 | "util-deprecate": "^1.0.1" 2392 | }, 2393 | "engines": { 2394 | "node": ">= 6" 2395 | } 2396 | }, 2397 | "node_modules/readdirp": { 2398 | "version": "3.6.0", 2399 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 2400 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 2401 | "dev": true, 2402 | "dependencies": { 2403 | "picomatch": "^2.2.1" 2404 | }, 2405 | "engines": { 2406 | "node": ">=8.10.0" 2407 | } 2408 | }, 2409 | "node_modules/resolve": { 2410 | "version": "1.22.2", 2411 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", 2412 | "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", 2413 | "dev": true, 2414 | "dependencies": { 2415 | "is-core-module": "^2.11.0", 2416 | "path-parse": "^1.0.7", 2417 | "supports-preserve-symlinks-flag": "^1.0.0" 2418 | }, 2419 | "bin": { 2420 | "resolve": "bin/resolve" 2421 | }, 2422 | "funding": { 2423 | "url": "https://github.com/sponsors/ljharb" 2424 | } 2425 | }, 2426 | "node_modules/retry": { 2427 | "version": "0.12.0", 2428 | "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", 2429 | "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", 2430 | "optional": true, 2431 | "engines": { 2432 | "node": ">= 4" 2433 | } 2434 | }, 2435 | "node_modules/rimraf": { 2436 | "version": "5.0.1", 2437 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.1.tgz", 2438 | "integrity": "sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg==", 2439 | "dev": true, 2440 | "dependencies": { 2441 | "glob": "^10.2.5" 2442 | }, 2443 | "bin": { 2444 | "rimraf": "dist/cjs/src/bin.js" 2445 | }, 2446 | "engines": { 2447 | "node": ">=14" 2448 | }, 2449 | "funding": { 2450 | "url": "https://github.com/sponsors/isaacs" 2451 | } 2452 | }, 2453 | "node_modules/safe-buffer": { 2454 | "version": "5.2.1", 2455 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2456 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 2457 | "funding": [ 2458 | { 2459 | "type": "github", 2460 | "url": "https://github.com/sponsors/feross" 2461 | }, 2462 | { 2463 | "type": "patreon", 2464 | "url": "https://www.patreon.com/feross" 2465 | }, 2466 | { 2467 | "type": "consulting", 2468 | "url": "https://feross.org/support" 2469 | } 2470 | ] 2471 | }, 2472 | "node_modules/safer-buffer": { 2473 | "version": "2.1.2", 2474 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2475 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 2476 | }, 2477 | "node_modules/semver": { 2478 | "version": "7.5.1", 2479 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", 2480 | "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", 2481 | "dependencies": { 2482 | "lru-cache": "^6.0.0" 2483 | }, 2484 | "bin": { 2485 | "semver": "bin/semver.js" 2486 | }, 2487 | "engines": { 2488 | "node": ">=10" 2489 | } 2490 | }, 2491 | "node_modules/semver/node_modules/lru-cache": { 2492 | "version": "6.0.0", 2493 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 2494 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 2495 | "dependencies": { 2496 | "yallist": "^4.0.0" 2497 | }, 2498 | "engines": { 2499 | "node": ">=10" 2500 | } 2501 | }, 2502 | "node_modules/send": { 2503 | "version": "0.18.0", 2504 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 2505 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 2506 | "dependencies": { 2507 | "debug": "2.6.9", 2508 | "depd": "2.0.0", 2509 | "destroy": "1.2.0", 2510 | "encodeurl": "~1.0.2", 2511 | "escape-html": "~1.0.3", 2512 | "etag": "~1.8.1", 2513 | "fresh": "0.5.2", 2514 | "http-errors": "2.0.0", 2515 | "mime": "1.6.0", 2516 | "ms": "2.1.3", 2517 | "on-finished": "2.4.1", 2518 | "range-parser": "~1.2.1", 2519 | "statuses": "2.0.1" 2520 | }, 2521 | "engines": { 2522 | "node": ">= 0.8.0" 2523 | } 2524 | }, 2525 | "node_modules/send/node_modules/ms": { 2526 | "version": "2.1.3", 2527 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2528 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 2529 | }, 2530 | "node_modules/serve-static": { 2531 | "version": "1.15.0", 2532 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 2533 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 2534 | "dependencies": { 2535 | "encodeurl": "~1.0.2", 2536 | "escape-html": "~1.0.3", 2537 | "parseurl": "~1.3.3", 2538 | "send": "0.18.0" 2539 | }, 2540 | "engines": { 2541 | "node": ">= 0.8.0" 2542 | } 2543 | }, 2544 | "node_modules/set-blocking": { 2545 | "version": "2.0.0", 2546 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 2547 | "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" 2548 | }, 2549 | "node_modules/setprototypeof": { 2550 | "version": "1.2.0", 2551 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 2552 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 2553 | }, 2554 | "node_modules/shebang-command": { 2555 | "version": "2.0.0", 2556 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2557 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2558 | "dev": true, 2559 | "dependencies": { 2560 | "shebang-regex": "^3.0.0" 2561 | }, 2562 | "engines": { 2563 | "node": ">=8" 2564 | } 2565 | }, 2566 | "node_modules/shebang-regex": { 2567 | "version": "3.0.0", 2568 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2569 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2570 | "dev": true, 2571 | "engines": { 2572 | "node": ">=8" 2573 | } 2574 | }, 2575 | "node_modules/side-channel": { 2576 | "version": "1.0.4", 2577 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 2578 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 2579 | "dependencies": { 2580 | "call-bind": "^1.0.0", 2581 | "get-intrinsic": "^1.0.2", 2582 | "object-inspect": "^1.9.0" 2583 | }, 2584 | "funding": { 2585 | "url": "https://github.com/sponsors/ljharb" 2586 | } 2587 | }, 2588 | "node_modules/signal-exit": { 2589 | "version": "4.0.2", 2590 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", 2591 | "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", 2592 | "dev": true, 2593 | "engines": { 2594 | "node": ">=14" 2595 | }, 2596 | "funding": { 2597 | "url": "https://github.com/sponsors/isaacs" 2598 | } 2599 | }, 2600 | "node_modules/smart-buffer": { 2601 | "version": "4.2.0", 2602 | "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", 2603 | "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", 2604 | "optional": true, 2605 | "engines": { 2606 | "node": ">= 6.0.0", 2607 | "npm": ">= 3.0.0" 2608 | } 2609 | }, 2610 | "node_modules/socks": { 2611 | "version": "2.7.1", 2612 | "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", 2613 | "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", 2614 | "optional": true, 2615 | "dependencies": { 2616 | "ip": "^2.0.0", 2617 | "smart-buffer": "^4.2.0" 2618 | }, 2619 | "engines": { 2620 | "node": ">= 10.13.0", 2621 | "npm": ">= 3.0.0" 2622 | } 2623 | }, 2624 | "node_modules/socks-proxy-agent": { 2625 | "version": "6.2.1", 2626 | "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", 2627 | "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", 2628 | "optional": true, 2629 | "dependencies": { 2630 | "agent-base": "^6.0.2", 2631 | "debug": "^4.3.3", 2632 | "socks": "^2.6.2" 2633 | }, 2634 | "engines": { 2635 | "node": ">= 10" 2636 | } 2637 | }, 2638 | "node_modules/socks-proxy-agent/node_modules/debug": { 2639 | "version": "4.3.4", 2640 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 2641 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 2642 | "optional": true, 2643 | "dependencies": { 2644 | "ms": "2.1.2" 2645 | }, 2646 | "engines": { 2647 | "node": ">=6.0" 2648 | }, 2649 | "peerDependenciesMeta": { 2650 | "supports-color": { 2651 | "optional": true 2652 | } 2653 | } 2654 | }, 2655 | "node_modules/socks-proxy-agent/node_modules/ms": { 2656 | "version": "2.1.2", 2657 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2658 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 2659 | "optional": true 2660 | }, 2661 | "node_modules/source-map": { 2662 | "version": "0.6.1", 2663 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 2664 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 2665 | "dev": true, 2666 | "engines": { 2667 | "node": ">=0.10.0" 2668 | } 2669 | }, 2670 | "node_modules/source-map-support": { 2671 | "version": "0.5.21", 2672 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", 2673 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", 2674 | "dev": true, 2675 | "dependencies": { 2676 | "buffer-from": "^1.0.0", 2677 | "source-map": "^0.6.0" 2678 | } 2679 | }, 2680 | "node_modules/sqlite": { 2681 | "version": "4.2.1", 2682 | "resolved": "https://registry.npmjs.org/sqlite/-/sqlite-4.2.1.tgz", 2683 | "integrity": "sha512-Tll0Ndvnwkuv5Hn6WIbh26rZiYQORuH1t5m/or9LUpSmDmmyFG89G9fKrSeugMPxwmEIXoVxqTun4LbizTs4uw==" 2684 | }, 2685 | "node_modules/sqlite3": { 2686 | "version": "5.1.6", 2687 | "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.6.tgz", 2688 | "integrity": "sha512-olYkWoKFVNSSSQNvxVUfjiVbz3YtBwTJj+mfV5zpHmqW3sELx2Cf4QCdirMelhM5Zh+KDVaKgQHqCxrqiWHybw==", 2689 | "hasInstallScript": true, 2690 | "dependencies": { 2691 | "@mapbox/node-pre-gyp": "^1.0.0", 2692 | "node-addon-api": "^4.2.0", 2693 | "tar": "^6.1.11" 2694 | }, 2695 | "optionalDependencies": { 2696 | "node-gyp": "8.x" 2697 | }, 2698 | "peerDependencies": { 2699 | "node-gyp": "8.x" 2700 | }, 2701 | "peerDependenciesMeta": { 2702 | "node-gyp": { 2703 | "optional": true 2704 | } 2705 | } 2706 | }, 2707 | "node_modules/ssri": { 2708 | "version": "8.0.1", 2709 | "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", 2710 | "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", 2711 | "optional": true, 2712 | "dependencies": { 2713 | "minipass": "^3.1.1" 2714 | }, 2715 | "engines": { 2716 | "node": ">= 8" 2717 | } 2718 | }, 2719 | "node_modules/ssri/node_modules/minipass": { 2720 | "version": "3.3.6", 2721 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", 2722 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 2723 | "optional": true, 2724 | "dependencies": { 2725 | "yallist": "^4.0.0" 2726 | }, 2727 | "engines": { 2728 | "node": ">=8" 2729 | } 2730 | }, 2731 | "node_modules/statuses": { 2732 | "version": "2.0.1", 2733 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 2734 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 2735 | "engines": { 2736 | "node": ">= 0.8" 2737 | } 2738 | }, 2739 | "node_modules/string_decoder": { 2740 | "version": "1.3.0", 2741 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 2742 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 2743 | "dependencies": { 2744 | "safe-buffer": "~5.2.0" 2745 | } 2746 | }, 2747 | "node_modules/string-width": { 2748 | "version": "5.1.2", 2749 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 2750 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 2751 | "dev": true, 2752 | "dependencies": { 2753 | "eastasianwidth": "^0.2.0", 2754 | "emoji-regex": "^9.2.2", 2755 | "strip-ansi": "^7.0.1" 2756 | }, 2757 | "engines": { 2758 | "node": ">=12" 2759 | }, 2760 | "funding": { 2761 | "url": "https://github.com/sponsors/sindresorhus" 2762 | } 2763 | }, 2764 | "node_modules/string-width-cjs": { 2765 | "name": "string-width", 2766 | "version": "4.2.3", 2767 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2768 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2769 | "dev": true, 2770 | "dependencies": { 2771 | "emoji-regex": "^8.0.0", 2772 | "is-fullwidth-code-point": "^3.0.0", 2773 | "strip-ansi": "^6.0.1" 2774 | } 2775 | }, 2776 | "node_modules/string-width-cjs/node_modules/ansi-regex": { 2777 | "version": "5.0.1", 2778 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2779 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2780 | "dev": true, 2781 | "engines": { 2782 | "node": ">=8" 2783 | } 2784 | }, 2785 | "node_modules/string-width-cjs/node_modules/emoji-regex": { 2786 | "version": "8.0.0", 2787 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2788 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 2789 | "dev": true 2790 | }, 2791 | "node_modules/string-width-cjs/node_modules/strip-ansi": { 2792 | "version": "6.0.1", 2793 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2794 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2795 | "dev": true, 2796 | "dependencies": { 2797 | "ansi-regex": "^5.0.1" 2798 | }, 2799 | "engines": { 2800 | "node": ">=8" 2801 | } 2802 | }, 2803 | "node_modules/strip-ansi": { 2804 | "version": "7.1.0", 2805 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 2806 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 2807 | "dev": true, 2808 | "dependencies": { 2809 | "ansi-regex": "^6.0.1" 2810 | }, 2811 | "engines": { 2812 | "node": ">=12" 2813 | }, 2814 | "funding": { 2815 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 2816 | } 2817 | }, 2818 | "node_modules/strip-ansi-cjs": { 2819 | "name": "strip-ansi", 2820 | "version": "6.0.1", 2821 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2822 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2823 | "dev": true, 2824 | "dependencies": { 2825 | "ansi-regex": "^5.0.1" 2826 | } 2827 | }, 2828 | "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { 2829 | "version": "5.0.1", 2830 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2831 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2832 | "dev": true, 2833 | "engines": { 2834 | "node": ">=8" 2835 | } 2836 | }, 2837 | "node_modules/strip-bom": { 2838 | "version": "3.0.0", 2839 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 2840 | "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", 2841 | "engines": { 2842 | "node": ">=4" 2843 | } 2844 | }, 2845 | "node_modules/strip-json-comments": { 2846 | "version": "2.0.1", 2847 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 2848 | "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", 2849 | "dev": true, 2850 | "engines": { 2851 | "node": ">=0.10.0" 2852 | } 2853 | }, 2854 | "node_modules/supports-preserve-symlinks-flag": { 2855 | "version": "1.0.0", 2856 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 2857 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 2858 | "dev": true, 2859 | "engines": { 2860 | "node": ">= 0.4" 2861 | }, 2862 | "funding": { 2863 | "url": "https://github.com/sponsors/ljharb" 2864 | } 2865 | }, 2866 | "node_modules/tar": { 2867 | "version": "6.1.15", 2868 | "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", 2869 | "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", 2870 | "dependencies": { 2871 | "chownr": "^2.0.0", 2872 | "fs-minipass": "^2.0.0", 2873 | "minipass": "^5.0.0", 2874 | "minizlib": "^2.1.1", 2875 | "mkdirp": "^1.0.3", 2876 | "yallist": "^4.0.0" 2877 | }, 2878 | "engines": { 2879 | "node": ">=10" 2880 | } 2881 | }, 2882 | "node_modules/tar/node_modules/minipass": { 2883 | "version": "5.0.0", 2884 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", 2885 | "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", 2886 | "engines": { 2887 | "node": ">=8" 2888 | } 2889 | }, 2890 | "node_modules/to-regex-range": { 2891 | "version": "5.0.1", 2892 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2893 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2894 | "dev": true, 2895 | "dependencies": { 2896 | "is-number": "^7.0.0" 2897 | }, 2898 | "engines": { 2899 | "node": ">=8.0" 2900 | } 2901 | }, 2902 | "node_modules/toidentifier": { 2903 | "version": "1.0.1", 2904 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 2905 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 2906 | "engines": { 2907 | "node": ">=0.6" 2908 | } 2909 | }, 2910 | "node_modules/tr46": { 2911 | "version": "0.0.3", 2912 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 2913 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" 2914 | }, 2915 | "node_modules/tree-kill": { 2916 | "version": "1.2.2", 2917 | "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", 2918 | "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", 2919 | "dev": true, 2920 | "bin": { 2921 | "tree-kill": "cli.js" 2922 | } 2923 | }, 2924 | "node_modules/ts-node": { 2925 | "version": "10.9.1", 2926 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", 2927 | "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", 2928 | "dev": true, 2929 | "dependencies": { 2930 | "@cspotcode/source-map-support": "^0.8.0", 2931 | "@tsconfig/node10": "^1.0.7", 2932 | "@tsconfig/node12": "^1.0.7", 2933 | "@tsconfig/node14": "^1.0.0", 2934 | "@tsconfig/node16": "^1.0.2", 2935 | "acorn": "^8.4.1", 2936 | "acorn-walk": "^8.1.1", 2937 | "arg": "^4.1.0", 2938 | "create-require": "^1.1.0", 2939 | "diff": "^4.0.1", 2940 | "make-error": "^1.1.1", 2941 | "v8-compile-cache-lib": "^3.0.1", 2942 | "yn": "3.1.1" 2943 | }, 2944 | "bin": { 2945 | "ts-node": "dist/bin.js", 2946 | "ts-node-cwd": "dist/bin-cwd.js", 2947 | "ts-node-esm": "dist/bin-esm.js", 2948 | "ts-node-script": "dist/bin-script.js", 2949 | "ts-node-transpile-only": "dist/bin-transpile.js", 2950 | "ts-script": "dist/bin-script-deprecated.js" 2951 | }, 2952 | "peerDependencies": { 2953 | "@swc/core": ">=1.2.50", 2954 | "@swc/wasm": ">=1.2.50", 2955 | "@types/node": "*", 2956 | "typescript": ">=2.7" 2957 | }, 2958 | "peerDependenciesMeta": { 2959 | "@swc/core": { 2960 | "optional": true 2961 | }, 2962 | "@swc/wasm": { 2963 | "optional": true 2964 | } 2965 | } 2966 | }, 2967 | "node_modules/ts-node-dev": { 2968 | "version": "2.0.0", 2969 | "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-2.0.0.tgz", 2970 | "integrity": "sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==", 2971 | "dev": true, 2972 | "dependencies": { 2973 | "chokidar": "^3.5.1", 2974 | "dynamic-dedupe": "^0.3.0", 2975 | "minimist": "^1.2.6", 2976 | "mkdirp": "^1.0.4", 2977 | "resolve": "^1.0.0", 2978 | "rimraf": "^2.6.1", 2979 | "source-map-support": "^0.5.12", 2980 | "tree-kill": "^1.2.2", 2981 | "ts-node": "^10.4.0", 2982 | "tsconfig": "^7.0.0" 2983 | }, 2984 | "bin": { 2985 | "ts-node-dev": "lib/bin.js", 2986 | "tsnd": "lib/bin.js" 2987 | }, 2988 | "engines": { 2989 | "node": ">=0.8.0" 2990 | }, 2991 | "peerDependencies": { 2992 | "node-notifier": "*", 2993 | "typescript": "*" 2994 | }, 2995 | "peerDependenciesMeta": { 2996 | "node-notifier": { 2997 | "optional": true 2998 | } 2999 | } 3000 | }, 3001 | "node_modules/ts-node-dev/node_modules/brace-expansion": { 3002 | "version": "1.1.11", 3003 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 3004 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 3005 | "dev": true, 3006 | "dependencies": { 3007 | "balanced-match": "^1.0.0", 3008 | "concat-map": "0.0.1" 3009 | } 3010 | }, 3011 | "node_modules/ts-node-dev/node_modules/glob": { 3012 | "version": "7.2.3", 3013 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 3014 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 3015 | "dev": true, 3016 | "dependencies": { 3017 | "fs.realpath": "^1.0.0", 3018 | "inflight": "^1.0.4", 3019 | "inherits": "2", 3020 | "minimatch": "^3.1.1", 3021 | "once": "^1.3.0", 3022 | "path-is-absolute": "^1.0.0" 3023 | }, 3024 | "engines": { 3025 | "node": "*" 3026 | }, 3027 | "funding": { 3028 | "url": "https://github.com/sponsors/isaacs" 3029 | } 3030 | }, 3031 | "node_modules/ts-node-dev/node_modules/minimatch": { 3032 | "version": "3.1.2", 3033 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 3034 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 3035 | "dev": true, 3036 | "dependencies": { 3037 | "brace-expansion": "^1.1.7" 3038 | }, 3039 | "engines": { 3040 | "node": "*" 3041 | } 3042 | }, 3043 | "node_modules/ts-node-dev/node_modules/rimraf": { 3044 | "version": "2.7.1", 3045 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 3046 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 3047 | "dev": true, 3048 | "dependencies": { 3049 | "glob": "^7.1.3" 3050 | }, 3051 | "bin": { 3052 | "rimraf": "bin.js" 3053 | } 3054 | }, 3055 | "node_modules/tsconfig": { 3056 | "version": "7.0.0", 3057 | "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", 3058 | "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", 3059 | "dev": true, 3060 | "dependencies": { 3061 | "@types/strip-bom": "^3.0.0", 3062 | "@types/strip-json-comments": "0.0.30", 3063 | "strip-bom": "^3.0.0", 3064 | "strip-json-comments": "^2.0.0" 3065 | } 3066 | }, 3067 | "node_modules/tsconfig-paths": { 3068 | "version": "4.2.0", 3069 | "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", 3070 | "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", 3071 | "dependencies": { 3072 | "json5": "^2.2.2", 3073 | "minimist": "^1.2.6", 3074 | "strip-bom": "^3.0.0" 3075 | }, 3076 | "engines": { 3077 | "node": ">=6" 3078 | } 3079 | }, 3080 | "node_modules/type-is": { 3081 | "version": "1.6.18", 3082 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 3083 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 3084 | "dependencies": { 3085 | "media-typer": "0.3.0", 3086 | "mime-types": "~2.1.24" 3087 | }, 3088 | "engines": { 3089 | "node": ">= 0.6" 3090 | } 3091 | }, 3092 | "node_modules/typescript": { 3093 | "version": "5.1.3", 3094 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", 3095 | "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", 3096 | "dev": true, 3097 | "bin": { 3098 | "tsc": "bin/tsc", 3099 | "tsserver": "bin/tsserver" 3100 | }, 3101 | "engines": { 3102 | "node": ">=14.17" 3103 | } 3104 | }, 3105 | "node_modules/unique-filename": { 3106 | "version": "1.1.1", 3107 | "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", 3108 | "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", 3109 | "optional": true, 3110 | "dependencies": { 3111 | "unique-slug": "^2.0.0" 3112 | } 3113 | }, 3114 | "node_modules/unique-slug": { 3115 | "version": "2.0.2", 3116 | "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", 3117 | "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", 3118 | "optional": true, 3119 | "dependencies": { 3120 | "imurmurhash": "^0.1.4" 3121 | } 3122 | }, 3123 | "node_modules/unpipe": { 3124 | "version": "1.0.0", 3125 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 3126 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 3127 | "engines": { 3128 | "node": ">= 0.8" 3129 | } 3130 | }, 3131 | "node_modules/util-deprecate": { 3132 | "version": "1.0.2", 3133 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 3134 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 3135 | }, 3136 | "node_modules/utils-merge": { 3137 | "version": "1.0.1", 3138 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 3139 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 3140 | "engines": { 3141 | "node": ">= 0.4.0" 3142 | } 3143 | }, 3144 | "node_modules/v8-compile-cache-lib": { 3145 | "version": "3.0.1", 3146 | "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", 3147 | "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", 3148 | "dev": true 3149 | }, 3150 | "node_modules/vary": { 3151 | "version": "1.1.2", 3152 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 3153 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 3154 | "engines": { 3155 | "node": ">= 0.8" 3156 | } 3157 | }, 3158 | "node_modules/webidl-conversions": { 3159 | "version": "3.0.1", 3160 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 3161 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" 3162 | }, 3163 | "node_modules/whatwg-url": { 3164 | "version": "5.0.0", 3165 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 3166 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 3167 | "dependencies": { 3168 | "tr46": "~0.0.3", 3169 | "webidl-conversions": "^3.0.0" 3170 | } 3171 | }, 3172 | "node_modules/which": { 3173 | "version": "2.0.2", 3174 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 3175 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 3176 | "devOptional": true, 3177 | "dependencies": { 3178 | "isexe": "^2.0.0" 3179 | }, 3180 | "bin": { 3181 | "node-which": "bin/node-which" 3182 | }, 3183 | "engines": { 3184 | "node": ">= 8" 3185 | } 3186 | }, 3187 | "node_modules/wide-align": { 3188 | "version": "1.1.5", 3189 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", 3190 | "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", 3191 | "dependencies": { 3192 | "string-width": "^1.0.2 || 2 || 3 || 4" 3193 | } 3194 | }, 3195 | "node_modules/wide-align/node_modules/ansi-regex": { 3196 | "version": "5.0.1", 3197 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 3198 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 3199 | "engines": { 3200 | "node": ">=8" 3201 | } 3202 | }, 3203 | "node_modules/wide-align/node_modules/emoji-regex": { 3204 | "version": "8.0.0", 3205 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 3206 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 3207 | }, 3208 | "node_modules/wide-align/node_modules/string-width": { 3209 | "version": "4.2.3", 3210 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 3211 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 3212 | "dependencies": { 3213 | "emoji-regex": "^8.0.0", 3214 | "is-fullwidth-code-point": "^3.0.0", 3215 | "strip-ansi": "^6.0.1" 3216 | }, 3217 | "engines": { 3218 | "node": ">=8" 3219 | } 3220 | }, 3221 | "node_modules/wide-align/node_modules/strip-ansi": { 3222 | "version": "6.0.1", 3223 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 3224 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 3225 | "dependencies": { 3226 | "ansi-regex": "^5.0.1" 3227 | }, 3228 | "engines": { 3229 | "node": ">=8" 3230 | } 3231 | }, 3232 | "node_modules/wrap-ansi": { 3233 | "version": "8.1.0", 3234 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 3235 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 3236 | "dev": true, 3237 | "dependencies": { 3238 | "ansi-styles": "^6.1.0", 3239 | "string-width": "^5.0.1", 3240 | "strip-ansi": "^7.0.1" 3241 | }, 3242 | "engines": { 3243 | "node": ">=12" 3244 | }, 3245 | "funding": { 3246 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 3247 | } 3248 | }, 3249 | "node_modules/wrap-ansi-cjs": { 3250 | "name": "wrap-ansi", 3251 | "version": "7.0.0", 3252 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 3253 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 3254 | "dev": true, 3255 | "dependencies": { 3256 | "ansi-styles": "^4.0.0", 3257 | "string-width": "^4.1.0", 3258 | "strip-ansi": "^6.0.0" 3259 | } 3260 | }, 3261 | "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { 3262 | "version": "5.0.1", 3263 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 3264 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 3265 | "dev": true, 3266 | "engines": { 3267 | "node": ">=8" 3268 | } 3269 | }, 3270 | "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { 3271 | "version": "4.3.0", 3272 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 3273 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 3274 | "dev": true, 3275 | "dependencies": { 3276 | "color-convert": "^2.0.1" 3277 | }, 3278 | "engines": { 3279 | "node": ">=8" 3280 | }, 3281 | "funding": { 3282 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 3283 | } 3284 | }, 3285 | "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { 3286 | "version": "8.0.0", 3287 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 3288 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 3289 | "dev": true 3290 | }, 3291 | "node_modules/wrap-ansi-cjs/node_modules/string-width": { 3292 | "version": "4.2.3", 3293 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 3294 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 3295 | "dev": true, 3296 | "dependencies": { 3297 | "emoji-regex": "^8.0.0", 3298 | "is-fullwidth-code-point": "^3.0.0", 3299 | "strip-ansi": "^6.0.1" 3300 | }, 3301 | "engines": { 3302 | "node": ">=8" 3303 | } 3304 | }, 3305 | "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { 3306 | "version": "6.0.1", 3307 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 3308 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 3309 | "dev": true, 3310 | "dependencies": { 3311 | "ansi-regex": "^5.0.1" 3312 | }, 3313 | "engines": { 3314 | "node": ">=8" 3315 | } 3316 | }, 3317 | "node_modules/wrappy": { 3318 | "version": "1.0.2", 3319 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3320 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 3321 | }, 3322 | "node_modules/xtend": { 3323 | "version": "4.0.2", 3324 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 3325 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 3326 | "dev": true, 3327 | "engines": { 3328 | "node": ">=0.4" 3329 | } 3330 | }, 3331 | "node_modules/yallist": { 3332 | "version": "4.0.0", 3333 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 3334 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 3335 | }, 3336 | "node_modules/yn": { 3337 | "version": "3.1.1", 3338 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 3339 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 3340 | "dev": true, 3341 | "engines": { 3342 | "node": ">=6" 3343 | } 3344 | } 3345 | } 3346 | } 3347 | -------------------------------------------------------------------------------- /aula_08/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "clean-architecture", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "build": "rimraf dist/ && tsc", 8 | "dev": "ts-node-dev -r tsconfig-paths/register src/index.ts" 9 | }, 10 | "author": "", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "@types/node": "^20.2.5", 14 | "@types/sqlite3": "^3.1.8", 15 | "rimraf": "^5.0.1", 16 | "ts-node": "^10.9.1", 17 | "ts-node-dev": "^2.0.0", 18 | "typescript": "^5.1.3" 19 | }, 20 | "dependencies": { 21 | "@types/express": "^4.17.17", 22 | "body-parser": "^1.20.2", 23 | "express": "^4.18.2", 24 | "sqlite": "^4.2.1", 25 | "sqlite3": "^5.1.6", 26 | "tsconfig-paths": "^4.2.0" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /aula_08/requirements.md: -------------------------------------------------------------------------------- 1 | # o que precisa ter? 2 | 3 | - registrar estudante 4 | - registrar disciplina 5 | - matricular pessoa 6 | - listar estudantes 7 | - listar disciplinas 8 | - listar estudantes por disciplina 9 | - listar disciplinas por estudantes 10 | 11 | 12 | -------------------------------------------------------------------------------- /aula_08/src/adapters/disciplina.ts: -------------------------------------------------------------------------------- 1 | import { Disciplina } from "@entities/disciplina"; 2 | 3 | interface DisciplinaOut { 4 | nome: string; 5 | id: string; 6 | } 7 | 8 | export const DisciplinaAdapter = { 9 | adaptJsonDisciplinas: function (dados: Disciplina[] | null): string { 10 | if (dados === null) { 11 | return JSON.stringify({}); 12 | } 13 | let alldata = dados.map(function (item) { 14 | return { nome: item.nome, id: item.id }; 15 | }); 16 | return JSON.stringify(alldata); 17 | }, 18 | }; 19 | -------------------------------------------------------------------------------- /aula_08/src/adapters/estudante.ts: -------------------------------------------------------------------------------- 1 | import { Estudante } from "@entities"; 2 | 3 | interface EstudanteOut { 4 | nome: string; 5 | id: string; 6 | } 7 | 8 | export const EstudanteAdapter = { 9 | adaptJsonEstudantes: function (dados: Estudante[] | null): string { 10 | if (dados === null) { 11 | return JSON.stringify({}); 12 | } 13 | let alldata = dados.map(function (item) { 14 | return { nome: item.nome, id: item.id }; 15 | }); 16 | return JSON.stringify(alldata); 17 | }, 18 | }; 19 | -------------------------------------------------------------------------------- /aula_08/src/adapters/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./disciplina"; 2 | export * from "./estudante"; 3 | -------------------------------------------------------------------------------- /aula_08/src/api/index.ts: -------------------------------------------------------------------------------- 1 | import { DisciplinaController } from "@controllers/disciplina"; 2 | import { EstudanteController } from "@controllers/estudante"; 3 | import { MatriculaController } from "@controllers/matricula"; 4 | import { Disciplina } from "@entities/disciplina"; 5 | import { Estudante } from "@entities/estudante"; 6 | import { Matricula } from "@entities/matricula"; 7 | import { DbConnection } from "@interfaces/dbconnection"; 8 | 9 | import { Request, Response } from "express"; 10 | 11 | export class FaculdadeApp { 12 | private _dbconnection: DbConnection; 13 | 14 | constructor(dbconnection: DbConnection) { 15 | this._dbconnection = dbconnection; 16 | } 17 | 18 | start() { 19 | const express = require("express"); 20 | const bodyParser = require("body-parser"); 21 | 22 | const app = express(); 23 | app.use(bodyParser.json()); 24 | const port = 3000; 25 | 26 | app.get("/estudante", async (req: Request, res: Response) => { 27 | res.setHeader("Content-type", "application/json"); 28 | const estudantes = await EstudanteController.ObterTodosEstudantes( 29 | this._dbconnection 30 | ); 31 | res.send(estudantes); 32 | }); 33 | 34 | app.post("/estudante", async (req: Request, res: Response) => { 35 | const nomeEstudante: string = req.body.nome; 36 | 37 | await EstudanteController.IncluirEstudante( 38 | nomeEstudante, 39 | this._dbconnection 40 | ) 41 | .then((r) => { 42 | res 43 | .status(201) 44 | .send({ success: true, message: "Registrado com sucesso!" }); 45 | }) 46 | .catch((err) => { 47 | res.status(400).send({ success: false, message: err }); 48 | }); 49 | }); 50 | 51 | app.post("/disciplina", async (req: Request, res: Response) => { 52 | const nomeDisciplina: string = req.body.nome; 53 | 54 | await DisciplinaController.IncluirDisciplina( 55 | nomeDisciplina, 56 | this._dbconnection 57 | ) 58 | .then(() => { 59 | res 60 | .status(201) 61 | .send({ success: true, message: "Registrado com sucesso!" }); 62 | }) 63 | .catch((err) => { 64 | res.status(400).send({ success: false, message: err }); 65 | }); 66 | }); 67 | 68 | app.get("/disciplina", async (req: Request, res: Response) => { 69 | res.setHeader("Content-type", "application/json"); 70 | const disciplinas = await DisciplinaController.ObterTodasDisciplinas( 71 | this._dbconnection 72 | ); 73 | res.send(disciplinas); 74 | }); 75 | 76 | app.post("/matricula", async (req: Request, res: Response) => { 77 | // registrar um estudante em uma disciplina 78 | const estudanteId: number = parseInt(req.body.estudante); 79 | const disciplinaId: number = parseInt(req.body.disciplina); 80 | 81 | await MatriculaController.MatricularEstudanteEmDisciplina( 82 | estudanteId, 83 | disciplinaId, 84 | this._dbconnection 85 | ) 86 | .then(() => { 87 | res.status(201).send({ 88 | success: true, 89 | message: "Matricula efetuada com sucesso.", 90 | }); 91 | }) 92 | .catch((err) => { 93 | res.status(400).send({ success: false, message: err }); 94 | }); 95 | }); 96 | 97 | // obter disciplinas de estudante 98 | app.get("/matricula/estudante/:id", async (req: Request, res: Response) => { 99 | const estudanteId = parseInt(req.params.id); 100 | const disciplinas = 101 | await MatriculaController.ObterDisciplinasPorEstudante( 102 | estudanteId, 103 | this._dbconnection 104 | ); 105 | res.send(disciplinas); 106 | }); 107 | 108 | // obter estudantes de disciplina 109 | app.get( 110 | "/matricula/disciplina/:id", 111 | async (req: Request, res: Response) => { 112 | const disciplinaId = parseInt(req.params.id); 113 | const estudantes = 114 | await MatriculaController.ObterEstudantesPorDisciplina( 115 | disciplinaId, 116 | this._dbconnection 117 | ); 118 | res.send(estudantes); 119 | } 120 | ); 121 | 122 | app.listen(port, () => { 123 | console.log(`Faculdade app listening on port ${port}`); 124 | }); 125 | } 126 | } 127 | -------------------------------------------------------------------------------- /aula_08/src/controllers/disciplina.ts: -------------------------------------------------------------------------------- 1 | import { DisciplinaGateway } from "@gateways/disciplina"; 2 | import { EstudanteGateway } from "@gateways/disciplina"; 3 | import { DbConnection } from "@interfaces/dbconnection"; 4 | import { DisciplinaUseCases } from "@usecases"; 5 | import { DisciplinaAdapter } from "../adapters/disciplina"; 6 | 7 | export class DisciplinaController { 8 | static async ObterTodasDisciplinas( 9 | dbconnection: DbConnection 10 | ): Promise { 11 | const disciplinaGateway = new DisciplinaGateway(dbconnection); 12 | const todasAsDisciplinas = await DisciplinaUseCases.ObterTodasDisciplinas( 13 | disciplinaGateway 14 | ); // vai retornar Disciplina[] 15 | 16 | const adapted = DisciplinaAdapter.adaptJsonDisciplinas(todasAsDisciplinas); 17 | return adapted; 18 | } 19 | 20 | static async IncluirDisciplina( 21 | nome: string, 22 | dbconnection: DbConnection 23 | ): Promise { 24 | const disciplinaGateway = new DisciplinaGateway(dbconnection); 25 | const disciplina = await DisciplinaUseCases.IncluirDisciplina( 26 | nome, 27 | disciplinaGateway 28 | ).catch((err) => { 29 | return Promise.reject(err); 30 | }); 31 | } 32 | 33 | static async MatricularEstudante( 34 | disciplinaId: number, 35 | estudanteId: number, 36 | dbconnection: DbConnection 37 | ) {} 38 | } 39 | -------------------------------------------------------------------------------- /aula_08/src/controllers/estudante.ts: -------------------------------------------------------------------------------- 1 | import { EstudanteGateway } from "@gateways/estudante"; 2 | import { DbConnection } from "@interfaces/dbconnection"; 3 | import { EstudanteUseCases } from "@usecases"; 4 | import { EstudanteAdapter } from "@adapters"; 5 | 6 | export class EstudanteController { 7 | static async ObterTodosEstudantes( 8 | dbconnection: DbConnection 9 | ): Promise { 10 | const estudantesGateway = new EstudanteGateway(dbconnection); 11 | const todosOsEstudantes = await EstudanteUseCases.ObterTodosEstudantes( 12 | estudantesGateway 13 | ); 14 | 15 | const adapted = EstudanteAdapter.adaptJsonEstudantes(todosOsEstudantes); 16 | return adapted; 17 | } 18 | 19 | static async IncluirEstudante( 20 | nome: string, 21 | dbconnection: DbConnection 22 | ): Promise { 23 | const estudanteGateway = new EstudanteGateway(dbconnection); 24 | const estudante = await EstudanteUseCases.IncluirEstudante( 25 | nome, 26 | estudanteGateway 27 | ).catch((err) => { 28 | return Promise.reject(err); 29 | }); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /aula_08/src/controllers/matricula.ts: -------------------------------------------------------------------------------- 1 | import { Disciplina, Estudante } from "@entities"; 2 | import { 3 | DisciplinaGateway, 4 | EstudanteGateway, 5 | MatriculaGateway, 6 | } from "@gateways/matricula"; 7 | import { DbConnection } from "@interfaces/dbconnection"; 8 | import { MatriculaUseCases } from "@usecases"; 9 | import { DisciplinaAdapter, EstudanteAdapter } from "@adapters"; 10 | 11 | export class MatriculaController { 12 | static async ObterDisciplinasPorEstudante( 13 | estudanteId: number, 14 | dbconnection: DbConnection 15 | ): Promise { 16 | const matriculaGateway = new MatriculaGateway(dbconnection); 17 | const estudanteGateway = new EstudanteGateway(dbconnection); 18 | const disciplinaGateway = new DisciplinaGateway(dbconnection); 19 | const disciplinas = await MatriculaUseCases.ObterDisciplinasPorEstudante( 20 | estudanteId, 21 | matriculaGateway, 22 | estudanteGateway, 23 | disciplinaGateway 24 | ); 25 | 26 | return DisciplinaAdapter.adaptJsonDisciplinas(disciplinas); 27 | } 28 | 29 | static async ObterEstudantesPorDisciplina( 30 | disciplinaId: number, 31 | dbconnection: DbConnection 32 | ): Promise { 33 | const matriculaGateway = new MatriculaGateway(dbconnection); 34 | const estudanteGateway = new EstudanteGateway(dbconnection); 35 | const disciplinaGateway = new DisciplinaGateway(dbconnection); 36 | const estudantes = await MatriculaUseCases.ObterEstudantesPorDisciplina( 37 | disciplinaId, 38 | matriculaGateway, 39 | estudanteGateway, 40 | disciplinaGateway 41 | ); 42 | 43 | return EstudanteAdapter.adaptJsonEstudantes(estudantes); 44 | } 45 | 46 | static async MatricularEstudanteEmDisciplina( 47 | estudanteId: number, 48 | disciplinaId: number, 49 | dbconnection: DbConnection 50 | ): Promise { 51 | const matriculaGateway = new MatriculaGateway(dbconnection); 52 | const estudanteGateway = new EstudanteGateway(dbconnection); 53 | const disciplinaGateway = new DisciplinaGateway(dbconnection); 54 | 55 | const matricula = await MatriculaUseCases.MatricularEstudanteEmDisciplina( 56 | estudanteId, 57 | disciplinaId, 58 | matriculaGateway, 59 | estudanteGateway, 60 | disciplinaGateway 61 | ); 62 | 63 | if (matricula !== null && matricula !== undefined) { 64 | // gravar no banco de dados! 65 | await matriculaGateway.Incluir(matricula); 66 | } 67 | 68 | // se chegou aqui, deu tudo certo. 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /aula_08/src/entities/disciplina.ts: -------------------------------------------------------------------------------- 1 | export class Disciplina { 2 | private _nome: string; 3 | private _id: number; 4 | 5 | constructor(id: number, nome: string) { 6 | this._id = id; 7 | this._nome = nome; 8 | } 9 | 10 | get nome(): string { 11 | return this._nome; 12 | } 13 | 14 | get id(): number { 15 | return this._id; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /aula_08/src/entities/estudante.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Estudante com id = -1 é um novo estudante. 3 | */ 4 | 5 | export class Estudante { 6 | private _nome: string; 7 | private _id: number; 8 | 9 | constructor(id: number, nome: string) { 10 | this._id = id; 11 | this._nome = nome; 12 | } 13 | 14 | get nome(): string { 15 | return this._nome; 16 | } 17 | 18 | get id(): number { 19 | return this._id; 20 | } 21 | 22 | get isValid(): boolean { 23 | return this._id > 0; 24 | } 25 | } -------------------------------------------------------------------------------- /aula_08/src/entities/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./disciplina"; 2 | export * from "./estudante"; 3 | export * from "./matricula"; 4 | -------------------------------------------------------------------------------- /aula_08/src/entities/matricula.ts: -------------------------------------------------------------------------------- 1 | import { Disciplina } from "./disciplina"; 2 | import { Estudante } from "./estudante"; 3 | 4 | export class Matricula { 5 | private _estudante: Estudante; 6 | private _disciplina: Disciplina; 7 | 8 | constructor(estudante: Estudante, disciplina: Disciplina) { 9 | if (estudante == null) { 10 | throw new Error('Estudante invalido'); 11 | } 12 | if (disciplina == null) { 13 | throw new Error('Disciplina invalida'); 14 | } 15 | 16 | this._estudante = estudante; 17 | this._disciplina = disciplina; 18 | } 19 | 20 | get estudante(): Estudante { 21 | return this._estudante; 22 | } 23 | 24 | get disciplina(): Disciplina { 25 | return this._disciplina; 26 | } 27 | } -------------------------------------------------------------------------------- /aula_08/src/external/sqlite_database.ts: -------------------------------------------------------------------------------- 1 | import { DbConnection } from "@interfaces/dbconnection"; 2 | import { ParametroBd } from "@types"; 3 | import { open } from "sqlite"; 4 | 5 | const sqlite3 = require("sqlite3").verbose(); 6 | 7 | interface parametros { 8 | restricao: string; 9 | valores: any[]; 10 | } 11 | 12 | export class SqliteConnection implements DbConnection { 13 | private _dsn: string; 14 | 15 | constructor(dsn: string) { 16 | this._dsn = dsn; 17 | } 18 | 19 | private async openDatabase() { 20 | return await open({ filename: this._dsn, driver: sqlite3.Database }); 21 | } 22 | 23 | async BuscarTodas( 24 | nomeTabela: string, 25 | campos?: string[] | null 26 | ): Promise { 27 | // tratar os campos 28 | const camposBusca = this.ajustarCamposExpressao(campos); 29 | 30 | // construir o comando sql 31 | const sql = `SELECT ${camposBusca} FROM ${nomeTabela} `; 32 | const connection = await this.openDatabase(); 33 | const rows = await connection.all(sql, []); 34 | connection.close(); 35 | return rows; 36 | } 37 | 38 | async BuscarPorParametros( 39 | nomeTabela: string, 40 | campos: string[] | null, 41 | parametros: ParametroBd[] 42 | ): Promise { 43 | const camposBusca = this.ajustarCamposExpressao(campos); 44 | const parametrosBusca = this.prepararParametrosBusca(parametros); 45 | const sql = ` 46 | SELECT ${camposBusca} 47 | FROM ${nomeTabela} 48 | ${parametrosBusca.restricao} 49 | `; 50 | 51 | const connection = await this.openDatabase(); 52 | const rows = await connection.all(sql, parametrosBusca.valores); 53 | connection.close(); 54 | return rows; 55 | } 56 | 57 | async ObterUltimoId(nomeTabela: string): Promise { 58 | const sql = `SELECT seq FROM sqlite_sequence WHERE name=$t`; 59 | const params = { $t: nomeTabela }; 60 | const db = await this.openDatabase(); 61 | const result = await db.get(sql, params); 62 | 63 | if (result === null || result === undefined) { 64 | return 1; 65 | } 66 | 67 | return result.seq + 1; 68 | } 69 | 70 | async Inserir(nomeTabela: string, parametros: ParametroBd[]): Promise { 71 | const nomesCampos: string[] = []; 72 | const nomesValores: string[] = []; 73 | const valores: Record = {}; 74 | 75 | parametros.forEach(function (item) { 76 | nomesCampos.push(item.campo); 77 | const nomeValor = `$${item.campo}`; 78 | nomesValores.push(nomeValor); 79 | valores[nomeValor] = item.valor; 80 | }); 81 | 82 | const sql = ` 83 | INSERT INTO ${nomeTabela} 84 | (${nomesCampos.join(",")}) 85 | VALUES 86 | (${nomesValores.join(",")}) 87 | `; 88 | 89 | const bancoDados = await this.openDatabase(); 90 | const prepared = await bancoDados.prepare(sql, valores); 91 | prepared.run(); 92 | } 93 | 94 | // auxiliares 95 | 96 | private prepararParametrosBusca( 97 | params: ParametroBd[] | null | undefined 98 | ): parametros { 99 | if (params === null || params === undefined) { 100 | return { 101 | restricao: "", 102 | valores: [], 103 | }; 104 | } 105 | 106 | const camposRestricao: string[] = []; 107 | const valores: any[] = []; 108 | params.forEach(function (item) { 109 | camposRestricao.push(`${item.campo} = ?`); 110 | valores.push(item.valor); 111 | }); 112 | 113 | return { 114 | restricao: `WHERE ${camposRestricao.join(" AND ")}`, 115 | valores: valores, 116 | }; 117 | } 118 | 119 | private ajustarCamposExpressao(campos: string[] | undefined | null): string { 120 | if (campos === undefined || campos === null) { 121 | return " * "; 122 | } else if (campos.length == 0) { 123 | return " * "; 124 | } else { 125 | return campos.join(", "); 126 | } 127 | } 128 | } 129 | -------------------------------------------------------------------------------- /aula_08/src/gateways/disciplina.ts: -------------------------------------------------------------------------------- 1 | import { Disciplina } from "@entities/disciplina"; 2 | import { DbConnection } from "@interfaces/dbconnection"; 3 | import { DisciplinaGatewayInterface } from "@interfaces/gateways"; 4 | import { ParametroBd } from "@types"; 5 | 6 | export class DisciplinaGateway implements DisciplinaGatewayInterface { 7 | private repositorioDados: DbConnection; 8 | private nomeTabela = "disciplinas"; 9 | 10 | constructor(conexao: DbConnection) { 11 | this.repositorioDados = conexao; 12 | } 13 | 14 | public async BuscarPorId(id: number): Promise { 15 | const retornoBd = await this.repositorioDados.BuscarPorParametros( 16 | this.nomeTabela, 17 | null, 18 | [{ campo: "disciplina_id", valor: id }] 19 | ); 20 | if (retornoBd === null || retornoBd === undefined) return null; 21 | if (retornoBd.length < 1) return null; 22 | 23 | const row = retornoBd[0]; 24 | return new Disciplina(row.disciplina_id, row.nome); 25 | } 26 | 27 | public async BuscarPorNome(nome: string): Promise { 28 | const retornoBD = await this.repositorioDados.BuscarPorParametros( 29 | this.nomeTabela, 30 | null, 31 | [{ campo: "nome", valor: nome }] 32 | ); 33 | 34 | if (retornoBD === null || retornoBD === undefined) { 35 | return null; 36 | } 37 | 38 | if (retornoBD.length < 1) { 39 | return null; 40 | } 41 | 42 | const linhaRetorno = retornoBD[0]; 43 | const disciplina = new Disciplina( 44 | linhaRetorno.disciplina_id, 45 | linhaRetorno.nome 46 | ); 47 | 48 | return disciplina; 49 | } 50 | 51 | public async BuscarTodas(): Promise { 52 | const result = await this.repositorioDados.BuscarTodas( 53 | this.nomeTabela, 54 | null 55 | ); 56 | 57 | if (result === null) { 58 | return null; 59 | } else { 60 | const returnData: Disciplina[] = []; 61 | result.forEach((element: any) => { 62 | returnData.push(new Disciplina(element.disciplina_id, element.nome)); 63 | }); 64 | return returnData; 65 | } 66 | } 67 | 68 | public async Incluir(disciplina: Disciplina): Promise { 69 | const novoId = await this.repositorioDados.ObterUltimoId(this.nomeTabela); 70 | 71 | const parametros: ParametroBd[] = []; 72 | parametros.push({ campo: "disciplina_id", valor: novoId }); 73 | parametros.push({ campo: "nome", valor: disciplina.nome }); 74 | 75 | const sucesso = await this.repositorioDados.Inserir( 76 | this.nomeTabela, 77 | parametros 78 | ); 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /aula_08/src/gateways/estudante.ts: -------------------------------------------------------------------------------- 1 | import { Estudante } from "@entities"; 2 | import { DbConnection } from "@interfaces/dbconnection"; 3 | import { EstudanteGatewayInterface } from "@interfaces/gateways"; 4 | import { ParametroBd } from "@types"; 5 | 6 | export class EstudanteGateway implements EstudanteGatewayInterface { 7 | private repositorioDados: DbConnection; 8 | private nomeTabela = "estudantes"; 9 | 10 | constructor(database: DbConnection) { 11 | this.repositorioDados = database; 12 | } 13 | 14 | async BuscarPorId(id: number): Promise { 15 | const retornoBd = await this.repositorioDados.BuscarPorParametros( 16 | this.nomeTabela, 17 | null, 18 | [{ campo: "estudante_id", valor: id }] 19 | ); 20 | 21 | if (retornoBd === null || retornoBd === undefined) return null; 22 | if (retornoBd.length < 1) return null; 23 | 24 | const linhaRetorno = retornoBd[0]; 25 | return new Estudante(linhaRetorno.estudante_id, linhaRetorno.nome); 26 | } 27 | 28 | async BuscarPorNome(nome: string): Promise { 29 | const retornoBD = await this.repositorioDados.BuscarPorParametros( 30 | this.nomeTabela, 31 | null, 32 | [{ campo: "nome", valor: nome }] 33 | ); 34 | 35 | if (retornoBD === null || retornoBD === undefined) { 36 | return null; 37 | } 38 | 39 | if (retornoBD.length < 1) { 40 | return null; 41 | } 42 | 43 | const linhaRetorno = retornoBD[0]; 44 | const estudante = new Estudante( 45 | linhaRetorno.estudante_id, 46 | linhaRetorno.nome 47 | ); 48 | 49 | return estudante; 50 | } 51 | 52 | async BuscarTodos(): Promise { 53 | const result = await this.repositorioDados.BuscarTodas( 54 | this.nomeTabela, 55 | null 56 | ); 57 | 58 | if (result === null) { 59 | return null; 60 | } else { 61 | const returnData: Estudante[] = []; 62 | result.forEach((element: any) => { 63 | returnData.push(new Estudante(element.estudante_id, element.nome)); 64 | }); 65 | return returnData; 66 | } 67 | } 68 | 69 | async Incluir(estudante: Estudante): Promise { 70 | const novoId = await this.repositorioDados.ObterUltimoId(this.nomeTabela); 71 | 72 | const parametros: ParametroBd[] = []; 73 | parametros.push({ campo: "estudante_id", valor: novoId }); 74 | parametros.push({ campo: "nome", valor: estudante.nome }); 75 | 76 | const sucesso = await this.repositorioDados.Inserir( 77 | this.nomeTabela, 78 | parametros 79 | ); 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /aula_08/src/gateways/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./matricula"; 2 | export * from "./disciplina"; 3 | export * from "./estudante"; 4 | -------------------------------------------------------------------------------- /aula_08/src/gateways/matricula.ts: -------------------------------------------------------------------------------- 1 | import { Estudante, Matricula, Disciplina } from "@entities"; 2 | import { DbConnection } from "@interfaces/dbconnection"; 3 | import { MatriculaGatewayInterface } from "@interfaces/gateways"; 4 | import { ParametroBd } from "@types"; 5 | import { MatriculaDados } from "@types"; 6 | 7 | class MatriculaGateway implements MatriculaGatewayInterface { 8 | private connection: DbConnection; 9 | private nomeTabela = "matriculas"; 10 | 11 | constructor(database: DbConnection) { 12 | this.connection = database; 13 | } 14 | public async Buscar( 15 | estudante: Estudante, 16 | disciplina: Disciplina 17 | ): Promise { 18 | const resultado = await this.connection.BuscarPorParametros( 19 | this.nomeTabela, 20 | null, 21 | [ 22 | { campo: "disciplina_id", valor: disciplina.id }, 23 | { campo: "estudante_id", valor: estudante.id }, 24 | ] 25 | ); 26 | 27 | if (resultado === null || resultado === undefined) return null; 28 | if (resultado.length < 1) return null; 29 | 30 | return new Matricula(estudante, disciplina); 31 | } 32 | 33 | public async Incluir(matricula: Matricula): Promise { 34 | const parametros: ParametroBd[] = []; 35 | parametros.push({ campo: "disciplina_id", valor: matricula.disciplina.id }); 36 | parametros.push({ campo: "estudante_id", valor: matricula.estudante.id }); 37 | 38 | await this.connection.Inserir(this.nomeTabela, parametros); 39 | } 40 | 41 | public async BuscarPorEstudante( 42 | estudante: Estudante 43 | ): Promise { 44 | const parametros: ParametroBd[] = [ 45 | { campo: "estudante_id", valor: estudante.id }, 46 | ]; 47 | const listaMatriculasBd = await this.connection.BuscarPorParametros( 48 | this.nomeTabela, 49 | null, 50 | parametros 51 | ); 52 | if (listaMatriculasBd.length < 1) return []; 53 | 54 | const listaMatriculas: MatriculaDados[] = []; 55 | for (let p = 0; p < listaMatriculasBd.length; p++) { 56 | listaMatriculas.push({ 57 | estudanteId: estudante.id, 58 | disciplinaId: listaMatriculasBd[p].disciplina_id, 59 | }); 60 | } 61 | 62 | return listaMatriculas; 63 | } 64 | 65 | public async BuscarPorDisciplina( 66 | disciplina: Disciplina 67 | ): Promise { 68 | const parametros: ParametroBd[] = [ 69 | { campo: "disciplina_id", valor: disciplina.id }, 70 | ]; 71 | const listaMatriculasBd = await this.connection.BuscarPorParametros( 72 | this.nomeTabela, 73 | null, 74 | parametros 75 | ); 76 | if (listaMatriculasBd.length < 1) return []; 77 | 78 | const listaMatriculas: MatriculaDados[] = []; 79 | for (let p = 0; p < listaMatriculasBd.length; p++) { 80 | listaMatriculas.push({ 81 | estudanteId: listaMatriculasBd[p].estudante_id, 82 | disciplinaId: disciplina.id, 83 | }); 84 | } 85 | 86 | return listaMatriculas; 87 | } 88 | } 89 | 90 | export { MatriculaDados, MatriculaGateway }; 91 | -------------------------------------------------------------------------------- /aula_08/src/index.ts: -------------------------------------------------------------------------------- 1 | import { FaculdadeApp } from "./api"; 2 | import { SqliteConnection } from "@external/sqlite_database"; 3 | 4 | /** 5 | * 6 | * Este é o arquivo inicial. A partir dele iniciamos todo o resto. 7 | * Aqui já definimos o banco de dados usado, e passamos na criação do 8 | * da API. 9 | * 10 | */ 11 | 12 | const sqlconnection = new SqliteConnection( 13 | "/home/erick/work/fiap/fiap_cleanarch/ensino.sqlite3" 14 | ); 15 | const faculdadeApp = new FaculdadeApp(sqlconnection); 16 | faculdadeApp.start(); 17 | -------------------------------------------------------------------------------- /aula_08/src/interfaces/dbconnection.ts: -------------------------------------------------------------------------------- 1 | import { ParametroBd } from "@types"; 2 | 3 | export interface DbConnection { 4 | BuscarPorParametros( 5 | nomeTabela: string, 6 | campos: string[] | null, 7 | parametros: ParametroBd[] 8 | ): Promise; 9 | 10 | BuscarTodas(nomeTabela: string, campos?: string[] | null): Promise; 11 | 12 | Inserir(nomeTabela: string, parametros: ParametroBd[]): Promise; 13 | 14 | ObterUltimoId(nomeTabela: string): Promise; 15 | } 16 | -------------------------------------------------------------------------------- /aula_08/src/interfaces/gateways.ts: -------------------------------------------------------------------------------- 1 | import { Disciplina } from "@entities/disciplina"; 2 | import { Estudante } from "@entities/estudante"; 3 | import { Matricula } from "@entities/matricula"; 4 | import { MatriculaDados } from "src/gateways"; 5 | 6 | interface DisciplinaGatewayInterface { 7 | BuscarPorId(id: number): Promise; 8 | BuscarPorNome(nome: string): Promise; 9 | BuscarTodas(): Promise; 10 | Incluir(disciplina: Disciplina): Promise; 11 | } 12 | 13 | interface MatriculaGatewayInterface { 14 | Buscar( 15 | estudante: Estudante, 16 | disciplina: Disciplina 17 | ): Promise; 18 | Incluir(matricula: Matricula): Promise; 19 | BuscarPorEstudante(estudante: Estudante): Promise; 20 | BuscarPorDisciplina(disciplina: Disciplina): Promise; 21 | } 22 | 23 | interface EstudanteGatewayInterface { 24 | BuscarPorNome(nome: string): Promise; 25 | BuscarPorId(id: number): Promise; 26 | BuscarTodos(): Promise; 27 | Incluir(estudante: Estudante): Promise; 28 | } 29 | 30 | export { 31 | DisciplinaGatewayInterface, 32 | EstudanteGatewayInterface, 33 | MatriculaGatewayInterface, 34 | }; 35 | -------------------------------------------------------------------------------- /aula_08/src/types/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./parametrobd"; 2 | export * from "./matriculadados"; 3 | -------------------------------------------------------------------------------- /aula_08/src/types/matriculadados.ts: -------------------------------------------------------------------------------- 1 | export interface MatriculaDados { 2 | estudanteId: number; 3 | disciplinaId: number; 4 | } 5 | -------------------------------------------------------------------------------- /aula_08/src/types/parametrobd.ts: -------------------------------------------------------------------------------- 1 | type ParametroBd = { 2 | campo: string; 3 | valor: any; 4 | }; 5 | 6 | export { ParametroBd }; 7 | -------------------------------------------------------------------------------- /aula_08/src/usecases/disciplina.ts: -------------------------------------------------------------------------------- 1 | import { Disciplina } from "@entities/disciplina"; 2 | import { DbConnection } from "@interfaces/dbconnection"; 3 | import { DisciplinaGatewayInterface } from "@interfaces/gateways"; 4 | import { DisciplinaGateway } from "src/gateways"; 5 | 6 | export class DisciplinaUseCases { 7 | static async ObterTodasDisciplinas( 8 | disciplinasGateway: DisciplinaGatewayInterface 9 | ): Promise { 10 | const todasAsDisciplinas = await disciplinasGateway.BuscarTodas(); 11 | return todasAsDisciplinas; 12 | } 13 | 14 | static async IncluirDisciplina( 15 | nome: string, 16 | disciplinasGateway: DisciplinaGatewayInterface 17 | ) { 18 | const disciplina = await disciplinasGateway.BuscarPorNome(nome); 19 | 20 | if (disciplina !== null) return Promise.reject("Disciplina já existente"); 21 | 22 | const novaDisciplina = new Disciplina(-1, nome); 23 | disciplinasGateway.Incluir(novaDisciplina); 24 | return true; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /aula_08/src/usecases/estudante.ts: -------------------------------------------------------------------------------- 1 | import { Estudante } from "@entities/estudante"; 2 | import { EstudanteGatewayInterface } from "@interfaces/gateways"; 3 | 4 | class EstudanteUseCases { 5 | static async ObterTodosEstudantes( 6 | estudantesGateway: EstudanteGatewayInterface 7 | ): Promise { 8 | const todosOsEstudantes = await estudantesGateway.BuscarTodos(); 9 | return todosOsEstudantes; 10 | } 11 | 12 | static async IncluirEstudante( 13 | nome: string, 14 | estudanteGateway: EstudanteGatewayInterface 15 | ): Promise { 16 | // aqui eh o usecase. eu tenho que verificar se o estudante ja existe. 17 | const estudante = await estudanteGateway.BuscarPorNome(nome); 18 | 19 | if (estudante !== null) return Promise.reject("Estudante ja existente"); 20 | 21 | const novoEstudante = new Estudante(-1, nome); 22 | const resultadoInclusao = await estudanteGateway.Incluir(novoEstudante); 23 | return true; 24 | } 25 | } 26 | 27 | export { EstudanteUseCases }; 28 | -------------------------------------------------------------------------------- /aula_08/src/usecases/index.ts: -------------------------------------------------------------------------------- 1 | export * from './disciplina'; 2 | export * from './estudante'; 3 | export * from './matricula'; -------------------------------------------------------------------------------- /aula_08/src/usecases/matricula.ts: -------------------------------------------------------------------------------- 1 | import { Disciplina, Estudante, Matricula } from "@entities"; 2 | import { MatriculaDados } from "@types"; 3 | import { 4 | DisciplinaGatewayInterface, 5 | EstudanteGatewayInterface, 6 | MatriculaGatewayInterface, 7 | } from "@interfaces/gateways"; 8 | import { 9 | MatriculaGateway, 10 | EstudanteGateway, 11 | DisciplinaGateway, 12 | } from "src/gateways"; 13 | 14 | export class MatriculaUseCases { 15 | static async ObterEstudantesPorDisciplina( 16 | disciplinaId: number, 17 | matriculaGateway: MatriculaGatewayInterface, 18 | estudanteGateway: EstudanteGatewayInterface, 19 | disciplinaGateway: DisciplinaGatewayInterface 20 | ) { 21 | const disciplina = await disciplinaGateway.BuscarPorId(disciplinaId); 22 | if (disciplina === null) return Promise.reject("Disciplina nao encontrada"); 23 | 24 | const matriculasDisciplina: MatriculaDados[] = 25 | await matriculaGateway.BuscarPorDisciplina(disciplina); 26 | 27 | if (matriculasDisciplina === null || matriculasDisciplina === undefined) 28 | return []; 29 | 30 | const estudantesDisciplina: Estudante[] = []; 31 | for (let i = 0; i < matriculasDisciplina.length; i++) { 32 | const estudante = await estudanteGateway.BuscarPorId( 33 | matriculasDisciplina[i].estudanteId 34 | ); 35 | if (estudante !== null) estudantesDisciplina.push(estudante); 36 | } 37 | return estudantesDisciplina; 38 | } 39 | static async ObterDisciplinasPorEstudante( 40 | estudanteId: number, 41 | matriculaGateway: MatriculaGatewayInterface, 42 | estudanteGateway: EstudanteGatewayInterface, 43 | disciplinaGateway: DisciplinaGatewayInterface 44 | ): Promise { 45 | const estudante = await estudanteGateway.BuscarPorId(estudanteId); 46 | if (estudante === null) return Promise.reject("Estudante nao encontrado"); 47 | 48 | const matriculasEstudante: MatriculaDados[] = 49 | await matriculaGateway.BuscarPorEstudante(estudante); 50 | 51 | if (matriculasEstudante === null || matriculasEstudante === undefined) 52 | return []; 53 | 54 | const disciplinasEstudante: Disciplina[] = []; 55 | for (let i = 0; i < matriculasEstudante.length; i++) { 56 | const disciplina = await disciplinaGateway.BuscarPorId( 57 | matriculasEstudante[i].disciplinaId 58 | ); 59 | if (disciplina !== null) disciplinasEstudante.push(disciplina); 60 | } 61 | 62 | return disciplinasEstudante; 63 | } 64 | 65 | static async MatricularEstudanteEmDisciplina( 66 | estudanteId: number, 67 | disciplinaId: number, 68 | matriculaGateway: MatriculaGatewayInterface, 69 | estudanteGateway: EstudanteGatewayInterface, 70 | disciplinaGateway: DisciplinaGatewayInterface 71 | ): Promise { 72 | // estudante existe? 73 | const estudante = await estudanteGateway.BuscarPorId(estudanteId); 74 | if (estudante === null) return Promise.reject("Estudante nao encontrado"); 75 | 76 | // disciplina existe? 77 | const disciplina = await disciplinaGateway.BuscarPorId(disciplinaId); 78 | if (disciplina === null) return Promise.reject("Disciplina nao encontrada"); 79 | 80 | // ja existe estudante essa disciplina? 81 | const matriculaExistente = await matriculaGateway.Buscar( 82 | estudante, 83 | disciplina 84 | ); 85 | if (matriculaExistente !== null) 86 | return Promise.reject("Matrícula ja efetuada"); 87 | 88 | // como tudo está correto, podemos dar andamento! 89 | const matriculaNova = new Matricula(estudante, disciplina); 90 | return matriculaNova; 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /aula_08/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2016", 4 | "module": "commonjs", 5 | "rootDir": "./src", 6 | "esModuleInterop": true, 7 | "forceConsistentCasingInFileNames": true, 8 | "strict": true, 9 | "skipLibCheck": true, 10 | "outDir": "./dist", 11 | "moduleResolution": "node", 12 | "baseUrl": ".", 13 | "paths": { 14 | "@controllers/*": ["./src/controllers/*"], 15 | "@interfaces/*": ["./src/interfaces/*"], 16 | "@usecases/*": ["./src/usecases/*"], 17 | "@usecases": ["./src/usecases/index.ts"], 18 | "@entities/*": ["./src/entities/*"], 19 | "@external/*": ["./src/external/*"], 20 | "@types/*": ["./src/types/"], 21 | "@types": ["./src/types/index.ts"], 22 | "@gateways/*": ["./src/gateways/"], 23 | "@entities": ["./src/entities/index.ts"], 24 | "@adapters": ["./src/adapters/index.ts"] 25 | } 26 | }, 27 | "include": ["src/**/*"] 28 | } 29 | --------------------------------------------------------------------------------