├── .circleci └── config.yml ├── .editorconfig ├── .eslintrc.js ├── .gitignore ├── .prettierrc ├── LICENSE ├── README.md ├── docker-compose.yml ├── docker_fish_history ├── package-lock.json ├── package.json ├── src ├── index.js └── utils.js └── test ├── index.js ├── schemas ├── catalog.json ├── client.json ├── façade.json ├── person.json ├── personFaçade.json ├── reffab.json ├── refforfab.json └── tax.json └── spec.js /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2.1 2 | 3 | jobs: 4 | test: 5 | working_directory: ~/repo 6 | docker: 7 | - image: cimg/node:23.9.0 8 | environment: 9 | NODE_ENV: test 10 | POSTGRES_HOST: 127.0.0.1 11 | MSSQL_HOST: 127.0.0.1 12 | MSSQL_PASSWORD: Passw0rd 13 | MSSQL_USER: sa 14 | POSTGRES_USER: postgres 15 | POSTGRES_PASSWORD: postgres 16 | - image: mcr.microsoft.com/mssql/server:2022-CU14-ubuntu-20.04 17 | environment: 18 | ACCEPT_EULA: Y 19 | SA_PASSWORD: Passw0rd 20 | - image: postgres:15.2-alpine 21 | environment: 22 | POSTGRES_USER: postgres 23 | POSTGRES_PASSWORD: postgres 24 | steps: 25 | - checkout 26 | - restore_cache: 27 | name: Restore NPM Package Cache 28 | keys: 29 | - npm-packages-{{ checksum "package-lock.json" }} 30 | - run: 31 | name: Install dependencies 32 | command: | 33 | npm install 34 | - save_cache: 35 | name: Save NPM Package Cache 36 | key: npm-packages-{{ checksum "package-lock.json" }} 37 | paths: 38 | - ~/.cache/npm 39 | - run: 40 | name: Waiting for postgres to be ready 41 | command: | 42 | for i in `seq 1 10`; 43 | do 44 | nc -z localhost 5432 && echo Success && exit 0 45 | echo -n . 46 | sleep 1 47 | done 48 | echo Failed waiting for postgres && exit 1 49 | - run: 50 | name: Waiting for mssql to be ready 51 | command: | 52 | for i in `seq 1 10`; 53 | do 54 | nc -z localhost 1433 && echo Success && exit 0 55 | echo -n . 56 | sleep 1 57 | done 58 | echo Failed waiting for mssql && exit 1 59 | - run: 60 | name: Tests 61 | command: | 62 | npm test 63 | - persist_to_workspace: 64 | root: ~/repo 65 | paths: . 66 | 67 | publish: 68 | working_directory: ~/repo 69 | docker: 70 | - image: cimg/node:23.9.0 71 | steps: 72 | - attach_workspace: 73 | at: ~/repo 74 | - run: 75 | name: Publish package 76 | command: | 77 | PACK=$(npm view . name) 78 | PUBLISHED_VERSION=$(npm view "$PACK" version) 79 | PACKAGE_VERSION=$(cat package.json \ 80 | | grep version \ 81 | | head -1 \ 82 | | awk -F: '{ print $2 }' \ 83 | | sed 's/[", ]//g') 84 | echo Package=$PACK, Published version=$PUBLISHED_VERSION, Package version=$PACKAGE_VERSION 85 | if [ "$PUBLISHED_VERSION" == "$PACKAGE_VERSION" ]; then 86 | echo " => Not publishing" 87 | else 88 | echo " => Will publish" 89 | npm set //registry.npmjs.org/:_authToken=$NPM_TOKEN 90 | npm publish 91 | fi 92 | 93 | workflows: 94 | test-n-publish: 95 | jobs: 96 | - test 97 | - publish: 98 | requires: 99 | - test 100 | filters: 101 | branches: 102 | only: master 103 | 104 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | charset = utf-8 7 | trim_trailing_whitespace = true 8 | insert_final_newline = true 9 | 10 | [*.md] 11 | trim_trailing_whitespace = false 12 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: 'google', 3 | parserOptions: { 4 | ecmaVersion: 2018 5 | }, 6 | env: { 7 | node: true, 8 | es6: true, 9 | mocha: true 10 | }, 11 | rules: { 12 | 'generator-star-spacing': [ 13 | 'error', 14 | { 15 | before: true, 16 | after: false 17 | } 18 | ], 19 | 'comma-dangle': 0, 20 | semi: ['error', 'never'], 21 | 'require-jsdoc': 0, 22 | 'valid-jsdoc': 0, 23 | 'new-cap': 0, 24 | 'quote-props': 0, 25 | 'no-extra-parens': 0, 26 | 'arrow-parens': ['error', 'as-needed'], 27 | 'yield-star-spacing': ['error', {before: true, after: false}], 28 | 'max-len': [ 29 | 'error', 30 | { 31 | ignoreComments: true, 32 | ignoreStrings: true, 33 | ignoreTemplateLiterals: true 34 | } 35 | ], 36 | 'no-var': 0, 37 | camelcase: 0, 38 | 'no-invalid-this': 0, 39 | 'no-undef': 2, 40 | 'no-unreachable': 2 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .history 3 | .nyc_output 4 | yarn-error.log 5 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": false, 3 | "arrowParens": "avoid", 4 | "trailingComma": "none", 5 | "bracketSpacing": false, 6 | "singleQuote": true, 7 | "printWidth": 70 8 | } 9 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2025 Andre Gloria (andrglo.com) 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 13 | all 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 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # json-schema-table [![NPM version][npm-image]][npm-url] [![Dependency Status][daviddm-image]][daviddm-url] [![CircleCI](https://circleci.com/gh/andrglo/json-schema-table.svg?style=svg)](https://circleci.com/gh/andrglo/json-schema-table) 2 | > Creates and maintains a SQL table structure equivalent to a 3 | json schema definition. For MSSQL and Postgres 4 | 5 | First you create all your tables and then syncronizes then 6 | with each other to create the references. You can sync whenever 7 | you modify your json schema 8 | 9 | ## Install 10 | 11 | ```sh 12 | $ npm install --save json-schema-table 13 | ``` 14 | 15 | ## Usage 16 | 17 | ```js 18 | var jsonSchemaTable = require('json-schema-table'); 19 | var pg = require('pg-cr-layer'); 20 | var studentSchema = require('./student.json'); 21 | var classSchema = require('./class.json'); 22 | 23 | // initialize and connect to a database 24 | 25 | var studentTable = jsonSchemaTable('person', studentSchema, {db: pg}); 26 | var classTable = jsonSchemaTable('student', classSchema, {db: pg}); 27 | 28 | // First create then sync to build the references 29 | studentTable.create().then(function() { 30 | return classTable.create(); 31 | }).then(function() { 32 | return studentTable.sync(); 33 | }).then(function() { 34 | return classTable.sync(); 35 | }).catch(function(error) { 36 | console.log(error); 37 | }); 38 | ``` 39 | For the db connection you can use [mssql-cr-layer](https://github.com/andrglo/mssql-cr-layer) 40 | or [pg-cr-layer](https://github.com/andrglo/pg-cr-layer) 41 | 42 | To more details take a look at the tests 43 | 44 | ## License 45 | 46 | MIT © [Andre Gloria](andrglo.com) 47 | 48 | 49 | [npm-image]: https://badge.fury.io/js/json-schema-table.svg 50 | [npm-url]: https://npmjs.org/package/json-schema-table 51 | [daviddm-image]: https://david-dm.org/andrglo/json-schema-table.svg?theme=shields.io 52 | [daviddm-url]: https://david-dm.org/andrglo/json-schema-table 53 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | dms: 4 | image: andrglo/everest:latest 5 | hostname: json-schema-table 6 | container_name: json-schema-table-dms-1 7 | command: tail -f /dev/null 8 | working_dir: /root/json-schema-table 9 | volumes: 10 | - ./docker_fish_history:/root/.config/fish/fish_history 11 | - .:/root/json-schema-table 12 | environment: 13 | - NODE_ENV=test 14 | - MSSQL_PASSWORD=Passw0rd 15 | - MSSQL_HOST=mssql 16 | - POSTGRES_HOST=postgres 17 | restart: always 18 | 19 | mssql: 20 | image: mcr.microsoft.com/mssql/server:2022-CU14-ubuntu-20.04 21 | container_name: json-schema-table-mssql-1 22 | environment: 23 | - ACCEPT_EULA=Y 24 | - SA_PASSWORD=Passw0rd 25 | restart: always 26 | 27 | postgres: 28 | image: andrglo/postgres:15 29 | container_name: json-schema-table-postges-1 30 | environment: 31 | - POSTGRES_USER=postgres 32 | - POSTGRES_PASSWORD=postgres 33 | restart: always 34 | -------------------------------------------------------------------------------- /docker_fish_history: -------------------------------------------------------------------------------- 1 | - cmd: ncu --interactive --format group 2 | when: 1470615608 3 | - cmd: nc -zv postgres 5432 4 | when: 1470615608 5 | - cmd: nc -zv mssql 1433 6 | when: 1470615608 7 | - cmd: npm test 8 | when: 1470615608 9 | 10 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "json-schema-table", 3 | "version": "2.0.1", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "json-schema-table", 9 | "version": "2.0.1", 10 | "license": "MIT", 11 | "dependencies": { 12 | "lodash": "^4.17.21" 13 | }, 14 | "devDependencies": { 15 | "chai": "^5.2.0", 16 | "eslint": "^9.22.0", 17 | "eslint-config-google": "^0.14.0", 18 | "mocha": "^11.1.0", 19 | "mssql-cr-layer": "^3.0.2", 20 | "pg-cr-layer": "^2.0.24" 21 | } 22 | }, 23 | "node_modules/@azure/abort-controller": { 24 | "version": "2.1.2", 25 | "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", 26 | "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", 27 | "dev": true, 28 | "license": "MIT", 29 | "dependencies": { 30 | "tslib": "^2.6.2" 31 | }, 32 | "engines": { 33 | "node": ">=18.0.0" 34 | } 35 | }, 36 | "node_modules/@azure/core-auth": { 37 | "version": "1.9.0", 38 | "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.9.0.tgz", 39 | "integrity": "sha512-FPwHpZywuyasDSLMqJ6fhbOK3TqUdviZNF8OqRGA4W5Ewib2lEEZ+pBsYcBa88B2NGO/SEnYPGhyBqNlE8ilSw==", 40 | "dev": true, 41 | "license": "MIT", 42 | "dependencies": { 43 | "@azure/abort-controller": "^2.0.0", 44 | "@azure/core-util": "^1.11.0", 45 | "tslib": "^2.6.2" 46 | }, 47 | "engines": { 48 | "node": ">=18.0.0" 49 | } 50 | }, 51 | "node_modules/@azure/core-client": { 52 | "version": "1.9.3", 53 | "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.9.3.tgz", 54 | "integrity": "sha512-/wGw8fJ4mdpJ1Cum7s1S+VQyXt1ihwKLzfabS1O/RDADnmzVc01dHn44qD0BvGH6KlZNzOMW95tEpKqhkCChPA==", 55 | "dev": true, 56 | "license": "MIT", 57 | "dependencies": { 58 | "@azure/abort-controller": "^2.0.0", 59 | "@azure/core-auth": "^1.4.0", 60 | "@azure/core-rest-pipeline": "^1.9.1", 61 | "@azure/core-tracing": "^1.0.0", 62 | "@azure/core-util": "^1.6.1", 63 | "@azure/logger": "^1.0.0", 64 | "tslib": "^2.6.2" 65 | }, 66 | "engines": { 67 | "node": ">=18.0.0" 68 | } 69 | }, 70 | "node_modules/@azure/core-http-compat": { 71 | "version": "2.2.0", 72 | "resolved": "https://registry.npmjs.org/@azure/core-http-compat/-/core-http-compat-2.2.0.tgz", 73 | "integrity": "sha512-1kW8ZhN0CfbNOG6C688z5uh2yrzALE7dDXHiR9dY4vt+EbhGZQSbjDa5bQd2rf3X2pdWMsXbqbArxUyeNdvtmg==", 74 | "dev": true, 75 | "license": "MIT", 76 | "dependencies": { 77 | "@azure/abort-controller": "^2.0.0", 78 | "@azure/core-client": "^1.3.0", 79 | "@azure/core-rest-pipeline": "^1.19.0" 80 | }, 81 | "engines": { 82 | "node": ">=18.0.0" 83 | } 84 | }, 85 | "node_modules/@azure/core-lro": { 86 | "version": "2.7.2", 87 | "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.7.2.tgz", 88 | "integrity": "sha512-0YIpccoX8m/k00O7mDDMdJpbr6mf1yWo2dfmxt5A8XVZVVMz2SSKaEbMCeJRvgQ0IaSlqhjT47p4hVIRRy90xw==", 89 | "dev": true, 90 | "license": "MIT", 91 | "dependencies": { 92 | "@azure/abort-controller": "^2.0.0", 93 | "@azure/core-util": "^1.2.0", 94 | "@azure/logger": "^1.0.0", 95 | "tslib": "^2.6.2" 96 | }, 97 | "engines": { 98 | "node": ">=18.0.0" 99 | } 100 | }, 101 | "node_modules/@azure/core-paging": { 102 | "version": "1.6.2", 103 | "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.6.2.tgz", 104 | "integrity": "sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA==", 105 | "dev": true, 106 | "license": "MIT", 107 | "dependencies": { 108 | "tslib": "^2.6.2" 109 | }, 110 | "engines": { 111 | "node": ">=18.0.0" 112 | } 113 | }, 114 | "node_modules/@azure/core-rest-pipeline": { 115 | "version": "1.19.1", 116 | "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.19.1.tgz", 117 | "integrity": "sha512-zHeoI3NCs53lLBbWNzQycjnYKsA1CVKlnzSNuSFcUDwBp8HHVObePxrM7HaX+Ha5Ks639H7chNC9HOaIhNS03w==", 118 | "dev": true, 119 | "license": "MIT", 120 | "dependencies": { 121 | "@azure/abort-controller": "^2.0.0", 122 | "@azure/core-auth": "^1.8.0", 123 | "@azure/core-tracing": "^1.0.1", 124 | "@azure/core-util": "^1.11.0", 125 | "@azure/logger": "^1.0.0", 126 | "http-proxy-agent": "^7.0.0", 127 | "https-proxy-agent": "^7.0.0", 128 | "tslib": "^2.6.2" 129 | }, 130 | "engines": { 131 | "node": ">=18.0.0" 132 | } 133 | }, 134 | "node_modules/@azure/core-tracing": { 135 | "version": "1.2.0", 136 | "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.2.0.tgz", 137 | "integrity": "sha512-UKTiEJPkWcESPYJz3X5uKRYyOcJD+4nYph+KpfdPRnQJVrZfk0KJgdnaAWKfhsBBtAf/D58Az4AvCJEmWgIBAg==", 138 | "dev": true, 139 | "license": "MIT", 140 | "dependencies": { 141 | "tslib": "^2.6.2" 142 | }, 143 | "engines": { 144 | "node": ">=18.0.0" 145 | } 146 | }, 147 | "node_modules/@azure/core-util": { 148 | "version": "1.11.0", 149 | "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.11.0.tgz", 150 | "integrity": "sha512-DxOSLua+NdpWoSqULhjDyAZTXFdP/LKkqtYuxxz1SCN289zk3OG8UOpnCQAz/tygyACBtWp/BoO72ptK7msY8g==", 151 | "dev": true, 152 | "license": "MIT", 153 | "dependencies": { 154 | "@azure/abort-controller": "^2.0.0", 155 | "tslib": "^2.6.2" 156 | }, 157 | "engines": { 158 | "node": ">=18.0.0" 159 | } 160 | }, 161 | "node_modules/@azure/identity": { 162 | "version": "4.7.0", 163 | "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.7.0.tgz", 164 | "integrity": "sha512-6z/S2KorkbKaZ0DgZFVRdu7RCuATmMSTjKpuhj7YpjxkJ0vnJ7kTM3cpNgzFgk9OPYfZ31wrBEtC/iwAS4jQDA==", 165 | "dev": true, 166 | "license": "MIT", 167 | "dependencies": { 168 | "@azure/abort-controller": "^2.0.0", 169 | "@azure/core-auth": "^1.9.0", 170 | "@azure/core-client": "^1.9.2", 171 | "@azure/core-rest-pipeline": "^1.17.0", 172 | "@azure/core-tracing": "^1.0.0", 173 | "@azure/core-util": "^1.11.0", 174 | "@azure/logger": "^1.0.0", 175 | "@azure/msal-browser": "^4.2.0", 176 | "@azure/msal-node": "^3.2.1", 177 | "events": "^3.0.0", 178 | "jws": "^4.0.0", 179 | "open": "^10.1.0", 180 | "stoppable": "^1.1.0", 181 | "tslib": "^2.2.0" 182 | }, 183 | "engines": { 184 | "node": ">=18.0.0" 185 | } 186 | }, 187 | "node_modules/@azure/keyvault-common": { 188 | "version": "2.0.0", 189 | "resolved": "https://registry.npmjs.org/@azure/keyvault-common/-/keyvault-common-2.0.0.tgz", 190 | "integrity": "sha512-wRLVaroQtOqfg60cxkzUkGKrKMsCP6uYXAOomOIysSMyt1/YM0eUn9LqieAWM8DLcU4+07Fio2YGpPeqUbpP9w==", 191 | "dev": true, 192 | "license": "MIT", 193 | "dependencies": { 194 | "@azure/abort-controller": "^2.0.0", 195 | "@azure/core-auth": "^1.3.0", 196 | "@azure/core-client": "^1.5.0", 197 | "@azure/core-rest-pipeline": "^1.8.0", 198 | "@azure/core-tracing": "^1.0.0", 199 | "@azure/core-util": "^1.10.0", 200 | "@azure/logger": "^1.1.4", 201 | "tslib": "^2.2.0" 202 | }, 203 | "engines": { 204 | "node": ">=18.0.0" 205 | } 206 | }, 207 | "node_modules/@azure/keyvault-keys": { 208 | "version": "4.9.0", 209 | "resolved": "https://registry.npmjs.org/@azure/keyvault-keys/-/keyvault-keys-4.9.0.tgz", 210 | "integrity": "sha512-ZBP07+K4Pj3kS4TF4XdkqFcspWwBHry3vJSOFM5k5ZABvf7JfiMonvaFk2nBF6xjlEbMpz5PE1g45iTMme0raQ==", 211 | "dev": true, 212 | "license": "MIT", 213 | "dependencies": { 214 | "@azure/abort-controller": "^2.0.0", 215 | "@azure/core-auth": "^1.3.0", 216 | "@azure/core-client": "^1.5.0", 217 | "@azure/core-http-compat": "^2.0.1", 218 | "@azure/core-lro": "^2.2.0", 219 | "@azure/core-paging": "^1.1.1", 220 | "@azure/core-rest-pipeline": "^1.8.1", 221 | "@azure/core-tracing": "^1.0.0", 222 | "@azure/core-util": "^1.0.0", 223 | "@azure/keyvault-common": "^2.0.0", 224 | "@azure/logger": "^1.0.0", 225 | "tslib": "^2.2.0" 226 | }, 227 | "engines": { 228 | "node": ">=18.0.0" 229 | } 230 | }, 231 | "node_modules/@azure/logger": { 232 | "version": "1.1.4", 233 | "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.1.4.tgz", 234 | "integrity": "sha512-4IXXzcCdLdlXuCG+8UKEwLA1T1NHqUfanhXYHiQTn+6sfWCZXduqbtXDGceg3Ce5QxTGo7EqmbV6Bi+aqKuClQ==", 235 | "dev": true, 236 | "license": "MIT", 237 | "dependencies": { 238 | "tslib": "^2.6.2" 239 | }, 240 | "engines": { 241 | "node": ">=18.0.0" 242 | } 243 | }, 244 | "node_modules/@azure/msal-browser": { 245 | "version": "4.5.1", 246 | "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-4.5.1.tgz", 247 | "integrity": "sha512-vcva6qA4ytVjg52Ew+RxXGKRuoDMdvNOwT+kECNC36kujYalFQe9B5SNud4WVa/Zk12KFa0bkOHFnjP8cgDv3A==", 248 | "dev": true, 249 | "license": "MIT", 250 | "dependencies": { 251 | "@azure/msal-common": "15.2.0" 252 | }, 253 | "engines": { 254 | "node": ">=0.8.0" 255 | } 256 | }, 257 | "node_modules/@azure/msal-common": { 258 | "version": "15.2.0", 259 | "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.2.0.tgz", 260 | "integrity": "sha512-HiYfGAKthisUYqHG1nImCf/uzcyS31wng3o+CycWLIM9chnYJ9Lk6jZ30Y6YiYYpTQ9+z/FGUpiKKekd3Arc0A==", 261 | "dev": true, 262 | "license": "MIT", 263 | "engines": { 264 | "node": ">=0.8.0" 265 | } 266 | }, 267 | "node_modules/@azure/msal-node": { 268 | "version": "3.2.3", 269 | "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-3.2.3.tgz", 270 | "integrity": "sha512-0eaPqBIWEAizeYiXdeHb09Iq0tvHJ17ztvNEaLdr/KcJJhJxbpkkEQf09DB+vKlFE0tzYi7j4rYLTXtES/InEQ==", 271 | "dev": true, 272 | "license": "MIT", 273 | "dependencies": { 274 | "@azure/msal-common": "15.2.0", 275 | "jsonwebtoken": "^9.0.0", 276 | "uuid": "^8.3.0" 277 | }, 278 | "engines": { 279 | "node": ">=16" 280 | } 281 | }, 282 | "node_modules/@eslint-community/eslint-utils": { 283 | "version": "4.5.0", 284 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.0.tgz", 285 | "integrity": "sha512-RoV8Xs9eNwiDvhv7M+xcL4PWyRyIXRY/FLp3buU4h1EYfdF7unWUy3dOjPqb3C7rMUewIcqwW850PgS8h1o1yg==", 286 | "dev": true, 287 | "license": "MIT", 288 | "dependencies": { 289 | "eslint-visitor-keys": "^3.4.3" 290 | }, 291 | "engines": { 292 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 293 | }, 294 | "funding": { 295 | "url": "https://opencollective.com/eslint" 296 | }, 297 | "peerDependencies": { 298 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 299 | } 300 | }, 301 | "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { 302 | "version": "3.4.3", 303 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 304 | "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 305 | "dev": true, 306 | "license": "Apache-2.0", 307 | "engines": { 308 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 309 | }, 310 | "funding": { 311 | "url": "https://opencollective.com/eslint" 312 | } 313 | }, 314 | "node_modules/@eslint-community/regexpp": { 315 | "version": "4.12.1", 316 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", 317 | "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", 318 | "dev": true, 319 | "license": "MIT", 320 | "engines": { 321 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 322 | } 323 | }, 324 | "node_modules/@eslint/config-array": { 325 | "version": "0.19.2", 326 | "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", 327 | "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", 328 | "dev": true, 329 | "license": "Apache-2.0", 330 | "dependencies": { 331 | "@eslint/object-schema": "^2.1.6", 332 | "debug": "^4.3.1", 333 | "minimatch": "^3.1.2" 334 | }, 335 | "engines": { 336 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 337 | } 338 | }, 339 | "node_modules/@eslint/config-helpers": { 340 | "version": "0.1.0", 341 | "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.1.0.tgz", 342 | "integrity": "sha512-kLrdPDJE1ckPo94kmPPf9Hfd0DU0Jw6oKYrhe+pwSC0iTUInmTa+w6fw8sGgcfkFJGNdWOUeOaDM4quW4a7OkA==", 343 | "dev": true, 344 | "license": "Apache-2.0", 345 | "engines": { 346 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 347 | } 348 | }, 349 | "node_modules/@eslint/core": { 350 | "version": "0.12.0", 351 | "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", 352 | "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", 353 | "dev": true, 354 | "license": "Apache-2.0", 355 | "dependencies": { 356 | "@types/json-schema": "^7.0.15" 357 | }, 358 | "engines": { 359 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 360 | } 361 | }, 362 | "node_modules/@eslint/eslintrc": { 363 | "version": "3.3.0", 364 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.0.tgz", 365 | "integrity": "sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==", 366 | "dev": true, 367 | "license": "MIT", 368 | "dependencies": { 369 | "ajv": "^6.12.4", 370 | "debug": "^4.3.2", 371 | "espree": "^10.0.1", 372 | "globals": "^14.0.0", 373 | "ignore": "^5.2.0", 374 | "import-fresh": "^3.2.1", 375 | "js-yaml": "^4.1.0", 376 | "minimatch": "^3.1.2", 377 | "strip-json-comments": "^3.1.1" 378 | }, 379 | "engines": { 380 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 381 | }, 382 | "funding": { 383 | "url": "https://opencollective.com/eslint" 384 | } 385 | }, 386 | "node_modules/@eslint/js": { 387 | "version": "9.22.0", 388 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.22.0.tgz", 389 | "integrity": "sha512-vLFajx9o8d1/oL2ZkpMYbkLv8nDB6yaIwFNt7nI4+I80U/z03SxmfOMsLbvWr3p7C+Wnoh//aOu2pQW8cS0HCQ==", 390 | "dev": true, 391 | "license": "MIT", 392 | "engines": { 393 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 394 | } 395 | }, 396 | "node_modules/@eslint/object-schema": { 397 | "version": "2.1.6", 398 | "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", 399 | "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", 400 | "dev": true, 401 | "license": "Apache-2.0", 402 | "engines": { 403 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 404 | } 405 | }, 406 | "node_modules/@eslint/plugin-kit": { 407 | "version": "0.2.7", 408 | "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz", 409 | "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==", 410 | "dev": true, 411 | "license": "Apache-2.0", 412 | "dependencies": { 413 | "@eslint/core": "^0.12.0", 414 | "levn": "^0.4.1" 415 | }, 416 | "engines": { 417 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 418 | } 419 | }, 420 | "node_modules/@humanfs/core": { 421 | "version": "0.19.1", 422 | "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", 423 | "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", 424 | "dev": true, 425 | "license": "Apache-2.0", 426 | "engines": { 427 | "node": ">=18.18.0" 428 | } 429 | }, 430 | "node_modules/@humanfs/node": { 431 | "version": "0.16.6", 432 | "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", 433 | "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", 434 | "dev": true, 435 | "license": "Apache-2.0", 436 | "dependencies": { 437 | "@humanfs/core": "^0.19.1", 438 | "@humanwhocodes/retry": "^0.3.0" 439 | }, 440 | "engines": { 441 | "node": ">=18.18.0" 442 | } 443 | }, 444 | "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { 445 | "version": "0.3.1", 446 | "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", 447 | "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", 448 | "dev": true, 449 | "license": "Apache-2.0", 450 | "engines": { 451 | "node": ">=18.18" 452 | }, 453 | "funding": { 454 | "type": "github", 455 | "url": "https://github.com/sponsors/nzakas" 456 | } 457 | }, 458 | "node_modules/@humanwhocodes/module-importer": { 459 | "version": "1.0.1", 460 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 461 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 462 | "dev": true, 463 | "license": "Apache-2.0", 464 | "engines": { 465 | "node": ">=12.22" 466 | }, 467 | "funding": { 468 | "type": "github", 469 | "url": "https://github.com/sponsors/nzakas" 470 | } 471 | }, 472 | "node_modules/@humanwhocodes/retry": { 473 | "version": "0.4.2", 474 | "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", 475 | "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", 476 | "dev": true, 477 | "license": "Apache-2.0", 478 | "engines": { 479 | "node": ">=18.18" 480 | }, 481 | "funding": { 482 | "type": "github", 483 | "url": "https://github.com/sponsors/nzakas" 484 | } 485 | }, 486 | "node_modules/@isaacs/cliui": { 487 | "version": "8.0.2", 488 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 489 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 490 | "dev": true, 491 | "license": "ISC", 492 | "dependencies": { 493 | "string-width": "^5.1.2", 494 | "string-width-cjs": "npm:string-width@^4.2.0", 495 | "strip-ansi": "^7.0.1", 496 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 497 | "wrap-ansi": "^8.1.0", 498 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 499 | }, 500 | "engines": { 501 | "node": ">=12" 502 | } 503 | }, 504 | "node_modules/@js-joda/core": { 505 | "version": "5.6.4", 506 | "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.6.4.tgz", 507 | "integrity": "sha512-ChdLDTYMEoYoiKZMT90wZMEdGvZ2/QZMnhvjvEqeO5oLoxUfSiLzfe6Lhf3g88+MhZ+utbAu7PAxX1sZkLo5pA==", 508 | "dev": true, 509 | "license": "BSD-3-Clause" 510 | }, 511 | "node_modules/@pkgjs/parseargs": { 512 | "version": "0.11.0", 513 | "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", 514 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", 515 | "dev": true, 516 | "license": "MIT", 517 | "optional": true, 518 | "engines": { 519 | "node": ">=14" 520 | } 521 | }, 522 | "node_modules/@tediousjs/connection-string": { 523 | "version": "0.5.0", 524 | "resolved": "https://registry.npmjs.org/@tediousjs/connection-string/-/connection-string-0.5.0.tgz", 525 | "integrity": "sha512-7qSgZbincDDDFyRweCIEvZULFAw5iz/DeunhvuxpL31nfntX3P4Yd4HkHBRg9H8CdqY1e5WFN1PZIz/REL9MVQ==", 526 | "dev": true, 527 | "license": "MIT" 528 | }, 529 | "node_modules/@types/estree": { 530 | "version": "1.0.6", 531 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", 532 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", 533 | "dev": true, 534 | "license": "MIT" 535 | }, 536 | "node_modules/@types/json-schema": { 537 | "version": "7.0.15", 538 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", 539 | "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", 540 | "dev": true, 541 | "license": "MIT" 542 | }, 543 | "node_modules/@types/node": { 544 | "version": "22.13.10", 545 | "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", 546 | "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", 547 | "dev": true, 548 | "license": "MIT", 549 | "dependencies": { 550 | "undici-types": "~6.20.0" 551 | } 552 | }, 553 | "node_modules/@types/readable-stream": { 554 | "version": "4.0.18", 555 | "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.18.tgz", 556 | "integrity": "sha512-21jK/1j+Wg+7jVw1xnSwy/2Q1VgVjWuFssbYGTREPUBeZ+rqVFl2udq0IkxzPC0ZhOzVceUbyIACFZKLqKEBlA==", 557 | "dev": true, 558 | "license": "MIT", 559 | "dependencies": { 560 | "@types/node": "*", 561 | "safe-buffer": "~5.1.1" 562 | } 563 | }, 564 | "node_modules/@types/readable-stream/node_modules/safe-buffer": { 565 | "version": "5.1.2", 566 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 567 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 568 | "dev": true, 569 | "license": "MIT" 570 | }, 571 | "node_modules/abort-controller": { 572 | "version": "3.0.0", 573 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 574 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 575 | "dev": true, 576 | "license": "MIT", 577 | "dependencies": { 578 | "event-target-shim": "^5.0.0" 579 | }, 580 | "engines": { 581 | "node": ">=6.5" 582 | } 583 | }, 584 | "node_modules/acorn": { 585 | "version": "8.14.1", 586 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", 587 | "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", 588 | "dev": true, 589 | "license": "MIT", 590 | "bin": { 591 | "acorn": "bin/acorn" 592 | }, 593 | "engines": { 594 | "node": ">=0.4.0" 595 | } 596 | }, 597 | "node_modules/acorn-jsx": { 598 | "version": "5.3.2", 599 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 600 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 601 | "dev": true, 602 | "license": "MIT", 603 | "peerDependencies": { 604 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 605 | } 606 | }, 607 | "node_modules/agent-base": { 608 | "version": "7.1.3", 609 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", 610 | "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", 611 | "dev": true, 612 | "license": "MIT", 613 | "engines": { 614 | "node": ">= 14" 615 | } 616 | }, 617 | "node_modules/ajv": { 618 | "version": "6.12.6", 619 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 620 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 621 | "dev": true, 622 | "license": "MIT", 623 | "dependencies": { 624 | "fast-deep-equal": "^3.1.1", 625 | "fast-json-stable-stringify": "^2.0.0", 626 | "json-schema-traverse": "^0.4.1", 627 | "uri-js": "^4.2.2" 628 | }, 629 | "funding": { 630 | "type": "github", 631 | "url": "https://github.com/sponsors/epoberezkin" 632 | } 633 | }, 634 | "node_modules/ansi-colors": { 635 | "version": "4.1.3", 636 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", 637 | "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", 638 | "dev": true, 639 | "license": "MIT", 640 | "engines": { 641 | "node": ">=6" 642 | } 643 | }, 644 | "node_modules/ansi-regex": { 645 | "version": "6.1.0", 646 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 647 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", 648 | "dev": true, 649 | "license": "MIT", 650 | "engines": { 651 | "node": ">=12" 652 | }, 653 | "funding": { 654 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 655 | } 656 | }, 657 | "node_modules/ansi-styles": { 658 | "version": "4.3.0", 659 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 660 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 661 | "dev": true, 662 | "license": "MIT", 663 | "dependencies": { 664 | "color-convert": "^2.0.1" 665 | }, 666 | "engines": { 667 | "node": ">=8" 668 | }, 669 | "funding": { 670 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 671 | } 672 | }, 673 | "node_modules/anymatch": { 674 | "version": "3.1.3", 675 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 676 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 677 | "dev": true, 678 | "license": "ISC", 679 | "dependencies": { 680 | "normalize-path": "^3.0.0", 681 | "picomatch": "^2.0.4" 682 | }, 683 | "engines": { 684 | "node": ">= 8" 685 | } 686 | }, 687 | "node_modules/argparse": { 688 | "version": "2.0.1", 689 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 690 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 691 | "dev": true, 692 | "license": "Python-2.0" 693 | }, 694 | "node_modules/assertion-error": { 695 | "version": "2.0.1", 696 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", 697 | "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", 698 | "dev": true, 699 | "license": "MIT", 700 | "engines": { 701 | "node": ">=12" 702 | } 703 | }, 704 | "node_modules/balanced-match": { 705 | "version": "1.0.2", 706 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 707 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 708 | "dev": true, 709 | "license": "MIT" 710 | }, 711 | "node_modules/base64-js": { 712 | "version": "1.5.1", 713 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 714 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 715 | "dev": true, 716 | "funding": [ 717 | { 718 | "type": "github", 719 | "url": "https://github.com/sponsors/feross" 720 | }, 721 | { 722 | "type": "patreon", 723 | "url": "https://www.patreon.com/feross" 724 | }, 725 | { 726 | "type": "consulting", 727 | "url": "https://feross.org/support" 728 | } 729 | ], 730 | "license": "MIT" 731 | }, 732 | "node_modules/binary-extensions": { 733 | "version": "2.3.0", 734 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", 735 | "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", 736 | "dev": true, 737 | "license": "MIT", 738 | "engines": { 739 | "node": ">=8" 740 | }, 741 | "funding": { 742 | "url": "https://github.com/sponsors/sindresorhus" 743 | } 744 | }, 745 | "node_modules/bl": { 746 | "version": "6.0.20", 747 | "resolved": "https://registry.npmjs.org/bl/-/bl-6.0.20.tgz", 748 | "integrity": "sha512-JMP0loH6ApbpT4Aa9oU5NqAkdDvcyc8koeuK8i5mYoBCVj3XCXG0uweGNN2m6DqaCO2yRHdm+MjCeTsR5VsmcA==", 749 | "dev": true, 750 | "license": "MIT", 751 | "dependencies": { 752 | "@types/readable-stream": "^4.0.0", 753 | "buffer": "^6.0.3", 754 | "inherits": "^2.0.4", 755 | "readable-stream": "^4.2.0" 756 | } 757 | }, 758 | "node_modules/brace-expansion": { 759 | "version": "1.1.11", 760 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 761 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 762 | "dev": true, 763 | "license": "MIT", 764 | "dependencies": { 765 | "balanced-match": "^1.0.0", 766 | "concat-map": "0.0.1" 767 | } 768 | }, 769 | "node_modules/braces": { 770 | "version": "3.0.3", 771 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 772 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 773 | "dev": true, 774 | "license": "MIT", 775 | "dependencies": { 776 | "fill-range": "^7.1.1" 777 | }, 778 | "engines": { 779 | "node": ">=8" 780 | } 781 | }, 782 | "node_modules/browser-stdout": { 783 | "version": "1.3.1", 784 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 785 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 786 | "dev": true, 787 | "license": "ISC" 788 | }, 789 | "node_modules/buffer": { 790 | "version": "6.0.3", 791 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", 792 | "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", 793 | "dev": true, 794 | "funding": [ 795 | { 796 | "type": "github", 797 | "url": "https://github.com/sponsors/feross" 798 | }, 799 | { 800 | "type": "patreon", 801 | "url": "https://www.patreon.com/feross" 802 | }, 803 | { 804 | "type": "consulting", 805 | "url": "https://feross.org/support" 806 | } 807 | ], 808 | "license": "MIT", 809 | "dependencies": { 810 | "base64-js": "^1.3.1", 811 | "ieee754": "^1.2.1" 812 | } 813 | }, 814 | "node_modules/buffer-equal-constant-time": { 815 | "version": "1.0.1", 816 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 817 | "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", 818 | "dev": true, 819 | "license": "BSD-3-Clause" 820 | }, 821 | "node_modules/bundle-name": { 822 | "version": "4.1.0", 823 | "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", 824 | "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", 825 | "dev": true, 826 | "license": "MIT", 827 | "dependencies": { 828 | "run-applescript": "^7.0.0" 829 | }, 830 | "engines": { 831 | "node": ">=18" 832 | }, 833 | "funding": { 834 | "url": "https://github.com/sponsors/sindresorhus" 835 | } 836 | }, 837 | "node_modules/callsites": { 838 | "version": "3.1.0", 839 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 840 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 841 | "dev": true, 842 | "license": "MIT", 843 | "engines": { 844 | "node": ">=6" 845 | } 846 | }, 847 | "node_modules/camelcase": { 848 | "version": "6.3.0", 849 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", 850 | "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", 851 | "dev": true, 852 | "license": "MIT", 853 | "engines": { 854 | "node": ">=10" 855 | }, 856 | "funding": { 857 | "url": "https://github.com/sponsors/sindresorhus" 858 | } 859 | }, 860 | "node_modules/chai": { 861 | "version": "5.2.0", 862 | "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", 863 | "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", 864 | "dev": true, 865 | "license": "MIT", 866 | "dependencies": { 867 | "assertion-error": "^2.0.1", 868 | "check-error": "^2.1.1", 869 | "deep-eql": "^5.0.1", 870 | "loupe": "^3.1.0", 871 | "pathval": "^2.0.0" 872 | }, 873 | "engines": { 874 | "node": ">=12" 875 | } 876 | }, 877 | "node_modules/chalk": { 878 | "version": "4.1.2", 879 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 880 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 881 | "dev": true, 882 | "license": "MIT", 883 | "dependencies": { 884 | "ansi-styles": "^4.1.0", 885 | "supports-color": "^7.1.0" 886 | }, 887 | "engines": { 888 | "node": ">=10" 889 | }, 890 | "funding": { 891 | "url": "https://github.com/chalk/chalk?sponsor=1" 892 | } 893 | }, 894 | "node_modules/check-error": { 895 | "version": "2.1.1", 896 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", 897 | "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", 898 | "dev": true, 899 | "license": "MIT", 900 | "engines": { 901 | "node": ">= 16" 902 | } 903 | }, 904 | "node_modules/chokidar": { 905 | "version": "3.6.0", 906 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", 907 | "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", 908 | "dev": true, 909 | "license": "MIT", 910 | "dependencies": { 911 | "anymatch": "~3.1.2", 912 | "braces": "~3.0.2", 913 | "glob-parent": "~5.1.2", 914 | "is-binary-path": "~2.1.0", 915 | "is-glob": "~4.0.1", 916 | "normalize-path": "~3.0.0", 917 | "readdirp": "~3.6.0" 918 | }, 919 | "engines": { 920 | "node": ">= 8.10.0" 921 | }, 922 | "funding": { 923 | "url": "https://paulmillr.com/funding/" 924 | }, 925 | "optionalDependencies": { 926 | "fsevents": "~2.3.2" 927 | } 928 | }, 929 | "node_modules/chokidar/node_modules/glob-parent": { 930 | "version": "5.1.2", 931 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 932 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 933 | "dev": true, 934 | "license": "ISC", 935 | "dependencies": { 936 | "is-glob": "^4.0.1" 937 | }, 938 | "engines": { 939 | "node": ">= 6" 940 | } 941 | }, 942 | "node_modules/cliui": { 943 | "version": "8.0.1", 944 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", 945 | "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", 946 | "dev": true, 947 | "license": "ISC", 948 | "dependencies": { 949 | "string-width": "^4.2.0", 950 | "strip-ansi": "^6.0.1", 951 | "wrap-ansi": "^7.0.0" 952 | }, 953 | "engines": { 954 | "node": ">=12" 955 | } 956 | }, 957 | "node_modules/cliui/node_modules/ansi-regex": { 958 | "version": "5.0.1", 959 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 960 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 961 | "dev": true, 962 | "license": "MIT", 963 | "engines": { 964 | "node": ">=8" 965 | } 966 | }, 967 | "node_modules/cliui/node_modules/emoji-regex": { 968 | "version": "8.0.0", 969 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 970 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 971 | "dev": true, 972 | "license": "MIT" 973 | }, 974 | "node_modules/cliui/node_modules/string-width": { 975 | "version": "4.2.3", 976 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 977 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 978 | "dev": true, 979 | "license": "MIT", 980 | "dependencies": { 981 | "emoji-regex": "^8.0.0", 982 | "is-fullwidth-code-point": "^3.0.0", 983 | "strip-ansi": "^6.0.1" 984 | }, 985 | "engines": { 986 | "node": ">=8" 987 | } 988 | }, 989 | "node_modules/cliui/node_modules/strip-ansi": { 990 | "version": "6.0.1", 991 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 992 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 993 | "dev": true, 994 | "license": "MIT", 995 | "dependencies": { 996 | "ansi-regex": "^5.0.1" 997 | }, 998 | "engines": { 999 | "node": ">=8" 1000 | } 1001 | }, 1002 | "node_modules/cliui/node_modules/wrap-ansi": { 1003 | "version": "7.0.0", 1004 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1005 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1006 | "dev": true, 1007 | "license": "MIT", 1008 | "dependencies": { 1009 | "ansi-styles": "^4.0.0", 1010 | "string-width": "^4.1.0", 1011 | "strip-ansi": "^6.0.0" 1012 | }, 1013 | "engines": { 1014 | "node": ">=10" 1015 | }, 1016 | "funding": { 1017 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1018 | } 1019 | }, 1020 | "node_modules/color-convert": { 1021 | "version": "2.0.1", 1022 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1023 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1024 | "dev": true, 1025 | "license": "MIT", 1026 | "dependencies": { 1027 | "color-name": "~1.1.4" 1028 | }, 1029 | "engines": { 1030 | "node": ">=7.0.0" 1031 | } 1032 | }, 1033 | "node_modules/color-name": { 1034 | "version": "1.1.4", 1035 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1036 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1037 | "dev": true, 1038 | "license": "MIT" 1039 | }, 1040 | "node_modules/commander": { 1041 | "version": "11.1.0", 1042 | "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", 1043 | "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", 1044 | "dev": true, 1045 | "license": "MIT", 1046 | "engines": { 1047 | "node": ">=16" 1048 | } 1049 | }, 1050 | "node_modules/concat-map": { 1051 | "version": "0.0.1", 1052 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1053 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 1054 | "dev": true, 1055 | "license": "MIT" 1056 | }, 1057 | "node_modules/cross-spawn": { 1058 | "version": "7.0.6", 1059 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 1060 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 1061 | "dev": true, 1062 | "license": "MIT", 1063 | "dependencies": { 1064 | "path-key": "^3.1.0", 1065 | "shebang-command": "^2.0.0", 1066 | "which": "^2.0.1" 1067 | }, 1068 | "engines": { 1069 | "node": ">= 8" 1070 | } 1071 | }, 1072 | "node_modules/debug": { 1073 | "version": "4.4.0", 1074 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 1075 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 1076 | "dev": true, 1077 | "license": "MIT", 1078 | "dependencies": { 1079 | "ms": "^2.1.3" 1080 | }, 1081 | "engines": { 1082 | "node": ">=6.0" 1083 | }, 1084 | "peerDependenciesMeta": { 1085 | "supports-color": { 1086 | "optional": true 1087 | } 1088 | } 1089 | }, 1090 | "node_modules/decamelize": { 1091 | "version": "4.0.0", 1092 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 1093 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 1094 | "dev": true, 1095 | "license": "MIT", 1096 | "engines": { 1097 | "node": ">=10" 1098 | }, 1099 | "funding": { 1100 | "url": "https://github.com/sponsors/sindresorhus" 1101 | } 1102 | }, 1103 | "node_modules/deep-eql": { 1104 | "version": "5.0.2", 1105 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", 1106 | "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", 1107 | "dev": true, 1108 | "license": "MIT", 1109 | "engines": { 1110 | "node": ">=6" 1111 | } 1112 | }, 1113 | "node_modules/deep-is": { 1114 | "version": "0.1.4", 1115 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 1116 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 1117 | "dev": true, 1118 | "license": "MIT" 1119 | }, 1120 | "node_modules/default-browser": { 1121 | "version": "5.2.1", 1122 | "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", 1123 | "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", 1124 | "dev": true, 1125 | "license": "MIT", 1126 | "dependencies": { 1127 | "bundle-name": "^4.1.0", 1128 | "default-browser-id": "^5.0.0" 1129 | }, 1130 | "engines": { 1131 | "node": ">=18" 1132 | }, 1133 | "funding": { 1134 | "url": "https://github.com/sponsors/sindresorhus" 1135 | } 1136 | }, 1137 | "node_modules/default-browser-id": { 1138 | "version": "5.0.0", 1139 | "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", 1140 | "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", 1141 | "dev": true, 1142 | "license": "MIT", 1143 | "engines": { 1144 | "node": ">=18" 1145 | }, 1146 | "funding": { 1147 | "url": "https://github.com/sponsors/sindresorhus" 1148 | } 1149 | }, 1150 | "node_modules/define-lazy-prop": { 1151 | "version": "3.0.0", 1152 | "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", 1153 | "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", 1154 | "dev": true, 1155 | "license": "MIT", 1156 | "engines": { 1157 | "node": ">=12" 1158 | }, 1159 | "funding": { 1160 | "url": "https://github.com/sponsors/sindresorhus" 1161 | } 1162 | }, 1163 | "node_modules/diff": { 1164 | "version": "5.2.0", 1165 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", 1166 | "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", 1167 | "dev": true, 1168 | "license": "BSD-3-Clause", 1169 | "engines": { 1170 | "node": ">=0.3.1" 1171 | } 1172 | }, 1173 | "node_modules/eastasianwidth": { 1174 | "version": "0.2.0", 1175 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 1176 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 1177 | "dev": true, 1178 | "license": "MIT" 1179 | }, 1180 | "node_modules/ecdsa-sig-formatter": { 1181 | "version": "1.0.11", 1182 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 1183 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 1184 | "dev": true, 1185 | "license": "Apache-2.0", 1186 | "dependencies": { 1187 | "safe-buffer": "^5.0.1" 1188 | } 1189 | }, 1190 | "node_modules/emoji-regex": { 1191 | "version": "9.2.2", 1192 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 1193 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 1194 | "dev": true, 1195 | "license": "MIT" 1196 | }, 1197 | "node_modules/escalade": { 1198 | "version": "3.2.0", 1199 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", 1200 | "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", 1201 | "dev": true, 1202 | "license": "MIT", 1203 | "engines": { 1204 | "node": ">=6" 1205 | } 1206 | }, 1207 | "node_modules/escape-string-regexp": { 1208 | "version": "4.0.0", 1209 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1210 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1211 | "dev": true, 1212 | "license": "MIT", 1213 | "engines": { 1214 | "node": ">=10" 1215 | }, 1216 | "funding": { 1217 | "url": "https://github.com/sponsors/sindresorhus" 1218 | } 1219 | }, 1220 | "node_modules/eslint": { 1221 | "version": "9.22.0", 1222 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.22.0.tgz", 1223 | "integrity": "sha512-9V/QURhsRN40xuHXWjV64yvrzMjcz7ZyNoF2jJFmy9j/SLk0u1OLSZgXi28MrXjymnjEGSR80WCdab3RGMDveQ==", 1224 | "dev": true, 1225 | "license": "MIT", 1226 | "dependencies": { 1227 | "@eslint-community/eslint-utils": "^4.2.0", 1228 | "@eslint-community/regexpp": "^4.12.1", 1229 | "@eslint/config-array": "^0.19.2", 1230 | "@eslint/config-helpers": "^0.1.0", 1231 | "@eslint/core": "^0.12.0", 1232 | "@eslint/eslintrc": "^3.3.0", 1233 | "@eslint/js": "9.22.0", 1234 | "@eslint/plugin-kit": "^0.2.7", 1235 | "@humanfs/node": "^0.16.6", 1236 | "@humanwhocodes/module-importer": "^1.0.1", 1237 | "@humanwhocodes/retry": "^0.4.2", 1238 | "@types/estree": "^1.0.6", 1239 | "@types/json-schema": "^7.0.15", 1240 | "ajv": "^6.12.4", 1241 | "chalk": "^4.0.0", 1242 | "cross-spawn": "^7.0.6", 1243 | "debug": "^4.3.2", 1244 | "escape-string-regexp": "^4.0.0", 1245 | "eslint-scope": "^8.3.0", 1246 | "eslint-visitor-keys": "^4.2.0", 1247 | "espree": "^10.3.0", 1248 | "esquery": "^1.5.0", 1249 | "esutils": "^2.0.2", 1250 | "fast-deep-equal": "^3.1.3", 1251 | "file-entry-cache": "^8.0.0", 1252 | "find-up": "^5.0.0", 1253 | "glob-parent": "^6.0.2", 1254 | "ignore": "^5.2.0", 1255 | "imurmurhash": "^0.1.4", 1256 | "is-glob": "^4.0.0", 1257 | "json-stable-stringify-without-jsonify": "^1.0.1", 1258 | "lodash.merge": "^4.6.2", 1259 | "minimatch": "^3.1.2", 1260 | "natural-compare": "^1.4.0", 1261 | "optionator": "^0.9.3" 1262 | }, 1263 | "bin": { 1264 | "eslint": "bin/eslint.js" 1265 | }, 1266 | "engines": { 1267 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1268 | }, 1269 | "funding": { 1270 | "url": "https://eslint.org/donate" 1271 | }, 1272 | "peerDependencies": { 1273 | "jiti": "*" 1274 | }, 1275 | "peerDependenciesMeta": { 1276 | "jiti": { 1277 | "optional": true 1278 | } 1279 | } 1280 | }, 1281 | "node_modules/eslint-config-google": { 1282 | "version": "0.14.0", 1283 | "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.14.0.tgz", 1284 | "integrity": "sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==", 1285 | "dev": true, 1286 | "license": "Apache-2.0", 1287 | "engines": { 1288 | "node": ">=0.10.0" 1289 | }, 1290 | "peerDependencies": { 1291 | "eslint": ">=5.16.0" 1292 | } 1293 | }, 1294 | "node_modules/eslint-scope": { 1295 | "version": "8.3.0", 1296 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", 1297 | "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", 1298 | "dev": true, 1299 | "license": "BSD-2-Clause", 1300 | "dependencies": { 1301 | "esrecurse": "^4.3.0", 1302 | "estraverse": "^5.2.0" 1303 | }, 1304 | "engines": { 1305 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1306 | }, 1307 | "funding": { 1308 | "url": "https://opencollective.com/eslint" 1309 | } 1310 | }, 1311 | "node_modules/eslint-visitor-keys": { 1312 | "version": "4.2.0", 1313 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", 1314 | "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", 1315 | "dev": true, 1316 | "license": "Apache-2.0", 1317 | "engines": { 1318 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1319 | }, 1320 | "funding": { 1321 | "url": "https://opencollective.com/eslint" 1322 | } 1323 | }, 1324 | "node_modules/espree": { 1325 | "version": "10.3.0", 1326 | "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", 1327 | "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", 1328 | "dev": true, 1329 | "license": "BSD-2-Clause", 1330 | "dependencies": { 1331 | "acorn": "^8.14.0", 1332 | "acorn-jsx": "^5.3.2", 1333 | "eslint-visitor-keys": "^4.2.0" 1334 | }, 1335 | "engines": { 1336 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1337 | }, 1338 | "funding": { 1339 | "url": "https://opencollective.com/eslint" 1340 | } 1341 | }, 1342 | "node_modules/esquery": { 1343 | "version": "1.6.0", 1344 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", 1345 | "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", 1346 | "dev": true, 1347 | "license": "BSD-3-Clause", 1348 | "dependencies": { 1349 | "estraverse": "^5.1.0" 1350 | }, 1351 | "engines": { 1352 | "node": ">=0.10" 1353 | } 1354 | }, 1355 | "node_modules/esrecurse": { 1356 | "version": "4.3.0", 1357 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 1358 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 1359 | "dev": true, 1360 | "license": "BSD-2-Clause", 1361 | "dependencies": { 1362 | "estraverse": "^5.2.0" 1363 | }, 1364 | "engines": { 1365 | "node": ">=4.0" 1366 | } 1367 | }, 1368 | "node_modules/estraverse": { 1369 | "version": "5.3.0", 1370 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1371 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1372 | "dev": true, 1373 | "license": "BSD-2-Clause", 1374 | "engines": { 1375 | "node": ">=4.0" 1376 | } 1377 | }, 1378 | "node_modules/esutils": { 1379 | "version": "2.0.3", 1380 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1381 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1382 | "dev": true, 1383 | "license": "BSD-2-Clause", 1384 | "engines": { 1385 | "node": ">=0.10.0" 1386 | } 1387 | }, 1388 | "node_modules/event-target-shim": { 1389 | "version": "5.0.1", 1390 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 1391 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", 1392 | "dev": true, 1393 | "license": "MIT", 1394 | "engines": { 1395 | "node": ">=6" 1396 | } 1397 | }, 1398 | "node_modules/events": { 1399 | "version": "3.3.0", 1400 | "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", 1401 | "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", 1402 | "dev": true, 1403 | "license": "MIT", 1404 | "engines": { 1405 | "node": ">=0.8.x" 1406 | } 1407 | }, 1408 | "node_modules/fast-deep-equal": { 1409 | "version": "3.1.3", 1410 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1411 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 1412 | "dev": true, 1413 | "license": "MIT" 1414 | }, 1415 | "node_modules/fast-json-stable-stringify": { 1416 | "version": "2.1.0", 1417 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1418 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1419 | "dev": true, 1420 | "license": "MIT" 1421 | }, 1422 | "node_modules/fast-levenshtein": { 1423 | "version": "2.0.6", 1424 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1425 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 1426 | "dev": true, 1427 | "license": "MIT" 1428 | }, 1429 | "node_modules/file-entry-cache": { 1430 | "version": "8.0.0", 1431 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", 1432 | "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", 1433 | "dev": true, 1434 | "license": "MIT", 1435 | "dependencies": { 1436 | "flat-cache": "^4.0.0" 1437 | }, 1438 | "engines": { 1439 | "node": ">=16.0.0" 1440 | } 1441 | }, 1442 | "node_modules/fill-range": { 1443 | "version": "7.1.1", 1444 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 1445 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 1446 | "dev": true, 1447 | "license": "MIT", 1448 | "dependencies": { 1449 | "to-regex-range": "^5.0.1" 1450 | }, 1451 | "engines": { 1452 | "node": ">=8" 1453 | } 1454 | }, 1455 | "node_modules/find-up": { 1456 | "version": "5.0.0", 1457 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1458 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1459 | "dev": true, 1460 | "license": "MIT", 1461 | "dependencies": { 1462 | "locate-path": "^6.0.0", 1463 | "path-exists": "^4.0.0" 1464 | }, 1465 | "engines": { 1466 | "node": ">=10" 1467 | }, 1468 | "funding": { 1469 | "url": "https://github.com/sponsors/sindresorhus" 1470 | } 1471 | }, 1472 | "node_modules/flat": { 1473 | "version": "5.0.2", 1474 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 1475 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 1476 | "dev": true, 1477 | "license": "BSD-3-Clause", 1478 | "bin": { 1479 | "flat": "cli.js" 1480 | } 1481 | }, 1482 | "node_modules/flat-cache": { 1483 | "version": "4.0.1", 1484 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", 1485 | "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", 1486 | "dev": true, 1487 | "license": "MIT", 1488 | "dependencies": { 1489 | "flatted": "^3.2.9", 1490 | "keyv": "^4.5.4" 1491 | }, 1492 | "engines": { 1493 | "node": ">=16" 1494 | } 1495 | }, 1496 | "node_modules/flatted": { 1497 | "version": "3.3.3", 1498 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", 1499 | "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", 1500 | "dev": true, 1501 | "license": "ISC" 1502 | }, 1503 | "node_modules/foreground-child": { 1504 | "version": "3.3.1", 1505 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", 1506 | "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", 1507 | "dev": true, 1508 | "license": "ISC", 1509 | "dependencies": { 1510 | "cross-spawn": "^7.0.6", 1511 | "signal-exit": "^4.0.1" 1512 | }, 1513 | "engines": { 1514 | "node": ">=14" 1515 | }, 1516 | "funding": { 1517 | "url": "https://github.com/sponsors/isaacs" 1518 | } 1519 | }, 1520 | "node_modules/fsevents": { 1521 | "version": "2.3.3", 1522 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1523 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1524 | "dev": true, 1525 | "hasInstallScript": true, 1526 | "license": "MIT", 1527 | "optional": true, 1528 | "os": [ 1529 | "darwin" 1530 | ], 1531 | "engines": { 1532 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1533 | } 1534 | }, 1535 | "node_modules/get-caller-file": { 1536 | "version": "2.0.5", 1537 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1538 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1539 | "dev": true, 1540 | "license": "ISC", 1541 | "engines": { 1542 | "node": "6.* || 8.* || >= 10.*" 1543 | } 1544 | }, 1545 | "node_modules/glob": { 1546 | "version": "10.4.5", 1547 | "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", 1548 | "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", 1549 | "dev": true, 1550 | "license": "ISC", 1551 | "dependencies": { 1552 | "foreground-child": "^3.1.0", 1553 | "jackspeak": "^3.1.2", 1554 | "minimatch": "^9.0.4", 1555 | "minipass": "^7.1.2", 1556 | "package-json-from-dist": "^1.0.0", 1557 | "path-scurry": "^1.11.1" 1558 | }, 1559 | "bin": { 1560 | "glob": "dist/esm/bin.mjs" 1561 | }, 1562 | "funding": { 1563 | "url": "https://github.com/sponsors/isaacs" 1564 | } 1565 | }, 1566 | "node_modules/glob-parent": { 1567 | "version": "6.0.2", 1568 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 1569 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 1570 | "dev": true, 1571 | "license": "ISC", 1572 | "dependencies": { 1573 | "is-glob": "^4.0.3" 1574 | }, 1575 | "engines": { 1576 | "node": ">=10.13.0" 1577 | } 1578 | }, 1579 | "node_modules/glob/node_modules/brace-expansion": { 1580 | "version": "2.0.1", 1581 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1582 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1583 | "dev": true, 1584 | "license": "MIT", 1585 | "dependencies": { 1586 | "balanced-match": "^1.0.0" 1587 | } 1588 | }, 1589 | "node_modules/glob/node_modules/minimatch": { 1590 | "version": "9.0.5", 1591 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 1592 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 1593 | "dev": true, 1594 | "license": "ISC", 1595 | "dependencies": { 1596 | "brace-expansion": "^2.0.1" 1597 | }, 1598 | "engines": { 1599 | "node": ">=16 || 14 >=14.17" 1600 | }, 1601 | "funding": { 1602 | "url": "https://github.com/sponsors/isaacs" 1603 | } 1604 | }, 1605 | "node_modules/globals": { 1606 | "version": "14.0.0", 1607 | "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", 1608 | "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", 1609 | "dev": true, 1610 | "license": "MIT", 1611 | "engines": { 1612 | "node": ">=18" 1613 | }, 1614 | "funding": { 1615 | "url": "https://github.com/sponsors/sindresorhus" 1616 | } 1617 | }, 1618 | "node_modules/has-flag": { 1619 | "version": "4.0.0", 1620 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1621 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1622 | "dev": true, 1623 | "license": "MIT", 1624 | "engines": { 1625 | "node": ">=8" 1626 | } 1627 | }, 1628 | "node_modules/he": { 1629 | "version": "1.2.0", 1630 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 1631 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 1632 | "dev": true, 1633 | "license": "MIT", 1634 | "bin": { 1635 | "he": "bin/he" 1636 | } 1637 | }, 1638 | "node_modules/http-proxy-agent": { 1639 | "version": "7.0.2", 1640 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", 1641 | "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", 1642 | "dev": true, 1643 | "license": "MIT", 1644 | "dependencies": { 1645 | "agent-base": "^7.1.0", 1646 | "debug": "^4.3.4" 1647 | }, 1648 | "engines": { 1649 | "node": ">= 14" 1650 | } 1651 | }, 1652 | "node_modules/https-proxy-agent": { 1653 | "version": "7.0.6", 1654 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", 1655 | "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", 1656 | "dev": true, 1657 | "license": "MIT", 1658 | "dependencies": { 1659 | "agent-base": "^7.1.2", 1660 | "debug": "4" 1661 | }, 1662 | "engines": { 1663 | "node": ">= 14" 1664 | } 1665 | }, 1666 | "node_modules/iconv-lite": { 1667 | "version": "0.6.3", 1668 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 1669 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 1670 | "dev": true, 1671 | "license": "MIT", 1672 | "dependencies": { 1673 | "safer-buffer": ">= 2.1.2 < 3.0.0" 1674 | }, 1675 | "engines": { 1676 | "node": ">=0.10.0" 1677 | } 1678 | }, 1679 | "node_modules/ieee754": { 1680 | "version": "1.2.1", 1681 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 1682 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 1683 | "dev": true, 1684 | "funding": [ 1685 | { 1686 | "type": "github", 1687 | "url": "https://github.com/sponsors/feross" 1688 | }, 1689 | { 1690 | "type": "patreon", 1691 | "url": "https://www.patreon.com/feross" 1692 | }, 1693 | { 1694 | "type": "consulting", 1695 | "url": "https://feross.org/support" 1696 | } 1697 | ], 1698 | "license": "BSD-3-Clause" 1699 | }, 1700 | "node_modules/ignore": { 1701 | "version": "5.3.2", 1702 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", 1703 | "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", 1704 | "dev": true, 1705 | "license": "MIT", 1706 | "engines": { 1707 | "node": ">= 4" 1708 | } 1709 | }, 1710 | "node_modules/import-fresh": { 1711 | "version": "3.3.1", 1712 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", 1713 | "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", 1714 | "dev": true, 1715 | "license": "MIT", 1716 | "dependencies": { 1717 | "parent-module": "^1.0.0", 1718 | "resolve-from": "^4.0.0" 1719 | }, 1720 | "engines": { 1721 | "node": ">=6" 1722 | }, 1723 | "funding": { 1724 | "url": "https://github.com/sponsors/sindresorhus" 1725 | } 1726 | }, 1727 | "node_modules/imurmurhash": { 1728 | "version": "0.1.4", 1729 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1730 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 1731 | "dev": true, 1732 | "license": "MIT", 1733 | "engines": { 1734 | "node": ">=0.8.19" 1735 | } 1736 | }, 1737 | "node_modules/inherits": { 1738 | "version": "2.0.4", 1739 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1740 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1741 | "dev": true, 1742 | "license": "ISC" 1743 | }, 1744 | "node_modules/is-binary-path": { 1745 | "version": "2.1.0", 1746 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1747 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1748 | "dev": true, 1749 | "license": "MIT", 1750 | "dependencies": { 1751 | "binary-extensions": "^2.0.0" 1752 | }, 1753 | "engines": { 1754 | "node": ">=8" 1755 | } 1756 | }, 1757 | "node_modules/is-docker": { 1758 | "version": "3.0.0", 1759 | "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", 1760 | "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", 1761 | "dev": true, 1762 | "license": "MIT", 1763 | "bin": { 1764 | "is-docker": "cli.js" 1765 | }, 1766 | "engines": { 1767 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 1768 | }, 1769 | "funding": { 1770 | "url": "https://github.com/sponsors/sindresorhus" 1771 | } 1772 | }, 1773 | "node_modules/is-extglob": { 1774 | "version": "2.1.1", 1775 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1776 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1777 | "dev": true, 1778 | "license": "MIT", 1779 | "engines": { 1780 | "node": ">=0.10.0" 1781 | } 1782 | }, 1783 | "node_modules/is-fullwidth-code-point": { 1784 | "version": "3.0.0", 1785 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1786 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1787 | "dev": true, 1788 | "license": "MIT", 1789 | "engines": { 1790 | "node": ">=8" 1791 | } 1792 | }, 1793 | "node_modules/is-glob": { 1794 | "version": "4.0.3", 1795 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1796 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1797 | "dev": true, 1798 | "license": "MIT", 1799 | "dependencies": { 1800 | "is-extglob": "^2.1.1" 1801 | }, 1802 | "engines": { 1803 | "node": ">=0.10.0" 1804 | } 1805 | }, 1806 | "node_modules/is-inside-container": { 1807 | "version": "1.0.0", 1808 | "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", 1809 | "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", 1810 | "dev": true, 1811 | "license": "MIT", 1812 | "dependencies": { 1813 | "is-docker": "^3.0.0" 1814 | }, 1815 | "bin": { 1816 | "is-inside-container": "cli.js" 1817 | }, 1818 | "engines": { 1819 | "node": ">=14.16" 1820 | }, 1821 | "funding": { 1822 | "url": "https://github.com/sponsors/sindresorhus" 1823 | } 1824 | }, 1825 | "node_modules/is-number": { 1826 | "version": "7.0.0", 1827 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1828 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1829 | "dev": true, 1830 | "license": "MIT", 1831 | "engines": { 1832 | "node": ">=0.12.0" 1833 | } 1834 | }, 1835 | "node_modules/is-plain-obj": { 1836 | "version": "2.1.0", 1837 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 1838 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 1839 | "dev": true, 1840 | "license": "MIT", 1841 | "engines": { 1842 | "node": ">=8" 1843 | } 1844 | }, 1845 | "node_modules/is-unicode-supported": { 1846 | "version": "0.1.0", 1847 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 1848 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 1849 | "dev": true, 1850 | "license": "MIT", 1851 | "engines": { 1852 | "node": ">=10" 1853 | }, 1854 | "funding": { 1855 | "url": "https://github.com/sponsors/sindresorhus" 1856 | } 1857 | }, 1858 | "node_modules/is-wsl": { 1859 | "version": "3.1.0", 1860 | "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", 1861 | "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", 1862 | "dev": true, 1863 | "license": "MIT", 1864 | "dependencies": { 1865 | "is-inside-container": "^1.0.0" 1866 | }, 1867 | "engines": { 1868 | "node": ">=16" 1869 | }, 1870 | "funding": { 1871 | "url": "https://github.com/sponsors/sindresorhus" 1872 | } 1873 | }, 1874 | "node_modules/isexe": { 1875 | "version": "2.0.0", 1876 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1877 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1878 | "dev": true, 1879 | "license": "ISC" 1880 | }, 1881 | "node_modules/jackspeak": { 1882 | "version": "3.4.3", 1883 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", 1884 | "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", 1885 | "dev": true, 1886 | "license": "BlueOak-1.0.0", 1887 | "dependencies": { 1888 | "@isaacs/cliui": "^8.0.2" 1889 | }, 1890 | "funding": { 1891 | "url": "https://github.com/sponsors/isaacs" 1892 | }, 1893 | "optionalDependencies": { 1894 | "@pkgjs/parseargs": "^0.11.0" 1895 | } 1896 | }, 1897 | "node_modules/js-md4": { 1898 | "version": "0.3.2", 1899 | "resolved": "https://registry.npmjs.org/js-md4/-/js-md4-0.3.2.tgz", 1900 | "integrity": "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==", 1901 | "dev": true, 1902 | "license": "MIT" 1903 | }, 1904 | "node_modules/js-yaml": { 1905 | "version": "4.1.0", 1906 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1907 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1908 | "dev": true, 1909 | "license": "MIT", 1910 | "dependencies": { 1911 | "argparse": "^2.0.1" 1912 | }, 1913 | "bin": { 1914 | "js-yaml": "bin/js-yaml.js" 1915 | } 1916 | }, 1917 | "node_modules/json-buffer": { 1918 | "version": "3.0.1", 1919 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 1920 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 1921 | "dev": true, 1922 | "license": "MIT" 1923 | }, 1924 | "node_modules/json-schema-traverse": { 1925 | "version": "0.4.1", 1926 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1927 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1928 | "dev": true, 1929 | "license": "MIT" 1930 | }, 1931 | "node_modules/json-stable-stringify-without-jsonify": { 1932 | "version": "1.0.1", 1933 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1934 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 1935 | "dev": true, 1936 | "license": "MIT" 1937 | }, 1938 | "node_modules/jsonwebtoken": { 1939 | "version": "9.0.2", 1940 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", 1941 | "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", 1942 | "dev": true, 1943 | "license": "MIT", 1944 | "dependencies": { 1945 | "jws": "^3.2.2", 1946 | "lodash.includes": "^4.3.0", 1947 | "lodash.isboolean": "^3.0.3", 1948 | "lodash.isinteger": "^4.0.4", 1949 | "lodash.isnumber": "^3.0.3", 1950 | "lodash.isplainobject": "^4.0.6", 1951 | "lodash.isstring": "^4.0.1", 1952 | "lodash.once": "^4.0.0", 1953 | "ms": "^2.1.1", 1954 | "semver": "^7.5.4" 1955 | }, 1956 | "engines": { 1957 | "node": ">=12", 1958 | "npm": ">=6" 1959 | } 1960 | }, 1961 | "node_modules/jsonwebtoken/node_modules/jwa": { 1962 | "version": "1.4.1", 1963 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", 1964 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", 1965 | "dev": true, 1966 | "license": "MIT", 1967 | "dependencies": { 1968 | "buffer-equal-constant-time": "1.0.1", 1969 | "ecdsa-sig-formatter": "1.0.11", 1970 | "safe-buffer": "^5.0.1" 1971 | } 1972 | }, 1973 | "node_modules/jsonwebtoken/node_modules/jws": { 1974 | "version": "3.2.2", 1975 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", 1976 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", 1977 | "dev": true, 1978 | "license": "MIT", 1979 | "dependencies": { 1980 | "jwa": "^1.4.1", 1981 | "safe-buffer": "^5.0.1" 1982 | } 1983 | }, 1984 | "node_modules/jwa": { 1985 | "version": "2.0.0", 1986 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", 1987 | "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", 1988 | "dev": true, 1989 | "license": "MIT", 1990 | "dependencies": { 1991 | "buffer-equal-constant-time": "1.0.1", 1992 | "ecdsa-sig-formatter": "1.0.11", 1993 | "safe-buffer": "^5.0.1" 1994 | } 1995 | }, 1996 | "node_modules/jws": { 1997 | "version": "4.0.0", 1998 | "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", 1999 | "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", 2000 | "dev": true, 2001 | "license": "MIT", 2002 | "dependencies": { 2003 | "jwa": "^2.0.0", 2004 | "safe-buffer": "^5.0.1" 2005 | } 2006 | }, 2007 | "node_modules/keyv": { 2008 | "version": "4.5.4", 2009 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", 2010 | "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 2011 | "dev": true, 2012 | "license": "MIT", 2013 | "dependencies": { 2014 | "json-buffer": "3.0.1" 2015 | } 2016 | }, 2017 | "node_modules/levn": { 2018 | "version": "0.4.1", 2019 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 2020 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 2021 | "dev": true, 2022 | "license": "MIT", 2023 | "dependencies": { 2024 | "prelude-ls": "^1.2.1", 2025 | "type-check": "~0.4.0" 2026 | }, 2027 | "engines": { 2028 | "node": ">= 0.8.0" 2029 | } 2030 | }, 2031 | "node_modules/locate-path": { 2032 | "version": "6.0.0", 2033 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 2034 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 2035 | "dev": true, 2036 | "license": "MIT", 2037 | "dependencies": { 2038 | "p-locate": "^5.0.0" 2039 | }, 2040 | "engines": { 2041 | "node": ">=10" 2042 | }, 2043 | "funding": { 2044 | "url": "https://github.com/sponsors/sindresorhus" 2045 | } 2046 | }, 2047 | "node_modules/lodash": { 2048 | "version": "4.17.21", 2049 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 2050 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 2051 | "license": "MIT" 2052 | }, 2053 | "node_modules/lodash.every": { 2054 | "version": "4.6.0", 2055 | "resolved": "https://registry.npmjs.org/lodash.every/-/lodash.every-4.6.0.tgz", 2056 | "integrity": "sha512-isF82d+65/sNvQ3aaQAW7LLHnnTxSN/2fm4rhYyuufLzA4VtHz6y6S5vFwe6PQVr2xdqUOyxBbTNKDpnmeu50w==", 2057 | "dev": true, 2058 | "license": "MIT" 2059 | }, 2060 | "node_modules/lodash.includes": { 2061 | "version": "4.3.0", 2062 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", 2063 | "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", 2064 | "dev": true, 2065 | "license": "MIT" 2066 | }, 2067 | "node_modules/lodash.isboolean": { 2068 | "version": "3.0.3", 2069 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 2070 | "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", 2071 | "dev": true, 2072 | "license": "MIT" 2073 | }, 2074 | "node_modules/lodash.isinteger": { 2075 | "version": "4.0.4", 2076 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", 2077 | "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", 2078 | "dev": true, 2079 | "license": "MIT" 2080 | }, 2081 | "node_modules/lodash.isnumber": { 2082 | "version": "3.0.3", 2083 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", 2084 | "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", 2085 | "dev": true, 2086 | "license": "MIT" 2087 | }, 2088 | "node_modules/lodash.isplainobject": { 2089 | "version": "4.0.6", 2090 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 2091 | "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", 2092 | "dev": true, 2093 | "license": "MIT" 2094 | }, 2095 | "node_modules/lodash.isstring": { 2096 | "version": "4.0.1", 2097 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 2098 | "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", 2099 | "dev": true, 2100 | "license": "MIT" 2101 | }, 2102 | "node_modules/lodash.merge": { 2103 | "version": "4.6.2", 2104 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 2105 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 2106 | "dev": true, 2107 | "license": "MIT" 2108 | }, 2109 | "node_modules/lodash.once": { 2110 | "version": "4.1.1", 2111 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 2112 | "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", 2113 | "dev": true, 2114 | "license": "MIT" 2115 | }, 2116 | "node_modules/log-symbols": { 2117 | "version": "4.1.0", 2118 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 2119 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 2120 | "dev": true, 2121 | "license": "MIT", 2122 | "dependencies": { 2123 | "chalk": "^4.1.0", 2124 | "is-unicode-supported": "^0.1.0" 2125 | }, 2126 | "engines": { 2127 | "node": ">=10" 2128 | }, 2129 | "funding": { 2130 | "url": "https://github.com/sponsors/sindresorhus" 2131 | } 2132 | }, 2133 | "node_modules/loupe": { 2134 | "version": "3.1.3", 2135 | "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", 2136 | "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", 2137 | "dev": true, 2138 | "license": "MIT" 2139 | }, 2140 | "node_modules/lru-cache": { 2141 | "version": "10.4.3", 2142 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", 2143 | "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", 2144 | "dev": true, 2145 | "license": "ISC" 2146 | }, 2147 | "node_modules/minimatch": { 2148 | "version": "3.1.2", 2149 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2150 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2151 | "dev": true, 2152 | "license": "ISC", 2153 | "dependencies": { 2154 | "brace-expansion": "^1.1.7" 2155 | }, 2156 | "engines": { 2157 | "node": "*" 2158 | } 2159 | }, 2160 | "node_modules/minipass": { 2161 | "version": "7.1.2", 2162 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 2163 | "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 2164 | "dev": true, 2165 | "license": "ISC", 2166 | "engines": { 2167 | "node": ">=16 || 14 >=14.17" 2168 | } 2169 | }, 2170 | "node_modules/mocha": { 2171 | "version": "11.1.0", 2172 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.1.0.tgz", 2173 | "integrity": "sha512-8uJR5RTC2NgpY3GrYcgpZrsEd9zKbPDpob1RezyR2upGHRQtHWofmzTMzTMSV6dru3tj5Ukt0+Vnq1qhFEEwAg==", 2174 | "dev": true, 2175 | "license": "MIT", 2176 | "dependencies": { 2177 | "ansi-colors": "^4.1.3", 2178 | "browser-stdout": "^1.3.1", 2179 | "chokidar": "^3.5.3", 2180 | "debug": "^4.3.5", 2181 | "diff": "^5.2.0", 2182 | "escape-string-regexp": "^4.0.0", 2183 | "find-up": "^5.0.0", 2184 | "glob": "^10.4.5", 2185 | "he": "^1.2.0", 2186 | "js-yaml": "^4.1.0", 2187 | "log-symbols": "^4.1.0", 2188 | "minimatch": "^5.1.6", 2189 | "ms": "^2.1.3", 2190 | "serialize-javascript": "^6.0.2", 2191 | "strip-json-comments": "^3.1.1", 2192 | "supports-color": "^8.1.1", 2193 | "workerpool": "^6.5.1", 2194 | "yargs": "^17.7.2", 2195 | "yargs-parser": "^21.1.1", 2196 | "yargs-unparser": "^2.0.0" 2197 | }, 2198 | "bin": { 2199 | "_mocha": "bin/_mocha", 2200 | "mocha": "bin/mocha.js" 2201 | }, 2202 | "engines": { 2203 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2204 | } 2205 | }, 2206 | "node_modules/mocha/node_modules/brace-expansion": { 2207 | "version": "2.0.1", 2208 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 2209 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 2210 | "dev": true, 2211 | "license": "MIT", 2212 | "dependencies": { 2213 | "balanced-match": "^1.0.0" 2214 | } 2215 | }, 2216 | "node_modules/mocha/node_modules/minimatch": { 2217 | "version": "5.1.6", 2218 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", 2219 | "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", 2220 | "dev": true, 2221 | "license": "ISC", 2222 | "dependencies": { 2223 | "brace-expansion": "^2.0.1" 2224 | }, 2225 | "engines": { 2226 | "node": ">=10" 2227 | } 2228 | }, 2229 | "node_modules/mocha/node_modules/supports-color": { 2230 | "version": "8.1.1", 2231 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 2232 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 2233 | "dev": true, 2234 | "license": "MIT", 2235 | "dependencies": { 2236 | "has-flag": "^4.0.0" 2237 | }, 2238 | "engines": { 2239 | "node": ">=10" 2240 | }, 2241 | "funding": { 2242 | "url": "https://github.com/chalk/supports-color?sponsor=1" 2243 | } 2244 | }, 2245 | "node_modules/ms": { 2246 | "version": "2.1.3", 2247 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2248 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 2249 | "dev": true, 2250 | "license": "MIT" 2251 | }, 2252 | "node_modules/mssql": { 2253 | "version": "11.0.1", 2254 | "resolved": "https://registry.npmjs.org/mssql/-/mssql-11.0.1.tgz", 2255 | "integrity": "sha512-KlGNsugoT90enKlR8/G36H0kTxPthDhmtNUCwEHvgRza5Cjpjoj+P2X6eMpFUDN7pFrJZsKadL4x990G8RBE1w==", 2256 | "dev": true, 2257 | "license": "MIT", 2258 | "dependencies": { 2259 | "@tediousjs/connection-string": "^0.5.0", 2260 | "commander": "^11.0.0", 2261 | "debug": "^4.3.3", 2262 | "rfdc": "^1.3.0", 2263 | "tarn": "^3.0.2", 2264 | "tedious": "^18.2.1" 2265 | }, 2266 | "bin": { 2267 | "mssql": "bin/mssql" 2268 | }, 2269 | "engines": { 2270 | "node": ">=18" 2271 | } 2272 | }, 2273 | "node_modules/mssql-cr-layer": { 2274 | "version": "3.0.2", 2275 | "resolved": "https://registry.npmjs.org/mssql-cr-layer/-/mssql-cr-layer-3.0.2.tgz", 2276 | "integrity": "sha512-I/BxjNBbwoYoxa/oKqQSZo6k7kYdP4EQJ6lZNiumE2RK8X9OFZQEm+Mp6zROqzNffCAc3olMJfWMQo80Nf76dg==", 2277 | "dev": true, 2278 | "license": "MIT", 2279 | "dependencies": { 2280 | "debug": "^4.4.0", 2281 | "lodash.every": "^4.6.0", 2282 | "mssql": "^11.0.1" 2283 | } 2284 | }, 2285 | "node_modules/native-duplexpair": { 2286 | "version": "1.0.0", 2287 | "resolved": "https://registry.npmjs.org/native-duplexpair/-/native-duplexpair-1.0.0.tgz", 2288 | "integrity": "sha512-E7QQoM+3jvNtlmyfqRZ0/U75VFgCls+fSkbml2MpgWkWyz3ox8Y58gNhfuziuQYGNNQAbFZJQck55LHCnCK6CA==", 2289 | "dev": true, 2290 | "license": "MIT" 2291 | }, 2292 | "node_modules/natural-compare": { 2293 | "version": "1.4.0", 2294 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 2295 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 2296 | "dev": true, 2297 | "license": "MIT" 2298 | }, 2299 | "node_modules/normalize-path": { 2300 | "version": "3.0.0", 2301 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2302 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 2303 | "dev": true, 2304 | "license": "MIT", 2305 | "engines": { 2306 | "node": ">=0.10.0" 2307 | } 2308 | }, 2309 | "node_modules/open": { 2310 | "version": "10.1.0", 2311 | "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", 2312 | "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", 2313 | "dev": true, 2314 | "license": "MIT", 2315 | "dependencies": { 2316 | "default-browser": "^5.2.1", 2317 | "define-lazy-prop": "^3.0.0", 2318 | "is-inside-container": "^1.0.0", 2319 | "is-wsl": "^3.1.0" 2320 | }, 2321 | "engines": { 2322 | "node": ">=18" 2323 | }, 2324 | "funding": { 2325 | "url": "https://github.com/sponsors/sindresorhus" 2326 | } 2327 | }, 2328 | "node_modules/optionator": { 2329 | "version": "0.9.4", 2330 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", 2331 | "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", 2332 | "dev": true, 2333 | "license": "MIT", 2334 | "dependencies": { 2335 | "deep-is": "^0.1.3", 2336 | "fast-levenshtein": "^2.0.6", 2337 | "levn": "^0.4.1", 2338 | "prelude-ls": "^1.2.1", 2339 | "type-check": "^0.4.0", 2340 | "word-wrap": "^1.2.5" 2341 | }, 2342 | "engines": { 2343 | "node": ">= 0.8.0" 2344 | } 2345 | }, 2346 | "node_modules/p-limit": { 2347 | "version": "3.1.0", 2348 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 2349 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 2350 | "dev": true, 2351 | "license": "MIT", 2352 | "dependencies": { 2353 | "yocto-queue": "^0.1.0" 2354 | }, 2355 | "engines": { 2356 | "node": ">=10" 2357 | }, 2358 | "funding": { 2359 | "url": "https://github.com/sponsors/sindresorhus" 2360 | } 2361 | }, 2362 | "node_modules/p-locate": { 2363 | "version": "5.0.0", 2364 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 2365 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 2366 | "dev": true, 2367 | "license": "MIT", 2368 | "dependencies": { 2369 | "p-limit": "^3.0.2" 2370 | }, 2371 | "engines": { 2372 | "node": ">=10" 2373 | }, 2374 | "funding": { 2375 | "url": "https://github.com/sponsors/sindresorhus" 2376 | } 2377 | }, 2378 | "node_modules/package-json-from-dist": { 2379 | "version": "1.0.1", 2380 | "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", 2381 | "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", 2382 | "dev": true, 2383 | "license": "BlueOak-1.0.0" 2384 | }, 2385 | "node_modules/parent-module": { 2386 | "version": "1.0.1", 2387 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 2388 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 2389 | "dev": true, 2390 | "license": "MIT", 2391 | "dependencies": { 2392 | "callsites": "^3.0.0" 2393 | }, 2394 | "engines": { 2395 | "node": ">=6" 2396 | } 2397 | }, 2398 | "node_modules/path-exists": { 2399 | "version": "4.0.0", 2400 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2401 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2402 | "dev": true, 2403 | "license": "MIT", 2404 | "engines": { 2405 | "node": ">=8" 2406 | } 2407 | }, 2408 | "node_modules/path-key": { 2409 | "version": "3.1.1", 2410 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2411 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2412 | "dev": true, 2413 | "license": "MIT", 2414 | "engines": { 2415 | "node": ">=8" 2416 | } 2417 | }, 2418 | "node_modules/path-scurry": { 2419 | "version": "1.11.1", 2420 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", 2421 | "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", 2422 | "dev": true, 2423 | "license": "BlueOak-1.0.0", 2424 | "dependencies": { 2425 | "lru-cache": "^10.2.0", 2426 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" 2427 | }, 2428 | "engines": { 2429 | "node": ">=16 || 14 >=14.18" 2430 | }, 2431 | "funding": { 2432 | "url": "https://github.com/sponsors/isaacs" 2433 | } 2434 | }, 2435 | "node_modules/pathval": { 2436 | "version": "2.0.0", 2437 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", 2438 | "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", 2439 | "dev": true, 2440 | "license": "MIT", 2441 | "engines": { 2442 | "node": ">= 14.16" 2443 | } 2444 | }, 2445 | "node_modules/pg": { 2446 | "version": "8.14.0", 2447 | "resolved": "https://registry.npmjs.org/pg/-/pg-8.14.0.tgz", 2448 | "integrity": "sha512-nXbVpyoaXVmdqlKEzToFf37qzyeeh7mbiXsnoWvstSqohj88yaa/I/Rq/HEVn2QPSZEuLIJa/jSpRDyzjEx4FQ==", 2449 | "dev": true, 2450 | "license": "MIT", 2451 | "dependencies": { 2452 | "pg-connection-string": "^2.7.0", 2453 | "pg-pool": "^3.8.0", 2454 | "pg-protocol": "^1.8.0", 2455 | "pg-types": "^2.1.0", 2456 | "pgpass": "1.x" 2457 | }, 2458 | "engines": { 2459 | "node": ">= 8.0.0" 2460 | }, 2461 | "optionalDependencies": { 2462 | "pg-cloudflare": "^1.1.1" 2463 | }, 2464 | "peerDependencies": { 2465 | "pg-native": ">=3.0.1" 2466 | }, 2467 | "peerDependenciesMeta": { 2468 | "pg-native": { 2469 | "optional": true 2470 | } 2471 | } 2472 | }, 2473 | "node_modules/pg-cloudflare": { 2474 | "version": "1.1.1", 2475 | "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", 2476 | "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", 2477 | "dev": true, 2478 | "license": "MIT", 2479 | "optional": true 2480 | }, 2481 | "node_modules/pg-connection-string": { 2482 | "version": "2.7.0", 2483 | "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.7.0.tgz", 2484 | "integrity": "sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==", 2485 | "dev": true, 2486 | "license": "MIT" 2487 | }, 2488 | "node_modules/pg-cr-layer": { 2489 | "version": "2.0.24", 2490 | "resolved": "https://registry.npmjs.org/pg-cr-layer/-/pg-cr-layer-2.0.24.tgz", 2491 | "integrity": "sha512-8t53gId2HLEzn2tUrzLfwym3i7I+aNqWWgHP10Oa9Ml3lhTeUwS1W72MqFdonQjezZBov67G2CXWZ9OooexWHQ==", 2492 | "dev": true, 2493 | "license": "MIT", 2494 | "dependencies": { 2495 | "debug": "^4.4.0", 2496 | "pg": "^8.14.0" 2497 | } 2498 | }, 2499 | "node_modules/pg-int8": { 2500 | "version": "1.0.1", 2501 | "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", 2502 | "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", 2503 | "dev": true, 2504 | "license": "ISC", 2505 | "engines": { 2506 | "node": ">=4.0.0" 2507 | } 2508 | }, 2509 | "node_modules/pg-pool": { 2510 | "version": "3.8.0", 2511 | "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.8.0.tgz", 2512 | "integrity": "sha512-VBw3jiVm6ZOdLBTIcXLNdSotb6Iy3uOCwDGFAksZCXmi10nyRvnP2v3jl4d+IsLYRyXf6o9hIm/ZtUzlByNUdw==", 2513 | "dev": true, 2514 | "license": "MIT", 2515 | "peerDependencies": { 2516 | "pg": ">=8.0" 2517 | } 2518 | }, 2519 | "node_modules/pg-protocol": { 2520 | "version": "1.8.0", 2521 | "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.8.0.tgz", 2522 | "integrity": "sha512-jvuYlEkL03NRvOoyoRktBK7+qU5kOvlAwvmrH8sr3wbLrOdVWsRxQfz8mMy9sZFsqJ1hEWNfdWKI4SAmoL+j7g==", 2523 | "dev": true, 2524 | "license": "MIT" 2525 | }, 2526 | "node_modules/pg-types": { 2527 | "version": "2.2.0", 2528 | "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", 2529 | "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", 2530 | "dev": true, 2531 | "license": "MIT", 2532 | "dependencies": { 2533 | "pg-int8": "1.0.1", 2534 | "postgres-array": "~2.0.0", 2535 | "postgres-bytea": "~1.0.0", 2536 | "postgres-date": "~1.0.4", 2537 | "postgres-interval": "^1.1.0" 2538 | }, 2539 | "engines": { 2540 | "node": ">=4" 2541 | } 2542 | }, 2543 | "node_modules/pgpass": { 2544 | "version": "1.0.5", 2545 | "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", 2546 | "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", 2547 | "dev": true, 2548 | "license": "MIT", 2549 | "dependencies": { 2550 | "split2": "^4.1.0" 2551 | } 2552 | }, 2553 | "node_modules/picomatch": { 2554 | "version": "2.3.1", 2555 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2556 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2557 | "dev": true, 2558 | "license": "MIT", 2559 | "engines": { 2560 | "node": ">=8.6" 2561 | }, 2562 | "funding": { 2563 | "url": "https://github.com/sponsors/jonschlinkert" 2564 | } 2565 | }, 2566 | "node_modules/postgres-array": { 2567 | "version": "2.0.0", 2568 | "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", 2569 | "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", 2570 | "dev": true, 2571 | "license": "MIT", 2572 | "engines": { 2573 | "node": ">=4" 2574 | } 2575 | }, 2576 | "node_modules/postgres-bytea": { 2577 | "version": "1.0.0", 2578 | "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", 2579 | "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", 2580 | "dev": true, 2581 | "license": "MIT", 2582 | "engines": { 2583 | "node": ">=0.10.0" 2584 | } 2585 | }, 2586 | "node_modules/postgres-date": { 2587 | "version": "1.0.7", 2588 | "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", 2589 | "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", 2590 | "dev": true, 2591 | "license": "MIT", 2592 | "engines": { 2593 | "node": ">=0.10.0" 2594 | } 2595 | }, 2596 | "node_modules/postgres-interval": { 2597 | "version": "1.2.0", 2598 | "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", 2599 | "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", 2600 | "dev": true, 2601 | "license": "MIT", 2602 | "dependencies": { 2603 | "xtend": "^4.0.0" 2604 | }, 2605 | "engines": { 2606 | "node": ">=0.10.0" 2607 | } 2608 | }, 2609 | "node_modules/prelude-ls": { 2610 | "version": "1.2.1", 2611 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 2612 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 2613 | "dev": true, 2614 | "license": "MIT", 2615 | "engines": { 2616 | "node": ">= 0.8.0" 2617 | } 2618 | }, 2619 | "node_modules/process": { 2620 | "version": "0.11.10", 2621 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 2622 | "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", 2623 | "dev": true, 2624 | "license": "MIT", 2625 | "engines": { 2626 | "node": ">= 0.6.0" 2627 | } 2628 | }, 2629 | "node_modules/punycode": { 2630 | "version": "2.3.1", 2631 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 2632 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 2633 | "dev": true, 2634 | "license": "MIT", 2635 | "engines": { 2636 | "node": ">=6" 2637 | } 2638 | }, 2639 | "node_modules/randombytes": { 2640 | "version": "2.1.0", 2641 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 2642 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 2643 | "dev": true, 2644 | "license": "MIT", 2645 | "dependencies": { 2646 | "safe-buffer": "^5.1.0" 2647 | } 2648 | }, 2649 | "node_modules/readable-stream": { 2650 | "version": "4.7.0", 2651 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", 2652 | "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", 2653 | "dev": true, 2654 | "license": "MIT", 2655 | "dependencies": { 2656 | "abort-controller": "^3.0.0", 2657 | "buffer": "^6.0.3", 2658 | "events": "^3.3.0", 2659 | "process": "^0.11.10", 2660 | "string_decoder": "^1.3.0" 2661 | }, 2662 | "engines": { 2663 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 2664 | } 2665 | }, 2666 | "node_modules/readdirp": { 2667 | "version": "3.6.0", 2668 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 2669 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 2670 | "dev": true, 2671 | "license": "MIT", 2672 | "dependencies": { 2673 | "picomatch": "^2.2.1" 2674 | }, 2675 | "engines": { 2676 | "node": ">=8.10.0" 2677 | } 2678 | }, 2679 | "node_modules/require-directory": { 2680 | "version": "2.1.1", 2681 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 2682 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 2683 | "dev": true, 2684 | "license": "MIT", 2685 | "engines": { 2686 | "node": ">=0.10.0" 2687 | } 2688 | }, 2689 | "node_modules/resolve-from": { 2690 | "version": "4.0.0", 2691 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 2692 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 2693 | "dev": true, 2694 | "license": "MIT", 2695 | "engines": { 2696 | "node": ">=4" 2697 | } 2698 | }, 2699 | "node_modules/rfdc": { 2700 | "version": "1.4.1", 2701 | "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", 2702 | "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", 2703 | "dev": true, 2704 | "license": "MIT" 2705 | }, 2706 | "node_modules/run-applescript": { 2707 | "version": "7.0.0", 2708 | "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", 2709 | "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", 2710 | "dev": true, 2711 | "license": "MIT", 2712 | "engines": { 2713 | "node": ">=18" 2714 | }, 2715 | "funding": { 2716 | "url": "https://github.com/sponsors/sindresorhus" 2717 | } 2718 | }, 2719 | "node_modules/safe-buffer": { 2720 | "version": "5.2.1", 2721 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2722 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 2723 | "dev": true, 2724 | "funding": [ 2725 | { 2726 | "type": "github", 2727 | "url": "https://github.com/sponsors/feross" 2728 | }, 2729 | { 2730 | "type": "patreon", 2731 | "url": "https://www.patreon.com/feross" 2732 | }, 2733 | { 2734 | "type": "consulting", 2735 | "url": "https://feross.org/support" 2736 | } 2737 | ], 2738 | "license": "MIT" 2739 | }, 2740 | "node_modules/safer-buffer": { 2741 | "version": "2.1.2", 2742 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2743 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 2744 | "dev": true, 2745 | "license": "MIT" 2746 | }, 2747 | "node_modules/semver": { 2748 | "version": "7.7.1", 2749 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", 2750 | "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", 2751 | "dev": true, 2752 | "license": "ISC", 2753 | "bin": { 2754 | "semver": "bin/semver.js" 2755 | }, 2756 | "engines": { 2757 | "node": ">=10" 2758 | } 2759 | }, 2760 | "node_modules/serialize-javascript": { 2761 | "version": "6.0.2", 2762 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", 2763 | "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", 2764 | "dev": true, 2765 | "license": "BSD-3-Clause", 2766 | "dependencies": { 2767 | "randombytes": "^2.1.0" 2768 | } 2769 | }, 2770 | "node_modules/shebang-command": { 2771 | "version": "2.0.0", 2772 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2773 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2774 | "dev": true, 2775 | "license": "MIT", 2776 | "dependencies": { 2777 | "shebang-regex": "^3.0.0" 2778 | }, 2779 | "engines": { 2780 | "node": ">=8" 2781 | } 2782 | }, 2783 | "node_modules/shebang-regex": { 2784 | "version": "3.0.0", 2785 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2786 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2787 | "dev": true, 2788 | "license": "MIT", 2789 | "engines": { 2790 | "node": ">=8" 2791 | } 2792 | }, 2793 | "node_modules/signal-exit": { 2794 | "version": "4.1.0", 2795 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 2796 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 2797 | "dev": true, 2798 | "license": "ISC", 2799 | "engines": { 2800 | "node": ">=14" 2801 | }, 2802 | "funding": { 2803 | "url": "https://github.com/sponsors/isaacs" 2804 | } 2805 | }, 2806 | "node_modules/split2": { 2807 | "version": "4.2.0", 2808 | "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", 2809 | "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", 2810 | "dev": true, 2811 | "license": "ISC", 2812 | "engines": { 2813 | "node": ">= 10.x" 2814 | } 2815 | }, 2816 | "node_modules/sprintf-js": { 2817 | "version": "1.1.3", 2818 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", 2819 | "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", 2820 | "dev": true, 2821 | "license": "BSD-3-Clause" 2822 | }, 2823 | "node_modules/stoppable": { 2824 | "version": "1.1.0", 2825 | "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", 2826 | "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", 2827 | "dev": true, 2828 | "license": "MIT", 2829 | "engines": { 2830 | "node": ">=4", 2831 | "npm": ">=6" 2832 | } 2833 | }, 2834 | "node_modules/string_decoder": { 2835 | "version": "1.3.0", 2836 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 2837 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 2838 | "dev": true, 2839 | "license": "MIT", 2840 | "dependencies": { 2841 | "safe-buffer": "~5.2.0" 2842 | } 2843 | }, 2844 | "node_modules/string-width": { 2845 | "version": "5.1.2", 2846 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 2847 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 2848 | "dev": true, 2849 | "license": "MIT", 2850 | "dependencies": { 2851 | "eastasianwidth": "^0.2.0", 2852 | "emoji-regex": "^9.2.2", 2853 | "strip-ansi": "^7.0.1" 2854 | }, 2855 | "engines": { 2856 | "node": ">=12" 2857 | }, 2858 | "funding": { 2859 | "url": "https://github.com/sponsors/sindresorhus" 2860 | } 2861 | }, 2862 | "node_modules/string-width-cjs": { 2863 | "name": "string-width", 2864 | "version": "4.2.3", 2865 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2866 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2867 | "dev": true, 2868 | "license": "MIT", 2869 | "dependencies": { 2870 | "emoji-regex": "^8.0.0", 2871 | "is-fullwidth-code-point": "^3.0.0", 2872 | "strip-ansi": "^6.0.1" 2873 | }, 2874 | "engines": { 2875 | "node": ">=8" 2876 | } 2877 | }, 2878 | "node_modules/string-width-cjs/node_modules/ansi-regex": { 2879 | "version": "5.0.1", 2880 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2881 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2882 | "dev": true, 2883 | "license": "MIT", 2884 | "engines": { 2885 | "node": ">=8" 2886 | } 2887 | }, 2888 | "node_modules/string-width-cjs/node_modules/emoji-regex": { 2889 | "version": "8.0.0", 2890 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2891 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 2892 | "dev": true, 2893 | "license": "MIT" 2894 | }, 2895 | "node_modules/string-width-cjs/node_modules/strip-ansi": { 2896 | "version": "6.0.1", 2897 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2898 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2899 | "dev": true, 2900 | "license": "MIT", 2901 | "dependencies": { 2902 | "ansi-regex": "^5.0.1" 2903 | }, 2904 | "engines": { 2905 | "node": ">=8" 2906 | } 2907 | }, 2908 | "node_modules/strip-ansi": { 2909 | "version": "7.1.0", 2910 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 2911 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 2912 | "dev": true, 2913 | "license": "MIT", 2914 | "dependencies": { 2915 | "ansi-regex": "^6.0.1" 2916 | }, 2917 | "engines": { 2918 | "node": ">=12" 2919 | }, 2920 | "funding": { 2921 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 2922 | } 2923 | }, 2924 | "node_modules/strip-ansi-cjs": { 2925 | "name": "strip-ansi", 2926 | "version": "6.0.1", 2927 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2928 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2929 | "dev": true, 2930 | "license": "MIT", 2931 | "dependencies": { 2932 | "ansi-regex": "^5.0.1" 2933 | }, 2934 | "engines": { 2935 | "node": ">=8" 2936 | } 2937 | }, 2938 | "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { 2939 | "version": "5.0.1", 2940 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2941 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2942 | "dev": true, 2943 | "license": "MIT", 2944 | "engines": { 2945 | "node": ">=8" 2946 | } 2947 | }, 2948 | "node_modules/strip-json-comments": { 2949 | "version": "3.1.1", 2950 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 2951 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 2952 | "dev": true, 2953 | "license": "MIT", 2954 | "engines": { 2955 | "node": ">=8" 2956 | }, 2957 | "funding": { 2958 | "url": "https://github.com/sponsors/sindresorhus" 2959 | } 2960 | }, 2961 | "node_modules/supports-color": { 2962 | "version": "7.2.0", 2963 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 2964 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2965 | "dev": true, 2966 | "license": "MIT", 2967 | "dependencies": { 2968 | "has-flag": "^4.0.0" 2969 | }, 2970 | "engines": { 2971 | "node": ">=8" 2972 | } 2973 | }, 2974 | "node_modules/tarn": { 2975 | "version": "3.0.2", 2976 | "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", 2977 | "integrity": "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==", 2978 | "dev": true, 2979 | "license": "MIT", 2980 | "engines": { 2981 | "node": ">=8.0.0" 2982 | } 2983 | }, 2984 | "node_modules/tedious": { 2985 | "version": "18.6.1", 2986 | "resolved": "https://registry.npmjs.org/tedious/-/tedious-18.6.1.tgz", 2987 | "integrity": "sha512-9AvErXXQTd6l7TDd5EmM+nxbOGyhnmdbp/8c3pw+tjaiSXW9usME90ET/CRG1LN1Y9tPMtz/p83z4Q97B4DDpw==", 2988 | "dev": true, 2989 | "license": "MIT", 2990 | "dependencies": { 2991 | "@azure/core-auth": "^1.7.2", 2992 | "@azure/identity": "^4.2.1", 2993 | "@azure/keyvault-keys": "^4.4.0", 2994 | "@js-joda/core": "^5.6.1", 2995 | "@types/node": ">=18", 2996 | "bl": "^6.0.11", 2997 | "iconv-lite": "^0.6.3", 2998 | "js-md4": "^0.3.2", 2999 | "native-duplexpair": "^1.0.0", 3000 | "sprintf-js": "^1.1.3" 3001 | }, 3002 | "engines": { 3003 | "node": ">=18" 3004 | } 3005 | }, 3006 | "node_modules/to-regex-range": { 3007 | "version": "5.0.1", 3008 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 3009 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 3010 | "dev": true, 3011 | "license": "MIT", 3012 | "dependencies": { 3013 | "is-number": "^7.0.0" 3014 | }, 3015 | "engines": { 3016 | "node": ">=8.0" 3017 | } 3018 | }, 3019 | "node_modules/tslib": { 3020 | "version": "2.8.1", 3021 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", 3022 | "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", 3023 | "dev": true, 3024 | "license": "0BSD" 3025 | }, 3026 | "node_modules/type-check": { 3027 | "version": "0.4.0", 3028 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 3029 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 3030 | "dev": true, 3031 | "license": "MIT", 3032 | "dependencies": { 3033 | "prelude-ls": "^1.2.1" 3034 | }, 3035 | "engines": { 3036 | "node": ">= 0.8.0" 3037 | } 3038 | }, 3039 | "node_modules/undici-types": { 3040 | "version": "6.20.0", 3041 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", 3042 | "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", 3043 | "dev": true, 3044 | "license": "MIT" 3045 | }, 3046 | "node_modules/uri-js": { 3047 | "version": "4.4.1", 3048 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 3049 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 3050 | "dev": true, 3051 | "license": "BSD-2-Clause", 3052 | "dependencies": { 3053 | "punycode": "^2.1.0" 3054 | } 3055 | }, 3056 | "node_modules/uuid": { 3057 | "version": "8.3.2", 3058 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 3059 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", 3060 | "dev": true, 3061 | "license": "MIT", 3062 | "bin": { 3063 | "uuid": "dist/bin/uuid" 3064 | } 3065 | }, 3066 | "node_modules/which": { 3067 | "version": "2.0.2", 3068 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 3069 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 3070 | "dev": true, 3071 | "license": "ISC", 3072 | "dependencies": { 3073 | "isexe": "^2.0.0" 3074 | }, 3075 | "bin": { 3076 | "node-which": "bin/node-which" 3077 | }, 3078 | "engines": { 3079 | "node": ">= 8" 3080 | } 3081 | }, 3082 | "node_modules/word-wrap": { 3083 | "version": "1.2.5", 3084 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", 3085 | "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", 3086 | "dev": true, 3087 | "license": "MIT", 3088 | "engines": { 3089 | "node": ">=0.10.0" 3090 | } 3091 | }, 3092 | "node_modules/workerpool": { 3093 | "version": "6.5.1", 3094 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", 3095 | "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", 3096 | "dev": true, 3097 | "license": "Apache-2.0" 3098 | }, 3099 | "node_modules/wrap-ansi": { 3100 | "version": "8.1.0", 3101 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 3102 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 3103 | "dev": true, 3104 | "license": "MIT", 3105 | "dependencies": { 3106 | "ansi-styles": "^6.1.0", 3107 | "string-width": "^5.0.1", 3108 | "strip-ansi": "^7.0.1" 3109 | }, 3110 | "engines": { 3111 | "node": ">=12" 3112 | }, 3113 | "funding": { 3114 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 3115 | } 3116 | }, 3117 | "node_modules/wrap-ansi-cjs": { 3118 | "name": "wrap-ansi", 3119 | "version": "7.0.0", 3120 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 3121 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 3122 | "dev": true, 3123 | "license": "MIT", 3124 | "dependencies": { 3125 | "ansi-styles": "^4.0.0", 3126 | "string-width": "^4.1.0", 3127 | "strip-ansi": "^6.0.0" 3128 | }, 3129 | "engines": { 3130 | "node": ">=10" 3131 | }, 3132 | "funding": { 3133 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 3134 | } 3135 | }, 3136 | "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { 3137 | "version": "5.0.1", 3138 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 3139 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 3140 | "dev": true, 3141 | "license": "MIT", 3142 | "engines": { 3143 | "node": ">=8" 3144 | } 3145 | }, 3146 | "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { 3147 | "version": "8.0.0", 3148 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 3149 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 3150 | "dev": true, 3151 | "license": "MIT" 3152 | }, 3153 | "node_modules/wrap-ansi-cjs/node_modules/string-width": { 3154 | "version": "4.2.3", 3155 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 3156 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 3157 | "dev": true, 3158 | "license": "MIT", 3159 | "dependencies": { 3160 | "emoji-regex": "^8.0.0", 3161 | "is-fullwidth-code-point": "^3.0.0", 3162 | "strip-ansi": "^6.0.1" 3163 | }, 3164 | "engines": { 3165 | "node": ">=8" 3166 | } 3167 | }, 3168 | "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { 3169 | "version": "6.0.1", 3170 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 3171 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 3172 | "dev": true, 3173 | "license": "MIT", 3174 | "dependencies": { 3175 | "ansi-regex": "^5.0.1" 3176 | }, 3177 | "engines": { 3178 | "node": ">=8" 3179 | } 3180 | }, 3181 | "node_modules/wrap-ansi/node_modules/ansi-styles": { 3182 | "version": "6.2.1", 3183 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 3184 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 3185 | "dev": true, 3186 | "license": "MIT", 3187 | "engines": { 3188 | "node": ">=12" 3189 | }, 3190 | "funding": { 3191 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 3192 | } 3193 | }, 3194 | "node_modules/xtend": { 3195 | "version": "4.0.2", 3196 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 3197 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 3198 | "dev": true, 3199 | "license": "MIT", 3200 | "engines": { 3201 | "node": ">=0.4" 3202 | } 3203 | }, 3204 | "node_modules/y18n": { 3205 | "version": "5.0.8", 3206 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 3207 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 3208 | "dev": true, 3209 | "license": "ISC", 3210 | "engines": { 3211 | "node": ">=10" 3212 | } 3213 | }, 3214 | "node_modules/yargs": { 3215 | "version": "17.7.2", 3216 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", 3217 | "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", 3218 | "dev": true, 3219 | "license": "MIT", 3220 | "dependencies": { 3221 | "cliui": "^8.0.1", 3222 | "escalade": "^3.1.1", 3223 | "get-caller-file": "^2.0.5", 3224 | "require-directory": "^2.1.1", 3225 | "string-width": "^4.2.3", 3226 | "y18n": "^5.0.5", 3227 | "yargs-parser": "^21.1.1" 3228 | }, 3229 | "engines": { 3230 | "node": ">=12" 3231 | } 3232 | }, 3233 | "node_modules/yargs-parser": { 3234 | "version": "21.1.1", 3235 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", 3236 | "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", 3237 | "dev": true, 3238 | "license": "ISC", 3239 | "engines": { 3240 | "node": ">=12" 3241 | } 3242 | }, 3243 | "node_modules/yargs-unparser": { 3244 | "version": "2.0.0", 3245 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 3246 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 3247 | "dev": true, 3248 | "license": "MIT", 3249 | "dependencies": { 3250 | "camelcase": "^6.0.0", 3251 | "decamelize": "^4.0.0", 3252 | "flat": "^5.0.2", 3253 | "is-plain-obj": "^2.1.0" 3254 | }, 3255 | "engines": { 3256 | "node": ">=10" 3257 | } 3258 | }, 3259 | "node_modules/yargs/node_modules/ansi-regex": { 3260 | "version": "5.0.1", 3261 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 3262 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 3263 | "dev": true, 3264 | "license": "MIT", 3265 | "engines": { 3266 | "node": ">=8" 3267 | } 3268 | }, 3269 | "node_modules/yargs/node_modules/emoji-regex": { 3270 | "version": "8.0.0", 3271 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 3272 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 3273 | "dev": true, 3274 | "license": "MIT" 3275 | }, 3276 | "node_modules/yargs/node_modules/string-width": { 3277 | "version": "4.2.3", 3278 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 3279 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 3280 | "dev": true, 3281 | "license": "MIT", 3282 | "dependencies": { 3283 | "emoji-regex": "^8.0.0", 3284 | "is-fullwidth-code-point": "^3.0.0", 3285 | "strip-ansi": "^6.0.1" 3286 | }, 3287 | "engines": { 3288 | "node": ">=8" 3289 | } 3290 | }, 3291 | "node_modules/yargs/node_modules/strip-ansi": { 3292 | "version": "6.0.1", 3293 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 3294 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 3295 | "dev": true, 3296 | "license": "MIT", 3297 | "dependencies": { 3298 | "ansi-regex": "^5.0.1" 3299 | }, 3300 | "engines": { 3301 | "node": ">=8" 3302 | } 3303 | }, 3304 | "node_modules/yocto-queue": { 3305 | "version": "0.1.0", 3306 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 3307 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 3308 | "dev": true, 3309 | "license": "MIT", 3310 | "engines": { 3311 | "node": ">=10" 3312 | }, 3313 | "funding": { 3314 | "url": "https://github.com/sponsors/sindresorhus" 3315 | } 3316 | } 3317 | } 3318 | } 3319 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "json-schema-table", 3 | "version": "2.0.2", 4 | "description": "Creates and maintains a SQL table structure", 5 | "repository": "https://github.com/andrglo/json-schema-table.git", 6 | "author": { 7 | "name": "Andre Gloria", 8 | "email": "andredagloria@gmail.com" 9 | }, 10 | "files": [ 11 | "src" 12 | ], 13 | "main": "src/index.js", 14 | "keywords": [ 15 | "json", 16 | "schema", 17 | "SQL", 18 | "Postgres", 19 | "mssql" 20 | ], 21 | "devDependencies": { 22 | "chai": "^5.2.0", 23 | "eslint": "^9.22.0", 24 | "eslint-config-google": "^0.14.0", 25 | "mocha": "^11.1.0", 26 | "mssql-cr-layer": "^3.0.2", 27 | "pg-cr-layer": "^2.0.24" 28 | }, 29 | "scripts": { 30 | "test": "mocha --bail --exit --timeout 30000 test/index.js", 31 | "ssh": "docker exec -it json-schema-table-dms-1 fish" 32 | }, 33 | "license": "MIT", 34 | "dependencies": { 35 | "lodash": "^4.17.21" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | const _ = require('lodash') 2 | const assert = require('assert') 3 | 4 | const utils = require('./utils') 5 | 6 | module.exports = jsonSchemaTable 7 | 8 | function jsonSchemaTable(tableName, schema, config) { 9 | config = Object.assign({}, config) 10 | assert( 11 | config.db, 12 | 'Database connector not informed, should be one of: ' + 13 | 'mssql-cr-layer or pg-cr-layer' 14 | ) 15 | const dialect = { 16 | db: config.db 17 | } 18 | if (config.db.dialect === 'mssql') { 19 | dialect.datetime = config.datetime 20 | dialect.propertyToDb = propertyToMssql 21 | } else { 22 | dialect.propertyToDb = propertyToPostgres 23 | dialect.bigint = !!config.bigint 24 | dialect.doubleFloats = !!config.doubleFloats 25 | } 26 | 27 | const dbSchemaName = 28 | config.schema || (dialect.db.dialect === 'mssql' ? 'dbo' : 'public') 29 | 30 | return { 31 | create: function() { 32 | return Promise.resolve() 33 | .then(function() { 34 | return dialect.db.execute( 35 | createTable(dialect, tableName, dbSchemaName, schema) 36 | ) 37 | }) 38 | .catch(function(error) { 39 | wrapError(error, [dbSchemaName, tableName].join('.')) 40 | throw error 41 | }) 42 | }, 43 | sync: function() { 44 | return getDbMetadata(dialect, tableName, dbSchemaName) 45 | .then(function(metadata) { 46 | if (!tableExists(metadata)) { 47 | throw new Error('All tables should be created first') 48 | } 49 | return checkTableStructure( 50 | dialect, 51 | tableName, 52 | dbSchemaName, 53 | schema, 54 | metadata 55 | ).then(function() { 56 | return createTableReferences( 57 | dialect, 58 | tableName, 59 | dbSchemaName, 60 | schema, 61 | metadata 62 | ) 63 | }) 64 | }) 65 | .catch(function(error) { 66 | wrapError(error, tableName) 67 | throw error 68 | }) 69 | }, 70 | metadata: function() { 71 | return getDbMetadata(dialect, tableName, dbSchemaName) 72 | .then(function(metadata) { 73 | const tableMetadata = {columns: metadata.columns} 74 | const primaryKey = metadata.tablesWithPrimaryKey[tableName] 75 | if (primaryKey) { 76 | tableMetadata.primaryKey = primaryKey.map(function(column) { 77 | return column.name 78 | }) 79 | } 80 | const uniqueKeys = metadata.tablesWithUniqueKeys[tableName] 81 | if (uniqueKeys) { 82 | tableMetadata.uniqueKeys = [] 83 | _.forEach(uniqueKeys, function(uniqueKey) { 84 | tableMetadata.uniqueKeys.push( 85 | uniqueKey.map(function(column) { 86 | return column.name 87 | }) 88 | ) 89 | }) 90 | } 91 | const foreignKeys = metadata.tablesWithForeignKeys[tableName] 92 | if (foreignKeys) { 93 | tableMetadata.foreignKeys = foreignKeys.map(function(foreignKey) { 94 | return { 95 | table: foreignKey.table, 96 | columns: foreignKey.columns 97 | } 98 | }) 99 | } 100 | return tableMetadata 101 | }) 102 | .catch(function(error) { 103 | wrapError(error, tableName) 104 | throw error 105 | }) 106 | } 107 | } 108 | } 109 | 110 | function getDbMetadata(dialect, tableName, dbSchemaName) { 111 | function isRedshift() { 112 | return new Promise(function(resolve, reject) { 113 | if (dialect.db.dialect !== 'postgres') { 114 | resolve(false) 115 | } else { 116 | dialect.db 117 | .isRedshift() 118 | .then(function(res) { 119 | resolve(res) 120 | }) 121 | .catch(function(err) { 122 | reject(err) 123 | }) 124 | } 125 | }) 126 | } 127 | 128 | const dbToProperty = 129 | dialect.db.dialect === 'mssql' ? mssqlToProperty : postgresToProperty 130 | const metadata = { 131 | tablesWithPrimaryKey: {}, 132 | tablesWithUniqueKeys: {}, 133 | tablesWithForeignKeys: {}, 134 | columns: {} 135 | } 136 | const catalog = 137 | dialect.db.dialect === 'mssql' ? 'db_name()' : 'current_database()' 138 | return isRedshift() 139 | .then(function(rs) { 140 | if (!rs) { 141 | return dialect.db 142 | .query( 143 | 'SELECT pk.CONSTRAINT_NAME as constraint_name,pk.TABLE_NAME as table_name,' + 144 | 'pk.COLUMN_NAME as column_name,' + 145 | 'rfk.TABLE_NAME as ref_table_name,rfk.COLUMN_NAME as ref_column_name,' + 146 | 'c.DATA_TYPE as data_type,c.CHARACTER_MAXIMUM_LENGTH as character_maximum_length,' + 147 | 'c.NUMERIC_PRECISION as numeric_precision,c.NUMERIC_SCALE as numerico_scale ' + 148 | 'FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE as pk ' + 149 | 'INNER JOIN INFORMATION_SCHEMA.COLUMNS as c ON pk.COLUMN_NAME=c.COLUMN_NAME AND pk.TABLE_NAME=c.TABLE_NAME AND ' + 150 | 'pk.TABLE_CATALOG=c.TABLE_CATALOG AND pk.TABLE_SCHEMA=c.TABLE_SCHEMA ' + 151 | 'LEFT OUTER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS as rk ON pk.CONSTRAINT_NAME=rk.CONSTRAINT_NAME AND ' + 152 | 'pk.TABLE_CATALOG=rk.CONSTRAINT_CATALOG AND pk.TABLE_SCHEMA=rk.CONSTRAINT_SCHEMA ' + 153 | 'LEFT OUTER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE as rfk ON rk.UNIQUE_CONSTRAINT_NAME=rfk.CONSTRAINT_NAME ' + 154 | 'AND pk.ORDINAL_POSITION=rfk.ORDINAL_POSITION AND ' + 155 | 'pk.TABLE_CATALOG=rfk.TABLE_CATALOG AND pk.TABLE_SCHEMA=rfk.TABLE_SCHEMA ' + 156 | 'WHERE pk.TABLE_CATALOG=' + 157 | catalog + 158 | 'AND pk.TABLE_SCHEMA=\'' + 159 | dbSchemaName + 160 | '\'' + 161 | 'ORDER BY pk.TABLE_NAME,pk.CONSTRAINT_NAME,pk.ORDINAL_POSITION' 162 | ) 163 | .then(function(recordset) { 164 | const constraints = {} 165 | recordset.map(function(record) { 166 | if (!constraints[record.constraint_name]) { 167 | constraints[record.constraint_name] = { 168 | table: record.table_name, 169 | references: record.ref_table_name, 170 | columns: [] 171 | } 172 | } 173 | 174 | const constraint = constraints[record.constraint_name] 175 | constraint.columns.push(dbToProperty(record)) 176 | }) 177 | return constraints 178 | }) 179 | } else { 180 | // Redshift does not support PK or FK constraints so just return an empty array. 181 | return Promise.resolve({}) 182 | } 183 | }) 184 | .then(function(constraints) { 185 | _.forEach(constraints, function(constraint, constraintName) { 186 | const table = constraint.table 187 | const constraintType = constraintName.substr(0, 2).toLowerCase() 188 | switch (constraintType) { 189 | case 'pk': 190 | metadata.tablesWithPrimaryKey[table] = constraint.columns 191 | break 192 | case 'fk': 193 | const fk = (metadata.tablesWithForeignKeys[table] = 194 | metadata.tablesWithForeignKeys[table] || []) 195 | fk.push({ 196 | table: constraint.references, 197 | columns: constraint.columns 198 | }) 199 | break 200 | case 'uk': 201 | const uk = (metadata.tablesWithUniqueKeys[table] = 202 | metadata.tablesWithUniqueKeys[table] || []) 203 | uk.push(constraint.columns) 204 | break 205 | } 206 | }) 207 | return dialect.db.query( 208 | 'SELECT COLUMN_NAME as column_name,IS_NULLABLE as is_nullable,' + 209 | 'DATA_TYPE as data_type,' + 210 | 'CHARACTER_MAXIMUM_LENGTH as character_maximum_length,NUMERIC_PRECISION as numeric_precision,' + 211 | 'NUMERIC_SCALE as numeric_scale FROM ' + 212 | 'INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=\'' + 213 | tableName + 214 | '\'' + 215 | 'AND TABLE_CATALOG=' + 216 | catalog + 217 | 'AND TABLE_SCHEMA=\'' + 218 | dbSchemaName + 219 | '\'' 220 | ) 221 | }) 222 | .then(function(recordset) { 223 | recordset.map(function(record) { 224 | metadata.columns[record.column_name] = dbToProperty(record) 225 | }) 226 | return metadata 227 | }) 228 | } 229 | 230 | function createTable(dialect, tableName, dbSchemaName, schema) { 231 | const columns = [] 232 | const primaryKey = utils.mapToColumnName(schema.primaryKey, schema) || [] 233 | const primaryKeyDefined = primaryKey.length > 0 234 | const unique = [] 235 | 236 | const qualifiedTableName = [ 237 | dialect.db.wrap(dbSchemaName), 238 | dialect.db.wrap(tableName) 239 | ].join('.') 240 | 241 | _.forEach(schema.properties, function(property, name) { 242 | const fieldName = property.field || name 243 | const fieldType = dialect.propertyToDb(property, name, schema) 244 | if (fieldType === void 0) { 245 | return 246 | } 247 | columns.push(dialect.db.wrap(fieldName) + ' ' + fieldType) 248 | if (primaryKeyDefined === false && property.primaryKey === true) { 249 | primaryKey.push(fieldName) 250 | } 251 | if (property.unique === true) { 252 | unique.push([fieldName]) 253 | } 254 | }) 255 | if (primaryKey.length) { 256 | columns.push( 257 | 'CONSTRAINT ' + 258 | dialect.db.wrap(buildPkConstraintName(tableName, primaryKey)) + 259 | ' PRIMARY KEY (' + 260 | primaryKey 261 | .map(function(column) { 262 | return dialect.db.wrap(column) 263 | }) 264 | .join(',') + 265 | ')' 266 | ) 267 | } 268 | 269 | if (schema.unique) { 270 | schema.unique.map(function(key) { 271 | unique.push(utils.mapToColumnName(key, schema)) 272 | }) 273 | } 274 | if (unique.length) { 275 | unique.map(function(group) { 276 | columns.push( 277 | 'CONSTRAINT ' + 278 | dialect.db.wrap(buildUniqueConstraintName(tableName, group)) + 279 | ' UNIQUE (' + 280 | group 281 | .map(function(column) { 282 | return dialect.db.wrap(column) 283 | }) 284 | .join(',') + 285 | ')' 286 | ) 287 | }) 288 | } 289 | 290 | return dialect.db.dialect === 'mssql' 291 | ? 'IF (NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE ' + 292 | `TABLE_SCHEMA = '${dbSchemaName}' AND TABLE_NAME = '${tableName}')) ` + 293 | `CREATE TABLE ${qualifiedTableName} (${columns.join(',')})` 294 | : `CREATE TABLE IF NOT EXISTS ${qualifiedTableName} (${columns.join(',')})` 295 | } 296 | 297 | function alterTable(dialect, tableName, dbSchemaName, schema, metadata) { 298 | const commands = [] 299 | const primaryKey = [] 300 | const unique = [] 301 | 302 | const qualifiedTableName = [ 303 | dialect.db.wrap(dbSchemaName), 304 | dialect.db.wrap(tableName) 305 | ].join('.') 306 | 307 | _.forEach(schema.properties, function(property, name) { 308 | const fieldName = property.field || name 309 | const fieldType = dialect.propertyToDb(property, name, schema, true) 310 | if (fieldType === void 0) { 311 | return 312 | } 313 | if ( 314 | property.primaryKey === true || 315 | (schema.primaryKey && schema.primaryKey.indexOf(name) !== -1) 316 | ) { 317 | primaryKey.push(fieldName) 318 | } 319 | if (property.unique === true) { 320 | unique.push([fieldName]) 321 | } 322 | 323 | if (!metadata.columns[fieldName]) { 324 | commands.push( 325 | 'ALTER TABLE ' + 326 | qualifiedTableName + 327 | ' ADD ' + 328 | dialect.db.wrap(fieldName) + 329 | ' ' + 330 | dialect.propertyToDb(property, name, schema) 331 | ) 332 | } else if (!equalDefinitions(metadata.columns[fieldName], property)) { 333 | if (canAlterColumn(metadata.columns[fieldName], property)) { 334 | commands.push( 335 | 'ALTER TABLE ' + 336 | qualifiedTableName + 337 | ' ALTER COLUMN ' + 338 | dialect.db.wrap(fieldName) + 339 | ' ' + 340 | fieldType 341 | ) 342 | if (dialect.name === 'postgres') { 343 | commands.push( 344 | 'ALTER TABLE ' + 345 | qualifiedTableName + 346 | ' ALTER COLUMN ' + 347 | dialect.db.wrap(fieldName) + 348 | ' ' + 349 | postgresSetNull(property, name, schema) 350 | ) 351 | } 352 | } else { 353 | throw new Error('Column ' + fieldName + ' cannot be modified') 354 | } 355 | } 356 | }) 357 | const oldPrimaryKey = metadata.tablesWithPrimaryKey[tableName] 358 | ? metadata.tablesWithPrimaryKey[tableName].map(function(column) { 359 | return column.name 360 | }) 361 | : [] 362 | if (_.difference(primaryKey, oldPrimaryKey).length) { 363 | if (oldPrimaryKey.length) { 364 | commands.push( 365 | 'ALTER TABLE ' + 366 | qualifiedTableName + 367 | ' DROP CONSTRAINT ' + 368 | dialect.db.wrap(buildPkConstraintName(tableName, oldPrimaryKey)) 369 | ) 370 | } 371 | if (primaryKey.length) { 372 | commands.push( 373 | 'ALTER TABLE ' + 374 | qualifiedTableName + 375 | ' ADD CONSTRAINT ' + 376 | dialect.db.wrap(buildPkConstraintName(tableName, primaryKey)) + 377 | ' PRIMARY KEY (' + 378 | primaryKey 379 | .map(function(column) { 380 | return dialect.db.wrap(column) 381 | }) 382 | .join(',') + 383 | ')' 384 | ) 385 | } 386 | } 387 | 388 | if (schema.unique) { 389 | schema.unique.map(function(key) { 390 | unique.push(utils.mapToColumnName(key, schema)) 391 | }) 392 | } 393 | if (unique.length) { 394 | unique.map(function(key) { 395 | if (!uniqueKeyExists(key, metadata.tablesWithUniqueKeys[tableName])) { 396 | commands.push( 397 | 'ALTER TABLE ' + 398 | qualifiedTableName + 399 | ' ADD CONSTRAINT ' + 400 | dialect.db.wrap(buildUniqueConstraintName(tableName, key)) + 401 | ' UNIQUE (' + 402 | key 403 | .map(function(column) { 404 | return dialect.db.wrap(column) 405 | }) 406 | .join(',') + 407 | ')' 408 | ) 409 | } 410 | }) 411 | } 412 | 413 | return commands.join(';') 414 | } 415 | 416 | function createTableReferences( 417 | dialect, 418 | tableName, 419 | dbSchemaName, 420 | schema, 421 | metadata 422 | ) { 423 | const commands = [] 424 | 425 | const qualifiedTableName = [ 426 | dialect.db.wrap(dbSchemaName), 427 | dialect.db.wrap(tableName) 428 | ].join('.') 429 | 430 | const $refs = [] 431 | _.forEach(schema.properties, function(property, name) { 432 | const $ref = property.$ref || (property.schema && property.schema.$ref) 433 | if ($ref) { 434 | const referencedTableName = getReferencedTableName($ref) 435 | if ( 436 | metadata.tablesWithPrimaryKey[referencedTableName] || 437 | metadata.tablesWithUniqueKeys[referencedTableName] 438 | ) { 439 | const foreignKey = property.field || name 440 | let key = property.schema && property.schema.key 441 | if (!key) { 442 | const pk = metadata.tablesWithPrimaryKey[referencedTableName] 443 | if (pk && pk.length === 1) { 444 | key = pk[0].name 445 | } 446 | } 447 | assert( 448 | key, 449 | 'Foreign key "' + 450 | foreignKey + 451 | '" don\'t have a candidate key column defined in table "' + 452 | referencedTableName + 453 | '"' 454 | ) 455 | $refs.push({ 456 | table: referencedTableName, 457 | key: [key], 458 | foreignKey: [foreignKey] 459 | }) 460 | } 461 | } 462 | }) 463 | _.forEach(schema.foreignKeys, function(keys, referencedTableName) { 464 | const fk = { 465 | table: referencedTableName, 466 | key: [], 467 | foreignKey: [] 468 | } 469 | _.forEach(keys, function(foreignKey, key) { 470 | fk.key.push(key) 471 | fk.foreignKey.push(foreignKey) 472 | }) 473 | $refs.push(fk) 474 | }) 475 | 476 | _.forEach($refs, function($ref) { 477 | const table = $ref.table 478 | 479 | const primaryKey = metadata.tablesWithPrimaryKey[table] 480 | const candidateKeys = primaryKey ? [primaryKey] : [] 481 | _.forEach(metadata.tablesWithUniqueKeys[table], function(key) { 482 | candidateKeys.push(key) 483 | }) 484 | let candidateKey 485 | _.forEach(candidateKeys, function(ck) { 486 | if ( 487 | ck 488 | .map(function(k) { 489 | return k.name 490 | }) 491 | .join() === $ref.key.join() 492 | ) { 493 | candidateKey = ck 494 | return false 495 | } 496 | }) 497 | if (!candidateKey) { 498 | throw new Error( 499 | 'Table "' + 500 | table + 501 | '" has no candidate key for "' + 502 | $ref.key.join(',') + 503 | '" to be referenced' 504 | ) 505 | } 506 | 507 | let hfk = false 508 | const hash = ( 509 | $ref.foreignKey.join('') + 510 | table + 511 | $ref.key.join('') 512 | ).toLowerCase() 513 | _.forEach(metadata.tablesWithForeignKeys[tableName], function(fk) { 514 | const fkHash = ( 515 | fk.columns.reduce(function(columns, column) { 516 | return columns + column.name 517 | }, '') + 518 | fk.table + 519 | fk.columns.reduce(function(columns, column) { 520 | return columns + column.references 521 | }, '') 522 | ).toLowerCase() 523 | if (hash === fkHash) { 524 | hfk = true 525 | return false 526 | } 527 | }) 528 | 529 | if (hfk === false) { 530 | $ref.foreignKey.map(function(foreignKey, index) { 531 | if (!metadata.columns[foreignKey]) { 532 | const property = candidateKey.reduce(function(result, key) { 533 | return result || (key.name === $ref.key[index] && key) 534 | }, void 0) 535 | commands.push( 536 | 'ALTER TABLE ' + 537 | qualifiedTableName + 538 | ' ADD ' + 539 | dialect.db.wrap(foreignKey) + 540 | ' ' + 541 | dialect.propertyToDb(property, foreignKey) 542 | ) 543 | } 544 | }) 545 | 546 | const constraintName = 547 | 'FK__' + tableName + '__' + $ref.foreignKey.join('__') 548 | commands.push( 549 | 'ALTER TABLE ' + 550 | qualifiedTableName + 551 | ' ADD CONSTRAINT ' + 552 | dialect.db.wrap(constraintName) + 553 | ' FOREIGN KEY (' + 554 | $ref.foreignKey 555 | .map(function(column) { 556 | return dialect.db.wrap(column) 557 | }) 558 | .join(',') + 559 | ') REFERENCES ' + 560 | dialect.db.wrap(table) + 561 | ' (' + 562 | $ref.key 563 | .map(function(column) { 564 | return dialect.db.wrap(column) 565 | }) 566 | .join(',') + 567 | ')' 568 | ) 569 | } 570 | }) 571 | 572 | return commands.length 573 | ? dialect.db.execute(commands.join(';')) 574 | : Promise.resolve() 575 | } 576 | 577 | function propertyToMssql(property, name, schema) { 578 | let column 579 | switch (property.type) { 580 | case 'integer': 581 | column = 'INT' 582 | if (property.autoIncrement === true) { 583 | column += ' IDENTITY(1,1)' 584 | } 585 | break 586 | case 'text': 587 | column = 'NVARCHAR(MAX)' 588 | break 589 | case 'blob': 590 | column = 'VARBINARY(MAX)' 591 | break 592 | case 'string': 593 | column = 594 | 'NVARCHAR(' + (property.maxLength ? property.maxLength : 'MAX') + ')' 595 | break 596 | case 'date': 597 | column = 'DATE' 598 | break 599 | case 'datetime': 600 | if (property.timezone === true) { 601 | column = 'DATETIMEOFFSET' 602 | } else { 603 | column = 'DATETIME2' 604 | } 605 | break 606 | case 'number': 607 | if (property.decimals) { 608 | column = 'DEC(' + property.maxLength + ',' + property.decimals + ')' 609 | } else { 610 | column = 'INT' 611 | } 612 | break 613 | case 'object': 614 | case void 0: 615 | return void 0 616 | case 'array': 617 | throw new Error( 618 | 'Property ' + name + ' has type not yet implemented: ' + property.type 619 | ) 620 | default: 621 | throw new Error('Property ' + name + ' has no correspondent mssql type') 622 | } 623 | column += 624 | ' ' + 625 | (property.required === true || 626 | property.primaryKey === true || 627 | (schema && utils.isInArray(name, schema.primaryKey, schema)) || 628 | (schema && utils.isInArray(name, schema.required, schema)) 629 | ? 'NOT NULL' 630 | : 'NULL') 631 | return column 632 | } 633 | 634 | function mssqlToProperty(metadata) { 635 | const property = {name: metadata.column_name} 636 | switch (metadata.data_type) { 637 | case 'int': 638 | property.type = 'integer' 639 | break 640 | case 'nvarchar': 641 | if (metadata.character_maximum_length === -1) { 642 | property.type = 'text' 643 | } else { 644 | property.type = 'string' 645 | property.maxLength = metadata.character_maximum_length 646 | } 647 | break 648 | case 'varbinary': 649 | property.type = 'blob' 650 | break 651 | case 'date': 652 | property.type = 'date' 653 | break 654 | case 'datetime': 655 | case 'datetime2': 656 | case 'datetimeoffset': 657 | property.type = 'datetime' 658 | break 659 | case 'decimal': 660 | property.type = 'number' 661 | property.maxLength = metadata.numeric_precision 662 | property.decimals = metadata.numeric_scale 663 | break 664 | default: 665 | throw new Error( 666 | 'Mssql column ' + 667 | metadata.column_name + 668 | ' type ' + 669 | metadata.data_type + 670 | ' has no correspondent property type' 671 | ) 672 | } 673 | if (metadata.is_nullable === 'NO') { 674 | property.required = true 675 | } 676 | if (metadata.ref_column_name) { 677 | property.references = metadata.ref_column_name 678 | } 679 | return property 680 | } 681 | 682 | function propertyToPostgres(property, name, schema, isAlter) { 683 | let column 684 | const integerType = this.bigint ? 'BIGINT' : 'INTEGER' 685 | const floatType = this.doubleFloats ? 'DOUBLE PRECISION' : 'REAL' 686 | 687 | switch (property.type) { 688 | case 'integer': 689 | if (property.autoIncrement === true) { 690 | column = 'SERIAL' 691 | } else { 692 | column = integerType 693 | } 694 | break 695 | case 'text': 696 | column = 'TEXT' 697 | break 698 | case 'boolean': 699 | column = 'BOOLEAN' 700 | break 701 | case 'blob': 702 | column = 'BYTEA' 703 | break 704 | case 'string': 705 | if (property.format === 'date-time') { 706 | column = 'TIMESTAMPTZ' 707 | } else { 708 | if (property.maxLength) { 709 | column = 'VARCHAR(' + property.maxLength + ')' 710 | } else { 711 | column = 'TEXT' 712 | } 713 | } 714 | break 715 | case 'date': 716 | column = 'DATE' 717 | break 718 | case 'time': 719 | column = 'TIME WITH TIME ZONE' 720 | break 721 | case 'datetime': 722 | column = 'TIMESTAMP WITH TIME ZONE' 723 | break 724 | case 'number': 725 | if (property.decimals && property.decimals > 0) { 726 | column = 'NUMERIC(' + property.maxLength + ',' + property.decimals + ')' 727 | } else if (property.maxLength > 0) { 728 | column = integerType 729 | } else { 730 | column = floatType 731 | } 732 | break 733 | case 'object': 734 | case void 0: 735 | return void 0 736 | case 'array': 737 | throw new Error( 738 | 'Property ' + name + ' has type not yet implemented: ' + property.type 739 | ) 740 | default: 741 | throw new Error( 742 | 'Property ' + name + ' has no correspondent postgres type' 743 | ) 744 | } 745 | if (isAlter === true) { 746 | column = ' TYPE ' + column 747 | } else { 748 | column += 749 | ' ' + 750 | (property.required === true || 751 | property.primaryKey === true || 752 | (schema && utils.isInArray(name, schema.primaryKey, schema)) || 753 | (schema && utils.isInArray(name, schema.required, schema)) 754 | ? 'NOT NULL' 755 | : 'NULL') 756 | } 757 | return column 758 | } 759 | 760 | function postgresSetNull(property, name, schema) { 761 | return property.required === true || 762 | property.primaryKey === true || 763 | (schema && utils.isInArray(name, schema.primaryKey, schema)) || 764 | (schema && utils.isInArray(name, schema.required, schema)) 765 | ? 'SET NOT NULL' 766 | : 'DROP NOT NULL' 767 | } 768 | 769 | function postgresToProperty(metadata) { 770 | const property = {name: metadata.column_name} 771 | switch (metadata.data_type) { 772 | case 'integer': 773 | case 'boolean': 774 | case 'text': 775 | case 'date': 776 | property.type = metadata.data_type 777 | break 778 | case 'bigint': 779 | property.type = 'integer' 780 | break 781 | case 'real': 782 | case 'double precision': 783 | property.type = 'number' 784 | break 785 | case 'time': 786 | property.type = 'time' 787 | break 788 | case 'time with time zone': 789 | property.type = 'time' 790 | break 791 | case 'timestamp': 792 | property.type = 'datetime' 793 | break 794 | case 'timestamp without time zone': 795 | case 'timestamp with time zone': 796 | property.type = 'datetime' 797 | break 798 | case 'character varying': 799 | property.type = 'string' 800 | property.maxLength = metadata.character_maximum_length 801 | break 802 | case 'bytea': 803 | property.type = 'blob' 804 | break 805 | case 'numeric': 806 | property.type = 'number' 807 | property.maxLength = metadata.numeric_precision 808 | property.decimals = metadata.numeric_scale 809 | break 810 | default: 811 | throw new Error( 812 | 'Postgres column ' + 813 | metadata.column_name + 814 | ' type ' + 815 | metadata.data_type + 816 | ' has no correspondent property type' 817 | ) 818 | } 819 | if (metadata.is_nullable === 'NO') { 820 | property.required = true 821 | } 822 | if (metadata.ref_column_name) { 823 | property.references = metadata.ref_column_name 824 | } 825 | return property 826 | } 827 | 828 | function tableExists(metadata) { 829 | return !_.isEmpty(metadata.columns) 830 | } 831 | 832 | function checkTableStructure( 833 | dialect, 834 | tableName, 835 | dbSchemaName, 836 | schema, 837 | metadata 838 | ) { 839 | const command = alterTable(dialect, tableName, dbSchemaName, schema, metadata) 840 | return command.length === 0 ? Promise.resolve() : dialect.db.execute(command) 841 | } 842 | 843 | function getReferencedTableName($ref) { 844 | const re = /^\#\/definitions\/(.*)/ 845 | const match = re.exec($ref) 846 | if (match) { 847 | return match[1] 848 | } 849 | return $ref 850 | } 851 | 852 | function equalDefinitions(was, is) { 853 | return ( 854 | (was.type === is.type && 855 | was.maxLength === is.maxLength && 856 | was.decimals === is.decimals) || 857 | (was.type === 'integer' && 858 | is.type === 'number' && 859 | (is.decimals === void 0 || is.decimals === 0)) || 860 | (was.type === 'datetime' && 861 | (is.type === 'date' || 862 | (is.type === 'string' && is.format === 'date-time'))) || 863 | (was.type === 'text' && (is.type === 'string' && is.maxLength === void 0)) 864 | ) 865 | } 866 | 867 | function canAlterColumn(from, to) { 868 | return ( 869 | (from.type === to.type && 870 | (from.type === 'string' && from.maxLength < to.maxLength)) || 871 | (from.type === 'number' && 872 | from.maxLength < to.maxLength && 873 | from.decimals <= to.decimals && 874 | to.maxLength - from.maxLength >= to.decimals - from.decimals) || 875 | (from.type === 'string' && to.type === 'text') 876 | ) 877 | } 878 | 879 | function buildPkConstraintName(tableName, primaryKey) { 880 | let constraintName = 'PK__' + tableName 881 | primaryKey.forEach(function(column) { 882 | constraintName += '__' + column 883 | }) 884 | return constraintName 885 | } 886 | 887 | function buildUniqueConstraintName(tableName, unique) { 888 | let constraintName = 'UK__' + tableName 889 | unique.forEach(function(column) { 890 | constraintName += '__' + column 891 | }) 892 | return constraintName 893 | } 894 | 895 | function uniqueKeyExists(key, existentKeys) { 896 | let found = false 897 | const hash = key.join('').toLowerCase() 898 | _.forEach(existentKeys, function(uk) { 899 | const ukHash = uk 900 | .reduce(function(columns, column) { 901 | return columns + column.name 902 | }, '') 903 | .toLowerCase() 904 | if (hash === ukHash) { 905 | found = true 906 | return false 907 | } 908 | }) 909 | return found 910 | } 911 | 912 | function wrapError(error, tableName) { 913 | error.message = error.message + ' (' + tableName + ')' 914 | } 915 | -------------------------------------------------------------------------------- /src/utils.js: -------------------------------------------------------------------------------- 1 | const _ = require('lodash') 2 | 3 | function findProperty(name, properties) { 4 | let property = properties[name] 5 | if (property === void 0) { 6 | property = 7 | _.reduce( 8 | properties, 9 | function(res, prop, propName) { 10 | return res ? res : name === propName ? prop : void 0 11 | }, 12 | void 0 13 | ) || 14 | _.reduce( 15 | properties, 16 | function(res, prop) { 17 | return res ? res : prop.field && name === prop.field ? prop : void 0 18 | }, 19 | void 0 20 | ) 21 | if (property === void 0) { 22 | throw new Error('Property "' + name + '" not found') 23 | } 24 | } 25 | return property 26 | } 27 | 28 | exports.isInArray = isInArray 29 | 30 | function isInArray(name, array, schema) { 31 | let found = false 32 | const property = findProperty(name, schema.properties) 33 | _.forEach(array, function(element) { 34 | if (name === element || name === property.field) { 35 | found = true 36 | return false 37 | } 38 | }) 39 | return found 40 | } 41 | 42 | exports.mapToColumnName = mapToColumnName 43 | 44 | function mapToColumnName(array, schema) { 45 | return ( 46 | array && 47 | array.map(function(name) { 48 | return findProperty(name, schema.properties).field || name 49 | }) 50 | ) 51 | } 52 | -------------------------------------------------------------------------------- /test/index.js: -------------------------------------------------------------------------------- 1 | const spec = require('./spec') 2 | const PgCrLayer = require('pg-cr-layer') 3 | const MssqlCrLayer = require('mssql-cr-layer') 4 | 5 | const pgConfig = { 6 | user: process.env.POSTGRES_USER || 'postgres', 7 | password: process.env.POSTGRES_PASSWORD || 'postgres', 8 | database: 'postgres', 9 | host: process.env.POSTGRES_HOST || 'localhost', 10 | port: process.env.POSTGRES_PORT || 5432, 11 | pool: { 12 | max: 10, 13 | idleTimeout: 30000 14 | } 15 | } 16 | const pg = new PgCrLayer(pgConfig) 17 | 18 | const mssqlConfig = { 19 | user: process.env.MSSQL_USER || 'sa', 20 | password: process.env.MSSQL_PASSWORD || 'Passw0rd', 21 | database: 'master', 22 | host: process.env.MSSQL_HOST || 'localhost', 23 | port: process.env.MSSQL_PORT || 1433, 24 | pool: { 25 | max: 10, 26 | idleTimeout: 30000 27 | } 28 | } 29 | const mssql = new MssqlCrLayer(mssqlConfig) 30 | 31 | const databaseName = process.env.POSTGRES_DATABASE || 'test-json-schema-table' 32 | 33 | function createPostgresDb() { 34 | return pg 35 | .execute('DROP DATABASE IF EXISTS "' + databaseName + '";') 36 | .then(function() { 37 | return pg.execute('CREATE DATABASE "' + databaseName + '"') 38 | }) 39 | .then(function() { 40 | return pg.execute('DROP DATABASE IF EXISTS "' + databaseName + '2";') 41 | }) 42 | .then(function() { 43 | return pg.execute('CREATE DATABASE "' + databaseName + '2"') 44 | }) 45 | } 46 | 47 | function createMssqlDb() { 48 | return mssql.execute( 49 | 'IF EXISTS(select * from sys.databases where name=\'' + 50 | databaseName + 51 | '\') DROP DATABASE [' + 52 | databaseName + 53 | '];' + 54 | 'CREATE DATABASE [' + 55 | databaseName + 56 | '];' + 57 | 'IF EXISTS(select * from sys.databases where name=\'' + 58 | databaseName + 59 | '2\') DROP DATABASE [' + 60 | databaseName + 61 | '2];' + 62 | 'CREATE DATABASE [' + 63 | databaseName + 64 | '2];' 65 | ) 66 | } 67 | 68 | const pgOptions = {database: databaseName} 69 | const mssqlOptions = {database: databaseName} 70 | 71 | before(function() { 72 | return pg 73 | .connect() 74 | .then(function() { 75 | return createPostgresDb() 76 | .then(function() { 77 | console.log('Postgres db created') 78 | return pg.close() 79 | }) 80 | .then(function() { 81 | console.log('Postgres db creation connection closed') 82 | pgConfig.database = databaseName 83 | console.log('Postgres will connect to', pgConfig.database) 84 | pgOptions.db = new PgCrLayer(pgConfig) 85 | }) 86 | }) 87 | .then(function() { 88 | return mssql.connect().then(function() { 89 | return createMssqlDb() 90 | .then(function() { 91 | console.log('Mssql db created') 92 | return mssql.close() 93 | }) 94 | .then(function() { 95 | console.log('Mssql db creation connection closed') 96 | mssqlConfig.database = databaseName 97 | console.log('Mssql will connect to', mssqlConfig.database) 98 | mssqlOptions.db = new MssqlCrLayer(mssqlConfig) 99 | }) 100 | }) 101 | }) 102 | }) 103 | 104 | describe('postgres', function() { 105 | let duration 106 | before(function() { 107 | duration = process.hrtime() 108 | }) 109 | spec(pgOptions) 110 | after(function() { 111 | duration = process.hrtime(duration) 112 | console.info( 113 | 'postgres finished after: %ds %dms', 114 | duration[0], 115 | duration[1] / 1000000 116 | ) 117 | }) 118 | }) 119 | 120 | describe('mssql', function() { 121 | let duration 122 | before(function() { 123 | duration = process.hrtime() 124 | }) 125 | spec(mssqlOptions) 126 | after(function() { 127 | duration = process.hrtime(duration) 128 | console.info( 129 | 'mssql finished after: %ds %dms', 130 | duration[0], 131 | duration[1] / 1000000 132 | ) 133 | }) 134 | }) 135 | 136 | after(function() { 137 | if (mssqlOptions.db) { 138 | mssqlOptions.db.close() 139 | } 140 | if (pgOptions.db) { 141 | pgOptions.db.close() 142 | } 143 | }) 144 | -------------------------------------------------------------------------------- /test/schemas/catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "properties": { 3 | "catnum": { 4 | "type": "string", 5 | "maxLength": 20, 6 | "required": true 7 | }, 8 | "refnum": { 9 | "type": "integer", 10 | "required": true 11 | } 12 | }, 13 | "primaryKey": [ 14 | "catnum", 15 | "refnum" 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /test/schemas/client.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "id": { 5 | "type": "integer", 6 | "$ref": "person", 7 | "field": "clientId", 8 | "primaryKey": true 9 | }, 10 | "initials": { 11 | "type": "string", 12 | "maxLength": 20 13 | }, 14 | "sales": { 15 | "type": "number", 16 | "maxLength": 20, 17 | "decimals": 6 18 | }, 19 | "debt": { 20 | "type": "number", 21 | "maxLength": 20, 22 | "decimals": 0 23 | }, 24 | "lastSale": { 25 | "type": "datetime" 26 | }, 27 | "cityTax": { 28 | "type": "object", 29 | "schema": { 30 | "$ref": "#/definitions/tax" 31 | } 32 | }, 33 | "stateTax": { 34 | "schema": { 35 | "$ref": "#/definitions/tax" 36 | } 37 | }, 38 | "tax": { 39 | "$ref": "tax" 40 | }, 41 | "taxes": { 42 | "type": "array", 43 | "items": { 44 | "type": "object", 45 | "schema": { 46 | "$ref": "#definitions/tax" 47 | } 48 | } 49 | } 50 | }, 51 | "required": [ 52 | "id", 53 | "initials" 54 | ] 55 | } 56 | -------------------------------------------------------------------------------- /test/schemas/façade.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "id": { 5 | "type": "string", 6 | "maxLength": 20, 7 | "required": true, 8 | "field": "Nome", 9 | "primaryKey": true 10 | }, 11 | "image": { 12 | "type": "blob" 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /test/schemas/person.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "id": { 5 | "type": "integer", 6 | "autoIncrement": true, 7 | "primaryKey": true, 8 | "field": "personId" 9 | }, 10 | "name": { 11 | "type": "string", 12 | "maxLength": 60, 13 | "field": "fieldName" 14 | }, 15 | "number": { 16 | "type": "number", 17 | "maxLength": 6 18 | }, 19 | "summary": { 20 | "type": "string" 21 | }, 22 | "description": { 23 | "type": "text" 24 | }, 25 | "state": { 26 | "type": "string", 27 | "maxLength": 2, 28 | "$ref": "state" 29 | }, 30 | "dateOfBirth": { 31 | "type": "date" 32 | }, 33 | "momentOfBirth": { 34 | "type": "datetime" 35 | }, 36 | "momentOfBirthWithZone": { 37 | "type": "datetime" 38 | } 39 | }, 40 | "required": [ 41 | "name" 42 | ], 43 | "unique": [ 44 | ["name"], 45 | ["state", "dateOfBirth"], 46 | ["fieldName", "state", "momentOfBirth"] 47 | ] 48 | } 49 | -------------------------------------------------------------------------------- /test/schemas/personFaçade.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "person": { 5 | "type": "string", 6 | "maxLength": 60, 7 | "schema": { 8 | "$ref": "person", 9 | "key": "fieldName" 10 | } 11 | }, 12 | "façade": { 13 | "type": "string", 14 | "maxLength": 20, 15 | "$ref": "façade", 16 | "field": "XfaçadeX" 17 | } 18 | }, 19 | "required": [ 20 | "person", 21 | "façade" 22 | ], 23 | "primaryKey": [ 24 | "person", 25 | "façade" 26 | ] 27 | } 28 | -------------------------------------------------------------------------------- /test/schemas/reffab.json: -------------------------------------------------------------------------------- 1 | { 2 | "properties": { 3 | "NUMCAT": { 4 | "type": "string", 5 | "maxLength": 20, 6 | "required": true 7 | }, 8 | "NUMREF": { 9 | "type": "integer", 10 | "required": true 11 | }, 12 | "MODEL": { 13 | "type": "string", 14 | "maxLength": 20, 15 | "required": true 16 | }, 17 | "REF": { 18 | "type": "string", 19 | "maxLength": 50, 20 | "required": true 21 | }, 22 | "ORIGINAL": { 23 | "type": "string", 24 | "maxLength": 1 25 | } 26 | }, 27 | "unique": [ 28 | [ 29 | "NUMREF", 30 | "NUMCAT", 31 | "MODEL", 32 | "REF" 33 | ], 34 | [ 35 | "REF" 36 | ], 37 | [ 38 | "REF", 39 | "ORIGINAL" 40 | ] 41 | ], 42 | "foreignKeys": { 43 | "catalog": { 44 | "catnum": "NUMCAT", 45 | "refnum": "NUMREF" 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /test/schemas/refforfab.json: -------------------------------------------------------------------------------- 1 | { 2 | "properties": { 3 | "NUMREF": { 4 | "type": "integer", 5 | "required": true 6 | }, 7 | "NUMCAT": { 8 | "type": "string", 9 | "maxLength": 20, 10 | "required": true 11 | }, 12 | "MODEL": { 13 | "type": "string", 14 | "maxLength": 20, 15 | "required": true 16 | }, 17 | "REF": { 18 | "type": "string", 19 | "maxLength": 50, 20 | "required": true 21 | }, 22 | "SUPPLIER": { 23 | "type": "integer", 24 | "required": true 25 | }, 26 | "STATUS": { 27 | "type": "string", 28 | "maxLength": 1 29 | } 30 | }, 31 | "primaryKey": [ 32 | "NUMCAT", 33 | "NUMREF", 34 | "MODEL", 35 | "REF", 36 | "SUPPLIER" 37 | ], 38 | "foreignKeys": { 39 | "reffab": { 40 | "NUMREF": "NUMREF", 41 | "NUMCAT": "NUMCAT", 42 | "MODEL": "MODEL", 43 | "REF": "REF" 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /test/schemas/tax.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "city": { 5 | "type": "string", 6 | "maxLength": 20 7 | }, 8 | "state": { 9 | "type": "string", 10 | "maxLength": 20 11 | }, 12 | "value": { 13 | "type": "number", 14 | "maxLength": 20, 15 | "decimals": 2 16 | } 17 | }, 18 | "primaryKey": [ 19 | "city", 20 | "state" 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /test/spec.js: -------------------------------------------------------------------------------- 1 | const jsonSchemaTable = require('../src') 2 | const _ = require('lodash') 3 | const utils = require('../src/utils') 4 | 5 | const personSchema = require('./schemas/person.json') 6 | const clientSchema = require('./schemas/client.json') 7 | const façadeSchema = require('./schemas/façade.json') 8 | const personFaçadeSchema = require('./schemas/personFaçade.json') 9 | const taxSchema = require('./schemas/tax.json') 10 | const catalogSchema = require('./schemas/catalog.json') 11 | const reffabSchema = require('./schemas/reffab.json') 12 | const refforfabSchema = require('./schemas/refforfab.json') 13 | 14 | let modifiedClientSchema 15 | let modifiedPersonSchema 16 | let modifiedTaxSchema 17 | let expect 18 | 19 | function checkColumns(columns, schema) { 20 | expect(Object.keys(columns).length).to.equal( 21 | Object.keys(schema.properties).length 22 | ) 23 | _.forEach(schema.properties, function(property, name) { 24 | const columnName = property.field || name 25 | columns.should.have.property(columnName) 26 | if (property.type === 'number' && !property.decimals) { 27 | expect(columns[columnName].type).to.equal('integer') 28 | expect(columns[columnName].maxLength).to.equal(undefined) 29 | } else if (property.type === 'date') { 30 | expect( 31 | columns[columnName].type === 'date' || 32 | columns[columnName].type === 'date' 33 | ).to.equal(true) 34 | expect(columns[columnName].maxLength).to.equal(undefined) 35 | } else if (property.type === 'string' && property.maxLength === void 0) { 36 | expect(columns[columnName].type === 'text').to.equal(true) 37 | expect(columns[columnName].maxLength).to.equal(undefined) 38 | } else if (property.type === 'object' || property.type === void 0) { 39 | // should be the type of the primary key of the referenced table 40 | } else { 41 | expect(columns[columnName].type).to.equal( 42 | property.type, 43 | 'Column ' + columnName 44 | ) 45 | expect(columns[columnName].maxLength).to.equal( 46 | property.maxLength, 47 | 'Column ' + columnName 48 | ) 49 | } 50 | const required = 51 | property.required || 52 | property.primaryKey || 53 | utils.isInArray(name, schema.primaryKey, schema) || 54 | utils.isInArray(name, schema.required, schema) || 55 | false 56 | expect(columns[columnName].required || false).to.equal( 57 | required, 58 | 'Column ' + columnName 59 | ) 60 | }) 61 | } 62 | 63 | function checkForeignKey(fks, columns, refTable, refTableColumns) { 64 | let found 65 | const joinedColumns = columns.join().toLowerCase() 66 | const joinedRefColumns = refTableColumns.join().toLowerCase() 67 | _.forEach(fks, function(fk) { 68 | if (fk.table.toLowerCase() === refTable.toLowerCase()) { 69 | const joinedFkColumns = fk.columns 70 | .map(function(column) { 71 | return column.name 72 | }) 73 | .join() 74 | .toLowerCase() 75 | const joinedFkRefColumns = fk.columns 76 | .map(function(column) { 77 | return column.references 78 | }) 79 | .join() 80 | .toLowerCase() 81 | if ( 82 | joinedFkColumns === joinedColumns && 83 | joinedFkRefColumns === joinedRefColumns 84 | ) { 85 | found = true 86 | return false 87 | } 88 | } 89 | }) 90 | expect(found).to.equal( 91 | true, 92 | 'Foreign key ' + columns.join() + ' don\'t have a correspondent key' 93 | ) 94 | } 95 | 96 | module.exports = function(options) { 97 | let db 98 | before(function() { 99 | return import('chai').then(chai => { 100 | chai.should() 101 | expect = chai.expect 102 | }) 103 | }) 104 | describe('Table with no references', function() { 105 | it('should not sync person before its created', function(done) { 106 | db = options.db 107 | const person = jsonSchemaTable('person', personSchema, {db}) 108 | person 109 | .sync() 110 | .then(function() { 111 | done(new Error('Invalid table synced')) 112 | }) 113 | .catch(function(error) { 114 | expect( 115 | error.message.indexOf('tables should be created first') !== -1 116 | ).to.equal(true) 117 | done() 118 | }) 119 | .catch(function(error) { 120 | done(error) 121 | }) 122 | }) 123 | it('should create person', function(done) { 124 | const person = jsonSchemaTable('person', personSchema, {db}) 125 | person 126 | .create() 127 | .then(function() { 128 | return person.metadata().then(function(metadata) { 129 | metadata.should.not.have.property('foreignKeys') 130 | metadata.should.have.property('primaryKey') 131 | expect(metadata.primaryKey).to.be.a('array') 132 | expect(metadata.primaryKey.length).to.equal(1) 133 | expect(metadata.primaryKey[0]).to.equal('personId') 134 | 135 | metadata.should.have.property('uniqueKeys') 136 | expect(metadata.uniqueKeys).to.be.a('array') 137 | expect(metadata.uniqueKeys.length).to.equal(3) 138 | metadata.uniqueKeys.forEach(function(uk) { 139 | if (uk.length === 1) { 140 | expect(uk[0]).to.equal('fieldName') 141 | } else if (uk.length === 2) { 142 | expect(uk[0]).to.equal('state') 143 | expect(uk[1]).to.equal('dateOfBirth') 144 | } else if (uk.length === 3) { 145 | expect(uk[0]).to.equal('fieldName') 146 | expect(uk[1]).to.equal('state') 147 | expect(uk[2]).to.equal('momentOfBirth') 148 | } else { 149 | throw new Error('Invalid unique key') 150 | } 151 | }) 152 | metadata.should.have.property('columns') 153 | expect(metadata.columns).to.be.a('object') 154 | checkColumns(metadata.columns, personSchema) 155 | done() 156 | }) 157 | }) 158 | .catch(done) 159 | }) 160 | it('should not create client due property with type array', function(done) { 161 | const client = jsonSchemaTable('client', clientSchema, {db}) 162 | client 163 | .create() 164 | .then(function() { 165 | done(new Error('Invalid table created')) 166 | }) 167 | .catch(function(error) { 168 | expect(error.message.indexOf('not yet implemented') !== -1).to.equal( 169 | true 170 | ) 171 | done() 172 | }) 173 | .catch(function(error) { 174 | done(error) 175 | }) 176 | }) 177 | it('should create client', function(done) { 178 | modifiedClientSchema = _.cloneDeep(clientSchema) 179 | delete modifiedClientSchema.properties.taxes 180 | const client = jsonSchemaTable('client', modifiedClientSchema, { 181 | db, 182 | datetime: true 183 | }) 184 | client 185 | .create() 186 | .then(function() { 187 | return client.metadata().then(function(metadata) { 188 | metadata.should.not.have.property('foreignKeys') 189 | metadata.should.have.property('primaryKey') 190 | expect(metadata.primaryKey).to.be.a('array') 191 | expect(metadata.primaryKey.length).to.equal(1) 192 | expect(metadata.primaryKey[0]).to.equal('clientId') 193 | metadata.should.have.property('columns') 194 | expect(metadata.columns).to.be.a('object') 195 | const createdSchema = _.extend({}, modifiedClientSchema) 196 | createdSchema.properties = _.pick(modifiedClientSchema.properties, [ 197 | 'id', 198 | 'initials', 199 | 'sales', 200 | 'debt', 201 | 'lastSale' 202 | ]) 203 | checkColumns(metadata.columns, createdSchema) 204 | done() 205 | }) 206 | }) 207 | .catch(function(error) { 208 | done(error) 209 | }) 210 | }) 211 | it('should create façade', function(done) { 212 | const façade = jsonSchemaTable('façade', façadeSchema, {db}) 213 | façade 214 | .create() 215 | .then(function() { 216 | return façade.metadata().then(function(metadata) { 217 | metadata.should.not.have.property('foreignKeys') 218 | metadata.should.have.property('primaryKey') 219 | expect(metadata.primaryKey).to.be.a('array') 220 | expect(metadata.primaryKey.length).to.equal(1) 221 | expect(metadata.primaryKey[0]).to.equal('Nome') 222 | metadata.should.have.property('columns') 223 | expect(metadata.columns).to.be.a('object') 224 | checkColumns(metadata.columns, façadeSchema) 225 | done() 226 | }) 227 | }) 228 | .catch(function(error) { 229 | done(error) 230 | }) 231 | }) 232 | it('should create person façade', function(done) { 233 | const personFaçade = jsonSchemaTable('personFaçade', personFaçadeSchema, { 234 | db 235 | }) 236 | personFaçade 237 | .create() 238 | .then(function() { 239 | return personFaçade.metadata().then(function(metadata) { 240 | metadata.should.not.have.property('foreignKeys') 241 | metadata.should.have.property('primaryKey') 242 | expect(metadata.primaryKey).to.be.a('array') 243 | expect(metadata.primaryKey.length).to.equal(2) 244 | expect(metadata.primaryKey[0]).to.equal('person') 245 | expect(metadata.primaryKey[1]).to.equal('XfaçadeX') 246 | metadata.should.have.property('columns') 247 | expect(metadata.columns).to.be.a('object') 248 | checkColumns(metadata.columns, personFaçadeSchema) 249 | done() 250 | }) 251 | }) 252 | .catch(function(error) { 253 | done(error) 254 | }) 255 | }) 256 | it('should create person tax', function(done) { 257 | const tax = jsonSchemaTable('tax', taxSchema, {db}) 258 | tax 259 | .create() 260 | .then(function() { 261 | return tax.metadata().then(function(metadata) { 262 | metadata.should.not.have.property('foreignKeys') 263 | metadata.should.have.property('primaryKey') 264 | expect(metadata.primaryKey).to.be.a('array') 265 | expect(metadata.primaryKey.length).to.equal(2) 266 | expect(metadata.primaryKey[0]).to.equal('city') 267 | expect(metadata.primaryKey[1]).to.equal('state') 268 | metadata.should.have.property('columns') 269 | expect(metadata.columns).to.be.a('object') 270 | checkColumns(metadata.columns, taxSchema) 271 | done() 272 | }) 273 | }) 274 | .catch(function(error) { 275 | done(error) 276 | }) 277 | }) 278 | it('should create catalog', function(done) { 279 | const catalog = jsonSchemaTable('catalog', catalogSchema, {db}) 280 | catalog 281 | .create() 282 | .then(function() { 283 | return catalog.metadata().then(function(metadata) { 284 | metadata.should.not.have.property('foreignKeys') 285 | metadata.should.have.property('primaryKey') 286 | expect(metadata.primaryKey).to.be.a('array') 287 | expect(metadata.primaryKey.length).to.equal(2) 288 | expect(metadata.primaryKey[0]).to.equal('catnum') 289 | expect(metadata.primaryKey[1]).to.equal('refnum') 290 | metadata.should.have.property('columns') 291 | expect(metadata.columns).to.be.a('object') 292 | checkColumns(metadata.columns, catalogSchema) 293 | done() 294 | }) 295 | }) 296 | .catch(function(error) { 297 | done(error) 298 | }) 299 | }) 300 | it('should create reffab', function(done) { 301 | const reffab = jsonSchemaTable('reffab', reffabSchema, {db}) 302 | reffab 303 | .create() 304 | .then(function() { 305 | return reffab.metadata().then(function(metadata) { 306 | metadata.should.not.have.property('foreignKeys') 307 | metadata.should.have.property('uniqueKeys') 308 | expect(metadata.uniqueKeys).to.be.a('array') 309 | expect(metadata.uniqueKeys.length).to.equal(3) 310 | expect(metadata.uniqueKeys[0]).to.be.a('array') 311 | expect(metadata.uniqueKeys[0].length).to.equal(4) 312 | expect(metadata.uniqueKeys[0][0]).to.equal('NUMREF') 313 | expect(metadata.uniqueKeys[0][1]).to.equal('NUMCAT') 314 | expect(metadata.uniqueKeys[0][2]).to.equal('MODEL') 315 | expect(metadata.uniqueKeys[0][3]).to.equal('REF') 316 | 317 | expect(metadata.uniqueKeys[1]).to.be.a('array') 318 | expect(metadata.uniqueKeys[1].length).to.equal(1) 319 | expect(metadata.uniqueKeys[1][0]).to.equal('REF') 320 | 321 | expect(metadata.uniqueKeys[2]).to.be.a('array') 322 | expect(metadata.uniqueKeys[2].length).to.equal(2) 323 | expect(metadata.uniqueKeys[2][0]).to.equal('REF') 324 | expect(metadata.uniqueKeys[2][1]).to.equal('ORIGINAL') 325 | 326 | metadata.should.have.property('columns') 327 | expect(metadata.columns).to.be.a('object') 328 | checkColumns(metadata.columns, reffabSchema) 329 | done() 330 | }) 331 | }) 332 | .catch(function(error) { 333 | done(error) 334 | }) 335 | }) 336 | it('should create refforfab', function(done) { 337 | const refforfab = jsonSchemaTable('refforfab', refforfabSchema, {db}) 338 | refforfab 339 | .create() 340 | .then(function() { 341 | return refforfab.metadata().then(function(metadata) { 342 | metadata.should.not.have.property('foreignKeys') 343 | metadata.should.have.property('primaryKey') 344 | expect(metadata.primaryKey).to.be.a('array') 345 | expect(metadata.primaryKey.length).to.equal(5) 346 | expect(metadata.primaryKey[0]).to.equal('NUMCAT') 347 | expect(metadata.primaryKey[1]).to.equal('NUMREF') 348 | expect(metadata.primaryKey[2]).to.equal('MODEL') 349 | expect(metadata.primaryKey[3]).to.equal('REF') 350 | expect(metadata.primaryKey[4]).to.equal('SUPPLIER') 351 | metadata.should.have.property('columns') 352 | expect(metadata.columns).to.be.a('object') 353 | checkColumns(metadata.columns, refforfabSchema) 354 | done() 355 | }) 356 | }) 357 | .catch(function(error) { 358 | done(error) 359 | }) 360 | }) 361 | }) 362 | 363 | describe('table with references if the reference exists', function() { 364 | it('should not alter person due table state not exists', function(done) { 365 | const person = jsonSchemaTable('person', personSchema, {db: db}) 366 | person 367 | .sync() 368 | .then(function() { 369 | return person.metadata().then(function(metadata) { 370 | metadata.should.not.have.property('foreignKeys') 371 | done() 372 | }) 373 | }) 374 | .catch(function(error) { 375 | done(error) 376 | }) 377 | }) 378 | it('lets alter tax to add a single column primary key', function(done) { 379 | modifiedTaxSchema = _.cloneDeep(taxSchema) 380 | modifiedTaxSchema.properties.id = { 381 | type: 'integer', 382 | autoIncrement: true, 383 | primaryKey: true 384 | } 385 | modifiedTaxSchema.required = modifiedTaxSchema.primaryKey 386 | delete modifiedTaxSchema.primaryKey 387 | const tax = jsonSchemaTable('tax', modifiedTaxSchema, {db: db}) 388 | tax 389 | .sync() 390 | .then(function() { 391 | return tax.metadata().then(function(metadata) { 392 | metadata.should.not.have.property('foreignKeys') 393 | metadata.should.have.property('primaryKey') 394 | expect(metadata.primaryKey).to.be.a('array') 395 | expect(metadata.primaryKey.length).to.equal(1) 396 | expect(metadata.primaryKey[0]).to.equal('id') 397 | metadata.should.have.property('columns') 398 | expect(metadata.columns).to.be.a('object') 399 | checkColumns(metadata.columns, modifiedTaxSchema) 400 | done() 401 | }) 402 | }) 403 | .catch(function(error) { 404 | done(error) 405 | }) 406 | }) 407 | it('should add 4 foreign key to table client', function(done) { 408 | const client = jsonSchemaTable('client', modifiedClientSchema, {db: db}) 409 | client 410 | .sync() 411 | .then(function() { 412 | return client.metadata().then(function(metadata) { 413 | metadata.should.have.property('foreignKeys') 414 | expect(metadata.foreignKeys).to.be.a('array') 415 | expect(metadata.foreignKeys.length).to.equal(4) 416 | checkForeignKey(metadata.foreignKeys, ['clientId'], 'person', [ 417 | 'personId' 418 | ]) 419 | checkForeignKey(metadata.foreignKeys, ['cityTax'], 'tax', ['id']) 420 | checkForeignKey(metadata.foreignKeys, ['stateTax'], 'tax', ['id']) 421 | checkForeignKey(metadata.foreignKeys, ['tax'], 'tax', ['id']) 422 | done() 423 | }) 424 | }) 425 | .catch(function(error) { 426 | done(error) 427 | }) 428 | }) 429 | it('should not add foreign key to table façade', function(done) { 430 | const façade = jsonSchemaTable('façade', façadeSchema, {db: db}) 431 | façade 432 | .sync() 433 | .then(function() { 434 | return façade.metadata().then(function(metadata) { 435 | metadata.should.not.have.property('foreignKeys') 436 | done() 437 | }) 438 | }) 439 | .catch(function(error) { 440 | done(error) 441 | }) 442 | }) 443 | it('should add 2 foreign keys to table personFaçade', function(done) { 444 | const personFaçade = jsonSchemaTable('personFaçade', personFaçadeSchema, { 445 | db: db 446 | }) 447 | personFaçade 448 | .sync() 449 | .then(function() { 450 | return personFaçade.metadata().then(function(metadata) { 451 | metadata.should.have.property('foreignKeys') 452 | expect(metadata.foreignKeys).to.be.a('array') 453 | expect(metadata.foreignKeys.length).to.equal(2) 454 | checkForeignKey(metadata.foreignKeys, ['XfaçadeX'], 'façade', [ 455 | 'Nome' 456 | ]) 457 | checkForeignKey(metadata.foreignKeys, ['person'], 'person', [ 458 | 'fieldName' 459 | ]) 460 | done() 461 | }) 462 | }) 463 | .catch(function(error) { 464 | done(error) 465 | }) 466 | }) 467 | }) 468 | 469 | describe('modify structure', function() { 470 | it('should not alter person column dateOfBirth', function(done) { 471 | modifiedPersonSchema = _.cloneDeep(personSchema) 472 | modifiedPersonSchema.properties.dateOfBirth.type = 'string' 473 | const person = jsonSchemaTable('person', modifiedPersonSchema, {db: db}) 474 | person 475 | .sync() 476 | .then(function() { 477 | done(new Error('Invalid alter table')) 478 | }) 479 | .catch(function(error) { 480 | expect( 481 | error.message.indexOf('dateOfBirth cannot be modified') !== -1 482 | ).to.equal(true) 483 | done() 484 | }) 485 | .catch(function(error) { 486 | done(error) 487 | }) 488 | }) 489 | it('should not alter client column initials to a small string', function(done) { 490 | modifiedClientSchema.properties.initials.maxLength = 2 491 | const client = jsonSchemaTable('client', modifiedClientSchema, {db: db}) 492 | client 493 | .sync() 494 | .then(function() { 495 | done(new Error('Invalid alter table')) 496 | }) 497 | .catch(function(error) { 498 | expect( 499 | error.message.indexOf('initials cannot be modified') !== -1 500 | ).to.equal(true) 501 | done() 502 | }) 503 | .catch(function(error) { 504 | done(error) 505 | }) 506 | }) 507 | it('should alter client column initials to a bigger string', function(done) { 508 | modifiedClientSchema.properties.initials.maxLength = 21 509 | const client = jsonSchemaTable('client', modifiedClientSchema, {db: db}) 510 | client 511 | .sync() 512 | .then(function() { 513 | return client.metadata().then(function(metadata) { 514 | metadata.should.have.property('columns') 515 | expect(metadata.columns).to.be.a('object') 516 | checkColumns(metadata.columns, modifiedClientSchema) 517 | done() 518 | }) 519 | }) 520 | .catch(function(error) { 521 | done(error) 522 | }) 523 | }) 524 | it('should not alter client column sales to a small number of decimals', function(done) { 525 | modifiedClientSchema.properties.sales.decimals = 4 526 | const client = jsonSchemaTable('client', modifiedClientSchema, {db: db}) 527 | client 528 | .sync() 529 | .then(function() { 530 | done(new Error('Invalid alter table')) 531 | }) 532 | .catch(function(error) { 533 | expect( 534 | error.message.indexOf('sales cannot be modified') !== -1 535 | ).to.equal(true) 536 | done() 537 | }) 538 | .catch(function(error) { 539 | done(error) 540 | }) 541 | }) 542 | it('should not alter client column sales to a bigger number of decimals', function(done) { 543 | modifiedClientSchema.properties.sales.decimals = 8 544 | const client = jsonSchemaTable('client', modifiedClientSchema, {db: db}) 545 | client 546 | .sync() 547 | .then(function() { 548 | done(new Error('Invalid alter table')) 549 | }) 550 | .catch(function(error) { 551 | expect( 552 | error.message.indexOf('sales cannot be modified') !== -1 553 | ).to.equal(true) 554 | done() 555 | }) 556 | .catch(function(error) { 557 | done(error) 558 | }) 559 | }) 560 | it('should not alter client column sales to a bigger number of decimals with no equivalent greater length', function(done) { 561 | modifiedClientSchema.properties.sales.maxLength = 21 562 | const client = jsonSchemaTable('client', modifiedClientSchema, {db: db}) 563 | client 564 | .sync() 565 | .then(function() { 566 | done(new Error('Invalid alter table')) 567 | }) 568 | .catch(function(error) { 569 | expect( 570 | error.message.indexOf('sales cannot be modified') !== -1 571 | ).to.equal(true) 572 | done() 573 | }) 574 | .catch(function(error) { 575 | done(error) 576 | }) 577 | }) 578 | it('should alter client column sales to a bigger number of decimals and length', function(done) { 579 | modifiedClientSchema.properties.sales.maxLength = 22 580 | const client = jsonSchemaTable('client', modifiedClientSchema, {db: db}) 581 | client 582 | .sync() 583 | .then(function() { 584 | return client.metadata().then(function(metadata) { 585 | metadata.should.have.property('columns') 586 | expect(metadata.columns).to.be.a('object') 587 | checkColumns(metadata.columns, modifiedClientSchema) 588 | done() 589 | }) 590 | }) 591 | .catch(function(error) { 592 | done(error) 593 | }) 594 | }) 595 | it('should add unique key to client', function(done) { 596 | modifiedClientSchema.unique = [['initials']] 597 | const client = jsonSchemaTable('client', modifiedClientSchema, {db: db}) 598 | client 599 | .sync() 600 | .then(function() { 601 | return client.metadata().then(function(metadata) { 602 | metadata.should.have.property('uniqueKeys') 603 | expect(metadata.uniqueKeys).to.be.a('array') 604 | expect(metadata.uniqueKeys.length).to.equal(1) 605 | expect(metadata.uniqueKeys[0]).to.be.a('array') 606 | expect(metadata.uniqueKeys[0].length).to.equal(1) 607 | expect(metadata.uniqueKeys[0][0]).to.equal('initials') 608 | done() 609 | }) 610 | }) 611 | .catch(function(error) { 612 | done(error) 613 | }) 614 | }) 615 | it('should alter person column name to text', function(done) { 616 | modifiedPersonSchema.properties.dateOfBirth.type = 'date' 617 | modifiedPersonSchema.properties.name.type = 'text' 618 | delete modifiedPersonSchema.properties.name.type 619 | const person = jsonSchemaTable('person', modifiedPersonSchema, {db: db}) 620 | person 621 | .sync() 622 | .then(function() { 623 | return person.metadata().then(function(metadata) { 624 | metadata.should.have.property('columns') 625 | expect(metadata.columns).to.be.a('object') 626 | checkColumns(metadata.columns, modifiedPersonSchema) 627 | done() 628 | }) 629 | }) 630 | .catch(function(error) { 631 | done(error) 632 | }) 633 | }) 634 | }) 635 | 636 | describe('tables with multiple columns references', function() { 637 | it('should add 2 foreign keys to table reffab', function(done) { 638 | const reffab = jsonSchemaTable('reffab', reffabSchema, {db: db}) 639 | reffab 640 | .sync() 641 | .then(function() { 642 | return reffab.metadata().then(function(metadata) { 643 | metadata.should.have.property('foreignKeys') 644 | expect(metadata.foreignKeys).to.be.a('array') 645 | expect(metadata.foreignKeys.length).to.equal(1) 646 | checkForeignKey( 647 | metadata.foreignKeys, 648 | ['NUMCAT', 'NUMREF'], 649 | 'catalog', 650 | ['catnum', 'refnum'] 651 | ) 652 | done() 653 | }) 654 | }) 655 | .catch(function(error) { 656 | done(error) 657 | }) 658 | }) 659 | 660 | it('should add 4 foreign keys to table refforfab', function(done) { 661 | const refforfab = jsonSchemaTable('refforfab', refforfabSchema, {db: db}) 662 | refforfab 663 | .sync() 664 | .then(function() { 665 | return refforfab.metadata().then(function(metadata) { 666 | metadata.should.have.property('foreignKeys') 667 | expect(metadata.foreignKeys).to.be.a('array') 668 | expect(metadata.foreignKeys.length).to.equal(1) 669 | checkForeignKey( 670 | metadata.foreignKeys, 671 | ['NUMREF', 'NUMCAT', 'MODEL', 'REF'], 672 | 'reffab', 673 | ['NUMREF', 'NUMCAT', 'MODEL', 'REF'] 674 | ) 675 | done() 676 | }) 677 | }) 678 | .catch(function(error) { 679 | done(error) 680 | }) 681 | }) 682 | }) 683 | } 684 | --------------------------------------------------------------------------------