diff --git a/.DS_Store b/.DS_Store index d91071a..2b27505 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/core/.eslintrc.json b/core/.eslintrc.json index 8d20e22..e714324 100644 --- a/core/.eslintrc.json +++ b/core/.eslintrc.json @@ -3,5 +3,19 @@ "ignorePatterns": ["node_modules", "dist", "test", "jest.config.js", "typings"], "env": { "jest": true + }, + "rules": { + "@typescript-eslint/explicit-module-boundary-types": "off", + "@typescript-eslint/no-unused-vars": "off", + "@typescript-eslint/ban-ts-comment": "off", + "node/no-extraneous-import": "off", + "no-empty": "off", + "node/no-extraneous-require": "off", + "node/no-unpublished-import": "off", + "eqeqeq": "off", + "node/no-unsupported-features/node-builtins": "off", + "@typescript-eslint/ban-types": "off", + "no-control-regex": "off", + "prefer-const": "off" } } diff --git a/core/package.json b/core/package.json index f6434f8..59d7349 100644 --- a/core/package.json +++ b/core/package.json @@ -1,42 +1,69 @@ { - "$schema": "http://json.schemastore.org/package", "name": "@cool-midway/core", "version": "8.0.0", - "description": "cool-admin-midway core", + "description": "cool-admin core", "main": "dist/index.js", "typings": "index.d.ts", "bin": { - "cool": "./dist/bin/index.js" + "cool": "dist/bin/index.js" }, "scripts": { - "build": "mwtsc --cleanOutDir", - "test": "cross-env NODE_ENV=unittest jest", - "cov": "jest --coverage", + "build": "cross-env midway-bin build -c", + "cov": "cross-env midway-bin cov --ts", "lint": "mwts check", "lint:fix": "mwts fix" }, - "keywords": [], - "author": "", + "keywords": [ + "cool", + "cool-admin", + "cooljs" + ], + "author": "COOL", "files": [ "dist/**/*.js", "dist/**/*.d.ts", "index.d.ts" ], + "readme": "README.md", "license": "MIT", + "repository": { + "type": "git", + "url": "https://cool-js.com" + }, "devDependencies": { + "@midwayjs/cli": "2.1.1", "@midwayjs/core": "^3.19.0", - "@midwayjs/logger": "^3.4.2", + "@midwayjs/koa": "^3.19.2", "@midwayjs/mock": "^3.19.2", + "@midwayjs/typeorm": "^3.19.2", + "@types/download": "^8.0.5", "@types/jest": "^29.5.14", "@types/node": "^22.10.5", + "aedes": "^0.51.3", "cross-env": "^7.0.3", "jest": "^29.7.0", "mwts": "^1.3.0", - "mwtsc": "^1.15.1", "ts-jest": "^29.2.5", + "typeorm": "^0.3.20", "typescript": "~5.7.3" }, "dependencies": { - "commander": "^11.1.0" + "@cool-midway/cache-manager-fs-hash": "^7.0.0", + "@midwayjs/cache": "^3.14.0", + "@midwayjs/cache-manager": "^3.19.3", + "axios": "^1.7.9", + "commander": "^13.0.0", + "decompress": "^4.2.1", + "download": "^8.0.0", + "glob": "^11.0.1", + "javascript-obfuscator": "^4.1.1", + "jsonwebtoken": "^9.0.2", + "lodash": "^4.17.21", + "md5": "^2.3.0", + "moment": "^2.30.1", + "pm2": "^5.4.3", + "sqlstring": "^2.3.3", + "uuid": "^11.0.5", + "ws": "^8.18.0" } -} +} \ No newline at end of file diff --git a/core/pnpm-lock.yaml b/core/pnpm-lock.yaml index a4a6d41..35e7c15 100644 --- a/core/pnpm-lock.yaml +++ b/core/pnpm-lock.yaml @@ -8,40 +8,100 @@ importers: .: dependencies: + '@cool-midway/cache-manager-fs-hash': + specifier: ^7.0.0 + version: 7.0.0 + '@midwayjs/cache': + specifier: ^3.14.0 + version: 3.14.0 + '@midwayjs/cache-manager': + specifier: ^3.19.3 + version: 3.19.3 + axios: + specifier: ^1.7.9 + version: 1.7.9 commander: - specifier: ^11.1.0 - version: 11.1.0 + specifier: ^13.0.0 + version: 13.0.0 + decompress: + specifier: ^4.2.1 + version: 4.2.1 + download: + specifier: ^8.0.0 + version: 8.0.0 + glob: + specifier: ^11.0.1 + version: 11.0.1 + javascript-obfuscator: + specifier: ^4.1.1 + version: 4.1.1 + jsonwebtoken: + specifier: ^9.0.2 + version: 9.0.2 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + md5: + specifier: ^2.3.0 + version: 2.3.0 + moment: + specifier: ^2.30.1 + version: 2.30.1 + pm2: + specifier: ^5.4.3 + version: 5.4.3 + sqlstring: + specifier: ^2.3.3 + version: 2.3.3 + uuid: + specifier: ^11.0.5 + version: 11.0.5 + ws: + specifier: ^8.18.0 + version: 8.18.0 devDependencies: + '@midwayjs/cli': + specifier: 2.1.1 + version: 2.1.1(@midwayjs/mock@3.19.2)(@types/node@22.10.5)(typescript@5.7.3) '@midwayjs/core': specifier: ^3.19.0 version: 3.19.0 - '@midwayjs/logger': - specifier: ^3.4.2 - version: 3.4.2 + '@midwayjs/koa': + specifier: ^3.19.2 + version: 3.19.2 '@midwayjs/mock': specifier: ^3.19.2 version: 3.19.2 + '@midwayjs/typeorm': + specifier: ^3.19.2 + version: 3.19.2 + '@types/download': + specifier: ^8.0.5 + version: 8.0.5 '@types/jest': specifier: ^29.5.14 version: 29.5.14 '@types/node': specifier: ^22.10.5 version: 22.10.5 + aedes: + specifier: ^0.51.3 + version: 0.51.3 cross-env: specifier: ^7.0.3 version: 7.0.3 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@22.10.5) + version: 29.7.0(@types/node@22.10.5)(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.3)) mwts: specifier: ^1.3.0 version: 1.3.0(typescript@5.7.3) - mwtsc: - specifier: ^1.15.1 - version: 1.15.1 ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.10.5))(typescript@5.7.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.10.5)(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.3)))(typescript@5.7.3) + typeorm: + specifier: ^0.3.20 + version: 0.3.20(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.3)) typescript: specifier: ~5.7.3 version: 5.7.3 @@ -59,20 +119,20 @@ packages: resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.26.3': - resolution: {integrity: sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==} + '@babel/compat-data@7.26.5': + resolution: {integrity: sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==} engines: {node: '>=6.9.0'} '@babel/core@7.26.0': resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} engines: {node: '>=6.9.0'} - '@babel/generator@7.26.3': - resolution: {integrity: sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==} + '@babel/generator@7.26.5': + resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.25.9': - resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} + '@babel/helper-compilation-targets@7.26.5': + resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.25.9': @@ -85,8 +145,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-plugin-utils@7.25.9': - resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} + '@babel/helper-plugin-utils@7.26.5': + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} engines: {node: '>=6.9.0'} '@babel/helper-string-parser@7.25.9': @@ -109,8 +169,8 @@ packages: resolution: {integrity: sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.26.3': - resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} + '@babel/parser@7.26.5': + resolution: {integrity: sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==} engines: {node: '>=6.0.0'} hasBin: true @@ -205,24 +265,32 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/runtime@7.26.0': + resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} + engines: {node: '>=6.9.0'} + '@babel/template@7.25.9': resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.26.4': - resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==} + '@babel/traverse@7.26.5': + resolution: {integrity: sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==} engines: {node: '>=6.9.0'} - '@babel/types@7.26.3': - resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} + '@babel/types@7.26.5': + resolution: {integrity: sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@colors/colors@1.5.0': - resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} - engines: {node: '>=0.1.90'} + '@cool-midway/cache-manager-fs-hash@7.0.0': + resolution: {integrity: sha512-Bl43bVCUm0V+w1wkfOicRfiHHZtaH1mQCp06baNapG86uC7OiXwMrml5+cvZD+mYSHdP07qUxtqkL8oUhrgAfg==} + engines: {node: '>=8.0.0'} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} '@eslint-community/eslint-utils@4.4.1': resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} @@ -238,6 +306,9 @@ packages: resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} engines: {node: ^10.12.0 || >=12.0.0} + '@hapi/bourne@3.0.0': + resolution: {integrity: sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==} + '@humanwhocodes/config-array@0.5.0': resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} engines: {node: '>=10.10.0'} @@ -251,10 +322,6 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - '@isaacs/fs-minipass@4.0.1': - resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} - engines: {node: '>=18.0.0'} - '@istanbuljs/load-nyc-config@1.1.0': resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -263,6 +330,14 @@ packages: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} + '@javascript-obfuscator/escodegen@2.3.0': + resolution: {integrity: sha512-QVXwMIKqYMl3KwtTirYIA6gOCiJ0ZDtptXqAv/8KWLG9uQU2fZqTVy7a/A5RvcoZhbDoFfveTxuGxJ5ibzQtkw==} + engines: {node: '>=6.0'} + + '@javascript-obfuscator/estraverse@5.4.0': + resolution: {integrity: sha512-CZFX7UZVN9VopGbjTx4UXaXsi9ewoM1buL0kY7j1ftYdSs7p2spv9opxFjHlQ/QGTgh4UqufYqJJ0WKLml7b6w==} + engines: {node: '>=4.0'} + '@jest/console@29.7.0': resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -347,25 +422,103 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@koa/router@12.0.2': + resolution: {integrity: sha512-sYcHglGKTxGF+hQ6x67xDfkE9o+NhVlRHBqq6gLywaMc6CojK/5vFZByphdonKinYlMLkEkacm+HEse9HzwgTA==} + engines: {node: '>= 12'} + '@midwayjs/async-hooks-context-manager@3.19.0': resolution: {integrity: sha512-jPVBR2wweN8F1bBx6gZhm70+drA0bo3TQBRsfTCIt0MJv3lTzsn/agRi1YgcQ+BXQnLDaGEUiTVTV4J2Ak/Rqw==} engines: {node: '>=12.17.0'} + '@midwayjs/cache-manager@3.19.3': + resolution: {integrity: sha512-aksDyxpFOm9fRCdi3efA9v3NsXlMUm2YxaO/00ZQRAM3pDcNom55WiV3MKsZUDugvYa6+HsYAmL2wJR8PJcu/Q==} + engines: {node: '>=12'} + + '@midwayjs/cache@3.14.0': + resolution: {integrity: sha512-WUDOanpD+vpNnWZ4q91FvlHpNCRSNHKtgVlTZNVmL9VhNt/weqB8VZhDGbGzzg6NM2k9rfwD3TevoolAee4fZw==} + engines: {node: '>=12'} + + '@midwayjs/cli-plugin-build@2.1.0': + resolution: {integrity: sha512-yV1KyqPaOI/vJ3zpHZQ5wf4DZqhGp46tpqS8EFa3lPCkE+QLI3w4+NlE4WSUH2ZNOJHiXi34sL36pRFViWiazw==} + engines: {node: '>= 10'} + + '@midwayjs/cli-plugin-check@2.1.0': + resolution: {integrity: sha512-FjKpy8dKzBcuNX+2OHbzVuzeu8MMfWaoXtS586stCArm7jwK7JC55H8hag9a+Tlsf0K9QbXw9hRz7D9CH+UTpg==} + engines: {node: '>= 10'} + + '@midwayjs/cli-plugin-clean@2.1.0': + resolution: {integrity: sha512-qm/9IlrFdGj/bX1xOkEWMithFzV4YO7VJo0Hz/OzJBmS0Vh+S7kRfeah+xoeioGRcD+jDkHn09jOedpzm4k3GQ==} + engines: {node: '>= 10'} + + '@midwayjs/cli-plugin-dev@2.1.1': + resolution: {integrity: sha512-Ku0oFEyKQggrz/IZo6RKTtHvNF8PMWxQ2Pbj4fDx/XWoiZ0OSPcDl6lwUWToqmKy+1i0JXcpauM8AYImWGW2Lw==} + engines: {node: '>= 10'} + peerDependencies: + '@midwayjs/mock': '*' + + '@midwayjs/cli-plugin-test@2.1.0': + resolution: {integrity: sha512-lYYLV0HqInB9NgZvDyVrrBnPoQfsVzzJTytRjCKGS8KsUQNYE8j/q4RsK3sBY5aj/0bKL2B6YBImYwoBy7jvPw==} + engines: {node: '>= 10'} + + '@midwayjs/cli@2.1.1': + resolution: {integrity: sha512-PgP2s6XsMEtdt6fVvqwzsurioWpxSMfni2GcU9RdyBEqjpXoqpGp4WlfqDUCR2NaEwfC3Mhh1n/W3BiVb8b6bQ==} + engines: {node: '>= 10.0.0'} + hasBin: true + + '@midwayjs/command-core@2.1.0': + resolution: {integrity: sha512-N9GxcfDt65FzsmM3aQV3R50tEobqGkfKKrJl6COTrrzHBw1KPQtKQDNICoBAylgvdqofoTW6f/7npMrTXCpMhg==} + engines: {node: '>= 10'} + + '@midwayjs/cookies@1.2.0': + resolution: {integrity: sha512-gdfAXk3+uL+9qcNo9lNnUFJCUGXXxCitBjyz9QJR08dcZ11mqTbxVNXhea525e3ZwKREy6f4PHAWofFwlPOZzQ==} + engines: {node: '>=10'} + '@midwayjs/core@3.19.0': resolution: {integrity: sha512-qFoaFeN8c0UcfJKwmXoFmFxhMVMIT+MwUcTt1A9r/7lGmuqTukUICv5dxhTFffIr6YJHhSMOXEK5u9FV/NxGGA==} engines: {node: '>=12'} + '@midwayjs/debugger@1.0.9': + resolution: {integrity: sha512-weDe6otEd75wxndIYRt5eKkhrI/e14leVn1ctwE1nXrxt0EVGda/ZTfMDB3TkF3ogwYJYoDQxUBiA9TUY5qgQQ==} + engines: {node: '>=10.3.0'} + '@midwayjs/glob@1.1.1': resolution: {integrity: sha512-xoNU+JdCxE214KQrB0qgs88+Da7KYVICeuTL9VeKwaxZXj6a/PbpmEaH4+5BHLvZRRe78tHGR19+nKZrmMHBJg==} - '@midwayjs/logger@3.4.2': - resolution: {integrity: sha512-BxSdSMog4jxeqpHwgauuKZT6iAiu/Vr1HDjO9l81iqU+l8c9veAJVeLT08nTqKdjUiQXnxTaW6nYlvnzF2HdMA==} - engines: {node: '>=10'} + '@midwayjs/koa@3.19.2': + resolution: {integrity: sha512-F25hMArjUoGlfKddbbH3VqvjPkxp8tdN6Jv/hKr4Hs1sMWuJd3IjBOkdKP9EhYL6adza9eJuBkX8QbzkKHz3Jw==} + engines: {node: '>=12'} + + '@midwayjs/locate@1.8.1': + resolution: {integrity: sha512-ZlYKENlBOtN6ODZk9+iHdJcrV+IYk+CZXqyQMT6VzTmBoE/z/HnAxKq39uJsn+dzDTR+c18/qdYVRZ0feKSHMw==} + + '@midwayjs/luckyeye@1.1.0': + resolution: {integrity: sha512-B/bBKJjyFT22a0K0K9R+b03tijGL7A8LQshfTha6KanqlYhpuEKA9N1IdR0+2yS4pQtVYJrddjcZ8ZR49ihQ6A==} + engines: {node: '>= 10.0.0'} + hasBin: true '@midwayjs/mock@3.19.2': resolution: {integrity: sha512-gwgMoB3u2JhS59AmVM8uA9rlsQXZeYBJzzGGMsmZ/bz0qaFinyPrUIPPQik4NMfa+v7i3hTPf1U9yxWaLSzZHA==} engines: {node: '>=12'} + '@midwayjs/serverless-spec-builder@2.1.0': + resolution: {integrity: sha512-OGf2zQ+RxctguVNpSXJAGAM9qeP97vD9S0Cc8hwiMomTYjNWW5WvRKtCyb8KWBnP2hEkWPuhPJ4WQo8wEg0AgQ==} + engines: {node: '>= 10'} + + '@midwayjs/session@3.19.2': + resolution: {integrity: sha512-SRZWFrEw5BPDTIRjOyh0/YoAiafQBbeR+by62kl/s9noy47UlJIRzGcXORbUHpKIbv+7u9jCnZyniXpNNJ53EA==} + engines: {node: '>=12'} + + '@midwayjs/typeorm@3.19.2': + resolution: {integrity: sha512-dJnkEZsGr7wON0HkKys51a4iHPzP1gyjyPcbcgqLJdfeJ3iCTOuQ7dDsBz0TTU8V7iYMTgzHcSgtkkl5j9+4jA==} + engines: {node: '>=12'} + hasBin: true + + '@midwayjs/version@3.19.3': + resolution: {integrity: sha512-COrHF1tpJviQfMp/oLgMfRF2dFFaRp0ETvJtLhLhkwTgGSdS33qrj8p+DfWlUMrVWzBz/FJoq0Ryi3PZ+F8IiQ==} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -382,6 +535,20 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@pm2/agent@2.0.4': + resolution: {integrity: sha512-n7WYvvTJhHLS2oBb1PjOtgLpMhgImOq8sXkPBw6smeg9LJBWZjiEgPKOpR8mn9UJZsB5P3W4V/MyvNnp31LKeA==} + + '@pm2/io@6.0.1': + resolution: {integrity: sha512-KiA+shC6sULQAr9mGZ1pg+6KVW9MF8NpG99x26Lf/082/Qy8qsTCtnJy+HQReW1A9Rdf0C/404cz0RZGZro+IA==} + engines: {node: '>=6.0'} + + '@pm2/js-api@0.8.0': + resolution: {integrity: sha512-nmWzrA/BQZik3VBz+npRcNIu01kdBhWL0mxKmP1ciF/gTcujPTQqt027N9fc1pK9ERM8RipFhymw7RcmCyOEYA==} + engines: {node: '>=4.0'} + + '@pm2/pm2-version-check@1.0.4': + resolution: {integrity: sha512-SXsM27SGH3yTWKc2fKR4SYNxsmnvuBQ9dd6QHtEWmiZ/VqaOYPAIlS8+vMcn27YLtAEBGvNRSh3TPNvtjZgfqA==} + '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} @@ -389,16 +556,41 @@ packages: resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} engines: {node: '>=6'} + '@sindresorhus/is@0.7.0': + resolution: {integrity: sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==} + engines: {node: '>=4'} + '@sinonjs/commons@3.0.1': resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} '@sinonjs/fake-timers@10.3.0': resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + '@sqltools/formatter@1.2.5': + resolution: {integrity: sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==} + '@szmarczak/http-timer@1.1.2': resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} engines: {node: '>=6'} + '@tootallnate/quickjs-emscripten@0.23.0': + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@types/accepts@1.3.7': + resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -411,12 +603,48 @@ packages: '@types/babel__traverse@7.20.6': resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + '@types/body-parser@1.19.5': + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/content-disposition@0.5.8': + resolution: {integrity: sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==} + '@types/cookiejar@2.1.5': resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} + '@types/cookies@0.9.0': + resolution: {integrity: sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==} + + '@types/decompress@4.2.7': + resolution: {integrity: sha512-9z+8yjKr5Wn73Pt17/ldnmQToaFHZxK0N1GHysuk/JIPT8RIdQeoInM01wWPgypRcvb6VH1drjuFpQ4zmY437g==} + + '@types/download@8.0.5': + resolution: {integrity: sha512-Ad68goc/BsL3atP3OP/lWKAKhiC6FduN1mC5yg9lZuGYmUY7vyoWBcXgt8GE9OzVWRq5IBXwm4o/QiE+gipZAg==} + + '@types/express-serve-static-core@5.0.4': + resolution: {integrity: sha512-5kz9ScmzBdzTgB/3susoCgfqNDzBjvLL4taparufgSvlwjdLy6UyUy9T/tCpYd2GIdIilCatC4iSQS0QSYHt0w==} + + '@types/express@5.0.0': + resolution: {integrity: sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==} + + '@types/glob@7.2.0': + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + + '@types/got@9.6.12': + resolution: {integrity: sha512-X4pj/HGHbXVLqTpKjA2ahI4rV/nNBc9mGO2I/0CgAra+F2dKgMXnENv2SRpemScBzBAI4vMelIVYViQxlSE6xA==} + '@types/graceful-fs@4.1.9': resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + '@types/http-assert@1.5.6': + resolution: {integrity: sha512-TTEwmtjgVbYAzZYWyeHPrrtWnfVkm8tQkP8P21uQifPgMRgjrow3XDEYqucuC8SKZJT7pUnhU/JymvjggxO9vw==} + + '@types/http-errors@2.0.4': + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + '@types/istanbul-lib-coverage@2.0.6': resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} @@ -432,9 +660,30 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/keygrip@1.0.6': + resolution: {integrity: sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==} + '@types/keyv@3.1.4': resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + '@types/koa-compose@3.2.8': + resolution: {integrity: sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==} + + '@types/koa@2.15.0': + resolution: {integrity: sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/minimatch@3.0.5': + resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} + + '@types/minimatch@5.1.2': + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + '@types/minimist@1.2.5': resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} @@ -444,12 +693,27 @@ packages: '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/qs@6.9.17': + resolution: {integrity: sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/readable-stream@4.0.18': + resolution: {integrity: sha512-21jK/1j+Wg+7jVw1xnSwy/2Q1VgVjWuFssbYGTREPUBeZ+rqVFl2udq0IkxzPC0ZhOzVceUbyIACFZKLqKEBlA==} + '@types/responselike@1.0.3': resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} '@types/semver@7.5.8': resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + '@types/send@0.17.4': + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + + '@types/serve-static@1.15.7': + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} @@ -459,6 +723,12 @@ packages: '@types/supertest@2.0.16': resolution: {integrity: sha512-6c2ogktZ06tr2ENoZivgm7YnprnhYE4ZoXGMY+oA7IuAf17M8FWvujXZGmxLv8y0PTyts4x5A+erSwVUFA8XSg==} + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + + '@types/validator@13.12.2': + resolution: {integrity: sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==} + '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} @@ -523,22 +793,74 @@ packages: resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@vercel/ncc@0.30.0': + resolution: {integrity: sha512-16ePj2GkwjomvE0HLL5ny+d+sudOwvZNYW8vjpMh3cyWdFxoMI8KSQiolVxeHBULbU1C5mVxLK5nL9NtnnpIew==} + hasBin: true + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + acorn@7.4.1: resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} engines: {node: '>=0.4.0'} hasBin: true + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + engines: {node: '>=0.4.0'} + hasBin: true + + address@1.2.2: + resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} + engines: {node: '>= 10.0.0'} + + aedes-packet@3.0.0: + resolution: {integrity: sha512-swASey0BxGs4/npZGWoiVDmnEyPvVFIRY6l2LVKL4rbiW8IhcIGDLfnb20Qo8U20itXlitAKPQ3MVTEbOGG5ZA==} + engines: {node: '>=14'} + + aedes-persistence@9.1.2: + resolution: {integrity: sha512-2Wlr5pwIK0eQOkiTwb8ZF6C20s8UPUlnsJ4kXYePZ3JlQl0NbBA176mzM8wY294BJ5wybpNc9P5XEQxqadRNcQ==} + engines: {node: '>=14'} + + aedes@0.51.3: + resolution: {integrity: sha512-aQfiI9w3RbqnowNCdcGMmCtxBFXN9bhJFcuZm24U5/NU06V3MCl42jWK2GUnu8rOypR2Ahi/aEcgq3w7CMcycg==} + engines: {node: '>=16'} + + agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} + engines: {node: '>= 14'} + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + amp-message@0.1.2: + resolution: {integrity: sha512-JqutcFwoU1+jhv7ArgW38bqrE+LQdcRv4NxNw0mp0JHQyB6tXesWRjtYKlDgHRY2o3JE5UTaBGUK8kSWUdxWUg==} + + amp@0.3.1: + resolution: {integrity: sha512-OwIuC4yZaRogHKiuU5WlMR5Xk/jAcpPtawWL05Gj8Lvm2F6mwoJt4O/bHI+DHwG79vWd+8OFYM4/BzYqyRd3qw==} + ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} @@ -574,16 +896,34 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + app-root-path@3.1.0: + resolution: {integrity: sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==} + engines: {node: '>= 6.0.0'} + + archive-type@4.0.0: + resolution: {integrity: sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==} + engines: {node: '>=4'} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + array-differ@3.0.0: + resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} + engines: {node: '>=8'} + array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} @@ -592,19 +932,43 @@ packages: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} + arrify@2.0.1: + resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} + engines: {node: '>=8'} + asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + assert@2.0.0: + resolution: {integrity: sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==} + + ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} + astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} + async@2.6.4: + resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} + + async@3.2.3: + resolution: {integrity: sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==} + async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axios@1.7.9: + resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==} + babel-jest@29.7.0: resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -633,10 +997,34 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + basic-ftp@5.0.5: + resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} + engines: {node: '>=10.0.0'} + binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + bl@1.2.3: + resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + bl@6.0.18: + resolution: {integrity: sha512-2k76XmWCuvu9HTvu3tFOl5HDdCH0wLZ/jHYva/LBVJmc9oX8yUtNQjxrFmbTdXsCSmIxwVTANZPNDfMQrvHFUw==} + + blessed@0.1.81: + resolution: {integrity: sha512-LoF5gae+hlmfORcG1M5+5XZi4LBmvlXTzwJWzUlPryN/SJdSflZvROM2TwkT0GMpq7oqT48NRd4GS7BiVBc5OQ==} + engines: {node: '>= 0.8.0'} + hasBin: true + + bodec@0.1.0: + resolution: {integrity: sha512-Ylo+MAo5BDUq1KA3f3R/MFhh+g8cnHmo8bz3YPGhI1znrMaf77ol1sfvYJzsw3nTE+Y2GryfDxBaR+AqpAkEHQ==} + boxen@5.1.2: resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} engines: {node: '>=10'} @@ -663,13 +1051,44 @@ packages: bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + buffer-alloc-unsafe@1.1.0: + resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} + + buffer-alloc@1.2.0: + resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + + buffer-fill@1.0.0: + resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} + buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} + cache-content-type@1.0.1: + resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} + engines: {node: '>= 6.0.0'} + + cache-manager@3.6.3: + resolution: {integrity: sha512-dS4DnV6c6cQcVH5OxzIU1XZaACXwvVIiUPkFytnRmLOACuBGv3GQgRQ1RJGRRw4/9DF14ZK2RFlZu1TUgDniMg==} + + cacheable-request@2.1.4: + resolution: {integrity: sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ==} + cacheable-request@6.1.0: resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==} engines: {node: '>=8'} @@ -678,6 +1097,10 @@ packages: resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} engines: {node: '>= 0.4'} + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + call-bound@1.0.3: resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} engines: {node: '>= 0.4'} @@ -705,10 +1128,17 @@ packages: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} + chalk@3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + chance@1.1.9: + resolution: {integrity: sha512-TfxnA/DcZXRTA4OekA2zL9GH8qscbbl6X0ZqU4tXhGveVY/mXWvEQLt5GwZcYXTEyEFflVtj+pG8nc8EwSm1RQ==} + char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} @@ -716,14 +1146,16 @@ packages: chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + + charm@0.1.2: + resolution: {integrity: sha512-syedaZ9cPe7r3hoQA9twWYKu5AIyCswN5+szkmPBe9ccdLrj4bYaCnLVPTLd2kgVRc7+zoX4tyPgRnFKCj5YjQ==} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - chownr@3.0.0: - resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} - engines: {node: '>=18'} - ci-info@2.0.0: resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} @@ -737,6 +1169,9 @@ packages: class-transformer@0.5.1: resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==} + class-validator@0.14.1: + resolution: {integrity: sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==} + cli-boxes@2.2.1: resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} engines: {node: '>=6'} @@ -745,21 +1180,36 @@ packages: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} - cli-table3@0.6.5: - resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} - engines: {node: 10.* || >= 12.*} + cli-highlight@2.1.11: + resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==} + engines: {node: '>=8.0.0', npm: '>=5.0.0'} + hasBin: true + + cli-tableau@2.0.1: + resolution: {integrity: sha512-he+WTicka9cl0Fg/y+YyxcN6/bfQ/1O3QmgxRXDhABKqLzvoOSM4fMzp39uMyLBulAFuywD2N7UaoQE7WaADxQ==} + engines: {node: '>=8.10.0'} cli-width@3.0.0: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} + clone-response@1.0.2: + resolution: {integrity: sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==} + clone-response@1.0.3: resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + co-body@6.2.0: + resolution: {integrity: sha512-Kbpv2Yd1NdL1V/V4cwLVxraHDV6K8ayohr2rmH0J87Er8+zJjcTa6dAn9QMPC9CRgU8+aNajKbSf1TzDB1yKPA==} + engines: {node: '>=8.0.0'} + co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} @@ -784,13 +1234,19 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} - commander@11.1.0: - resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} - engines: {node: '>=16'} + commander@10.0.0: + resolution: {integrity: sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==} + engines: {node: '>=14'} - commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} + commander@13.0.0: + resolution: {integrity: sha512-oPYleIY8wmTVzkvQq10AEok6YcTC4sRUBl8F9gVuwchGVUCTbl/vhLTaQqutuuySYOsu8YTgV+OxKc/8Yvx+mQ==} + engines: {node: '>=18'} + + commander@2.15.1: + resolution: {integrity: sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} compare-versions@6.1.1: resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} @@ -805,17 +1261,41 @@ packages: resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} engines: {node: '>=8'} + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} cookiejar@2.1.4: resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} + cookies@0.9.1: + resolution: {integrity: sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==} + engines: {node: '>= 0.8'} + + copy-to@2.0.1: + resolution: {integrity: sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + create-jest@29.7.0: resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + croner@4.1.97: + resolution: {integrity: sha512-/f6gpQuxDaqXu+1kwQYSckUglPaOrHdbIlBAu0YuW8/Cdb45XwXYNUBXg3r/9Mo6n540Kn/smKcZWko5x99KrQ==} + cross-env@7.0.3: resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} @@ -825,13 +1305,43 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + crypto-random-string@2.0.0: resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} engines: {node: '>=8'} + culvert@0.1.2: + resolution: {integrity: sha512-yi1x3EAWKjQTreYWeSd98431AV+IEE0qoDyOoaHJ7KJ21gv6HtBXHVLX74opVSGqcR8/AbjJBHAHpcOy2bj5Gg==} + + data-uri-to-buffer@6.0.2: + resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} + engines: {node: '>= 14'} + dayjs@1.11.13: resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + dayjs@1.8.36: + resolution: {integrity: sha512-3VmRXEtw7RZKAf+4Tv1Ym9AGeo8r8+CjDi26x+7SYQil1UqtqdaokhzoEJohqlzt0m5kacJSDhJQkG/LWhpRBw==} + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} @@ -849,10 +1359,34 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} + decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + decompress-response@3.3.0: resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} engines: {node: '>=4'} + decompress-tar@4.1.1: + resolution: {integrity: sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==} + engines: {node: '>=4'} + + decompress-tarbz2@4.1.1: + resolution: {integrity: sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==} + engines: {node: '>=4'} + + decompress-targz@4.1.1: + resolution: {integrity: sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==} + engines: {node: '>=4'} + + decompress-unzip@4.0.1: + resolution: {integrity: sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==} + engines: {node: '>=4'} + + decompress@4.2.1: + resolution: {integrity: sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==} + engines: {node: '>=4'} + dedent@1.5.3: resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} peerDependencies: @@ -861,6 +1395,9 @@ packages: babel-plugin-macros: optional: true + deep-equal@1.0.1: + resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} + deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -875,18 +1412,46 @@ packages: defer-to-connect@1.1.3: resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==} + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} + engines: {node: '>= 14'} + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + + depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} + detect-port@1.6.1: + resolution: {integrity: sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==} + engines: {node: '>= 4.0.0'} + hasBin: true + dezalgo@1.0.4: resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} @@ -894,6 +1459,10 @@ packages: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -906,6 +1475,14 @@ packages: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} + + download@8.0.0: + resolution: {integrity: sha512-ASRY5QhDk7FK+XrQtQyvhpDKanLluEEQtWl/J7Lxuf/b+i8RYh997QeXvL85xitrmRKVlx9c7eTrcRdq2GS4eA==} + engines: {node: '>=10'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -916,13 +1493,19 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + ejs@3.1.10: resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.79: - resolution: {integrity: sha512-nYOxJNxQ9Om4EC88BE4pPoNI8xwSFf8pU/BAeOl4Hh/b/i6V4biTAzwV7pXi3ARKeoYO5JZKMIXTryXSVer5RA==} + electron-to-chromium@1.5.80: + resolution: {integrity: sha512-LTrKpW0AqIuHwmlVNV+cjFYTnXtM9K37OGhpe0ZI10ScPSxqVSryZHIY3WnCS5NSYbBODRTZyhRMS2h5FAEqAw==} emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} @@ -934,9 +1517,17 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + enquirer@2.3.6: + resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} + engines: {node: '>=8.6'} + enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} @@ -956,6 +1547,9 @@ packages: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} + es6-object-assign@1.1.0: + resolution: {integrity: sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==} + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -964,6 +1558,9 @@ packages: resolution: {integrity: sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==} engines: {node: '>=8'} + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -976,6 +1573,11 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + eslint-config-prettier@8.10.0: resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} hasBin: true @@ -1009,6 +1611,10 @@ packages: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} + eslint-scope@7.1.1: + resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-utils@2.1.0: resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} engines: {node: '>=6'} @@ -1021,6 +1627,10 @@ packages: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} + eslint-visitor-keys@3.3.0: + resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1060,6 +1670,23 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + eventemitter2@0.4.14: + resolution: {integrity: sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==} + + eventemitter2@5.0.1: + resolution: {integrity: sha512-5EM1GHXycJBS6mauYAbVKT1cVs7POKWb2NXD4Vyt8dDqeZa7LaDK1/sjtL+Zb0lzTpSNil4596Dyu97hz37QLg==} + + eventemitter2@6.4.9: + resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -1072,10 +1699,21 @@ packages: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + ext-list@2.2.2: + resolution: {integrity: sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==} + engines: {node: '>=0.10.0'} + + ext-name@5.0.0: + resolution: {integrity: sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==} + engines: {node: '>=4'} + external-editor@3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} + extrareqp2@1.0.0: + resolution: {integrity: sha512-Gum0g1QYb6wpPJCVypWP3bbIuaibcFiJcpuPM10YSXp/tzqi84x9PJageob+eN4xVRIOto4wjSGNLyMD54D2xA==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -1086,6 +1724,9 @@ packages: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} + fast-json-patch@3.1.1: + resolution: {integrity: sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==} + fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -1095,15 +1736,35 @@ packages: fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + fast-unique-numbers@8.0.13: + resolution: {integrity: sha512-7OnTFAVPefgw2eBJ1xj2PGGR9FwYzSUso9decayHgCDX4sJkHLdcsYTytTg+tYv+wKF3U8gJuSBz2jJpQV4u/g==} + engines: {node: '>=16.1.0'} + fast-uri@3.0.5: resolution: {integrity: sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==} + fastfall@1.5.1: + resolution: {integrity: sha512-KH6p+Z8AKPXnmA7+Iz2Lh8ARCMr+8WNPVludm1LGkZoD2MjY6LVnRMtTKhkdzI+jr0RzQWXKzKyBJm1zoHEL4Q==} + engines: {node: '>=0.10.0'} + + fastparallel@2.4.1: + resolution: {integrity: sha512-qUmhxPgNHmvRjZKBFUNI0oZuuH9OlSIOXmJ98lhKPxMZZ7zS/Fi0wRHOihDSz0R1YiIOjxzOY4bq65YTcdBi2Q==} + fastq@1.18.0: resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} + fastseries@2.0.0: + resolution: {integrity: sha512-XBU9RXeoYc2/VnvMhplAxEmZLfIk7cvTBu+xwoBuTI8pL19E03cmca17QQycKIdxgwCeFA/a4u27gv1h3ya5LQ==} + fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + fclone@1.0.11: + resolution: {integrity: sha512-GDqVQezKzRABdeqflsgMr7ktzgF9CyS+p2oe0jJqUY6izSSbhPIQJDpoU4PtGcD7VPM9xh/dVrTu6z1nwgmEGw==} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} @@ -1112,13 +1773,44 @@ packages: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} + file-type@11.1.0: + resolution: {integrity: sha512-rM0UO7Qm9K7TWTtA6AShI/t7H5BPjDeGVDaNyg9BjHAj3PysKy7+8C8D137R88jnR3rFJZQB/tFgydl5sN5m7g==} + engines: {node: '>=6'} + + file-type@3.9.0: + resolution: {integrity: sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==} + engines: {node: '>=0.10.0'} + + file-type@4.4.0: + resolution: {integrity: sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==} + engines: {node: '>=4'} + + file-type@5.2.0: + resolution: {integrity: sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==} + engines: {node: '>=4'} + + file-type@6.2.0: + resolution: {integrity: sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==} + engines: {node: '>=4'} + filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + filename-reserved-regex@2.0.0: + resolution: {integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==} + engines: {node: '>=4'} + + filenamify@3.0.0: + resolution: {integrity: sha512-5EFZ//MsvJgXjBAFJ+Bh2YaCTRF/VP1YOmGrgt+KJ4SFRLjI87EIdwLLuT6wQX0I4F9W41xutobzczjsOKlI/g==} + engines: {node: '>=6'} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -1130,10 +1822,26 @@ packages: flatted@3.3.2: resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + foreground-child@3.3.0: resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} + form-data@2.5.2: + resolution: {integrity: sha512-GgwY0PS7DbXqajuGf4OYlsrIu3zgxD6Vvql43IBhm6MahqA5SK/7mwhtNj2AdH2z35YR34ujJ7BN+3fFC3jP5Q==} + engines: {node: '>= 0.12'} + form-data@4.0.1: resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} engines: {node: '>= 6'} @@ -1141,6 +1849,20 @@ packages: formidable@2.1.2: resolution: {integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==} + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + from2@2.3.0: + resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -1175,6 +1897,14 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} + get-stream@2.3.1: + resolution: {integrity: sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==} + engines: {node: '>=0.10.0'} + + get-stream@3.0.0: + resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} + engines: {node: '>=4'} + get-stream@4.1.0: resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} engines: {node: '>=6'} @@ -1187,6 +1917,21 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} + get-uri@6.0.4: + resolution: {integrity: sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==} + engines: {node: '>= 14'} + + git-node-fs@1.0.0: + resolution: {integrity: sha512-bLQypt14llVXBg0S0u8q8HmU7g9p3ysH+NvVlae5vILuUvs759665HvmR5+wb04KjHyjFcDRxdYb4kyNnluMUQ==} + peerDependencies: + js-git: ^0.7.8 + peerDependenciesMeta: + js-git: + optional: true + + git-sha1@0.1.2: + resolution: {integrity: sha512-2e/nZezdVlyCopOCYHeW0onkbZg7xP1Ad6pndPy1rCygeRykefUS6r7oA5cJRGEFvseiaz5a/qUHFVX1dd6Isg==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -1195,6 +1940,11 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true + glob@11.0.1: + resolution: {integrity: sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==} + engines: {node: 20 || >=22} + hasBin: true + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -1211,6 +1961,10 @@ packages: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} + globby@10.0.2: + resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} + engines: {node: '>=8'} + globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -1219,6 +1973,10 @@ packages: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} + got@8.3.2: + resolution: {integrity: sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==} + engines: {node: '>=4'} + got@9.6.0: resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==} engines: {node: '>=8.6'} @@ -1241,10 +1999,23 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-symbol-support-x@1.4.2: + resolution: {integrity: sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==} + has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} + has-to-string-tag-x@1.4.1: + resolution: {integrity: sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + has-yarn@2.1.0: resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==} engines: {node: '>=8'} @@ -1257,6 +2028,9 @@ packages: resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} engines: {node: '>=8'} + highlight.js@10.7.3: + resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -1267,21 +2041,46 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + http-assert@1.5.0: + resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} + engines: {node: '>= 0.8'} + + http-cache-semantics@3.8.1: + resolution: {integrity: sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==} + http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + http-errors@1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} + engines: {node: '>= 0.6'} + http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} + hyperid@3.3.0: + resolution: {integrity: sha512-7qhCVT4MJIoEsNcbhglhdmBKb09QtcmJNiIQGq7js/Khf5FtQQ9bzcAuloeqBeee7XD7JqDeve9KNlQya5tSGQ==} + iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ignore@4.0.6: resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} engines: {node: '>= 4'} @@ -1311,6 +2110,10 @@ packages: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} + inflation@2.1.0: + resolution: {integrity: sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==} + engines: {node: '>= 0.8.0'} + inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -1329,6 +2132,21 @@ packages: resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} engines: {node: '>=8.0.0'} + into-stream@3.1.0: + resolution: {integrity: sha512-TcdjPibTksa1NQximqep2r17ISRiNE9fwlfbg3F8ANdvP5/yrFTew86VcO//jk4QTaMlbjypPBq76HN2zaKfZQ==} + engines: {node: '>=4'} + + inversify@6.0.1: + resolution: {integrity: sha512-B3ex30927698TJENHR++8FfEaJGqoWOgI6ZY5Ht/nLUsFCwHn6akbwtnUAPCgUepAnTpe2qHxhDNjoKLyz6rgQ==} + + ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} + + is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} + is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} @@ -1336,6 +2154,13 @@ packages: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + is-ci@2.0.0: resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} hasBin: true @@ -1356,6 +2181,10 @@ packages: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -1364,6 +2193,13 @@ packages: resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} engines: {node: '>=10'} + is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + + is-natural-number@4.0.1: + resolution: {integrity: sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==} + is-npm@5.0.0: resolution: {integrity: sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==} engines: {node: '>=10'} @@ -1376,6 +2212,9 @@ packages: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} + is-object@1.0.2: + resolution: {integrity: sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==} + is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} @@ -1384,16 +2223,35 @@ packages: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-retry-allowed@1.2.0: + resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==} + engines: {node: '>=0.10.0'} + + is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + is-typedarray@1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} is-yarn-global@0.3.0: resolution: {integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==} + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -1421,14 +2279,27 @@ packages: resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} + isurl@1.0.0: + resolution: {integrity: sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==} + engines: {node: '>= 4'} + jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jackspeak@4.0.2: + resolution: {integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==} + engines: {node: 20 || >=22} + jake@10.9.2: resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} engines: {node: '>=10'} hasBin: true + javascript-obfuscator@4.1.1: + resolution: {integrity: sha512-gt+KZpIIrrxXHEQGD8xZrL8mTRwRY0U76/xz/YX0gZdPrSqQhT/c7dYLASlLlecT3r+FxE7je/+C0oLnTDCx4A==} + engines: {node: '>=12.22.0'} + hasBin: true + jest-changed-files@29.7.0: resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1558,6 +2429,13 @@ packages: node-notifier: optional: true + js-git@0.7.8: + resolution: {integrity: sha512-+E5ZH/HeRnoc/LW0AmAyhU+mNcWBzAKE+30+IDMLSLbbK+Tdt02AdkOKq9u15rlJsDEGFqtgckc8ZM59LhhiUA==} + + js-string-escape@1.0.1: + resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} + engines: {node: '>= 0.8'} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -1569,6 +2447,9 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -1592,11 +2473,38 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonwebtoken@9.0.2: + resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} + engines: {node: '>=12', npm: '>=6'} + + jwa@1.4.1: + resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + + jws@3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + + keygrip@1.1.0: + resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} + engines: {node: '>= 0.6'} + + keyv@3.0.0: + resolution: {integrity: sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==} + keyv@3.1.0: resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} @@ -1611,18 +2519,47 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} + koa-bodyparser@4.4.1: + resolution: {integrity: sha512-kBH3IYPMb+iAXnrxIhXnW+gXV8OTzCu8VPDqvcDHW9SQrbkHmqPQtiZwrltNmSq6/lpipHnT7k7PsjlVD7kK0w==} + engines: {node: '>=8.0.0'} + + koa-compose@4.1.0: + resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} + + koa-convert@2.0.0: + resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} + engines: {node: '>= 10'} + + koa@2.15.3: + resolution: {integrity: sha512-j/8tY9j5t+GVMLeioLaxweJiKUayFhlGqNTzf2ZGwL0ZCQijd2RLHK0SLW5Tsko8YyyqCZC2cojIb0/s62qTAg==} + engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} + latest-version@5.1.0: resolution: {integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==} engines: {node: '>=8'} + lazy@1.0.11: + resolution: {integrity: sha512-Y+CjUfLmIpoUCCRl0ub4smrYtGGr5AOa2AKOaWelGHOGz33X/Y/KizefGqbkwfz44+cnq/+9habclf8vOmu2LA==} + engines: {node: '>=0.2.0'} + leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} + levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + libphonenumber-js@1.11.17: + resolution: {integrity: sha512-Jr6v8thd5qRlOlc6CslSTzGzzQW03uiscab7KHQZX1Dfo4R6n6FDhZ0Hri6/X7edLIDv9gl4VMZXhxTjLnl0VQ==} + + light-spinner@1.0.4: + resolution: {integrity: sha512-2ugkvDHNKM0uGNCXDEMXjl8xm4TPDLYCQYFD2Oqd3J6ZL8bIQsjzB++yYgvWU4MX3zd3HYAT/crZtnSFrYIpvA==} + lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -1630,18 +2567,49 @@ packages: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} + lockfile@1.0.4: + resolution: {integrity: sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==} + + lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + + lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + + lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + + lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + + lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + lodash.truncate@4.4.2: resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lowercase-keys@1.0.0: + resolution: {integrity: sha512-RPlX0+PHuvxVDZ7xX+EBVAp4RsVxP/TdDSN2mJYdiq1Lc4Hz7EUSjUI7RZrKKlmrIzVhf6Jo2stj7++gVarS0A==} + engines: {node: '>=0.10.0'} + lowercase-keys@1.0.1: resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} engines: {node: '>=0.10.0'} @@ -1653,6 +2621,10 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.0.2: + resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==} + engines: {node: 20 || >=22} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -1660,6 +2632,18 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + make-dir@1.3.0: + resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} + engines: {node: '>=4'} + + make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} @@ -1686,6 +2670,13 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + md5@2.3.0: + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + meow@9.0.0: resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} engines: {node: '>=10'} @@ -1705,10 +2696,18 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + midway-version@1.4.0: + resolution: {integrity: sha512-2Z8RFK3VeKVWsyz8vs8hrQr27UYjxKLFpqTiQqWrnDtHrcd8OJoR3x6FxtJHGdNepX4ByVvx5Qx6bEqifQUK4A==} + hasBin: true + mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} + mime-db@1.53.0: + resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} + engines: {node: '>= 0.6'} + mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} @@ -1730,6 +2729,10 @@ packages: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} + minimatch@10.0.1: + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + engines: {node: 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -1752,18 +2755,51 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - minizlib@3.0.1: - resolution: {integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==} - engines: {node: '>= 18'} + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true - mkdirp@3.0.1: - resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} hasBin: true + mkdirp@2.1.3: + resolution: {integrity: sha512-sjAkg21peAG9HS+Dkx7hlG9Ztx7HLeKnvB3NQRcu/mltCVmvkF0pisbiTSfDVYTT86XEfZrTUosLdZLStquZUw==} + engines: {node: '>=10'} + hasBin: true + + mkdirp@2.1.6: + resolution: {integrity: sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==} + engines: {node: '>=10'} + hasBin: true + + mod-info@1.0.2: + resolution: {integrity: sha512-Z5FvCUYLg0OvZSg36Ltx0PjY3/LvSb+woTzDa1vSYcJ41ViaGC1nQnvnFLuziQgFvXCeH01X8eUFOsSt7/Q3Cg==} + + module-details-from-path@1.0.3: + resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} + + moment@2.30.1: + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} + + mqemitter@6.0.2: + resolution: {integrity: sha512-8RGlznQx/Nb1xC3xKUFXHWov7pn7JdH++YVwlr6SLT6k3ft1h+ImGqZdVudbdKruFckIq9wheq9s4hgCivJDow==} + engines: {node: '>=16'} + + mqtt-packet@7.1.2: + resolution: {integrity: sha512-FFZbcZ2omsf4c5TxEQfcX9hI+JzDpDKPT46OmeIBpVA7+t32ey25UNqlqNXTmeZOr5BLsSIERpQQLsFWJS94SQ==} + + mqtt-packet@9.0.1: + resolution: {integrity: sha512-koZF1V/X2RZUI6uD9wN5OK1JxxcG1ofAR4H3LjCw1FkeKzruZQ26aAA6v2m1lZyWONZIR5wMMJFrZJDRNzbiQw==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + multimatch@5.0.0: + resolution: {integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==} + engines: {node: '>=10'} + mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} @@ -1774,14 +2810,8 @@ packages: peerDependencies: typescript: '>=3' - mwtsc@1.15.1: - resolution: {integrity: sha512-dLr0jAsfAsSAN3AxCaVvTuHPUPh2fKJoX0ymor8SPkoQKJ1ijolMgORdJS9f3pZqzjyju3VJhd6voZ056JJCrQ==} - engines: {node: '>=12.11.0'} - hasBin: true - - mylas@2.1.13: - resolution: {integrity: sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg==} - engines: {node: '>=12.0.0'} + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} @@ -1793,6 +2823,28 @@ packages: resolution: {integrity: sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==} hasBin: true + needle@2.4.0: + resolution: {integrity: sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==} + engines: {node: '>= 4.4.x'} + hasBin: true + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + engines: {node: '>= 0.4.0'} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} @@ -1810,6 +2862,10 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + normalize-url@2.0.1: + resolution: {integrity: sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==} + engines: {node: '>=4'} + normalize-url@4.5.1: resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==} engines: {node: '>=8'} @@ -1818,10 +2874,30 @@ packages: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} + nssocket@0.6.0: + resolution: {integrity: sha512-a9GSOIql5IqgWJR3F/JXG4KpJTA3Z53Cj0MeMvGpglytB1nxE4PdFNC0jINe27CS7cGivoynwc054EzCcT3M3w==} + engines: {node: '>= 0.10.x'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + object-inspect@1.13.3: resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} engines: {node: '>= 0.4'} + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -1829,6 +2905,17 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} + only@0.0.2: + resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} + + opencollective-postinstall@2.0.3: + resolution: {integrity: sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==} + hasBin: true + + optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -1837,10 +2924,26 @@ packages: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} + p-cancelable@0.4.1: + resolution: {integrity: sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==} + engines: {node: '>=4'} + p-cancelable@1.1.0: resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} engines: {node: '>=6'} + p-event@2.3.1: + resolution: {integrity: sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==} + engines: {node: '>=6'} + + p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + + p-is-promise@1.1.0: + resolution: {integrity: sha512-zL7VE4JVS2IFSkR2GQKDSPEVxkoH43/p7oEnwpdCndKYJO0HVeRB7fA8TJwuLOTBREtK0ea8eHaxdwcpob5dmg==} + engines: {node: '>=4'} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -1853,10 +2956,22 @@ packages: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} + p-timeout@2.0.1: + resolution: {integrity: sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==} + engines: {node: '>=4'} + p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + pac-proxy-agent@7.1.0: + resolution: {integrity: sha512-Z5FnLVVZSnX7WjBg0mhDtydeRZ1xMcATZThjySQUHqr+0ksP8kqaw23fNKkaaN/Z8gwLUs/W7xdl0I75eP2Xyw==} + engines: {node: '>= 14'} + + pac-resolver@7.0.1: + resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} + engines: {node: '>= 14'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -1864,6 +2979,9 @@ packages: resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==} engines: {node: '>=8'} + pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -1872,6 +2990,19 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} + parse5-htmlparser2-tree-adapter@6.0.1: + resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} + + parse5@5.1.1: + resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==} + + parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -1891,10 +3022,20 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} + + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -1902,6 +3043,34 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + pidusage@2.0.21: + resolution: {integrity: sha512-cv3xAQos+pugVX+BfXpHsbyz/dLzX+lr44zNMsYiGxUw+kV5sgQCIcLd1z+0vq+KyC7dJ+/ts2PsfgWfSC3WXA==} + engines: {node: '>=8'} + + pidusage@3.0.2: + resolution: {integrity: sha512-g0VU+y08pKw5M8EZ2rIGiEBaB8wrQMjYGFfW2QVIfyT8V+fq8YFLkvlz4bz5ljvFDJYNFCWT3PWqcRr2FKO81w==} + engines: {node: '>=10'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pinkie-promise@2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} + + pinkie@2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} @@ -1910,9 +3079,36 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} - plimit-lit@1.6.1: - resolution: {integrity: sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA==} - engines: {node: '>=12'} + pm2-axon-rpc@0.7.1: + resolution: {integrity: sha512-FbLvW60w+vEyvMjP/xom2UPhUN/2bVpdtLfKJeYM3gwzYhoTEEChCOICfFzxkxuoEleOlnpjie+n1nue91bDQw==} + engines: {node: '>=5'} + + pm2-axon@4.0.1: + resolution: {integrity: sha512-kES/PeSLS8orT8dR5jMlNl+Yu4Ty3nbvZRmaAtROuVm9nYYGiaoXqqKQqQYzWQzMYWUKHMQTvBlirjE5GIIxqg==} + engines: {node: '>=5'} + + pm2-deploy@1.0.2: + resolution: {integrity: sha512-YJx6RXKrVrWaphEYf++EdOOx9EH18vM8RSZN/P1Y+NokTKqYAca/ejXwVLyiEpNju4HPZEk3Y2uZouwMqUlcgg==} + engines: {node: '>=4.0.0'} + + pm2-multimeter@0.1.2: + resolution: {integrity: sha512-S+wT6XfyKfd7SJIBqRgOctGxaBzUOmVQzTAS+cg04TsEUObJVreha7lvCfX8zzGVr871XwCSnHUU7DQQ5xEsfA==} + + pm2-sysmonit@1.2.8: + resolution: {integrity: sha512-ACOhlONEXdCTVwKieBIQLSi2tQZ8eKinhcr9JpZSUAL8Qy0ajIgRtsLxG/lwPOW3JEKqPyw/UaHmTWhUzpP4kA==} + + pm2@5.4.3: + resolution: {integrity: sha512-4/I1htIHzZk1Y67UgOCo4F1cJtas1kSds31N8zN0PybO230id1nigyjGuGFzUnGmUFPmrJ0On22fO1ChFlp7VQ==} + engines: {node: '>=12.0.0'} + hasBin: true + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} @@ -1935,14 +3131,31 @@ packages: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} + promptly@2.2.0: + resolution: {integrity: sha512-aC9j+BZsRSSzEsXBNBwDnAxujdx19HycZoKgRgzWnS8eOHg1asuf9heuLprfbe739zY3IdUQx+Egv6Jn135WHA==} + prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} + proxy-agent@6.3.1: + resolution: {integrity: sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==} + engines: {node: '>= 14'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + pump@3.0.2: resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} @@ -1957,17 +3170,28 @@ packages: pure-rand@6.1.0: resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + qlobber@7.0.1: + resolution: {integrity: sha512-FsFg9lMuMEFNKmTO9nV7tlyPhx8BmskPPjH2akWycuYVTtWaVwhW5yCHLJQ6Q+3mvw5cFX2vMfW2l9z2SiYAbg==} + engines: {node: '>= 14'} + + qlobber@8.0.1: + resolution: {integrity: sha512-O+Wd1chXj5YE1DwmD+ae0bXiSLehmnS3czlC1R9FL/Nt/3q8uMS1bIHmg2lJfCoiimCxClWM8AAuJrF0EvNiog==} + engines: {node: '>= 16'} + qs@6.13.1: resolution: {integrity: sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==} engines: {node: '>=0.6'} - queue-lit@1.5.2: - resolution: {integrity: sha512-tLc36IOPeMAubu8BkW8YDBV+WyIgKlYU7zUNs0J5Vk9skSZ4JfGlPOqplP0aHdfv7HL0B2Pg6nwiq60Qc6M2Hw==} - engines: {node: '>=12'} + query-string@5.1.1: + resolution: {integrity: sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==} + engines: {node: '>=0.10.0'} queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + queue@6.0.2: + resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + quick-lru@4.0.1: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} @@ -1991,6 +3215,21 @@ packages: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} engines: {node: '>=8'} + read@1.0.7: + resolution: {integrity: sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==} + engines: {node: '>=0.8'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readable-stream@4.7.0: + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -1999,9 +3238,15 @@ packages: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} + reflect-metadata@0.1.13: + resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} + reflect-metadata@0.2.2: resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + regexpp@3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} @@ -2022,6 +3267,10 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + require-in-the-middle@5.2.0: + resolution: {integrity: sha512-efCx3b+0Z69/LGJmm9Yvi4cqEdxnoGnxYxGxBghkkTTFeXRtTCmmhO0AnAfHz59k957uTSuy8WaHqOs8wbYUWg==} + engines: {node: '>=6'} + resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} @@ -2050,6 +3299,9 @@ packages: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} + retimer@4.0.0: + resolution: {integrity: sha512-fZIVtvbOsQsxNSDhpdPOX4lx5Ss2ni+S72AUBitARpFhtA3UzrAjQ6gDtypB2/+l7L+1VQgAgpvAKY66mElH0w==} + reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -2059,10 +3311,6 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rimraf@5.0.10: - resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} - hasBin: true - run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} @@ -2070,17 +3318,36 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + run-series@1.1.9: + resolution: {integrity: sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==} + rxjs@6.6.7: resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} engines: {npm: '>=2.0.0'} - safe-stable-stringify@2.5.0: - resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} - engines: {node: '>=10'} + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + scmp@2.1.0: + resolution: {integrity: sha512-o/mRQGk9Rcer/jEEw/yw4mwo3EU/NvYvp577/Btqrym9Qy5/MdWGBqipbALgd2lrdWTJ5/gqDusxfnQBxOxT2Q==} + + seek-bzip@1.0.6: + resolution: {integrity: sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==} + hasBin: true + semver-diff@3.1.1: resolution: {integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==} engines: {node: '>=8'} @@ -2093,14 +3360,27 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true + semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + semver@7.6.3: resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} hasBin: true + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -2109,6 +3389,12 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shimmer@1.2.1: + resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} + + should-send-same-site-none@2.0.5: + resolution: {integrity: sha512-7dig49H7sKnv1v/GPoFQChGgJdEX9s2oy9TQBSD5RbUx7M9CCRjHMaFP06v+DZQNM0K+o8dBhvBAd4eEKirqbQ==} + side-channel-list@1.0.0: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} engines: {node: '>= 0.4'} @@ -2143,6 +3429,30 @@ packages: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} engines: {node: '>=10'} + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} + + socks@2.8.3: + resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + sort-keys-length@1.0.1: + resolution: {integrity: sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==} + engines: {node: '>=0.10.0'} + + sort-keys@1.1.2: + resolution: {integrity: sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==} + engines: {node: '>=0.10.0'} + + sort-keys@2.0.0: + resolution: {integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==} + engines: {node: '>=4'} + source-map-support@0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} @@ -2168,18 +3478,39 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sprintf-js@1.1.2: + resolution: {integrity: sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + sqlstring@2.3.3: + resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} + engines: {node: '>= 0.6'} + stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + strict-uri-encode@1.1.0: + resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} + engines: {node: '>=0.10.0'} + string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} + string-template@1.0.0: + resolution: {integrity: sha512-SLqR3GBUXuoPP5MmYtD7ompvXiG87QjT6lzOszyXjTM86Uu7At7vNnt2xgyTLq5o9T4IxTYFyGxcULqpsmsfdg==} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -2188,6 +3519,15 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringz@2.1.0: + resolution: {integrity: sha512-KlywLT+MZ+v0IRepfMxRtnSvDCMc3nR1qqCs3m/qIbSOWkNZYT8XHQA31rS3TnKp0c5xjZu3M4GY/2aRKSi/6A==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -2196,10 +3536,17 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + strip-bom@4.0.0: resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} engines: {node: '>=8'} + strip-dirs@2.1.0: + resolution: {integrity: sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==} + strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} @@ -2216,6 +3563,10 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strip-outer@1.0.1: + resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==} + engines: {node: '>=0.10.0'} + superagent@8.1.2: resolution: {integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==} engines: {node: '>=6.4.0 <13 || >=14'} @@ -2241,13 +3592,19 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + systeminformation@5.25.10: + resolution: {integrity: sha512-7HVNcraf5VUsFHfl/1/bixFidJKrk//BjnPkYdJChqKdHmSyMGYkB6GRWWC3SKClg5D5v5SMpay4oO7hsFhiWg==} + engines: {node: '>=8.0.0'} + os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] + hasBin: true + table@6.9.0: resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} engines: {node: '>=10.0.0'} - tar@7.4.3: - resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} - engines: {node: '>=18'} + tar-stream@1.6.2: + resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} + engines: {node: '>= 0.8.0'} test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} @@ -2256,9 +3613,20 @@ packages: text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + timed-out@4.0.1: + resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} + engines: {node: '>=0.10.0'} + tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -2266,6 +3634,9 @@ packages: tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + to-buffer@1.1.1: + resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==} + to-readable-stream@1.0.0: resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==} engines: {node: '>=6'} @@ -2278,10 +3649,17 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + trim-newlines@3.0.1: resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} engines: {node: '>=8'} + trim-repeated@1.0.0: + resolution: {integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==} + engines: {node: '>=0.10.0'} + ts-jest@29.2.5: resolution: {integrity: sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} @@ -2306,19 +3684,56 @@ packages: esbuild: optional: true - tsc-alias@1.8.10: - resolution: {integrity: sha512-Ibv4KAWfFkFdKJxnWfVtdOmB0Zi1RJVxcbPGiCDsFpCQSsmpWyuzHG3rQyI5YkobWwxFPEyQfu1hdo4qLG2zPw==} + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + tslib@1.9.3: + resolution: {integrity: sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==} + + tslib@2.5.0: + resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsscmp@1.0.6: + resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} + engines: {node: '>=0.6.x'} + tsutils@3.21.0: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + tv4@1.3.0: + resolution: {integrity: sha512-afizzfpJgvPr+eDkREK4MxJ/+r8nEEHcmitwgnPUqpaP+FpwQyadnxNoSACbgc/b1LsZYtODGoPiFxQrgJgjvw==} + engines: {node: '>= 0.8.0'} + + tx2@1.0.5: + resolution: {integrity: sha512-sJ24w0y03Md/bxzK4FU8J8JveYYUbSs2FViLJ2D/8bytSiyPRbuE3DyL/9UKYXTZlV3yXq0L8GLlhobTnekCVg==} + + type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -2347,14 +3762,84 @@ packages: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + typeorm@0.3.20: + resolution: {integrity: sha512-sJ0T08dV5eoZroaq9uPKBoNcGslHBR4E4y+EBHs//SiGbblGe7IeduP/IH4ddCcj0qp3PHwDwGnuvqEAnKlq/Q==} + engines: {node: '>=16.13.0'} + hasBin: true + peerDependencies: + '@google-cloud/spanner': ^5.18.0 + '@sap/hana-client': ^2.12.25 + better-sqlite3: ^7.1.2 || ^8.0.0 || ^9.0.0 + hdb-pool: ^0.1.6 + ioredis: ^5.0.4 + mongodb: ^5.8.0 + mssql: ^9.1.1 || ^10.0.1 + mysql2: ^2.2.5 || ^3.0.1 + oracledb: ^6.3.0 + pg: ^8.5.1 + pg-native: ^3.0.0 + pg-query-stream: ^4.0.0 + redis: ^3.1.1 || ^4.0.0 + sql.js: ^1.4.0 + sqlite3: ^5.0.3 + ts-node: ^10.7.0 + typeorm-aurora-data-api-driver: ^2.0.0 + peerDependenciesMeta: + '@google-cloud/spanner': + optional: true + '@sap/hana-client': + optional: true + better-sqlite3: + optional: true + hdb-pool: + optional: true + ioredis: + optional: true + mongodb: + optional: true + mssql: + optional: true + mysql2: + optional: true + oracledb: + optional: true + pg: + optional: true + pg-native: + optional: true + pg-query-stream: + optional: true + redis: + optional: true + sql.js: + optional: true + sqlite3: + optional: true + ts-node: + optional: true + typeorm-aurora-data-api-driver: + optional: true + + typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + typescript@5.7.3: resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} engines: {node: '>=14.17'} hasBin: true + unbzip2-stream@1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + undici-types@6.20.0: resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} @@ -2362,6 +3847,10 @@ packages: resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} engines: {node: '>=8'} + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} @@ -2383,6 +3872,38 @@ packages: resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==} engines: {node: '>=4'} + url-to-options@1.0.1: + resolution: {integrity: sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==} + engines: {node: '>= 4'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + + uuid-parse@1.1.0: + resolution: {integrity: sha512-OdmXxA8rDsQ7YpNVbKSJkNzTw2I+S5WsbMDnCtIWSQaosNAcWtFuI/YK1TjzUI6nbkgiqEyh8gWngfcv8Asd9A==} + + uuid@10.0.0: + resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} + hasBin: true + + uuid@11.0.5: + resolution: {integrity: sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==} + hasBin: true + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + v8-compile-cache@2.4.0: resolution: {integrity: sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==} @@ -2393,9 +3914,31 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + validator@13.12.0: + resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} + engines: {node: '>= 0.10'} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vizion@2.2.1: + resolution: {integrity: sha512-sfAcO2yeSU0CSPFI/DmZp3FsFE9T+8913nv1xWBOyzODv13fwkn6Vl7HqxGpkr9F608M+8SuFId3s+BlZqfXww==} + engines: {node: '>=4.0'} + walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-typed-array@1.1.18: + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} + engines: {node: '>= 0.4'} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -2409,6 +3952,15 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + worker-timers-broker@6.1.8: + resolution: {integrity: sha512-FUCJu9jlK3A8WqLTKXM9E6kAmI/dR1vAJ8dHYLMisLNB/n3GuaFIjJ7pn16ZcD1zCOf7P6H62lWIEBi+yz/zQQ==} + + worker-timers-worker@7.0.71: + resolution: {integrity: sha512-ks/5YKwZsto1c2vmljroppOKCivB/ma97g9y77MAAz2TBBjPPgpoOiS1qYQKIgvGTr2QYPT3XhJWIB6Rj2MVPQ==} + + worker-timers@7.1.8: + resolution: {integrity: sha512-R54psRKYVLuzff7c1OTFcq/4Hue5Vlz4bFtNEIarpSiCYhpifHU3aIQI29S84o1j87ePCYqbmEJPqwBTf+3sfw==} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -2427,10 +3979,38 @@ packages: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + xdg-basedir@4.0.0: resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} engines: {node: '>=8'} + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -2441,10 +4021,6 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yallist@5.0.0: - resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} - engines: {node: '>=18'} - yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} @@ -2453,10 +4029,25 @@ packages: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + ylru@1.4.0: + resolution: {integrity: sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==} + engines: {node: '>= 4.0.0'} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -2478,20 +4069,20 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.26.3': {} + '@babel/compat-data@7.26.5': {} '@babel/core@7.26.0': dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.3 - '@babel/helper-compilation-targets': 7.25.9 + '@babel/generator': 7.26.5 + '@babel/helper-compilation-targets': 7.26.5 '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) '@babel/helpers': 7.26.0 - '@babel/parser': 7.26.3 + '@babel/parser': 7.26.5 '@babel/template': 7.25.9 - '@babel/traverse': 7.26.4 - '@babel/types': 7.26.3 + '@babel/traverse': 7.26.5 + '@babel/types': 7.26.5 convert-source-map: 2.0.0 debug: 4.4.0 gensync: 1.0.0-beta.2 @@ -2500,17 +4091,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.26.3': + '@babel/generator@7.26.5': dependencies: - '@babel/parser': 7.26.3 - '@babel/types': 7.26.3 + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 - '@babel/helper-compilation-targets@7.25.9': + '@babel/helper-compilation-targets@7.26.5': dependencies: - '@babel/compat-data': 7.26.3 + '@babel/compat-data': 7.26.5 '@babel/helper-validator-option': 7.25.9 browserslist: 4.24.4 lru-cache: 5.1.1 @@ -2518,8 +4109,8 @@ snapshots: '@babel/helper-module-imports@7.25.9': dependencies: - '@babel/traverse': 7.26.4 - '@babel/types': 7.26.3 + '@babel/traverse': 7.26.5 + '@babel/types': 7.26.5 transitivePeerDependencies: - supports-color @@ -2528,11 +4119,11 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-module-imports': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.26.4 + '@babel/traverse': 7.26.5 transitivePeerDependencies: - supports-color - '@babel/helper-plugin-utils@7.25.9': {} + '@babel/helper-plugin-utils@7.26.5': {} '@babel/helper-string-parser@7.25.9': {} @@ -2543,7 +4134,7 @@ snapshots: '@babel/helpers@7.26.0': dependencies: '@babel/template': 7.25.9 - '@babel/types': 7.26.3 + '@babel/types': 7.26.5 '@babel/highlight@7.25.9': dependencies: @@ -2552,122 +4143,131 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/parser@7.26.3': + '@babel/parser@7.26.5': dependencies: - '@babel/types': 7.26.3 + '@babel/types': 7.26.5 '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/runtime@7.26.0': + dependencies: + regenerator-runtime: 0.14.1 '@babel/template@7.25.9': dependencies: '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.3 - '@babel/types': 7.26.3 + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 - '@babel/traverse@7.26.4': + '@babel/traverse@7.26.5': dependencies: '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.3 - '@babel/parser': 7.26.3 + '@babel/generator': 7.26.5 + '@babel/parser': 7.26.5 '@babel/template': 7.25.9 - '@babel/types': 7.26.3 + '@babel/types': 7.26.5 debug: 4.4.0 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.26.3': + '@babel/types@7.26.5': dependencies: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 '@bcoe/v8-coverage@0.2.3': {} - '@colors/colors@1.5.0': - optional: true + '@cool-midway/cache-manager-fs-hash@7.0.0': + dependencies: + lockfile: 1.0.4 + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 '@eslint-community/eslint-utils@4.4.1(eslint@7.32.0)': dependencies: @@ -2690,6 +4290,8 @@ snapshots: transitivePeerDependencies: - supports-color + '@hapi/bourne@3.0.0': {} + '@humanwhocodes/config-array@0.5.0': dependencies: '@humanwhocodes/object-schema': 1.2.1 @@ -2709,10 +4311,6 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@isaacs/fs-minipass@4.0.1': - dependencies: - minipass: 7.1.2 - '@istanbuljs/load-nyc-config@1.1.0': dependencies: camelcase: 5.3.1 @@ -2723,6 +4321,17 @@ snapshots: '@istanbuljs/schema@0.1.3': {} + '@javascript-obfuscator/escodegen@2.3.0': + dependencies: + '@javascript-obfuscator/estraverse': 5.4.0 + esprima: 4.0.1 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 + + '@javascript-obfuscator/estraverse@5.4.0': {} + '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 @@ -2732,7 +4341,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0': + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.3))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -2746,7 +4355,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@22.10.5) + jest-config: 29.7.0(@types/node@22.10.5)(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -2902,8 +4511,127 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@koa/router@12.0.2': + dependencies: + debug: 4.4.0 + http-errors: 2.0.0 + koa-compose: 4.1.0 + methods: 1.1.2 + path-to-regexp: 6.3.0 + transitivePeerDependencies: + - supports-color + '@midwayjs/async-hooks-context-manager@3.19.0': {} + '@midwayjs/cache-manager@3.19.3': + dependencies: + lodash.clonedeep: 4.5.0 + lru-cache: 7.18.3 + + '@midwayjs/cache@3.14.0': + dependencies: + cache-manager: 3.6.3 + + '@midwayjs/cli-plugin-build@2.1.0': + dependencies: + '@midwayjs/command-core': 2.1.0 + '@vercel/ncc': 0.30.0 + fs-extra: 8.1.0 + globby: 10.0.2 + + '@midwayjs/cli-plugin-check@2.1.0': + dependencies: + '@midwayjs/command-core': 2.1.0 + '@midwayjs/locate': 1.8.1 + '@midwayjs/luckyeye': 1.1.0 + chalk: 4.1.2 + fs-extra: 8.1.0 + globby: 10.0.2 + js-yaml: 4.1.0 + midway-version: 1.4.0 + + '@midwayjs/cli-plugin-clean@2.1.0': + dependencies: + '@midwayjs/command-core': 2.1.0 + '@midwayjs/serverless-spec-builder': 2.1.0 + fs-extra: 8.1.0 + + '@midwayjs/cli-plugin-dev@2.1.1(@midwayjs/mock@3.19.2)': + dependencies: + '@midwayjs/command-core': 2.1.0 + '@midwayjs/debugger': 1.0.9 + '@midwayjs/mock': 3.19.2 + chalk: 4.1.2 + chokidar: 3.6.0 + detect-port: 1.6.1 + fs-extra: 8.1.0 + json5: 2.2.3 + koa: 2.15.3 + light-spinner: 1.0.4 + md5: 2.3.0 + node-fetch: 2.7.0 + tsconfig-paths: 3.15.0 + typescript: 4.9.5 + ws: 7.5.10 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@midwayjs/cli-plugin-test@2.1.0(@types/node@22.10.5)': + dependencies: + '@midwayjs/command-core': 2.1.0 + globby: 10.0.2 + ts-node: 10.9.2(@types/node@22.10.5)(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + + '@midwayjs/cli@2.1.1(@midwayjs/mock@3.19.2)(@types/node@22.10.5)(typescript@5.7.3)': + dependencies: + '@midwayjs/cli-plugin-build': 2.1.0 + '@midwayjs/cli-plugin-check': 2.1.0 + '@midwayjs/cli-plugin-clean': 2.1.0 + '@midwayjs/cli-plugin-dev': 2.1.1(@midwayjs/mock@3.19.2) + '@midwayjs/cli-plugin-test': 2.1.0(@types/node@22.10.5) + '@midwayjs/command-core': 2.1.0 + enquirer: 2.4.1 + minimist: 1.2.8 + mod-info: 1.0.2 + source-map-support: 0.5.21 + ts-node: 10.9.2(@types/node@22.10.5)(typescript@5.7.3) + transitivePeerDependencies: + - '@midwayjs/mock' + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - bufferutil + - encoding + - supports-color + - typescript + - utf-8-validate + + '@midwayjs/command-core@2.1.0': + dependencies: + fs-extra: 8.1.0 + globby: 10.0.2 + light-spinner: 1.0.4 + minimist: 1.2.8 + p-limit: 3.1.0 + + '@midwayjs/cookies@1.2.0': + dependencies: + scmp: 2.1.0 + should-send-same-site-none: 2.0.5 + '@midwayjs/core@3.19.0': dependencies: '@midwayjs/glob': 1.1.1 @@ -2911,14 +4639,45 @@ snapshots: picomatch: 2.3.1 reflect-metadata: 0.2.2 + '@midwayjs/debugger@1.0.9': + dependencies: + node-fetch: 2.7.0 + ws: 7.5.10 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + '@midwayjs/glob@1.1.1': dependencies: picomatch: 2.3.1 - '@midwayjs/logger@3.4.2': + '@midwayjs/koa@3.19.2': dependencies: - dayjs: 1.11.13 - safe-stable-stringify: 2.5.0 + '@koa/router': 12.0.2 + '@midwayjs/cookies': 1.2.0 + '@midwayjs/core': 3.19.0 + '@midwayjs/session': 3.19.2 + '@types/koa': 2.15.0 + '@types/qs': 6.9.17 + koa: 2.15.3 + koa-bodyparser: 4.4.1 + qs: 6.13.1 + transitivePeerDependencies: + - supports-color + + '@midwayjs/locate@1.8.1': + dependencies: + fs-extra: 8.1.0 + globby: 10.0.2 + + '@midwayjs/luckyeye@1.1.0': + dependencies: + find-root: 1.1.0 + ms: 2.1.3 + queue: 6.0.2 + semver: 7.6.3 + supports-color: 8.1.1 '@midwayjs/mock@3.19.2': dependencies: @@ -2931,6 +4690,20 @@ snapshots: transitivePeerDependencies: - supports-color + '@midwayjs/serverless-spec-builder@2.1.0': + dependencies: + ejs: 3.1.10 + js-yaml: 4.1.0 + mkdirp: 0.5.6 + + '@midwayjs/session@3.19.2': + dependencies: + '@midwayjs/cookies': 1.2.0 + + '@midwayjs/typeorm@3.19.2': {} + + '@midwayjs/version@3.19.3': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -2946,10 +4719,63 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@pm2/agent@2.0.4': + dependencies: + async: 3.2.6 + chalk: 3.0.0 + dayjs: 1.8.36 + debug: 4.3.7 + eventemitter2: 5.0.1 + fast-json-patch: 3.1.1 + fclone: 1.0.11 + nssocket: 0.6.0 + pm2-axon: 4.0.1 + pm2-axon-rpc: 0.7.1 + proxy-agent: 6.3.1 + semver: 7.5.4 + ws: 7.5.10 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@pm2/io@6.0.1': + dependencies: + async: 2.6.4 + debug: 4.3.7 + eventemitter2: 6.4.9 + require-in-the-middle: 5.2.0 + semver: 7.5.4 + shimmer: 1.2.1 + signal-exit: 3.0.7 + tslib: 1.9.3 + transitivePeerDependencies: + - supports-color + + '@pm2/js-api@0.8.0': + dependencies: + async: 2.6.4 + debug: 4.3.7 + eventemitter2: 6.4.9 + extrareqp2: 1.0.0(debug@4.3.7) + ws: 7.5.10 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@pm2/pm2-version-check@1.0.4': + dependencies: + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + '@sinclair/typebox@0.27.8': {} '@sindresorhus/is@0.14.0': {} + '@sindresorhus/is@0.7.0': {} + '@sinonjs/commons@3.0.1': dependencies: type-detect: 4.0.8 @@ -2958,37 +4784,110 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 + '@sqltools/formatter@1.2.5': {} + '@szmarczak/http-timer@1.1.2': dependencies: defer-to-connect: 1.1.3 + '@tootallnate/quickjs-emscripten@0.23.0': {} + + '@tsconfig/node10@1.0.11': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + + '@types/accepts@1.3.7': + dependencies: + '@types/node': 22.10.5 + '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.26.3 - '@babel/types': 7.26.3 + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.6 '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.26.3 + '@babel/types': 7.26.5 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.26.3 - '@babel/types': 7.26.3 + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 '@types/babel__traverse@7.20.6': dependencies: - '@babel/types': 7.26.3 + '@babel/types': 7.26.5 + + '@types/body-parser@1.19.5': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 22.10.5 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 22.10.5 + + '@types/content-disposition@0.5.8': {} '@types/cookiejar@2.1.5': {} + '@types/cookies@0.9.0': + dependencies: + '@types/connect': 3.4.38 + '@types/express': 5.0.0 + '@types/keygrip': 1.0.6 + '@types/node': 22.10.5 + + '@types/decompress@4.2.7': + dependencies: + '@types/node': 22.10.5 + + '@types/download@8.0.5': + dependencies: + '@types/decompress': 4.2.7 + '@types/got': 9.6.12 + '@types/node': 22.10.5 + + '@types/express-serve-static-core@5.0.4': + dependencies: + '@types/node': 22.10.5 + '@types/qs': 6.9.17 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + + '@types/express@5.0.0': + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 5.0.4 + '@types/qs': 6.9.17 + '@types/serve-static': 1.15.7 + + '@types/glob@7.2.0': + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 22.10.5 + + '@types/got@9.6.12': + dependencies: + '@types/node': 22.10.5 + '@types/tough-cookie': 4.0.5 + form-data: 2.5.2 + '@types/graceful-fs@4.1.9': dependencies: '@types/node': 22.10.5 + '@types/http-assert@1.5.6': {} + + '@types/http-errors@2.0.4': {} + '@types/istanbul-lib-coverage@2.0.6': {} '@types/istanbul-lib-report@3.0.3': @@ -3006,10 +4905,35 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/json5@0.0.29': {} + + '@types/keygrip@1.0.6': {} + '@types/keyv@3.1.4': dependencies: '@types/node': 22.10.5 + '@types/koa-compose@3.2.8': + dependencies: + '@types/koa': 2.15.0 + + '@types/koa@2.15.0': + dependencies: + '@types/accepts': 1.3.7 + '@types/content-disposition': 0.5.8 + '@types/cookies': 0.9.0 + '@types/http-assert': 1.5.6 + '@types/http-errors': 2.0.4 + '@types/keygrip': 1.0.6 + '@types/koa-compose': 3.2.8 + '@types/node': 22.10.5 + + '@types/mime@1.3.5': {} + + '@types/minimatch@3.0.5': {} + + '@types/minimatch@5.1.2': {} + '@types/minimist@1.2.5': {} '@types/node@22.10.5': @@ -3018,12 +4942,32 @@ snapshots: '@types/normalize-package-data@2.4.4': {} + '@types/qs@6.9.17': {} + + '@types/range-parser@1.2.7': {} + + '@types/readable-stream@4.0.18': + dependencies: + '@types/node': 22.10.5 + safe-buffer: 5.1.2 + '@types/responselike@1.0.3': dependencies: '@types/node': 22.10.5 '@types/semver@7.5.8': {} + '@types/send@0.17.4': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 22.10.5 + + '@types/serve-static@1.15.7': + dependencies: + '@types/http-errors': 2.0.4 + '@types/node': 22.10.5 + '@types/send': 0.17.4 + '@types/stack-utils@2.0.3': {} '@types/superagent@4.1.14': @@ -3035,6 +4979,10 @@ snapshots: dependencies: '@types/superagent': 4.1.14 + '@types/tough-cookie@4.0.5': {} + + '@types/validator@13.12.2': {} + '@types/yargs-parser@21.0.3': {} '@types/yargs@17.0.33': @@ -3125,12 +5073,65 @@ snapshots: '@typescript-eslint/types': 5.62.0 eslint-visitor-keys: 3.4.3 + '@vercel/ncc@0.30.0': {} + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + acorn-jsx@5.3.2(acorn@7.4.1): dependencies: acorn: 7.4.1 + acorn-walk@8.3.4: + dependencies: + acorn: 8.14.0 + acorn@7.4.1: {} + acorn@8.14.0: {} + + acorn@8.8.2: {} + + address@1.2.2: {} + + aedes-packet@3.0.0: + dependencies: + mqtt-packet: 7.1.2 + transitivePeerDependencies: + - supports-color + + aedes-persistence@9.1.2: + dependencies: + aedes-packet: 3.0.0 + qlobber: 7.0.1 + transitivePeerDependencies: + - supports-color + + aedes@0.51.3: + dependencies: + aedes-packet: 3.0.0 + aedes-persistence: 9.1.2 + end-of-stream: 1.4.4 + fastfall: 1.5.1 + fastparallel: 2.4.1 + fastseries: 2.0.0 + hyperid: 3.3.0 + mqemitter: 6.0.2 + mqtt-packet: 9.0.1 + retimer: 4.0.0 + reusify: 1.0.4 + uuid: 10.0.0 + transitivePeerDependencies: + - supports-color + + agent-base@7.1.3: {} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -3145,6 +5146,12 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + amp-message@0.1.2: + dependencies: + amp: 0.3.1 + + amp@0.3.1: {} + ansi-align@3.0.1: dependencies: string-width: 4.2.3 @@ -3171,29 +5178,72 @@ snapshots: ansi-styles@6.2.1: {} + any-promise@1.3.0: {} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 + app-root-path@3.1.0: {} + + archive-type@4.0.0: + dependencies: + file-type: 4.4.0 + + arg@4.1.3: {} + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 argparse@2.0.1: {} + array-differ@3.0.0: {} + array-union@2.1.0: {} arrify@1.0.1: {} + arrify@2.0.1: {} + asap@2.0.6: {} + assert@2.0.0: + dependencies: + es6-object-assign: 1.1.0 + is-nan: 1.3.2 + object-is: 1.1.6 + util: 0.12.5 + + ast-types@0.13.4: + dependencies: + tslib: 2.8.1 + astral-regex@2.0.0: {} + async@2.6.4: + dependencies: + lodash: 4.17.21 + + async@3.2.3: {} + async@3.2.6: {} asynckit@0.4.0: {} + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 + + axios@1.7.9: + dependencies: + follow-redirects: 1.15.9(debug@4.3.7) + form-data: 4.0.1 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + babel-jest@29.7.0(@babel/core@7.26.0): dependencies: '@babel/core': 7.26.0 @@ -3209,7 +5259,7 @@ snapshots: babel-plugin-istanbul@6.1.1: dependencies: - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 @@ -3220,7 +5270,7 @@ snapshots: babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.25.9 - '@babel/types': 7.26.3 + '@babel/types': 7.26.5 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.6 @@ -3251,8 +5301,34 @@ snapshots: balanced-match@1.0.2: {} + base64-js@1.5.1: {} + + basic-ftp@5.0.5: {} + binary-extensions@2.3.0: {} + bl@1.2.3: + dependencies: + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + bl@6.0.18: + dependencies: + '@types/readable-stream': 4.0.18 + buffer: 6.0.3 + inherits: 2.0.4 + readable-stream: 4.7.0 + + blessed@0.1.81: {} + + bodec@0.1.0: {} + boxen@5.1.2: dependencies: ansi-align: 3.0.1 @@ -3280,7 +5356,7 @@ snapshots: browserslist@4.24.4: dependencies: caniuse-lite: 1.0.30001692 - electron-to-chromium: 1.5.79 + electron-to-chromium: 1.5.80 node-releases: 2.0.19 update-browserslist-db: 1.1.2(browserslist@4.24.4) @@ -3292,10 +5368,54 @@ snapshots: dependencies: node-int64: 0.4.0 + buffer-alloc-unsafe@1.1.0: {} + + buffer-alloc@1.2.0: + dependencies: + buffer-alloc-unsafe: 1.1.0 + buffer-fill: 1.0.0 + + buffer-crc32@0.2.13: {} + + buffer-equal-constant-time@1.0.1: {} + + buffer-fill@1.0.0: {} + buffer-from@1.1.2: {} + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + bytes@3.1.2: {} + cache-content-type@1.0.1: + dependencies: + mime-types: 2.1.35 + ylru: 1.4.0 + + cache-manager@3.6.3: + dependencies: + async: 3.2.3 + lodash.clonedeep: 4.5.0 + lru-cache: 6.0.0 + + cacheable-request@2.1.4: + dependencies: + clone-response: 1.0.2 + get-stream: 3.0.0 + http-cache-semantics: 3.8.1 + keyv: 3.0.0 + lowercase-keys: 1.0.0 + normalize-url: 2.0.1 + responselike: 1.0.2 + cacheable-request@6.1.0: dependencies: clone-response: 1.0.3 @@ -3311,6 +5431,13 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + get-intrinsic: 1.2.7 + set-function-length: 1.2.2 + call-bound@1.0.3: dependencies: call-bind-apply-helpers: 1.0.1 @@ -3336,15 +5463,26 @@ snapshots: escape-string-regexp: 1.0.5 supports-color: 5.5.0 + chalk@3.0.0: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 + chance@1.1.9: {} + char-regex@1.0.2: {} chardet@0.7.0: {} + charenc@0.0.2: {} + + charm@0.1.2: {} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -3357,8 +5495,6 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - chownr@3.0.0: {} - ci-info@2.0.0: {} ci-info@3.9.0: {} @@ -3367,30 +5503,61 @@ snapshots: class-transformer@0.5.1: {} + class-validator@0.14.1: + dependencies: + '@types/validator': 13.12.2 + libphonenumber-js: 1.11.17 + validator: 13.12.0 + cli-boxes@2.2.1: {} cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 - cli-table3@0.6.5: + cli-highlight@2.1.11: dependencies: - string-width: 4.2.3 - optionalDependencies: - '@colors/colors': 1.5.0 + chalk: 4.1.2 + highlight.js: 10.7.3 + mz: 2.7.0 + parse5: 5.1.1 + parse5-htmlparser2-tree-adapter: 6.0.1 + yargs: 16.2.0 + + cli-tableau@2.0.1: + dependencies: + chalk: 3.0.0 cli-width@3.0.0: {} + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + clone-response@1.0.2: + dependencies: + mimic-response: 1.0.1 + clone-response@1.0.3: dependencies: mimic-response: 1.0.1 + co-body@6.2.0: + dependencies: + '@hapi/bourne': 3.0.0 + inflation: 2.1.0 + qs: 6.13.1 + raw-body: 2.5.2 + type-is: 1.6.18 + co@4.6.0: {} collect-v8-coverage@1.0.2: {} @@ -3411,9 +5578,13 @@ snapshots: dependencies: delayed-stream: 1.0.0 - commander@11.1.0: {} + commander@10.0.0: {} - commander@9.5.0: {} + commander@13.0.0: {} + + commander@2.15.1: {} + + commander@2.20.3: {} compare-versions@6.1.1: {} @@ -3430,17 +5601,32 @@ snapshots: write-file-atomic: 3.0.3 xdg-basedir: 4.0.0 + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + convert-source-map@2.0.0: {} cookiejar@2.1.4: {} - create-jest@29.7.0(@types/node@22.10.5): + cookies@0.9.1: + dependencies: + depd: 2.0.0 + keygrip: 1.1.0 + + copy-to@2.0.1: {} + + core-util-is@1.0.3: {} + + create-jest@29.7.0(@types/node@22.10.5)(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@22.10.5) + jest-config: 29.7.0(@types/node@22.10.5)(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -3449,6 +5635,10 @@ snapshots: - supports-color - ts-node + create-require@1.1.1: {} + + croner@4.1.97: {} + cross-env@7.0.3: dependencies: cross-spawn: 7.0.6 @@ -3459,10 +5649,26 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + crypt@0.0.2: {} + crypto-random-string@2.0.0: {} + culvert@0.1.2: {} + + data-uri-to-buffer@6.0.2: {} + dayjs@1.11.13: {} + dayjs@1.8.36: {} + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.3.7: + dependencies: + ms: 2.1.3 + debug@4.4.0: dependencies: ms: 2.1.3 @@ -3474,12 +5680,54 @@ snapshots: decamelize@1.2.0: {} + decode-uri-component@0.2.2: {} + decompress-response@3.3.0: dependencies: mimic-response: 1.0.1 + decompress-tar@4.1.1: + dependencies: + file-type: 5.2.0 + is-stream: 1.1.0 + tar-stream: 1.6.2 + + decompress-tarbz2@4.1.1: + dependencies: + decompress-tar: 4.1.1 + file-type: 6.2.0 + is-stream: 1.1.0 + seek-bzip: 1.0.6 + unbzip2-stream: 1.4.3 + + decompress-targz@4.1.1: + dependencies: + decompress-tar: 4.1.1 + file-type: 5.2.0 + is-stream: 1.1.0 + + decompress-unzip@4.0.1: + dependencies: + file-type: 3.9.0 + get-stream: 2.3.1 + pify: 2.3.0 + yauzl: 2.10.0 + + decompress@4.2.1: + dependencies: + decompress-tar: 4.1.1 + decompress-tarbz2: 4.1.1 + decompress-targz: 4.1.1 + decompress-unzip: 4.0.1 + graceful-fs: 4.2.11 + make-dir: 1.3.0 + pify: 2.3.0 + strip-dirs: 2.1.0 + dedent@1.5.3: {} + deep-equal@1.0.1: {} + deep-extend@0.6.0: {} deep-is@0.1.4: {} @@ -3488,12 +5736,43 @@ snapshots: defer-to-connect@1.1.3: {} + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + degenerator@5.0.1: + dependencies: + ast-types: 0.13.4 + escodegen: 2.1.0 + esprima: 4.0.1 + delayed-stream@1.0.0: {} + delegates@1.0.0: {} + + depd@1.1.2: {} + depd@2.0.0: {} + destroy@1.2.0: {} + detect-newline@3.1.0: {} + detect-port@1.6.1: + dependencies: + address: 1.2.2 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + dezalgo@1.0.4: dependencies: asap: 2.0.6 @@ -3501,6 +5780,8 @@ snapshots: diff-sequences@29.6.3: {} + diff@4.0.2: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -3513,6 +5794,22 @@ snapshots: dependencies: is-obj: 2.0.0 + dotenv@16.4.7: {} + + download@8.0.0: + dependencies: + archive-type: 4.0.0 + content-disposition: 0.5.4 + decompress: 4.2.1 + ext-name: 5.0.0 + file-type: 11.1.0 + filenamify: 3.0.0 + get-stream: 4.1.0 + got: 8.3.2 + make-dir: 2.1.0 + p-event: 2.3.1 + pify: 4.0.1 + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.1 @@ -3523,11 +5820,17 @@ snapshots: eastasianwidth@0.2.0: {} + ecdsa-sig-formatter@1.0.11: + dependencies: + safe-buffer: 5.2.1 + + ee-first@1.1.1: {} + ejs@3.1.10: dependencies: jake: 10.9.2 - electron-to-chromium@1.5.79: {} + electron-to-chromium@1.5.80: {} emittery@0.13.1: {} @@ -3535,10 +5838,16 @@ snapshots: emoji-regex@9.2.2: {} + encodeurl@1.0.2: {} + end-of-stream@1.4.4: dependencies: once: 1.4.0 + enquirer@2.3.6: + dependencies: + ansi-colors: 4.1.3 + enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 @@ -3556,16 +5865,28 @@ snapshots: dependencies: es-errors: 1.3.0 + es6-object-assign@1.1.0: {} + escalade@3.2.0: {} escape-goat@2.1.1: {} + escape-html@1.0.3: {} + escape-string-regexp@1.0.5: {} escape-string-regexp@2.0.0: {} escape-string-regexp@4.0.0: {} + escodegen@2.1.0: + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + eslint-config-prettier@8.10.0(eslint@7.32.0): dependencies: eslint: 7.32.0 @@ -3599,6 +5920,11 @@ snapshots: esrecurse: 4.3.0 estraverse: 4.3.0 + eslint-scope@7.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + eslint-utils@2.1.0: dependencies: eslint-visitor-keys: 1.3.0 @@ -3607,6 +5933,8 @@ snapshots: eslint-visitor-keys@2.1.0: {} + eslint-visitor-keys@3.3.0: {} + eslint-visitor-keys@3.4.3: {} eslint@7.32.0: @@ -3676,6 +6004,16 @@ snapshots: esutils@2.0.3: {} + event-target-shim@5.0.1: {} + + eventemitter2@0.4.14: {} + + eventemitter2@5.0.1: {} + + eventemitter2@6.4.9: {} + + events@3.3.0: {} + execa@5.1.1: dependencies: cross-spawn: 7.0.6 @@ -3698,12 +6036,27 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 + ext-list@2.2.2: + dependencies: + mime-db: 1.53.0 + + ext-name@5.0.0: + dependencies: + ext-list: 2.2.2 + sort-keys-length: 1.0.1 + external-editor@3.1.0: dependencies: chardet: 0.7.0 iconv-lite: 0.4.24 tmp: 0.0.33 + extrareqp2@1.0.0(debug@4.3.7): + dependencies: + follow-redirects: 1.15.9(debug@4.3.7) + transitivePeerDependencies: + - debug + fast-deep-equal@3.1.3: {} fast-diff@1.3.0: {} @@ -3716,22 +6069,46 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 + fast-json-patch@3.1.1: {} + fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} fast-safe-stringify@2.1.1: {} + fast-unique-numbers@8.0.13: + dependencies: + '@babel/runtime': 7.26.0 + tslib: 2.8.1 + fast-uri@3.0.5: {} + fastfall@1.5.1: + dependencies: + reusify: 1.0.4 + + fastparallel@2.4.1: + dependencies: + reusify: 1.0.4 + xtend: 4.0.2 + fastq@1.18.0: dependencies: reusify: 1.0.4 + fastseries@2.0.0: {} + fb-watchman@2.0.2: dependencies: bser: 2.1.1 + fclone@1.0.11: {} + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 @@ -3740,14 +6117,34 @@ snapshots: dependencies: flat-cache: 3.2.0 + file-type@11.1.0: {} + + file-type@3.9.0: {} + + file-type@4.4.0: {} + + file-type@5.2.0: {} + + file-type@6.2.0: {} + filelist@1.0.4: dependencies: minimatch: 5.1.6 + filename-reserved-regex@2.0.0: {} + + filenamify@3.0.0: + dependencies: + filename-reserved-regex: 2.0.0 + strip-outer: 1.0.1 + trim-repeated: 1.0.0 + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 + find-root@1.1.0: {} + find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -3761,11 +6158,26 @@ snapshots: flatted@3.3.2: {} + follow-redirects@1.15.9(debug@4.3.7): + optionalDependencies: + debug: 4.3.7 + + for-each@0.3.3: + dependencies: + is-callable: 1.2.7 + foreground-child@3.3.0: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 + form-data@2.5.2: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + safe-buffer: 5.2.1 + form-data@4.0.1: dependencies: asynckit: 0.4.0 @@ -3779,6 +6191,21 @@ snapshots: once: 1.4.0 qs: 6.13.1 + fresh@0.5.2: {} + + from2@2.3.0: + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + + fs-constants@1.0.0: {} + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -3812,6 +6239,13 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.0.0 + get-stream@2.3.1: + dependencies: + object-assign: 4.1.1 + pinkie-promise: 2.0.1 + + get-stream@3.0.0: {} + get-stream@4.1.0: dependencies: pump: 3.0.2 @@ -3822,6 +6256,20 @@ snapshots: get-stream@6.0.1: {} + get-uri@6.0.4: + dependencies: + basic-ftp: 5.0.5 + data-uri-to-buffer: 6.0.2 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + + git-node-fs@1.0.0(js-git@0.7.8): + optionalDependencies: + js-git: 0.7.8 + + git-sha1@0.1.2: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -3835,6 +6283,15 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + glob@11.0.1: + dependencies: + foreground-child: 3.3.0 + jackspeak: 4.0.2 + minimatch: 10.0.1 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.0 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -3854,6 +6311,17 @@ snapshots: dependencies: type-fest: 0.20.2 + globby@10.0.2: + dependencies: + '@types/glob': 7.2.0 + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + glob: 7.2.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + globby@11.1.0: dependencies: array-union: 2.1.0 @@ -3865,6 +6333,28 @@ snapshots: gopd@1.2.0: {} + got@8.3.2: + dependencies: + '@sindresorhus/is': 0.7.0 + '@types/keyv': 3.1.4 + '@types/responselike': 1.0.3 + cacheable-request: 2.1.4 + decompress-response: 3.3.0 + duplexer3: 0.1.5 + get-stream: 3.0.0 + into-stream: 3.1.0 + is-retry-allowed: 1.2.0 + isurl: 1.0.0 + lowercase-keys: 1.0.1 + mimic-response: 1.0.1 + p-cancelable: 0.4.1 + p-timeout: 2.0.1 + pify: 3.0.0 + safe-buffer: 5.2.1 + timed-out: 4.0.1 + url-parse-lax: 3.0.0 + url-to-options: 1.0.1 + got@9.6.0: dependencies: '@sindresorhus/is': 0.14.0 @@ -3891,8 +6381,22 @@ snapshots: has-flag@4.0.0: {} + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-symbol-support-x@1.4.2: {} + has-symbols@1.1.0: {} + has-to-string-tag-x@1.4.1: + dependencies: + has-symbol-support-x: 1.4.2 + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + has-yarn@2.1.0: {} hasown@2.0.2: @@ -3901,6 +6405,8 @@ snapshots: hexoid@1.0.0: {} + highlight.js@10.7.3: {} + hosted-git-info@2.8.9: {} hosted-git-info@4.1.0: @@ -3909,8 +6415,23 @@ snapshots: html-escaper@2.0.2: {} + http-assert@1.5.0: + dependencies: + deep-equal: 1.0.1 + http-errors: 1.8.1 + + http-cache-semantics@3.8.1: {} + http-cache-semantics@4.1.1: {} + http-errors@1.8.1: + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 1.5.0 + toidentifier: 1.0.1 + http-errors@2.0.0: dependencies: depd: 2.0.0 @@ -3919,12 +6440,34 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.3 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.3 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + human-signals@2.1.0: {} + hyperid@3.3.0: + dependencies: + buffer: 5.7.1 + uuid: 8.3.2 + uuid-parse: 1.1.0 + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 + ieee754@1.2.1: {} + ignore@4.0.6: {} ignore@5.3.2: {} @@ -3945,6 +6488,8 @@ snapshots: indent-string@4.0.0: {} + inflation@2.1.0: {} + inflight@1.0.6: dependencies: once: 1.4.0 @@ -3972,12 +6517,33 @@ snapshots: strip-ansi: 6.0.1 through: 2.3.8 + into-stream@3.1.0: + dependencies: + from2: 2.3.0 + p-is-promise: 1.1.0 + + inversify@6.0.1: {} + + ip-address@9.0.5: + dependencies: + jsbn: 1.1.0 + sprintf-js: 1.1.3 + + is-arguments@1.2.0: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + is-arrayish@0.2.1: {} is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 + is-buffer@1.1.6: {} + + is-callable@1.2.7: {} + is-ci@2.0.0: dependencies: ci-info: 2.0.0 @@ -3992,6 +6558,13 @@ snapshots: is-generator-fn@2.1.0: {} + is-generator-function@1.1.0: + dependencies: + call-bound: 1.0.3 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 @@ -4001,22 +6574,48 @@ snapshots: global-dirs: 3.0.1 is-path-inside: 3.0.3 + is-nan@1.3.2: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + + is-natural-number@4.0.1: {} + is-npm@5.0.0: {} is-number@7.0.0: {} is-obj@2.0.0: {} + is-object@1.0.2: {} + is-path-inside@3.0.3: {} is-plain-obj@1.1.0: {} + is-regex@1.2.1: + dependencies: + call-bound: 1.0.3 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-retry-allowed@1.2.0: {} + + is-stream@1.1.0: {} + is-stream@2.0.1: {} + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.18 + is-typedarray@1.0.0: {} is-yarn-global@0.3.0: {} + isarray@1.0.0: {} + isexe@2.0.0: {} istanbul-lib-coverage@3.2.2: {} @@ -4024,7 +6623,7 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.26.0 - '@babel/parser': 7.26.3 + '@babel/parser': 7.26.5 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -4034,7 +6633,7 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: '@babel/core': 7.26.0 - '@babel/parser': 7.26.3 + '@babel/parser': 7.26.5 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.6.3 @@ -4060,12 +6659,21 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 + isurl@1.0.0: + dependencies: + has-to-string-tag-x: 1.4.1 + is-object: 1.0.2 + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jackspeak@4.0.2: + dependencies: + '@isaacs/cliui': 8.0.2 + jake@10.9.2: dependencies: async: 3.2.6 @@ -4073,6 +6681,32 @@ snapshots: filelist: 1.0.4 minimatch: 3.1.2 + javascript-obfuscator@4.1.1: + dependencies: + '@javascript-obfuscator/escodegen': 2.3.0 + '@javascript-obfuscator/estraverse': 5.4.0 + acorn: 8.8.2 + assert: 2.0.0 + chalk: 4.1.2 + chance: 1.1.9 + class-validator: 0.14.1 + commander: 10.0.0 + eslint-scope: 7.1.1 + eslint-visitor-keys: 3.3.0 + fast-deep-equal: 3.1.3 + inversify: 6.0.1 + js-string-escape: 1.0.1 + md5: 2.3.0 + mkdirp: 2.1.3 + multimatch: 5.0.0 + opencollective-postinstall: 2.0.3 + process: 0.11.10 + reflect-metadata: 0.1.13 + source-map-support: 0.5.21 + string-template: 1.0.0 + stringz: 2.1.0 + tslib: 2.5.0 + jest-changed-files@29.7.0: dependencies: execa: 5.1.1 @@ -4105,16 +6739,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@22.10.5): + jest-cli@29.7.0(@types/node@22.10.5)(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.3)): dependencies: - '@jest/core': 29.7.0 + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.10.5) + create-jest: 29.7.0(@types/node@22.10.5)(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.3)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@22.10.5) + jest-config: 29.7.0(@types/node@22.10.5)(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -4124,7 +6758,7 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@22.10.5): + jest-config@29.7.0(@types/node@22.10.5)(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.3)): dependencies: '@babel/core': 7.26.0 '@jest/test-sequencer': 29.7.0 @@ -4150,6 +6784,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 22.10.5 + ts-node: 10.9.2(@types/node@22.10.5)(typescript@5.7.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -4311,10 +6946,10 @@ snapshots: jest-snapshot@29.7.0: dependencies: '@babel/core': 7.26.0 - '@babel/generator': 7.26.3 + '@babel/generator': 7.26.5 '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) - '@babel/types': 7.26.3 + '@babel/types': 7.26.5 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 @@ -4369,18 +7004,27 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@22.10.5): + jest@29.7.0(@types/node@22.10.5)(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.3)): dependencies: - '@jest/core': 29.7.0 + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.3)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@22.10.5) + jest-cli: 29.7.0(@types/node@22.10.5)(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node + js-git@0.7.8: + dependencies: + bodec: 0.1.0 + culvert: 0.1.2 + git-sha1: 0.1.2 + pako: 0.2.9 + + js-string-escape@1.0.1: {} + js-tokens@4.0.0: {} js-yaml@3.14.1: @@ -4392,6 +7036,8 @@ snapshots: dependencies: argparse: 2.0.1 + jsbn@1.1.0: {} + jsesc@3.1.0: {} json-buffer@3.0.0: {} @@ -4406,8 +7052,51 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} + json-stringify-safe@5.0.1: + optional: true + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + json5@2.2.3: {} + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + jsonwebtoken@9.0.2: + dependencies: + jws: 3.2.2 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 7.6.3 + + jwa@1.4.1: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jws@3.2.2: + dependencies: + jwa: 1.4.1 + safe-buffer: 5.2.1 + + keygrip@1.1.0: + dependencies: + tsscmp: 1.0.6 + + keyv@3.0.0: + dependencies: + json-buffer: 3.0.0 + keyv@3.1.0: dependencies: json-buffer: 3.0.0 @@ -4420,37 +7109,113 @@ snapshots: kleur@3.0.3: {} + koa-bodyparser@4.4.1: + dependencies: + co-body: 6.2.0 + copy-to: 2.0.1 + type-is: 1.6.18 + + koa-compose@4.1.0: {} + + koa-convert@2.0.0: + dependencies: + co: 4.6.0 + koa-compose: 4.1.0 + + koa@2.15.3: + dependencies: + accepts: 1.3.8 + cache-content-type: 1.0.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookies: 0.9.1 + debug: 4.4.0 + delegates: 1.0.0 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + fresh: 0.5.2 + http-assert: 1.5.0 + http-errors: 1.8.1 + is-generator-function: 1.1.0 + koa-compose: 4.1.0 + koa-convert: 2.0.0 + on-finished: 2.4.1 + only: 0.0.2 + parseurl: 1.3.3 + statuses: 1.5.0 + type-is: 1.6.18 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + latest-version@5.1.0: dependencies: package-json: 6.5.0 + lazy@1.0.11: {} + leven@3.1.0: {} + levn@0.3.0: + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 + libphonenumber-js@1.11.17: {} + + light-spinner@1.0.4: {} + lines-and-columns@1.2.4: {} locate-path@5.0.0: dependencies: p-locate: 4.1.0 + lockfile@1.0.4: + dependencies: + signal-exit: 3.0.7 + + lodash.clonedeep@4.5.0: {} + + lodash.includes@4.3.0: {} + + lodash.isboolean@3.0.3: {} + + lodash.isinteger@4.0.4: {} + + lodash.isnumber@3.0.3: {} + + lodash.isplainobject@4.0.6: {} + + lodash.isstring@4.0.1: {} + lodash.memoize@4.1.2: {} lodash.merge@4.6.2: {} + lodash.once@4.1.1: {} + lodash.truncate@4.4.2: {} lodash@4.17.21: {} + lowercase-keys@1.0.0: {} + lowercase-keys@1.0.1: {} lowercase-keys@2.0.0: {} lru-cache@10.4.3: {} + lru-cache@11.0.2: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -4459,6 +7224,17 @@ snapshots: dependencies: yallist: 4.0.0 + lru-cache@7.18.3: {} + + make-dir@1.3.0: + dependencies: + pify: 3.0.0 + + make-dir@2.1.0: + dependencies: + pify: 4.0.1 + semver: 5.7.2 + make-dir@3.1.0: dependencies: semver: 6.3.1 @@ -4479,6 +7255,14 @@ snapshots: math-intrinsics@1.1.0: {} + md5@2.3.0: + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: 1.1.6 + + media-typer@0.3.0: {} + meow@9.0.0: dependencies: '@types/minimist': 1.2.5 @@ -4505,8 +7289,15 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 + midway-version@1.4.0: + dependencies: + '@midwayjs/version': 3.19.3 + compare-versions: 6.1.1 + mime-db@1.52.0: {} + mime-db@1.53.0: {} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 @@ -4519,6 +7310,10 @@ snapshots: min-indent@1.0.1: {} + minimatch@10.0.1: + dependencies: + brace-expansion: 2.0.1 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -4541,15 +7336,53 @@ snapshots: minipass@7.1.2: {} - minizlib@3.0.1: + mkdirp@0.5.6: dependencies: - minipass: 7.1.2 - rimraf: 5.0.10 + minimist: 1.2.8 - mkdirp@3.0.1: {} + mkdirp@1.0.4: {} + + mkdirp@2.1.3: {} + + mkdirp@2.1.6: {} + + mod-info@1.0.2: {} + + module-details-from-path@1.0.3: {} + + moment@2.30.1: {} + + mqemitter@6.0.2: + dependencies: + fastparallel: 2.4.1 + qlobber: 8.0.1 + + mqtt-packet@7.1.2: + dependencies: + bl: 4.1.0 + debug: 4.4.0 + process-nextick-args: 2.0.1 + transitivePeerDependencies: + - supports-color + + mqtt-packet@9.0.1: + dependencies: + bl: 6.0.18 + debug: 4.4.0 + process-nextick-args: 2.0.1 + transitivePeerDependencies: + - supports-color ms@2.1.3: {} + multimatch@5.0.0: + dependencies: + '@types/minimatch': 3.0.5 + array-differ: 3.0.0 + array-union: 2.1.0 + arrify: 2.0.1 + minimatch: 3.1.2 + mute-stream@0.0.8: {} mwts@1.3.0(typescript@5.7.3): @@ -4574,17 +7407,11 @@ snapshots: transitivePeerDependencies: - supports-color - mwtsc@1.15.1: + mz@2.7.0: dependencies: - '@midwayjs/glob': 1.1.1 - chokidar: 3.6.0 - cli-table3: 0.6.5 - compare-versions: 6.1.1 - source-map-support: 0.5.21 - tar: 7.4.3 - tsc-alias: 1.8.10 - - mylas@2.1.13: {} + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 natural-compare-lite@1.4.0: {} @@ -4592,6 +7419,22 @@ snapshots: ncp@2.0.0: {} + needle@2.4.0: + dependencies: + debug: 3.2.7 + iconv-lite: 0.4.24 + sax: 1.4.1 + transitivePeerDependencies: + - supports-color + + negotiator@0.6.3: {} + + netmask@2.0.2: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + node-int64@0.4.0: {} node-releases@2.0.19: {} @@ -4612,14 +7455,38 @@ snapshots: normalize-path@3.0.0: {} + normalize-url@2.0.1: + dependencies: + prepend-http: 2.0.0 + query-string: 5.1.1 + sort-keys: 2.0.0 + normalize-url@4.5.1: {} npm-run-path@4.0.1: dependencies: path-key: 3.1.1 + nssocket@0.6.0: + dependencies: + eventemitter2: 0.4.14 + lazy: 1.0.11 + + object-assign@4.1.1: {} + object-inspect@1.13.3: {} + object-is@1.1.6: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + + object-keys@1.1.1: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + once@1.4.0: dependencies: wrappy: 1.0.2 @@ -4628,6 +7495,19 @@ snapshots: dependencies: mimic-fn: 2.1.0 + only@0.0.2: {} + + opencollective-postinstall@2.0.3: {} + + optionator@0.8.3: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.5 + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -4639,8 +7519,18 @@ snapshots: os-tmpdir@1.0.2: {} + p-cancelable@0.4.1: {} + p-cancelable@1.1.0: {} + p-event@2.3.1: + dependencies: + p-timeout: 2.0.1 + + p-finally@1.0.0: {} + + p-is-promise@1.1.0: {} + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -4653,8 +7543,30 @@ snapshots: dependencies: p-limit: 2.3.0 + p-timeout@2.0.1: + dependencies: + p-finally: 1.0.0 + p-try@2.2.0: {} + pac-proxy-agent@7.1.0: + dependencies: + '@tootallnate/quickjs-emscripten': 0.23.0 + agent-base: 7.1.3 + debug: 4.4.0 + get-uri: 6.0.4 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + pac-resolver: 7.0.1 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + pac-resolver@7.0.1: + dependencies: + degenerator: 5.0.1 + netmask: 2.0.2 + package-json-from-dist@1.0.1: {} package-json@6.5.0: @@ -4664,6 +7576,8 @@ snapshots: registry-url: 5.1.0 semver: 6.3.1 + pako@0.2.9: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -4675,6 +7589,16 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + parse5-htmlparser2-tree-adapter@6.0.1: + dependencies: + parse5: 6.0.1 + + parse5@5.1.1: {} + + parse5@6.0.1: {} + + parseurl@1.3.3: {} + path-exists@4.0.0: {} path-is-absolute@1.0.1: {} @@ -4688,21 +7612,124 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 + path-scurry@2.0.0: + dependencies: + lru-cache: 11.0.2 + minipass: 7.1.2 + + path-to-regexp@6.3.0: {} + path-type@4.0.0: {} + pend@1.2.0: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} + pidusage@2.0.21: + dependencies: + safe-buffer: 5.2.1 + optional: true + + pidusage@3.0.2: + dependencies: + safe-buffer: 5.2.1 + + pify@2.3.0: {} + + pify@3.0.0: {} + + pify@4.0.1: {} + + pinkie-promise@2.0.1: + dependencies: + pinkie: 2.0.4 + + pinkie@2.0.4: {} + pirates@4.0.6: {} pkg-dir@4.2.0: dependencies: find-up: 4.1.0 - plimit-lit@1.6.1: + pm2-axon-rpc@0.7.1: dependencies: - queue-lit: 1.5.2 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + + pm2-axon@4.0.1: + dependencies: + amp: 0.3.1 + amp-message: 0.1.2 + debug: 4.4.0 + escape-string-regexp: 4.0.0 + transitivePeerDependencies: + - supports-color + + pm2-deploy@1.0.2: + dependencies: + run-series: 1.1.9 + tv4: 1.3.0 + + pm2-multimeter@0.1.2: + dependencies: + charm: 0.1.2 + + pm2-sysmonit@1.2.8: + dependencies: + async: 3.2.6 + debug: 4.4.0 + pidusage: 2.0.21 + systeminformation: 5.25.10 + tx2: 1.0.5 + transitivePeerDependencies: + - supports-color + optional: true + + pm2@5.4.3: + dependencies: + '@pm2/agent': 2.0.4 + '@pm2/io': 6.0.1 + '@pm2/js-api': 0.8.0 + '@pm2/pm2-version-check': 1.0.4 + async: 3.2.6 + blessed: 0.1.81 + chalk: 3.0.0 + chokidar: 3.6.0 + cli-tableau: 2.0.1 + commander: 2.15.1 + croner: 4.1.97 + dayjs: 1.11.13 + debug: 4.4.0 + enquirer: 2.3.6 + eventemitter2: 5.0.1 + fclone: 1.0.11 + js-yaml: 4.1.0 + mkdirp: 1.0.4 + needle: 2.4.0 + pidusage: 3.0.2 + pm2-axon: 4.0.1 + pm2-axon-rpc: 0.7.1 + pm2-deploy: 1.0.2 + pm2-multimeter: 0.1.2 + promptly: 2.2.0 + semver: 7.6.3 + source-map-support: 0.5.21 + sprintf-js: 1.1.2 + vizion: 2.2.1 + optionalDependencies: + pm2-sysmonit: 1.2.8 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + possible-typed-array-names@1.0.0: {} + + prelude-ls@1.1.2: {} prelude-ls@1.2.1: {} @@ -4720,13 +7747,36 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 + process-nextick-args@2.0.1: {} + + process@0.11.10: {} + progress@2.0.3: {} + promptly@2.2.0: + dependencies: + read: 1.0.7 + prompts@2.4.2: dependencies: kleur: 3.0.3 sisteransi: 1.0.5 + proxy-agent@6.3.1: + dependencies: + agent-base: 7.1.3 + debug: 4.4.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 7.18.3 + pac-proxy-agent: 7.1.0 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + proxy-from-env@1.1.0: {} + pump@3.0.2: dependencies: end-of-stream: 1.4.4 @@ -4740,14 +7790,26 @@ snapshots: pure-rand@6.1.0: {} + qlobber@7.0.1: {} + + qlobber@8.0.1: {} + qs@6.13.1: dependencies: side-channel: 1.1.0 - queue-lit@1.5.2: {} + query-string@5.1.1: + dependencies: + decode-uri-component: 0.2.2 + object-assign: 4.1.1 + strict-uri-encode: 1.1.0 queue-microtask@1.2.3: {} + queue@6.0.2: + dependencies: + inherits: 2.0.4 + quick-lru@4.0.1: {} raw-body@2.5.2: @@ -4779,6 +7841,34 @@ snapshots: parse-json: 5.2.0 type-fest: 0.6.0 + read@1.0.7: + dependencies: + mute-stream: 0.0.8 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readable-stream@4.7.0: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + readdirp@3.6.0: dependencies: picomatch: 2.3.1 @@ -4788,8 +7878,12 @@ snapshots: indent-string: 4.0.0 strip-indent: 3.0.0 + reflect-metadata@0.1.13: {} + reflect-metadata@0.2.2: {} + regenerator-runtime@0.14.1: {} + regexpp@3.2.0: {} registry-auth-token@4.2.2: @@ -4804,6 +7898,14 @@ snapshots: require-from-string@2.0.2: {} + require-in-the-middle@5.2.0: + dependencies: + debug: 4.4.0 + module-details-from-path: 1.0.3 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + resolve-cwd@3.0.0: dependencies: resolve-from: 5.0.0 @@ -4829,30 +7931,48 @@ snapshots: onetime: 5.1.2 signal-exit: 3.0.7 + retimer@4.0.0: + dependencies: + worker-timers: 7.1.8 + reusify@1.0.4: {} rimraf@3.0.2: dependencies: glob: 7.2.3 - rimraf@5.0.10: - dependencies: - glob: 10.4.5 - run-async@2.4.1: {} run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 + run-series@1.1.9: {} + rxjs@6.6.7: dependencies: tslib: 1.14.1 - safe-stable-stringify@2.5.0: {} + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-regex: 1.2.1 safer-buffer@2.1.2: {} + sax@1.4.1: {} + + scmp@2.1.0: {} + + seek-bzip@1.0.6: + dependencies: + commander: 2.20.3 + semver-diff@3.1.1: dependencies: semver: 6.3.1 @@ -4861,16 +7981,38 @@ snapshots: semver@6.3.1: {} + semver@7.5.4: + dependencies: + lru-cache: 6.0.0 + semver@7.6.3: {} + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.7 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + setprototypeof@1.2.0: {} + sha.js@2.4.11: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} + shimmer@1.2.1: {} + + should-send-same-site-none@2.0.5: {} + side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 @@ -4913,6 +8055,33 @@ snapshots: astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 + smart-buffer@4.2.0: {} + + socks-proxy-agent@8.0.5: + dependencies: + agent-base: 7.1.3 + debug: 4.4.0 + socks: 2.8.3 + transitivePeerDependencies: + - supports-color + + socks@2.8.3: + dependencies: + ip-address: 9.0.5 + smart-buffer: 4.2.0 + + sort-keys-length@1.0.1: + dependencies: + sort-keys: 1.1.2 + + sort-keys@1.1.2: + dependencies: + is-plain-obj: 1.1.0 + + sort-keys@2.0.0: + dependencies: + is-plain-obj: 1.1.0 + source-map-support@0.5.13: dependencies: buffer-from: 1.1.2 @@ -4941,17 +8110,29 @@ snapshots: sprintf-js@1.0.3: {} + sprintf-js@1.1.2: {} + + sprintf-js@1.1.3: {} + + sqlstring@2.3.3: {} + stack-utils@2.0.6: dependencies: escape-string-regexp: 2.0.0 + statuses@1.5.0: {} + statuses@2.0.1: {} + strict-uri-encode@1.1.0: {} + string-length@4.0.2: dependencies: char-regex: 1.0.2 strip-ansi: 6.0.1 + string-template@1.0.0: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -4964,6 +8145,18 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + stringz@2.1.0: + dependencies: + char-regex: 1.0.2 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -4972,8 +8165,14 @@ snapshots: dependencies: ansi-regex: 6.1.0 + strip-bom@3.0.0: {} + strip-bom@4.0.0: {} + strip-dirs@2.1.0: + dependencies: + is-natural-number: 4.0.1 + strip-final-newline@2.0.0: {} strip-indent@3.0.0: @@ -4984,6 +8183,10 @@ snapshots: strip-json-comments@3.1.1: {} + strip-outer@1.0.1: + dependencies: + escape-string-regexp: 1.0.5 + superagent@8.1.2: dependencies: component-emitter: 1.3.1 @@ -5020,6 +8223,9 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + systeminformation@5.25.10: + optional: true + table@6.9.0: dependencies: ajv: 8.17.1 @@ -5028,14 +8234,15 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - tar@7.4.3: + tar-stream@1.6.2: dependencies: - '@isaacs/fs-minipass': 4.0.1 - chownr: 3.0.0 - minipass: 7.1.2 - minizlib: 3.0.1 - mkdirp: 3.0.1 - yallist: 5.0.0 + bl: 1.2.3 + buffer-alloc: 1.2.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + readable-stream: 2.3.8 + to-buffer: 1.1.1 + xtend: 4.0.2 test-exclude@6.0.0: dependencies: @@ -5045,14 +8252,26 @@ snapshots: text-table@0.2.0: {} + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + through@2.3.8: {} + timed-out@4.0.1: {} + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 tmpl@1.0.5: {} + to-buffer@1.1.1: {} + to-readable-stream@1.0.0: {} to-regex-range@5.0.1: @@ -5061,14 +8280,20 @@ snapshots: toidentifier@1.0.1: {} + tr46@0.0.3: {} + trim-newlines@3.0.1: {} - ts-jest@29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.10.5))(typescript@5.7.3): + trim-repeated@1.0.0: + dependencies: + escape-string-regexp: 1.0.5 + + ts-jest@29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.10.5)(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.3)))(typescript@5.7.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@22.10.5) + jest: 29.7.0(@types/node@22.10.5)(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -5082,22 +8307,75 @@ snapshots: '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.26.0) - tsc-alias@1.8.10: + ts-node@10.9.2(@types/node@22.10.5)(typescript@4.9.5): dependencies: - chokidar: 3.6.0 - commander: 9.5.0 - globby: 11.1.0 - mylas: 2.1.13 - normalize-path: 3.0.0 - plimit-lit: 1.6.1 + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 22.10.5 + acorn: 8.14.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.9.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 22.10.5 + acorn: 8.14.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.7.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 tslib@1.14.1: {} + tslib@1.9.3: {} + + tslib@2.5.0: {} + + tslib@2.8.1: {} + + tsscmp@1.0.6: {} + tsutils@3.21.0(typescript@5.7.3): dependencies: tslib: 1.14.1 typescript: 5.7.3 + tv4@1.3.0: {} + + tx2@1.0.5: + dependencies: + json-stringify-safe: 5.0.1 + optional: true + + type-check@0.3.2: + dependencies: + prelude-ls: 1.1.2 + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -5114,18 +8392,54 @@ snapshots: type-fest@0.8.1: {} + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + typedarray-to-buffer@3.1.5: dependencies: is-typedarray: 1.0.0 + typeorm@0.3.20(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.3)): + dependencies: + '@sqltools/formatter': 1.2.5 + app-root-path: 3.1.0 + buffer: 6.0.3 + chalk: 4.1.2 + cli-highlight: 2.1.11 + dayjs: 1.11.13 + debug: 4.4.0 + dotenv: 16.4.7 + glob: 10.4.5 + mkdirp: 2.1.6 + reflect-metadata: 0.2.2 + sha.js: 2.4.11 + tslib: 2.8.1 + uuid: 9.0.1 + yargs: 17.7.2 + optionalDependencies: + ts-node: 10.9.2(@types/node@22.10.5)(typescript@5.7.3) + transitivePeerDependencies: + - supports-color + + typescript@4.9.5: {} + typescript@5.7.3: {} + unbzip2-stream@1.4.3: + dependencies: + buffer: 5.7.1 + through: 2.3.8 + undici-types@6.20.0: {} unique-string@2.0.0: dependencies: crypto-random-string: 2.0.0 + universalify@0.1.2: {} + unpipe@1.0.0: {} update-browserslist-db@1.1.2(browserslist@4.24.4): @@ -5159,6 +8473,30 @@ snapshots: dependencies: prepend-http: 2.0.0 + url-to-options@1.0.1: {} + + util-deprecate@1.0.2: {} + + util@0.12.5: + dependencies: + inherits: 2.0.4 + is-arguments: 1.2.0 + is-generator-function: 1.1.0 + is-typed-array: 1.1.15 + which-typed-array: 1.1.18 + + uuid-parse@1.1.0: {} + + uuid@10.0.0: {} + + uuid@11.0.5: {} + + uuid@8.3.2: {} + + uuid@9.0.1: {} + + v8-compile-cache-lib@3.0.1: {} + v8-compile-cache@2.4.0: {} v8-to-istanbul@9.3.0: @@ -5172,10 +8510,37 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 + validator@13.12.0: {} + + vary@1.1.2: {} + + vizion@2.2.1: + dependencies: + async: 2.6.4 + git-node-fs: 1.0.0(js-git@0.7.8) + ini: 1.3.8 + js-git: 0.7.8 + walker@1.0.8: dependencies: makeerror: 1.0.12 + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which-typed-array@1.1.18: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + for-each: 0.3.3 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + which@2.0.2: dependencies: isexe: 2.0.0 @@ -5186,6 +8551,25 @@ snapshots: word-wrap@1.2.5: {} + worker-timers-broker@6.1.8: + dependencies: + '@babel/runtime': 7.26.0 + fast-unique-numbers: 8.0.13 + tslib: 2.8.1 + worker-timers-worker: 7.0.71 + + worker-timers-worker@7.0.71: + dependencies: + '@babel/runtime': 7.26.0 + tslib: 2.8.1 + + worker-timers@7.1.8: + dependencies: + '@babel/runtime': 7.26.0 + tslib: 2.8.1 + worker-timers-broker: 6.1.8 + worker-timers-worker: 7.0.71 + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -5212,20 +8596,34 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 3.0.7 + ws@7.5.10: {} + + ws@8.18.0: {} + xdg-basedir@4.0.0: {} + xtend@4.0.2: {} + y18n@5.0.8: {} yallist@3.1.1: {} yallist@4.0.0: {} - yallist@5.0.0: {} - yargs-parser@20.2.9: {} yargs-parser@21.1.1: {} + yargs@16.2.0: + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + yargs@17.7.2: dependencies: cliui: 8.0.1 @@ -5236,4 +8634,13 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + ylru@1.4.0: {} + + yn@3.1.1: {} + yocto-queue@0.1.0: {} diff --git a/core/src/bin/check.ts b/core/src/bin/check.ts index ea65b6d..8b58d4f 100644 --- a/core/src/bin/check.ts +++ b/core/src/bin/check.ts @@ -1,9 +1,48 @@ -export async function check() { - try { - console.log('Running check command...'); - // 在这里实现检查逻辑 - } catch (error) { - console.error('Check failed:', error); - process.exit(1); +import { existsSync, readFileSync, writeFileSync } from 'fs'; +import { v4 as uuid } from 'uuid'; +import { join } from 'path'; + +interface CheckConfig { + path: string; + pattern: string; +} + +/** + * 检查并替换单个配置文件 + */ +async function checkAndReplaceFile(config: CheckConfig): Promise { + const filePath = join(process.cwd(), config.path); + + if (!existsSync(filePath)) { + return; + } + + let content = readFileSync(filePath, 'utf-8'); + if (content.includes(config.pattern)) { + console.log(`${config.path},key is default, auto replace it`); + content = content.replace(config.pattern, uuid()); + writeFileSync(filePath, content, 'utf-8'); } } + +/** + * 检查配置文件 + */ +export async function check() { + const configs: CheckConfig[] = [ + { + path: 'src/config/config.default.ts', + pattern: 'cool-admin-keys-xxxxxx', + }, + { + path: 'src/modules/base/config.ts', + pattern: 'cool-admin-xxxxxx', + }, + { + path: 'src/modules/user/config.ts', + pattern: 'cool-app-xxxxx', + }, + ]; + + await Promise.all(configs.map(config => checkAndReplaceFile(config))); +} diff --git a/core/src/bin/entity.ts b/core/src/bin/entity.ts new file mode 100644 index 0000000..8fc112c --- /dev/null +++ b/core/src/bin/entity.ts @@ -0,0 +1,42 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import * as glob from 'glob'; + +const MODULES_PATH = 'src/modules'; +const OUTPUT_FILE = 'src/entities.ts'; + +/** + * 生成 entities.ts 文件 + */ +export function generateEntitiesFile() { + // 扫描所有的 ts 文件 + const entityFiles = glob.sync('*/entity/**/*.ts', { + cwd: MODULES_PATH, + absolute: true, + }); + + // 生成导入语句和导出数组 + const imports = entityFiles.map((file, index) => { + const relativePath = path.relative(path.dirname(OUTPUT_FILE), file); + return `import * as entity${index} from './${relativePath.replace( + /\.ts$/, + '' + )}';`; + }); + + const exportEntities = `export const entities = [ + ${entityFiles + .map((_, index) => `...Object.values(entity${index})`) + .join(',\n ')}, +];`; + + // 生成最终的文件内容 + const fileContent = `// 自动生成的文件,请勿手动修改 +${imports.join('\n')} +${exportEntities} +`; + + // 写入文件 + fs.writeFileSync(OUTPUT_FILE, fileContent); + console.log('Entities file generated successfully!'); +} diff --git a/core/src/bin/index.ts b/core/src/bin/index.ts index 2cddcb4..815cbd3 100644 --- a/core/src/bin/index.ts +++ b/core/src/bin/index.ts @@ -2,18 +2,38 @@ import { Command } from 'commander'; import { check } from './check'; - +import { generateEntitiesFile } from './entity'; +import { obfuscate } from './obfuscate'; const program = new Command(); // 设置版本号(从 package.json 中获取) program.version(require('../../package.json').version); -// 添加 check 命令 +// 修改命令定义部分 +const commands = { + check: async () => await check(), + entity: async () => await generateEntitiesFile(), + obfuscate: async () => await obfuscate(), +}; + +// 移除原有的单独命令定义 program - .command('check') - .description('Run check command') - .action(async () => { - await check(); + .arguments('[cmds...]') + .description('Run one or multiple commands: check, entity, obfuscate') + .action(async (cmds: string[]) => { + if (!cmds.length) { + program.outputHelp(); + return; + } + + for (const cmd of cmds) { + if (cmd in commands) { + console.log(`Executing ${cmd}...`); + await commands[cmd](); + } else { + console.error(`Unknown command: ${cmd}`); + } + } }); // 解析命令行参数 diff --git a/core/src/bin/obfuscate.ts b/core/src/bin/obfuscate.ts new file mode 100644 index 0000000..294a931 --- /dev/null +++ b/core/src/bin/obfuscate.ts @@ -0,0 +1,72 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import * as JavaScriptObfuscator from 'javascript-obfuscator'; + +// 混淆配置 +const obfuscatorOptions: JavaScriptObfuscator.ObfuscatorOptions = { + compact: true, + controlFlowFlattening: true, + controlFlowFlatteningThreshold: 0.7, + deadCodeInjection: true, + deadCodeInjectionThreshold: 0.4, + debugProtection: false, + debugProtectionInterval: 0, + disableConsoleOutput: true, + identifierNamesGenerator: 'hexadecimal' as const, + log: false, + numbersToExpressions: true, + renameGlobals: false, + rotateStringArray: true, + selfDefending: true, + shuffleStringArray: true, + splitStrings: true, + splitStringsChunkLength: 10, + stringArray: true, + stringArrayEncoding: ['base64'], + stringArrayThreshold: 0.75, + transformObjectKeys: true, + unicodeEscapeSequence: false, +}; + +// 处理单个文件的函数 +function obfuscateFile(filePath: string): void { + try { + const code = fs.readFileSync(filePath, 'utf8'); + const obfuscationResult = JavaScriptObfuscator.obfuscate( + code, + obfuscatorOptions + ); + fs.writeFileSync(filePath, obfuscationResult.getObfuscatedCode()); + // console.log(`成功混淆文件: ${filePath}`); + } catch (error) { + console.error(`处理文件 ${filePath} 时出错:`, error); + } +} + +// 递归处理目录的函数 +function processDirectory(directory: string): void { + const files = fs.readdirSync(directory); + + files.forEach(file => { + const fullPath = path.join(directory, file); + const stat = fs.statSync(fullPath); + + if (stat.isDirectory()) { + processDirectory(fullPath); + } else if (path.extname(file) === '.js') { + obfuscateFile(fullPath); + } + }); +} + +// 导出主函数 +export async function obfuscate(): Promise { + const distPath = path.join(process.cwd(), 'dist'); + if (fs.existsSync(distPath)) { + console.log('开始混淆 dist 目录下的 JS 文件...'); + processDirectory(distPath); + console.log('混淆完成!打包成功!'); + } else { + console.error('错误: dist 目录不存在!'); + } +} diff --git a/core/src/cache/store.ts b/core/src/cache/store.ts new file mode 100644 index 0000000..45260d2 --- /dev/null +++ b/core/src/cache/store.ts @@ -0,0 +1,64 @@ +import * as FsStore from '@cool-midway/cache-manager-fs-hash'; + +/** + * cool 基于磁盘的缓存 + */ +class FsCacheStore { + options: any; + + store: FsStore; + + constructor(options = {}) { + options = { + ...options, + path: 'cache', + ttl: -1, + }; + this.options = options; + this.store = FsStore.create(options); + } + + /** + * 获得 + * @param key + * @returns + */ + async get(key: string): Promise { + return await this.store.get(key); + } + + /** + * 设置 + * @param key + * @param value + * @param ttl + */ + async set(key: string, value: T, ttl: number): Promise { + let t = ttl ? ttl : this.options.ttl; + if (t > 0) { + t = t / 1000; + } + await this.store.set(key, value, { + ttl: t, + }); + } + + /** + * 删除 + * @param key + */ + async del(key: string): Promise { + await this.store.del(key); + } + + /** + * 重置 + */ + async reset(): Promise { + await this.store.reset(); + } +} + +export const CoolCacheStore = function (options = {}) { + return new FsCacheStore(options); +}; diff --git a/core/src/config/config.default.ts b/core/src/config/config.default.ts index d8324ca..1e335bf 100644 --- a/core/src/config/config.default.ts +++ b/core/src/config/config.default.ts @@ -1,4 +1,22 @@ -export const customKey = { - a: 1, - b: 'hello', +import { CoolConfig } from '../interface'; + +/** + * cool的配置 + */ +export default { + cool: { + // 是否自动导入数据库 + initDB: false, + // 是否自动导入模块菜单 + initMenu: true, + // 判断是否初始化的方式 + initJudge: 'file', + // crud配置 + crud: { + // 软删除 + softDelete: true, + // 分页查询每页条数 + pageSize: 15, + }, + } as CoolConfig, }; diff --git a/core/src/configuration.ts b/core/src/configuration.ts index f845280..86e3957 100644 --- a/core/src/configuration.ts +++ b/core/src/configuration.ts @@ -1,16 +1,74 @@ +import { + App, + ILifeCycle, + ILogger, + IMidwayContainer, + Inject, + Logger, +} from '@midwayjs/core'; import { Configuration } from '@midwayjs/core'; import * as DefaultConfig from './config/config.default'; +import { CoolExceptionFilter } from './exception/filter'; +import { FuncUtil } from './util/func'; +import * as koa from '@midwayjs/koa'; +import { CoolModuleConfig } from './module/config'; +import { CoolModuleImport } from './module/import'; +import { CoolEventManager } from './event'; +import { CoolEps } from './rest/eps'; +import { CoolDecorator } from './decorator'; +import * as cache from '@midwayjs/cache-manager'; +import * as _cache from '@midwayjs/cache'; @Configuration({ namespace: 'cool', + imports: [_cache, cache], importConfigs: [ { default: DefaultConfig, }, ], }) -export class BookConfiguration { - async onReady() { - // TODO something +export class CoolConfiguration implements ILifeCycle { + @Logger() + coreLogger: ILogger; + + @App() + app: koa.Application; + + @Inject() + coolEventManager: CoolEventManager; + + async onReady(container: IMidwayContainer) { + this.coolEventManager.emit('onReady'); + // 处理模块配置 + await container.getAsync(CoolModuleConfig); + // 常用函数处理 + await container.getAsync(FuncUtil); + // 异常处理 + this.app.useFilter([CoolExceptionFilter]); + // 装饰器 + await container.getAsync(CoolDecorator); + + // 缓存设置为全局 + // global["COOL-CACHE"] = await container.getAsync(CacheManager); + // // 清除 location + // setTimeout(() => { + // location.clean(); + // this.coreLogger.info("\x1B[36m [cool:core] location clean \x1B[0m"); + // }, 10000); + } + + async onConfigLoad() {} + + async onServerReady(container: IMidwayContainer) { + // 事件 + await (await container.getAsync(CoolEventManager)).init(); + // 导入模块数据 + (await container.getAsync(CoolModuleImport)).init(); + // 实体与路径 + const eps: CoolEps = await container.getAsync(CoolEps); + eps.init(); + this.coolEventManager.emit('onServerReady'); + // location.clean(); } } diff --git a/core/src/constant/global.ts b/core/src/constant/global.ts new file mode 100644 index 0000000..98d4784 --- /dev/null +++ b/core/src/constant/global.ts @@ -0,0 +1,79 @@ +/** + * 返回码 + */ +export enum RESCODE { + // 成功 + SUCCESS = 1000, + // 失败 + COMMFAIL = 1001, + // 参数验证失败 + VALIDATEFAIL = 1002, + // 参数验证失败 + COREFAIL = 1003, +} + +/** + * 返回信息 + */ +export enum RESMESSAGE { + // 成功 + SUCCESS = 'success', + // 失败 + COMMFAIL = 'comm fail', + // 参数验证失败 + VALIDATEFAIL = 'validate fail', + // 核心异常 + COREFAIL = 'core fail', +} + +/** + * 错误提示 + */ +export enum ERRINFO { + NOENTITY = '未设置操作实体', + NOID = '查询参数[id]不存在', + SORTFIELD = '排序参数不正确', +} + +/** + * 事件 + */ +export enum EVENT { + // 软删除 + SOFT_DELETE = 'onSoftDelete', + // 服务成功启动 + SERVER_READY = 'onServerReady', + // 服务就绪 + READY = 'onReady', + // ES 数据改变 + ES_DATA_CHANGE = 'esDataChange', +} + +export class GlobalConfig { + private static instance: GlobalConfig; + + RESCODE = { + SUCCESS: 1000, + COMMFAIL: 1001, + VALIDATEFAIL: 1002, + COREFAIL: 1003, + }; + + RESMESSAGE = { + SUCCESS: 'success', + COMMFAIL: 'comm fail', + VALIDATEFAIL: 'validate fail', + COREFAIL: 'core fail', + }; + + // ... 其他的配置 ... + + private constructor() {} + + static getInstance(): GlobalConfig { + if (!GlobalConfig.instance) { + GlobalConfig.instance = new GlobalConfig(); + } + return GlobalConfig.instance; + } +} diff --git a/core/src/controller/base.ts b/core/src/controller/base.ts new file mode 100644 index 0000000..f679c5d --- /dev/null +++ b/core/src/controller/base.ts @@ -0,0 +1,220 @@ +import { + App, + CONTROLLER_KEY, + getClassMetadata, + Init, + Inject, + Provide, +} from '@midwayjs/core'; +import { GlobalConfig } from '../constant/global'; +import { ControllerOption, CurdOption } from '../decorator/controller'; +import { BaseService } from '../service/base'; +import { IMidwayApplication } from '@midwayjs/core'; +import { Context } from '@midwayjs/koa'; +import { TypeORMDataSourceManager } from '@midwayjs/typeorm'; + +/** + * 控制器基类 + */ +@Provide() +export abstract class BaseController { + @Inject('ctx') + baseCtx: Context; + + @Inject() + service: BaseService; + + @App() + baseApp: IMidwayApplication; + + curdOption: CurdOption; + + @Inject() + typeORMDataSourceManager: TypeORMDataSourceManager; + + connectionName; + + @Init() + async init() { + const option: ControllerOption = getClassMetadata(CONTROLLER_KEY, this); + const curdOption: CurdOption = option.curdOption; + this.curdOption = curdOption; + if (!this.curdOption) { + return; + } + // 操作之前 + await this.before(curdOption); + // 设置service + await this.setService(curdOption); + // 设置实体 + await this.setEntity(curdOption); + } + + private async before(curdOption: CurdOption) { + if (!curdOption?.before) { + return; + } + await curdOption.before(this.baseCtx, this.baseApp); + } + + /** + * 插入参数值 + * @param curdOption 配置 + */ + private async insertParam(curdOption: CurdOption) { + if (!curdOption?.insertParam) { + return; + } + const body = this.baseCtx.request.body; + if (body) { + // 判断body是否是数组 + if (Array.isArray(body)) { + for (let i = 0; i < body.length; i++) { + body[i] = { + ...body[i], + ...(await curdOption.insertParam(this.baseCtx, this.baseApp)), + }; + } + this.baseCtx.request.body = body; + return; + } + this.baseCtx.request.body = { + // @ts-ignore + ...this.baseCtx.request.body, + ...(await curdOption.insertParam(this.baseCtx, this.baseApp)), + }; + } + } + + /** + * 设置实体 + * @param curdOption 配置 + */ + private async setEntity(curdOption: CurdOption) { + const entity = curdOption?.entity; + if (entity) { + const dataSourceName = + this.typeORMDataSourceManager.getDataSourceNameByModel(entity); + this.connectionName = dataSourceName; + const entityModel = this.typeORMDataSourceManager + .getDataSource(dataSourceName) + .getRepository(entity); + this.service.setEntity(entityModel); + } + } + + /** + * 设置service + * @param curdOption + */ + private async setService(curdOption: CurdOption) { + if (curdOption.service) { + this.service = await this.baseCtx.requestContext.getAsync( + curdOption.service + ); + } + } + + /** + * 新增 + * @returns + */ + async add() { + // 插入参数 + await this.insertParam(this.curdOption); + const { body } = this.baseCtx.request; + return this.ok(await this.service.add(body)); + } + + /** + * 删除 + * @returns + */ + async delete() { + // @ts-ignore + const { ids } = this.baseCtx.request.body; + return this.ok(await this.service.delete(ids)); + } + + /** + * 更新 + * @returns + */ + async update() { + const { body } = this.baseCtx.request; + return this.ok(await this.service.update(body)); + } + + /** + * 分页查询 + * @returns + */ + async page() { + const { body } = this.baseCtx.request; + return this.ok( + await this.service.page( + body, + this.curdOption.pageQueryOp, + this.connectionName + ) + ); + } + + /** + * 列表查询 + * @returns + */ + async list() { + const { body } = this.baseCtx.request; + return this.ok( + await this.service.list( + body, + this.curdOption.listQueryOp, + this.connectionName + ) + ); + } + + /** + * 根据ID查询信息 + * @returns + */ + async info() { + const { id } = this.baseCtx.query; + return this.ok( + await this.service.info(id, this.curdOption.infoIgnoreProperty) + ); + } + + /** + * 成功返回 + * @param data 返回数据 + */ + ok(data?: any) { + const { RESCODE, RESMESSAGE } = GlobalConfig.getInstance(); + const res = { + code: RESCODE.SUCCESS, + message: RESMESSAGE.SUCCESS, + }; + if (data || data == 0) { + res['data'] = data; + } + return res; + } + + /** + * 失败返回 + * @param message + */ + fail(message?: string, code?: number) { + const { RESCODE, RESMESSAGE } = GlobalConfig.getInstance(); + return { + code: code ? code : RESCODE.COMMFAIL, + message: message + ? message + : code == RESCODE.VALIDATEFAIL + ? RESMESSAGE.VALIDATEFAIL + : RESMESSAGE.COMMFAIL, + }; + } +} diff --git a/core/src/decorator/cache.ts b/core/src/decorator/cache.ts new file mode 100644 index 0000000..d006902 --- /dev/null +++ b/core/src/decorator/cache.ts @@ -0,0 +1,8 @@ +import { createCustomMethodDecorator } from '@midwayjs/core'; + +// 装饰器内部的唯一 id +export const COOL_CACHE = 'decorator:cool_cache'; + +export function CoolCache(ttl?: number): MethodDecorator { + return createCustomMethodDecorator(COOL_CACHE, ttl); +} diff --git a/core/src/decorator/controller.ts b/core/src/decorator/controller.ts new file mode 100644 index 0000000..8a31203 --- /dev/null +++ b/core/src/decorator/controller.ts @@ -0,0 +1,215 @@ +import { ModuleConfig } from './../interface'; +import { + Scope, + ScopeEnum, + saveClassMetadata, + saveModule, + CONTROLLER_KEY, + MiddlewareParamArray, + WEB_ROUTER_KEY, + attachClassMetadata, +} from '@midwayjs/core'; +import * as fs from 'fs'; +import * as _ from 'lodash'; +import location from '../util/location'; + +export type ApiTypes = 'add' | 'delete' | 'update' | 'page' | 'info' | 'list'; +// Crud配置 + +export interface CurdOption { + // 路由前缀,不配置默认是按Controller下的文件夹路径 + prefix?: string; + // curd api接口 + api: ApiTypes[]; + // 分页查询配置 + pageQueryOp?: QueryOp | Function; + // 非分页查询配置 + listQueryOp?: QueryOp | Function; + // 插入参数 + insertParam?: Function; + // 操作之前 + before?: Function; + // info 忽略返回属性 + infoIgnoreProperty?: string[]; + // 实体 + entity: any; + // 服务 + service?: any; + // api标签 + urlTag?: { + name: 'ignoreToken' | string; + url: ApiTypes[]; + }; +} +export interface JoinOp { + // 实体 + entity: any; + // 别名 + alias: string; + // 关联条件 + condition: string; + // 关联类型 + type?: 'innerJoin' | 'leftJoin'; +} + +// 字段匹配 +export interface FieldEq { + // 字段 + column: string; + // 请求参数 + requestParam: string; +} +// 查询配置 +export interface QueryOp { + // 需要模糊查询的字段 + keyWordLikeFields?: string[]; + // 查询条件 + where?: Function; + // 查询字段 + select?: string[]; + // 字段相等 + fieldEq?: string[] | FieldEq[] | (string | FieldEq)[]; + // 添加排序条件 + addOrderBy?: {}; + // 关联配置 + join?: JoinOp[]; + // 其他条件 + extend?: Function; +} + +// Controller 配置 +export interface ControllerOption { + // crud配置 如果是字符串则为路由前缀,不配置默认是按Controller下的文件夹路径 + curdOption?: CurdOption & string; + // 路由配置 + routerOptions?: { + // 是否敏感 + sensitive?: boolean; + // 路由中间件 + middleware?: MiddlewareParamArray; + // 别名 + alias?: string[]; + // 描述 + description?: string; + // 标签名称 + tagName?: string; + }; +} + +// 路由配置 +export interface RouterOptions { + sensitive?: boolean; + middleware?: MiddlewareParamArray; + description?: string; + tagName?: string; + ignoreGlobalPrefix?: boolean; +} + +// COOL的装饰器 +export function CoolController( + curdOption?: CurdOption | string | RouterOptions, + routerOptions: RouterOptions = { middleware: [], sensitive: true } +): ClassDecorator { + return (target: any) => { + // 将装饰的类,绑定到该装饰器,用于后续能获取到 class + saveModule(CONTROLLER_KEY, target); + let prefix; + if (curdOption) { + // 判断 curdOption 的类型 + if (typeof curdOption === 'string') { + prefix = curdOption; + } else if (curdOption && 'api' in curdOption) { + // curdOption 是 CurdOption 类型 + prefix = curdOption.prefix || ''; + } else { + // curdOption 是 RouterOptions 类型 合并到 routerOptions + routerOptions = { ...curdOption, ...routerOptions }; + } + } + // 如果不存在路由前缀,那么自动根据当前文件夹路径 + location.scriptPath(target).then(async (res: any) => { + if (!res?.path) return; + const pathSps = res.path.split('.'); + const paths = pathSps[pathSps.length - 2].split(/[/\\]/); + const pathArr = []; + let module = null; + for (const path of paths.reverse()) { + if (path != 'controller' && !module) { + pathArr.push(path); + } + if (path == 'controller' && !paths.includes('modules')) { + break; + } + if (path == 'controller' && paths.includes('modules')) { + module = 'ready'; + } + if (module && path != 'controller') { + module = `${path}`; + break; + } + } + if (module) { + pathArr.reverse(); + pathArr.splice(1, 0, module); + // 追加模块中间件 + const path = `${ + res.path.split(new RegExp(`modules[/\\\\]${module}`))[0] + }modules/${module}/config.${_.endsWith(res.path, 'ts') ? 'ts' : 'js'}`; + if (fs.existsSync(path)) { + const config: ModuleConfig = require(path).default(); + routerOptions.middleware = (config.middlewares || []).concat( + routerOptions.middleware || [] + ); + } + } + if (!prefix) { + prefix = `/${pathArr.join('/')}`; + } + saveMetadata(prefix, routerOptions, target, curdOption, module); + }); + }; +} + +export const apiDesc = { + add: '新增', + delete: '删除', + update: '修改', + page: '分页查询', + list: '列表查询', + info: '单个信息', +}; + +// 保存一些元数据信息,任意你希望存的东西 +function saveMetadata(prefix, routerOptions, target, curdOption, module) { + if (module && !routerOptions.tagName) { + routerOptions = routerOptions || {}; + routerOptions.tagName = module; + } + saveClassMetadata( + CONTROLLER_KEY, + { + prefix, + routerOptions, + curdOption, + module, + } as ControllerOption, + target + ); + // 追加CRUD路由 + if (!_.isEmpty(curdOption?.api)) { + curdOption?.api.forEach(path => { + attachClassMetadata( + WEB_ROUTER_KEY, + { + path: `/${path}`, + requestMethod: path == 'info' ? 'get' : 'post', + method: path, + summary: apiDesc[path], + description: '', + }, + target + ); + }); + Scope(ScopeEnum.Request)(target); + } +} diff --git a/core/src/decorator/event.ts b/core/src/decorator/event.ts new file mode 100644 index 0000000..faedeeb --- /dev/null +++ b/core/src/decorator/event.ts @@ -0,0 +1,54 @@ +import { + saveClassMetadata, + saveModule, + attachClassMetadata, +} from '@midwayjs/core'; +import { Scope, ScopeEnum } from '@midwayjs/core'; + +export const COOL_CLS_EVENT_KEY = 'decorator:cool:cls:event'; + +/** + * 事件配置 + */ +export interface CoolEventOptions { + /** 是否全局 */ + isGlobal: boolean; +} + +/** + * 事件 + * @param options + * @returns + */ +export function CoolEvent(options = {} as CoolEventOptions): ClassDecorator { + return (target: any) => { + // 将装饰的类,绑定到该装饰器,用于后续能获取到 class + saveModule(COOL_CLS_EVENT_KEY, target); + // 保存一些元数据信息,任意你希望存的东西 + saveClassMetadata(COOL_CLS_EVENT_KEY, options, target); + // 指定 IoC 容器创建实例的作用域,这里注册为请求作用域,这样能取到 ctx + Scope(ScopeEnum.Singleton)(target); + }; +} + +export const COOL_EVENT_KEY = 'decorator:cool:event'; + +/** + * 事件 + * @param eventName + * @returns + */ +export function Event(eventName?: string): MethodDecorator { + return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => { + // 将装饰的类,绑定到该装饰器,用于后续能获取到 class + attachClassMetadata( + COOL_EVENT_KEY, + { + eventName, + propertyKey, + descriptor, + }, + target + ); + }; +} diff --git a/core/src/decorator/index.ts b/core/src/decorator/index.ts new file mode 100644 index 0000000..53e48fa --- /dev/null +++ b/core/src/decorator/index.ts @@ -0,0 +1,112 @@ +import { COOL_CACHE } from './cache'; +import { CachingFactory, MidwayCache } from '@midwayjs/cache-manager'; +import { + Init, + Inject, + InjectClient, + JoinPoint, + MidwayDecoratorService, + Provide, + Scope, + ScopeEnum, +} from '@midwayjs/core'; +import { TypeORMDataSourceManager } from '@midwayjs/typeorm'; +import { CoolCommException } from '../exception/comm'; +import { COOL_TRANSACTION, TransactionOptions } from './transaction'; +import * as md5 from 'md5'; +import { CoolUrlTagData } from '../tag/data'; + +/** + * 装饰器 + */ +@Provide() +@Scope(ScopeEnum.Singleton) +export class CoolDecorator { + @Inject() + typeORMDataSourceManager: TypeORMDataSourceManager; + + @Inject() + decoratorService: MidwayDecoratorService; + + @InjectClient(CachingFactory, 'default') + midwayCache: MidwayCache; + + @Inject() + coolUrlTagData: CoolUrlTagData; + + @Init() + async init() { + // 事务 + await this.transaction(); + // 缓存 + await this.cache(); + // URL标签 + await this.coolUrlTagData.init(); + } + + /** + * 缓存 + */ + async cache() { + this.decoratorService.registerMethodHandler(COOL_CACHE, options => { + return { + around: async (joinPoint: JoinPoint) => { + const key = md5( + joinPoint.target.constructor.name + + joinPoint.methodName + + JSON.stringify(joinPoint.args) + ); + // 缓存有数据就返回 + let data: any = await this.midwayCache.get(key); + if (data) { + return JSON.parse(data); + } else { + // 执行原始方法 + data = await joinPoint.proceed(...joinPoint.args); + await this.midwayCache.set( + key, + JSON.stringify(data), + options.metadata + ); + } + return data; + }, + }; + }); + } + + /** + * 事务 + */ + async transaction() { + this.decoratorService.registerMethodHandler(COOL_TRANSACTION, options => { + return { + around: async (joinPoint: JoinPoint) => { + const option: TransactionOptions = options.metadata; + const dataSource = this.typeORMDataSourceManager.getDataSource( + option?.connectionName || 'default' + ); + const queryRunner = dataSource.createQueryRunner(); + await queryRunner.connect(); + if (option && option.isolation) { + await queryRunner.startTransaction(option.isolation); + } else { + await queryRunner.startTransaction(); + } + let data; + try { + joinPoint.args.push(queryRunner); + data = await joinPoint.proceed(...joinPoint.args); + await queryRunner.commitTransaction(); + } catch (error) { + await queryRunner.rollbackTransaction(); + throw new CoolCommException(error.message); + } finally { + await queryRunner.release(); + } + return data; + }, + }; + }); + } +} diff --git a/core/src/decorator/tag.ts b/core/src/decorator/tag.ts new file mode 100644 index 0000000..fdad1cf --- /dev/null +++ b/core/src/decorator/tag.ts @@ -0,0 +1,53 @@ +import { + saveClassMetadata, + savePropertyDataToClass, + saveModule, +} from '@midwayjs/core'; + +export const COOL_URL_TAG_KEY = 'decorator:cool:url:tag'; + +export const COOL_METHOD_TAG_KEY = 'decorator:cool:method:tag'; + +export enum TagTypes { + IGNORE_TOKEN = 'ignoreToken', + IGNORE_SIGN = 'ignoreSign', +} + +export interface CoolUrlTagConfig { + key: TagTypes | string; + value?: string[]; +} + +/** + * 打标记 + * @param data + * @returns + */ +export function CoolUrlTag(data?: CoolUrlTagConfig): ClassDecorator { + return (target: any) => { + // 将装饰的类,绑定到该装饰器,用于后续能获取到 class + saveModule(COOL_URL_TAG_KEY, target); + // 保存一些元数据信息,任意你希望存的东西 + saveClassMetadata(COOL_URL_TAG_KEY, data, target); + }; +} + +/** + * 方法打标记 + * @param data + * @returns + */ +export function CoolTag(tag: TagTypes | string): MethodDecorator { + return (target, key, descriptor: PropertyDescriptor) => { + savePropertyDataToClass( + COOL_METHOD_TAG_KEY, + { + key, + tag, + }, + target, + key + ); + return descriptor; + }; +} diff --git a/core/src/decorator/transaction.ts b/core/src/decorator/transaction.ts new file mode 100644 index 0000000..27a68af --- /dev/null +++ b/core/src/decorator/transaction.ts @@ -0,0 +1,19 @@ +import { createCustomMethodDecorator } from '@midwayjs/core'; + +type IsolationLevel = + | 'READ UNCOMMITTED' + | 'READ COMMITTED' + | 'REPEATABLE READ' + | 'SERIALIZABLE'; + +export interface TransactionOptions { + connectionName?: string; + isolation?: IsolationLevel; +} + +// 装饰器内部的唯一 id +export const COOL_TRANSACTION = 'decorator:cool_transaction'; + +export function CoolTransaction(option?: TransactionOptions): MethodDecorator { + return createCustomMethodDecorator(COOL_TRANSACTION, option); +} diff --git a/core/src/entity/base.ts b/core/src/entity/base.ts new file mode 100644 index 0000000..b9c8a03 --- /dev/null +++ b/core/src/entity/base.ts @@ -0,0 +1,26 @@ +import { + Index, + UpdateDateColumn, + CreateDateColumn, + PrimaryGeneratedColumn, +} from 'typeorm'; +import { CoolBaseEntity } from './typeorm'; + +/** + * 模型基类 + */ +export abstract class BaseEntity extends CoolBaseEntity { + // 默认自增 + @PrimaryGeneratedColumn('increment', { + comment: 'ID', + }) + id: number; + + @Index() + @CreateDateColumn({ comment: '创建时间' }) + createTime: Date; + + @Index() + @UpdateDateColumn({ comment: '更新时间' }) + updateTime: Date; +} diff --git a/core/src/entity/mongo.ts b/core/src/entity/mongo.ts new file mode 100644 index 0000000..68d52d6 --- /dev/null +++ b/core/src/entity/mongo.ts @@ -0,0 +1,25 @@ +import { + Index, + UpdateDateColumn, + CreateDateColumn, + // @ts-ignore + ObjectID, + ObjectIdColumn, +} from 'typeorm'; +import { CoolBaseEntity } from './typeorm'; + +/** + * 模型基类 + */ +export abstract class BaseMongoEntity extends CoolBaseEntity { + @ObjectIdColumn({ comment: 'id' }) + id: ObjectID; + + @Index() + @CreateDateColumn({ comment: '创建时间' }) + createTime: Date; + + @Index() + @UpdateDateColumn({ comment: '更新时间' }) + updateTime: Date; +} diff --git a/core/src/entity/typeorm.ts b/core/src/entity/typeorm.ts new file mode 100644 index 0000000..beb2ff9 --- /dev/null +++ b/core/src/entity/typeorm.ts @@ -0,0 +1,3 @@ +import { BaseEntity } from 'typeorm'; + +export abstract class CoolBaseEntity extends BaseEntity {} diff --git a/core/src/event/index.ts b/core/src/event/index.ts new file mode 100644 index 0000000..2671abe --- /dev/null +++ b/core/src/event/index.ts @@ -0,0 +1,185 @@ +import { App, getClassMetadata, listModule, Provide } from '@midwayjs/core'; +import * as Events from 'events'; +import { Scope, ScopeEnum, IMidwayApplication, Config } from '@midwayjs/core'; +import { COOL_CLS_EVENT_KEY, COOL_EVENT_KEY } from '../decorator/event'; +import * as pm2 from 'pm2'; +import * as _ from 'lodash'; + +export const COOL_EVENT_MESSAGE = 'cool:event:message'; + +/** + * 事件 + */ +@Provide() +@Scope(ScopeEnum.Singleton) +export class CoolEventManager extends Events { + @App() + app: IMidwayApplication; + + @Config('keys') + keys: string; + + // 事件数据 某个事件对应的模块对应的方法 + eventData = {} as { + [key: string]: { + module: any; + method: string; + }[]; + }; + + /** + * 初始化 + */ + async init() { + const eventModules = listModule(COOL_CLS_EVENT_KEY); + for (const module of eventModules) { + await this.handlerEvent(module); + } + await this.commEvent(); + await this.globalEvent(); + } + + /** + * 发送事件 + * @param event + * @param args + * @returns + */ + emit(event: string | symbol, ...args: any[]): boolean { + return super.emit(COOL_EVENT_MESSAGE, { + type: COOL_EVENT_MESSAGE, + data: { + event, + args, + }, + }); + } + + /** + * 发送全局事件 + * @param event 事件 + * @param random 是否随机一个 + * @param args 参数 + * @returns + */ + async globalEmit(event: string, random = false, ...args) { + // 如果是本地运行还是转普通模式 + if (this.app.getEnv() === 'local') { + this.emit(event, ...args); + return; + } + pm2.connect(() => { + pm2.list((err, list) => { + const ps = list.map(e => { + return { + id: e.pm_id, + name: e.name, + }; + }); + // random 为 true 时随机发给同名称的一个进程 + if (random) { + // 按名称分组 + const group = _.groupBy(ps, 'name'); + const names = Object.keys(group); + // 遍历名称 + names.forEach(name => { + const pss = group[name]; + // 随机一个 + const index = _.random(0, pss.length - 1); + const ps = pss[index]; + // 发给这个进程 + // @ts-ignore + pm2.sendDataToProcessId( + { + type: 'process:msg', + data: { + type: `${COOL_EVENT_MESSAGE}@${this.keys}`, + event, + args, + }, + id: ps.id, + topic: 'cool:event:topic', + }, + (err, res) => {} + ); + }); + } else { + // 发给所有进程 + ps.forEach(e => { + // @ts-ignore + pm2.sendDataToProcessId( + { + type: 'process:msg', + data: { + type: `${COOL_EVENT_MESSAGE}@${this.keys}`, + event, + args, + }, + id: e.id, + topic: 'cool:event:topic', + }, + (err, res) => {} + ); + }); + } + }); + }); + } + + /** + * 处理事件 + * @param module + */ + async handlerEvent(module) { + const events = getClassMetadata(COOL_EVENT_KEY, module); + for (const event of events) { + const listen = event.eventName ? event.eventName : event.propertyKey; + if (!this.eventData[listen]) { + this.eventData[listen] = []; + } + this.eventData[listen].push({ + module, + method: event.propertyKey, + }); + } + } + + /** + * 全局事件 + */ + async globalEvent() { + process.on('message', async (message: any) => { + const data = message?.data; + if (!data) return; + if (data.type != `${COOL_EVENT_MESSAGE}@${this.keys}`) return; + await this.doAction(message); + }); + } + + /** + * 普通事件 + */ + async commEvent() { + this.on(COOL_EVENT_MESSAGE, async (message: any) => { + await this.doAction(message); + }); + } + + /** + * 执行事件 + * @param message + */ + async doAction(message) { + const data = message.data; + const method = data.event; + const args = data.args; + if (this.eventData[method]) { + for (const event of this.eventData[method]) { + const moduleInstance = await this.app + .getApplicationContext() + .getAsync(event.module); + moduleInstance[event.method](...args); + } + } + } +} diff --git a/core/src/exception/base.ts b/core/src/exception/base.ts new file mode 100644 index 0000000..177b46b --- /dev/null +++ b/core/src/exception/base.ts @@ -0,0 +1,13 @@ +/** + * 异常基类 + */ +export class BaseException extends Error { + status: number; + + constructor(name: string, code: number, message: string) { + super(message); + + this.name = name; + this.status = code; + } +} diff --git a/core/src/exception/comm.ts b/core/src/exception/comm.ts new file mode 100644 index 0000000..d2c9525 --- /dev/null +++ b/core/src/exception/comm.ts @@ -0,0 +1,16 @@ +import { GlobalConfig } from '../constant/global'; +import { BaseException } from './base'; + +/** + * 通用异常 + */ +export class CoolCommException extends BaseException { + constructor(message: string) { + const { RESCODE, RESMESSAGE } = GlobalConfig.getInstance(); + super( + 'CoolCommException', + RESCODE.COMMFAIL, + message ? message : RESMESSAGE.COMMFAIL + ); + } +} diff --git a/core/src/exception/core.ts b/core/src/exception/core.ts new file mode 100644 index 0000000..9dc3a7e --- /dev/null +++ b/core/src/exception/core.ts @@ -0,0 +1,16 @@ +import { GlobalConfig } from '../constant/global'; +import { BaseException } from './base'; + +/** + * 核心异常 + */ +export class CoolCoreException extends BaseException { + constructor(message: string) { + const { RESCODE, RESMESSAGE } = GlobalConfig.getInstance(); + super( + 'CoolCoreException', + RESCODE.COREFAIL, + message ? message : RESMESSAGE.COREFAIL + ); + } +} diff --git a/core/src/exception/filter.ts b/core/src/exception/filter.ts new file mode 100644 index 0000000..17b15c0 --- /dev/null +++ b/core/src/exception/filter.ts @@ -0,0 +1,21 @@ +import { ILogger } from '@midwayjs/core'; +import { Catch, Logger } from '@midwayjs/core'; +import { GlobalConfig } from '../constant/global'; + +/** + * 全局异常处理 + */ +@Catch() +export class CoolExceptionFilter { + @Logger() + coreLogger: ILogger; + + async catch(err) { + const { RESCODE } = GlobalConfig.getInstance(); + this.coreLogger.error(err); + return { + code: err.status || RESCODE.COMMFAIL, + message: err.message, + }; + } +} diff --git a/core/src/exception/validate.ts b/core/src/exception/validate.ts new file mode 100644 index 0000000..da023ca --- /dev/null +++ b/core/src/exception/validate.ts @@ -0,0 +1,16 @@ +import { GlobalConfig } from '../constant/global'; +import { BaseException } from './base'; + +/** + * 校验异常 + */ +export class CoolValidateException extends BaseException { + constructor(message: string) { + const { RESCODE, RESMESSAGE } = GlobalConfig.getInstance(); + super( + 'CoolValidateException', + RESCODE.VALIDATEFAIL, + message ? message : RESMESSAGE.VALIDATEFAIL + ); + } +} diff --git a/core/src/index.ts b/core/src/index.ts index 86736f9..6003ac3 100644 --- a/core/src/index.ts +++ b/core/src/index.ts @@ -1,2 +1,52 @@ -export { BookConfiguration as Configuration } from './configuration'; -export * from './service/book.service'; +export { CoolConfiguration as Configuration } from './configuration'; + +// 异常处理 +export * from './exception/filter'; +export * from './exception/core'; +export * from './exception/base'; +export * from './exception/comm'; +export * from './exception/validate'; + +// cache +export * from './cache/store'; + +// entity +export * from './entity/base'; +export * from './entity/typeorm'; +export * from './entity/mongo'; + +// service +export * from './service/base'; +export * from './service/mysql'; +export * from './service/postgres'; +export * from './service/sqlite'; + +// controller +export * from './controller/base'; + +// 事件 +export * from './event/index'; + +// 装饰器 +export * from './decorator/controller'; +export * from './decorator/cache'; +export * from './decorator/event'; +export * from './decorator/transaction'; +export * from './decorator/tag'; +export * from './decorator/index'; + +// rest +export * from './rest/eps'; + +// tag +export * from './tag/data'; + +// 模块 +export * from './module/config'; +export * from './module/import'; +export * from './module/menu'; + +// 其他 +export * from './interface'; +export * from './util/func'; +export * from './constant/global'; diff --git a/core/src/interface.ts b/core/src/interface.ts new file mode 100644 index 0000000..24d9664 --- /dev/null +++ b/core/src/interface.ts @@ -0,0 +1,447 @@ +import { MiddlewareParamArray } from '@midwayjs/core'; +import { AedesOptions } from 'aedes'; +// @ts-ignore +import { PublishPacket } from 'packet'; + +/** + * 模块配置 + */ +export interface ModuleConfig { + /** 名称 */ + name: string; + /** 描述 */ + description: string; + /** 模块中间件 */ + middlewares?: MiddlewareParamArray; + /** 全局中间件 */ + globalMiddlewares?: MiddlewareParamArray; + /** 模块加载顺序,默认为0,值越大越优先加载 */ + order?: number; +} + +export interface CoolConfig { + /** 短信 */ + sms?: CoolSmsConfig; + /** 是否自动导入数据库 */ + initDB?: boolean; + /** Eps */ + eps?: boolean; + /** 是否自动导入模块菜单 */ + initMenu?: boolean; + /** 判断是否初始化的方式 */ + initJudge: 'file' | 'db'; + // 实体配置 + // entity?: { + // primaryType: "uuid" | "increment" | "rowid" | "identity"; + // }; + /** crud配置 */ + crud?: { + /** 软删除 */ + softDelete: boolean; + /** 分页查询每页条数 */ + pageSize: number; + /** 插入方式 */ + upsert: 'normal' | 'save'; + // 多租户 + // tenant: boolean; + }; + /** elasticsearch配置 */ + es?: { + nodes: string[]; + options?: any; + }; + /** pay */ + pay?: { + /** 微信支付 */ + wx?: CoolWxPayConfig; + /** 支付宝支付 */ + ali?: CoolAliPayConfig; + }; + /** rpc */ + rpc?: CoolRpcConfig; + /** redis */ + redis?: RedisConfig | RedisConfig[]; + /** 文件上传 */ + file?: { + /** 上传模式 */ + mode: MODETYPE; + /** 本地上传 文件地址前缀 */ + domain?: string; + /** oss */ + oss?: OSSConfig; + /** cos */ + cos?: COSConfig; + /** qiniu */ + qiniu?: QINIUConfig; + /** aws */ + aws: AWSConfig; + }; + /** IOT 配置 */ + iot?: CoolIotConfig; +} + +export interface CoolRpcConfig { + /** 服务名称 */ + name: string; + /** redis */ + redis: RedisConfig & RedisConfig[] & unknown; +} + +export interface RedisConfig { + /** host */ + host: string; + /** password */ + password: string; + /** port */ + port: number; + /** db */ + db: number; +} + +// 模式 +export enum MODETYPE { + /** 本地 */ + LOCAL = 'local', + /** 云存储 */ + CLOUD = 'cloud', + /** 其他 */ + OTHER = 'other', +} + +export enum CLOUDTYPE { + /** 阿里云存储 */ + OSS = 'oss', + /** 腾讯云存储 */ + COS = 'cos', + /** 七牛云存储 */ + QINIU = 'qiniu', + /** AWS S3 */ + AWS = 'aws', +} + +/** + * 上传模式 + */ +export interface Mode { + /** 模式 */ + mode: MODETYPE; + /** 类型 */ + type: string; +} + +/** + * 模块配置 + */ +export interface CoolFileConfig { + /** 上传模式 */ + mode: MODETYPE; + /** 阿里云oss 配置 */ + oss: OSSConfig; + /** 腾讯云 cos配置 */ + cos: COSConfig; + /** 七牛云 配置 */ + qiniu: QINIUConfig; + /** AWS s3 配置 */ + aws: AWSConfig; + /** 文件前缀 */ + domain: string; +} + +/** + * OSS 配置 + */ +export interface OSSConfig { + /** 阿里云accessKeyId */ + accessKeyId: string; + /** 阿里云accessKeySecret */ + accessKeySecret: string; + /** 阿里云oss的bucket */ + bucket: string; + /** 阿里云oss的endpoint */ + endpoint: string; + /** 阿里云oss的timeout */ + timeout: string; + /** 签名失效时间,毫秒 */ + expAfter?: number; + /** 文件最大的 size */ + maxSize?: number; + // host + host?: string; + // 阿里云oss的公网访问地址 + publicDomain?: string; +} + +/** + * COS 配置 + */ +export interface COSConfig { + /** 腾讯云accessKeyId */ + accessKeyId: string; + /** 腾讯云accessKeySecret */ + accessKeySecret: string; + /** 腾讯云cos的bucket */ + bucket: string; + /** 腾讯云cos的区域 */ + region: string; + /** 腾讯云cos的公网访问地址 */ + publicDomain: string; + /** 上传持续时间 */ + durationSeconds?: number; + /** 允许操作(上传)的对象前缀 */ + allowPrefix?: string; + /** 密钥的权限列表 */ + allowActions?: string[]; +} + +export interface QINIUConfig { + /** 七牛云accessKeyId */ + accessKeyId: string; + /** 七牛云accessKeySecret */ + accessKeySecret: string; + /** 七牛云cos的bucket */ + bucket: string; + /** 七牛云cos的区域 */ + region: string; + /** 七牛云cos的公网访问地址 */ + publicDomain: string; + /** 上传地址 */ + uploadUrl?: string; + /** 上传fileKey */ + fileKey?: string; +} + +export interface AWSConfig { + /** accessKeyId */ + accessKeyId: string; + /** secretAccessKey */ + secretAccessKey: string; + /** bucket */ + bucket: string; + /** region */ + region: string; + /** fields */ + fields?: any; + /** conditions */ + conditions?: any[]; + /** expires */ + expires?: number; + /** publicDomain */ + publicDomain?: string; + /** forcePathStyle */ + forcePathStyle?: boolean; +} + +/** + * 微信支付配置 + */ +export interface CoolWxPayConfig { + /** 直连商户申请的公众号或移动应用appid。 */ + appid: string; + /** 商户号 */ + mchid: string; + /** 可选参数 证书序列号 */ + serial_no?: string; + /** 回调链接 */ + notify_url: string; + /** 公钥 */ + publicKey: Buffer; + /** 私钥 */ + privateKey: Buffer; + /** 可选参数 认证类型,目前为WECHATPAY2-SHA256-RSA2048 */ + authType?: string; + /** 可选参数 User-Agent */ + userAgent?: string; + /** 可选参数 APIv3密钥 */ + key?: string; +} + +/** + * 支付宝支付配置 + */ +export interface CoolAliPayConfig { + /** 支付回调地址 */ + notifyUrl: string; + /** 应用ID */ + appId: string; + /** + * 应用私钥字符串 + * RSA签名验签工具:https://docs.open.alipay.com/291/106097) + * 密钥格式一栏请选择 “PKCS1(非JAVA适用)” + */ + privateKey: string; + /** 签名类型 */ + signType?: 'RSA2' | 'RSA'; + /** 支付宝公钥(需要对返回值做验签时候必填) */ + alipayPublicKey?: string; + /** 网关 */ + gateway?: string; + /** 网关超时时间(单位毫秒,默认 5s) */ + timeout?: number; + /** 是否把网关返回的下划线 key 转换为驼峰写法 */ + camelcase?: boolean; + /** 编码(只支持 utf-8) */ + charset?: 'utf-8'; + /** api版本 */ + version?: '1.0'; + urllib?: any; + /** 指定private key类型, 默认: PKCS1, PKCS8: PRIVATE KEY, PKCS1: RSA PRIVATE KEY */ + keyType?: 'PKCS1' | 'PKCS8'; + /** 应用公钥证书文件路径 */ + appCertPath?: string; + /** 应用公钥证书文件内容 */ + appCertContent?: string | Buffer; + /** 应用公钥证书sn */ + appCertSn?: string; + /** 支付宝根证书文件路径 */ + alipayRootCertPath?: string; + /** 支付宝根证书文件内容 */ + alipayRootCertContent?: string | Buffer; + /** 支付宝根证书sn */ + alipayRootCertSn?: string; + /** 支付宝公钥证书文件路径 */ + alipayPublicCertPath?: string; + /** 支付宝公钥证书文件内容 */ + alipayPublicCertContent?: string | Buffer; + /** 支付宝公钥证书sn */ + alipayCertSn?: string; + /** AES密钥,调用AES加解密相关接口时需要 */ + encryptKey?: string; + /** 服务器地址 */ + wsServiceUrl?: string; +} + +/** + * IOT配置 + */ +export interface CoolIotConfig { + /** MQTT服务端口 */ + port: number; + /** MQTT Websocket服务端口 */ + wsPort: number; + /** redis 配置 mqtt cluster下必须要配置 */ + redis?: { + /** host */ + host: string; + /** port */ + port: number; + /** password */ + password: string; + /** db */ + db: number; + }; + /** 发布消息配置 */ + publish?: PublishPacket; + /** 认证 */ + auth?: { + /** 用户 */ + username: string; + /** 密码 */ + password: string; + }; + /** 服务配置 */ + serve?: AedesOptions; +} + +export interface CoolSmsConfig { + /** + * 阿里云短信配置 + */ + ali: CoolSmsAliConfig; + /** + * 腾讯云短信配置 + */ + tx: CoolSmsTxConfig; + /** + * 云片短信配置 + */ + yp: CoolSmsYpConfig; + /** + * aws短信配置 + */ + aws: CoolSmsAwsConfig; +} + +export interface CoolSmsAwsConfig { + /** + * 区域 + */ + region: string; + /** + * accessKeyId + */ + accessKeyId: string; + /** + * secretAccessKey + */ + secretAccessKey: string; + /** + * 扩展配置 + */ + extend?: any; +} + +/** + * 阿里云配置 + */ +export interface CoolSmsAliConfig { + /** + * 阿里云accessKeyId + */ + accessKeyId: string; + /** + * 阿里云accessKeySecret + */ + accessKeySecret: string; + /** + * 签名,非必填,调用时可以传入 + */ + signName?: string; + /** + * 模板,非必填,调用时可以传入 + */ + template?: string; +} + +/** + * 腾讯云配置 + */ +export interface CoolSmsTxConfig { + /** + * 应用ID + */ + appId: string; + /** + * 腾讯云secretId + */ + secretId: string; + /** + * 腾讯云secretKey + */ + secretKey: string; + /** + * 签名,非必填,调用时可以传入 + */ + signName?: string; + /** + * 模板,非必填,调用时可以传入 + */ + template?: string; +} + +/** + * 云片短信配置 + */ +export interface CoolSmsYpConfig { + /** + * 云片apikey + */ + apikey: string; + /** + * 签名,非必填,调用时可以传入 + */ + signName?: string; + /** + * 模板,非必填,调用时可以传入 + */ + template?: string; +} diff --git a/core/src/module/config.ts b/core/src/module/config.ts new file mode 100644 index 0000000..0e00a9e --- /dev/null +++ b/core/src/module/config.ts @@ -0,0 +1,103 @@ +import { IMidwayApplication } from '@midwayjs/core'; +import { + ALL, + App, + Config, + Init, + Provide, + Scope, + ScopeEnum, +} from '@midwayjs/core'; +import * as fs from 'fs'; +import { CoolCoreException } from '../exception/core'; +import { ModuleConfig } from '../interface'; +import * as _ from 'lodash'; +import location from '../util/location'; + +/** + * 模块配置 + */ +@Provide() +@Scope(ScopeEnum.Singleton) +export class CoolModuleConfig { + @App() + app: IMidwayApplication; + + @Config(ALL) + allConfig; + + modules; + + @Init() + async init() { + const modules = []; + // 模块路径 + const moduleBasePath = `${location.getRootPath()}/modules/`; + + if (!fs.existsSync(moduleBasePath)) { + return; + } + if (!this.allConfig['module']) { + this.allConfig['module'] = {}; + } + // 全局中间件 + const globalMiddlewareArr = []; + for (const module of fs.readdirSync(moduleBasePath)) { + const modulePath = `${moduleBasePath}/${module}`; + const dirStats = fs.statSync(modulePath); + if (dirStats.isDirectory()) { + const configPath = fs.existsSync(`${modulePath}/config.ts`) + ? `${modulePath}/config.ts` + : `${modulePath}/config.js`; + console.log('configPath', configPath); + if (fs.existsSync(configPath)) { + const moduleConfig: ModuleConfig = require(configPath).default({ + app: this.app, + env: this.app.getEnv(), + }); + modules.push({ + order: moduleConfig.order || 0, + module: module, + }); + await this.moduleConfig(module, moduleConfig); + // 处理全局中间件 + if (!_.isEmpty(moduleConfig.globalMiddlewares)) { + globalMiddlewareArr.push({ + order: moduleConfig.order || 0, + data: moduleConfig.globalMiddlewares, + }); + } + } else { + throw new CoolCoreException(`模块【${module}】缺少config.ts配置文件`); + } + } + } + this.modules = _.orderBy(modules, ['order'], ['desc']).map(e => { + return e.module; + }); + await this.globalMiddlewareArr(globalMiddlewareArr); + } + + /** + * 模块配置 + * @param module 模块 + * @param config 配置 + */ + async moduleConfig(module, config) { + // 追加配置 + this.allConfig['module'][module] = config; + } + + /** + * 全局中间件 + * @param middleware 中间件 + */ + async globalMiddlewareArr(middlewares: any[]) { + middlewares = _.orderBy(middlewares, ['order'], ['desc']); + for (const middleware of middlewares) { + for (const item of middleware.data) { + this.app.getMiddleware().insertLast(item); + } + } + } +} diff --git a/core/src/module/import.ts b/core/src/module/import.ts new file mode 100644 index 0000000..9caafeb --- /dev/null +++ b/core/src/module/import.ts @@ -0,0 +1,262 @@ +import { ILogger, IMidwayApplication, Scope, ScopeEnum } from '@midwayjs/core'; +import { App, Config, Inject, Logger, Provide } from '@midwayjs/core'; +import { InjectDataSource, TypeORMDataSourceManager } from '@midwayjs/typeorm'; +import * as fs from 'fs'; +import * as _ from 'lodash'; +import * as path from 'path'; +import { DataSource, Equal } from 'typeorm'; +import { CoolEventManager } from '../event'; +import { CoolModuleConfig } from './config'; +import { CoolModuleMenu } from './menu'; +import location from '../util/location'; + +/** + * 模块sql + */ +@Provide() +@Scope(ScopeEnum.Singleton) +export class CoolModuleImport { + @Config('typeorm.dataSource') + ormConfig; + + @InjectDataSource('default') + defaultDataSource: DataSource; + + @Inject() + typeORMDataSourceManager: TypeORMDataSourceManager; + + @Config('cool') + coolConfig; + + @Logger() + coreLogger: ILogger; + + @Inject() + coolModuleConfig: CoolModuleConfig; + + @Inject() + coolEventManager: CoolEventManager; + + @App() + app: IMidwayApplication; + + @Inject() + coolModuleMenu: CoolModuleMenu; + + initJudge: 'file' | 'db'; + + /** + * 初始化 + */ + async init() { + this.initJudge = this.coolConfig.initJudge; + if (!this.initJudge) { + this.initJudge = 'file'; + } + // 是否需要导入 + if (this.coolConfig.initDB) { + const modules = this.coolModuleConfig.modules; + if (!modules || modules.length === 0) return; + const metadatas = await this.getDbMetadatas(); + setTimeout(async () => { + for (const module of modules) { + if (this.initJudge == 'file') { + const { exist, lockPath } = this.checkFileExist(module); + if (!exist) { + await this.initDataBase(module, metadatas, lockPath); + } + } + if (this.initJudge == 'db') { + const exist = await this.checkDbExist(module, metadatas); + if (!exist) { + await this.initDataBase(module, metadatas); + } + } + } + this.coolEventManager.emit('onDBInit', {}); + this.coolModuleMenu.init(); + }, 2000); + } + } + + /** + * 获取数据库元数据 + */ + async getDbMetadatas() { + // 获得所有的实体 + const entityMetadatas = this.defaultDataSource.entityMetadatas; + const metadatas = _.mapValues( + _.keyBy(entityMetadatas, 'tableName'), + 'target' + ); + return metadatas; + } + + /** + * 检查数据是否存在 + * @param module + * @param metadatas + */ + async checkDbExist(module: string, metadatas) { + const cKey = `init_db_${module}`; + const repository = this.defaultDataSource.getRepository( + metadatas['base_sys_conf'] + ); + const data = await repository.findOneBy({ cKey: Equal(cKey) }); + return !!data; + } + + /** + * 检查文件是否存在 + * @param module + */ + checkFileExist(module: string) { + const importLockPath = path.join( + `${location.getRootPath()}`, + '..', + 'lock', + 'db' + ); + if (!fs.existsSync(importLockPath)) { + fs.mkdirSync(importLockPath, { recursive: true }); + } + const lockPath = path.join(importLockPath, module + '.db.lock'); + return { + exist: fs.existsSync(lockPath), + lockPath, + }; + } + + /** + * 导入数据库 + * @param module + * @param lockPath 锁定导入 + */ + async initDataBase(module: string, metadatas, lockPath?: string) { + // 计算耗时 + const startTime = new Date().getTime(); + // 模块路径 + const modulePath = `${location.getRootPath()}/modules/${module}`; + // 数据路径 + const dataPath = `${modulePath}/db.json`; + // 判断文件是否存在 + if (fs.existsSync(dataPath)) { + // 读取数据 + const data = JSON.parse(fs.readFileSync(dataPath).toString() || '{}'); + // 导入数据 + for (const key in data) { + try { + for (const item of data[key]) { + await this.importData(metadatas, item, key); + } + } catch (e) { + this.coreLogger.error( + '\x1B[36m [cool:core] midwayjs cool core init ' + + module + + ' database err \x1B[0m' + ); + continue; + } + } + const endTime = new Date().getTime(); + await this.lockImportData( + module, + metadatas, + lockPath, + endTime - startTime + ); + this.coreLogger.info( + '\x1B[36m [cool:core] midwayjs cool core init ' + + module + + ' database complete \x1B[0m' + ); + } + } + + /** + * 锁定导入 + * @param module + * @param metadatas + * @param lockPath + * @param time + */ + async lockImportData( + module: string, + metadatas, + lockPath: string, + time: number + ) { + if (this.initJudge == 'file') { + fs.writeFileSync(lockPath, `time consuming:${time}ms`); + } + if (this.initJudge == 'db') { + const repository = this.defaultDataSource.getRepository( + metadatas['base_sys_conf'] + ); + if (this.ormConfig.default.type == 'postgres') { + await repository.save( + repository.create({ + cKey: `init_db_${module}`, + cValue: `time consuming:${time}ms`, + }) + ); + } else { + await repository.insert({ + cKey: `init_db_${module}`, + cValue: `time consuming:${time}ms`, + }); + } + } + } + + /** + * 导入数据 + * @param metadatas + * @param datas + * @param tableName + */ + async importData( + metadatas: any[], + item: any, + tableName: string, + parentItem: any = null + ) { + const repository = this.defaultDataSource.getRepository( + metadatas[tableName] + ); + // 处理当前项中的引用 + if (parentItem) { + for (const key in item) { + if (typeof item[key] === 'string' && item[key].startsWith('@')) { + const parentKey = item[key].substring(1); // 移除"@"符号 + if (Object.prototype.hasOwnProperty.call(parentItem, parentKey)) { + item[key] = parentItem[parentKey]; + } + } + } + } + // 插入当前项到数据库 + let insertedItem; + if (this.ormConfig.default.type == 'postgres') { + insertedItem = await repository.save(repository.create(item)); + if (item.id) { + await repository.update(insertedItem.id, { id: item.id }); + await this.defaultDataSource.query( + `SELECT setval('${tableName}_id_seq', (SELECT MAX(id) FROM ${tableName}));` + ); + } + } else { + insertedItem = await repository.insert(item); + } + // 递归处理@childDatas + if (!_.isEmpty(item['@childDatas'])) { + const childDatas = item['@childDatas']; + delete item['@childDatas']; + for (const childKey in childDatas) { + for (const childItem of childDatas[childKey]) { + await this.importData(metadatas, childItem, childKey, item); + } + } + } + } +} diff --git a/core/src/module/menu.ts b/core/src/module/menu.ts new file mode 100644 index 0000000..1527504 --- /dev/null +++ b/core/src/module/menu.ts @@ -0,0 +1,187 @@ +import { + App, + Config, + ILogger, + IMidwayApplication, + Inject, + Logger, + Provide, + Scope, + ScopeEnum, +} from '@midwayjs/core'; +import { InjectDataSource, TypeORMDataSourceManager } from '@midwayjs/typeorm'; +import * as fs from 'fs'; +import * as _ from 'lodash'; +import * as path from 'path'; +import { DataSource, Equal } from 'typeorm'; +import { CoolEventManager } from '../event'; +import { CoolConfig } from '../interface'; +import { CoolModuleConfig } from './config'; +import location from '../util/location'; + +/** + * 菜单 + */ +@Provide() +@Scope(ScopeEnum.Singleton) +export class CoolModuleMenu { + @Inject() + coolModuleConfig: CoolModuleConfig; + + @Config('cool') + coolConfig: CoolConfig; + + @App() + app: IMidwayApplication; + + @Logger() + coreLogger: ILogger; + + @Inject() + coolEventManager: CoolEventManager; + + initJudge: 'file' | 'db'; + + @Config('typeorm.dataSource') + ormConfig; + + @InjectDataSource('default') + defaultDataSource: DataSource; + + @Inject() + typeORMDataSourceManager: TypeORMDataSourceManager; + + datas = {}; + + async init() { + this.initJudge = this.coolConfig.initJudge; + if (!this.initJudge) { + this.initJudge = 'file'; + } + // 是否需要导入 + if (this.coolConfig.initMenu) { + const modules = this.coolModuleConfig.modules; + const metadatas = await this.getDbMetadatas(); + for (const module of modules) { + if (this.initJudge == 'file') { + const { exist, lockPath } = this.checkFileExist(module); + if (!exist) { + await this.importMenu(module, metadatas, lockPath); + } + } + if (this.initJudge == 'db') { + const exist = await this.checkDbExist(module, metadatas); + if (!exist) { + await this.importMenu(module, metadatas); + } + } + } + this.coolEventManager.emit('onMenuImport', this.datas); + } + } + + /** + * 导入菜单 + * @param module + * @param lockPath + */ + async importMenu(module: string, metadatas, lockPath?: string) { + // 模块路径 + const modulePath = `${location.getRootPath()}/modules/${module}`; + // json 路径 + const menuPath = `${modulePath}/menu.json`; + // 导入 + if (fs.existsSync(menuPath)) { + const data = fs.readFileSync(menuPath); + try { + // this.coolEventManager.emit("onMenuImport", module, JSON.parse(data.toString())); + this.datas[module] = JSON.parse(data.toString()); + await this.lockImportData(module, metadatas, lockPath); + } catch (error) { + this.coreLogger.error(error); + this.coreLogger.error( + `自动初始化模块[${module}]菜单失败,请检查对应的数据结构是否正确` + ); + } + } + } + + /** + * 获取数据库元数据 + */ + async getDbMetadatas() { + // 获得所有的实体 + const entityMetadatas = this.defaultDataSource.entityMetadatas; + const metadatas = _.mapValues( + _.keyBy(entityMetadatas, 'tableName'), + 'target' + ); + return metadatas; + } + + /** + * 检查数据是否存在 + * @param module + * @param metadatas + */ + async checkDbExist(module: string, metadatas) { + const cKey = `init_menu_${module}`; + const repository = this.defaultDataSource.getRepository( + metadatas['base_sys_conf'] + ); + const data = await repository.findOneBy({ cKey: Equal(cKey) }); + return !!data; + } + + /** + * 检查文件是否存在 + * @param module + */ + checkFileExist(module: string) { + const importLockPath = path.join( + `${location.getRootPath()}`, + '..', + 'lock', + 'menu' + ); + if (!fs.existsSync(importLockPath)) { + fs.mkdirSync(importLockPath, { recursive: true }); + } + const lockPath = path.join(importLockPath, module + '.menu.lock'); + return { + exist: fs.existsSync(lockPath), + lockPath, + }; + } + + /** + * 锁定导入 + * @param module + * @param metadatas + * @param lockPath + * @param time + */ + async lockImportData(module: string, metadatas, lockPath: string) { + if (this.initJudge == 'file') { + fs.writeFileSync(lockPath, 'success'); + } + if (this.initJudge == 'db') { + const repository = this.defaultDataSource.getRepository( + metadatas['base_sys_conf'] + ); + if (this.ormConfig.default.type == 'postgres') { + await repository.save( + repository.create({ + cKey: `init_menu_${module}`, + cValue: 'success', + }) + ); + } else { + await repository.insert({ + cKey: `init_menu_${module}`, + cValue: 'success', + }); + } + } + } +} diff --git a/core/src/rest/eps.ts b/core/src/rest/eps.ts new file mode 100644 index 0000000..cd7d59f --- /dev/null +++ b/core/src/rest/eps.ts @@ -0,0 +1,167 @@ +import { + CONTROLLER_KEY, + getClassMetadata, + listModule, + Provide, +} from '@midwayjs/core'; +import * as _ from 'lodash'; +import { + Scope, + ScopeEnum, + Config, + Inject, + MidwayWebRouterService, +} from '@midwayjs/core'; +import { TypeORMDataSourceManager } from '@midwayjs/typeorm'; +import { CoolUrlTagData } from '../tag/data'; +import { TagTypes } from '../decorator/tag'; + +/** + * 实体路径 + */ +@Provide() +@Scope(ScopeEnum.Singleton) +export class CoolEps { + admin = {}; + + app = {}; + + module = {}; + + @Inject() + midwayWebRouterService: MidwayWebRouterService; + + @Inject() + typeORMDataSourceManager: TypeORMDataSourceManager; + + @Config('cool.eps') + epsConfig: boolean; + + @Config('module') + moduleConfig: any; + + @Inject() + coolUrlTagData: CoolUrlTagData; + + // @Init() + async init() { + if (!this.epsConfig) return; + const entitys = await this.entity(); + const controllers = await this.controller(); + const routers = await this.router(); + await this.modules(); + const adminArr = []; + const appArr = []; + for (const controller of controllers) { + const { prefix, module, curdOption, routerOptions } = controller; + const name = curdOption?.entity?.name; + (_.startsWith(prefix, '/admin/') ? adminArr : appArr).push({ + module, + info: { + type: { + name: prefix.split('/').pop(), + description: routerOptions?.description || '', + }, + }, + api: routers[prefix], + name, + columns: entitys[name] || [], + prefix, + }); + } + this.admin = _.groupBy(adminArr, 'module'); + this.app = _.groupBy(appArr, 'module'); + } + + /** + * 模块信息 + * @param module + */ + async modules(module?: string) { + for (const key in this.moduleConfig) { + const config = this.moduleConfig[key]; + this.module[key] = { + name: config.name, + description: config.description, + }; + } + return module ? this.module[module] : this.module; + } + + /** + * 所有controller + * @returns + */ + async controller() { + const result = []; + const controllers = listModule(CONTROLLER_KEY); + for (const controller of controllers) { + result.push(getClassMetadata(CONTROLLER_KEY, controller)); + } + return result; + } + + /** + * 所有路由 + * @returns + */ + async router() { + let ignoreUrls: string[] = this.coolUrlTagData.byKey(TagTypes.IGNORE_TOKEN); + if (_.isEmpty(ignoreUrls)) { + ignoreUrls = []; + } + return _.groupBy( + (await this.midwayWebRouterService.getFlattenRouterTable()).map(item => { + return { + method: item.requestMethod, + path: item.url, + summary: item.summary, + dts: {}, + tag: '', + prefix: item.prefix, + ignoreToken: ignoreUrls.includes(item.prefix + item.url), + }; + }), + 'prefix' + ); + } + + /** + * 所有实体 + * @returns + */ + async entity() { + const result = {}; + const dataSourceNames = this.typeORMDataSourceManager.getDataSourceNames(); + for (const dataSourceName of dataSourceNames) { + const entityMetadatas = await this.typeORMDataSourceManager.getDataSource( + dataSourceName + ).entityMetadatas; + for (const entityMetadata of entityMetadatas) { + const commColums = []; + let columns = entityMetadata.columns; + if (entityMetadata.tableType != 'regular') continue; + columns = _.filter( + columns.map(e => { + return { + propertyName: e.propertyName, + type: + typeof e.type === 'string' ? e.type : e.type.name.toLowerCase(), + length: e.length, + comment: e.comment, + nullable: e.isNullable, + }; + }), + o => { + if (['createTime', 'updateTime'].includes(o.propertyName)) { + commColums.push(o); + } + return o && !['createTime', 'updateTime'].includes(o.propertyName); + } + ).concat(commColums); + result[entityMetadata.name] = columns; + } + } + return result; + } +} diff --git a/core/src/service/base.ts b/core/src/service/base.ts new file mode 100644 index 0000000..5961c81 --- /dev/null +++ b/core/src/service/base.ts @@ -0,0 +1,287 @@ +import { App, Config, Init, Inject, Provide } from '@midwayjs/core'; +import { Scope, ScopeEnum } from '@midwayjs/core'; +import { BaseMysqlService } from './mysql'; +import { BasePgService } from './postgres'; +import { CoolValidateException } from '../exception/validate'; +import { ERRINFO } from '../constant/global'; +import { Application, Context } from '@midwayjs/koa'; +import { TypeORMDataSourceManager } from '@midwayjs/typeorm'; +import { Repository, SelectQueryBuilder } from 'typeorm'; +import { QueryOp } from '../decorator/controller'; +import * as _ from 'lodash'; +import { CoolEventManager } from '../event'; +import { CoolCoreException } from '../exception/core'; +import { BaseSqliteService } from './sqlite'; + +/** + * 服务基类 + */ +@Provide() +@Scope(ScopeEnum.Request, { allowDowngrade: true }) +export abstract class BaseService { + // mysql的基类 + @Inject() + baseMysqlService: BaseMysqlService; + + // postgres的基类 + @Inject() + basePgService: BasePgService; + + @Inject() + baseSqliteService: BaseSqliteService; + + // 数据库类型 + @Config('typeorm.dataSource.default.type') + ormType; + + // 当前服务名称 + service: BaseMysqlService | BasePgService | BaseSqliteService; + + // 模型 + protected entity: Repository; + + protected sqlParams; + + @Inject() + typeORMDataSourceManager: TypeORMDataSourceManager; + + @Inject() + coolEventManager: CoolEventManager; + + @Inject('ctx') + baseCtx: Context; + + @App() + baseApp: Application; + + @Init() + async init() { + const services = { + mysql: this.baseMysqlService, + mariadb: this.baseMysqlService, + postgres: this.basePgService, + sqlite: this.baseSqliteService, + }; + this.service = services[this.ormType]; + if (!this.service) throw new CoolCoreException('暂不支持当前数据库类型'); + this.sqlParams = this.service.sqlParams; + await this.service.init(); + } + + // 设置模型 + setEntity(entity: any) { + this.entity = entity; + this.service.setEntity(entity); + } + + // 设置请求上下文 + setCtx(ctx: Context) { + this.baseCtx = ctx; + this.service.setCtx(ctx); + } + + // 设置应用对象 + setApp(app: Application) { + this.baseApp = app; + this.service.setApp(app); + } + + /** + * 设置sql + * @param condition 条件是否成立 + * @param sql sql语句 + * @param params 参数 + */ + setSql(condition, sql, params) { + return this.service.setSql(condition, sql, params); + } + + /** + * 获得查询个数的SQL + * @param sql + */ + getCountSql(sql) { + return this.service.getCountSql(sql); + } + + /** + * 参数安全性检查 + * @param params + */ + async paramSafetyCheck(params) { + return await this.service.paramSafetyCheck(params); + } + + /** + * 原生查询 + * @param sql + * @param params + * @param connectionName + */ + async nativeQuery(sql, params?, connectionName?) { + return await this.service.nativeQuery(sql, params, connectionName); + } + + /** + * 获得ORM管理 + * @param connectionName 连接名称 + */ + getOrmManager(connectionName = 'default') { + return this.service.getOrmManager(connectionName); + } + + /** + * 操作entity获得分页数据,不用写sql + * @param find QueryBuilder + * @param query + * @param autoSort + * @param connectionName + */ + async entityRenderPage( + find: SelectQueryBuilder, + query, + autoSort = true + ) { + return await this.service.entityRenderPage(find, query, autoSort); + } + + /** + * 执行SQL并获得分页数据 + * @param sql 执行的sql语句 + * @param query 分页查询条件 + * @param autoSort 是否自动排序 + * @param connectionName 连接名称 + */ + async sqlRenderPage(sql, query, autoSort = true, connectionName?) { + return await this.service.sqlRenderPage( + sql, + query, + autoSort, + connectionName + ); + } + + /** + * 获得单个ID + * @param id ID + * @param infoIgnoreProperty 忽略返回属性 + */ + async info(id: any, infoIgnoreProperty?: string[]) { + this.service.setEntity(this.entity); + return await this.service.info(id, infoIgnoreProperty); + } + + /** + * 删除 + * @param ids 删除的ID集合 如:[1,2,3] 或者 1,2,3 + */ + async delete(ids: any) { + this.service.setEntity(this.entity); + await this.modifyBefore(ids, 'delete'); + await this.service.delete(ids); + await this.modifyAfter(ids, 'delete'); + } + + /** + * 软删除 + * @param ids 删除的ID数组 + * @param entity 实体 + */ + async softDelete(ids: number[], entity?: Repository) { + this.service.setEntity(this.entity); + await this.service.softDelete(ids, entity); + } + + /** + * 修改 + * @param param 数据 + */ + async update(param: any) { + this.service.setEntity(this.entity); + if (!this.entity) throw new CoolValidateException(ERRINFO.NOENTITY); + if (!param.id && !(param instanceof Array)) + throw new CoolValidateException(ERRINFO.NOID); + await this.addOrUpdate(param, 'update'); + } + + /** + * 新增 + * @param param 数据 + */ + async add(param: any | any[]): Promise { + if (!this.entity) throw new CoolValidateException(ERRINFO.NOENTITY); + delete param.id; + await this.addOrUpdate(param, 'add'); + return { + id: + param instanceof Array + ? param.map(e => { + return e.id ? e.id : e._id; + }) + : param.id + ? param.id + : param._id, + }; + } + + /** + * 新增|修改 + * @param param 数据 + */ + async addOrUpdate(param: any | any[], type: 'add' | 'update' = 'add') { + this.service.setEntity(this.entity); + await this.modifyBefore(param, type); + await this.service.addOrUpdate(param, type); + await this.modifyAfter(param, type); + } + + /** + * 非分页查询 + * @param query 查询条件 + * @param option 查询配置 + * @param connectionName 连接名 + */ + async list(query, option, connectionName?): Promise { + this.service.setEntity(this.entity); + return await this.service.list(query, option, connectionName); + } + + /** + * 分页查询 + * @param query 查询条件 + * @param option 查询配置 + * @param connectionName 连接名 + */ + async page(query, option, connectionName?) { + this.service.setEntity(this.entity); + return await this.service.page(query, option, connectionName); + } + + /** + * 构建查询配置 + * @param query 前端查询 + * @param option + */ + async getOptionFind(query, option: QueryOp) { + this.service.setEntity(this.entity); + return await this.service.getOptionFind(query, option); + } + + /** + * 新增|修改|删除 之后的操作 + * @param data 对应数据 + */ + async modifyAfter( + data: any, + type: 'delete' | 'update' | 'add' + ): Promise {} + + /** + * 新增|修改|删除 之前的操作 + * @param data 对应数据 + */ + async modifyBefore( + data: any, + type: 'delete' | 'update' | 'add' + ): Promise {} +} diff --git a/core/src/service/book.service.ts b/core/src/service/book.service.ts deleted file mode 100644 index 5922543..0000000 --- a/core/src/service/book.service.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Provide } from '@midwayjs/core'; - -@Provide() -export class BookService { - async getBookById() { - return 'hello world'; - } -} diff --git a/core/src/service/mysql.ts b/core/src/service/mysql.ts new file mode 100644 index 0000000..60b004b --- /dev/null +++ b/core/src/service/mysql.ts @@ -0,0 +1,499 @@ +import { Init, Provide, Inject, App, Config } from '@midwayjs/core'; +import { Scope, ScopeEnum } from '@midwayjs/core'; +import { CoolValidateException } from '../exception/validate'; +import { ERRINFO, EVENT } from '../constant/global'; +import { Application, Context } from '@midwayjs/koa'; +import * as SqlString from 'sqlstring'; +import { CoolConfig } from '../interface'; +import { TypeORMDataSourceManager } from '@midwayjs/typeorm'; +import { Brackets, Equal, In, Repository, SelectQueryBuilder } from 'typeorm'; +import { QueryOp } from '../decorator/controller'; +import * as _ from 'lodash'; +import { CoolEventManager } from '../event'; + +/** + * 服务基类 + */ +@Provide() +@Scope(ScopeEnum.Request, { allowDowngrade: true }) +export abstract class BaseMysqlService { + // 分页配置 + @Config('cool') + private _coolConfig: CoolConfig; + + // 模型 + entity: Repository; + + sqlParams; + + @Inject() + typeORMDataSourceManager: TypeORMDataSourceManager; + + @Inject() + coolEventManager: CoolEventManager; + + // 设置模型 + setEntity(entity: any) { + this.entity = entity; + } + + // 设置请求上下文 + setCtx(ctx: Context) { + this.baseCtx = ctx; + } + + @App() + baseApp: Application; + + // 设置应用对象 + setApp(app: Application) { + this.baseApp = app; + } + + @Inject('ctx') + baseCtx: Context; + + // 初始化 + @Init() + init() { + this.sqlParams = []; + } + + /** + * 设置sql + * @param condition 条件是否成立 + * @param sql sql语句 + * @param params 参数 + */ + setSql(condition, sql, params) { + let rSql = false; + if (condition || condition === 0) { + rSql = true; + this.sqlParams = this.sqlParams.concat(params); + } + return rSql ? sql : ''; + } + + /** + * 获得查询个数的SQL + * @param sql + */ + getCountSql(sql) { + sql = sql + .replace(new RegExp('LIMIT', 'gm'), 'limit ') + .replace(new RegExp('\n', 'gm'), ' '); + if (sql.includes('limit')) { + const sqlArr = sql.split('limit '); + sqlArr.pop(); + sql = sqlArr.join('limit '); + } + return `select count(*) as count from (${sql}) a`; + } + + /** + * 参数安全性检查 + * @param params + */ + async paramSafetyCheck(params) { + const lp = params.toLowerCase(); + return !( + lp.indexOf('update ') > -1 || + lp.indexOf('select ') > -1 || + lp.indexOf('delete ') > -1 || + lp.indexOf('insert ') > -1 + ); + } + + /** + * 原生查询 + * @param sql + * @param params + * @param connectionName + */ + async nativeQuery(sql, params?, connectionName?) { + if (_.isEmpty(params)) { + params = this.sqlParams; + } + let newParams = []; + newParams = newParams.concat(params); + this.sqlParams = []; + for (const param of newParams) { + SqlString.escape(param); + } + return await this.getOrmManager(connectionName).query(sql, newParams || []); + } + + /** + * 获得ORM管理 + * @param connectionName 连接名称 + */ + getOrmManager(connectionName = 'default') { + return this.typeORMDataSourceManager.getDataSource(connectionName); + } + + /** + * 操作entity获得分页数据,不用写sql + * @param find QueryBuilder + * @param query + * @param autoSort + * @param connectionName + */ + async entityRenderPage( + find: SelectQueryBuilder, + query, + autoSort = true + ) { + const { + size = this._coolConfig.crud.pageSize, + page = 1, + order = 'createTime', + sort = 'desc', + isExport = false, + maxExportLimit, + } = query; + const count = await find.getCount(); + let dataFind: SelectQueryBuilder; + if (isExport && maxExportLimit > 0) { + dataFind = find.limit(maxExportLimit); + } else { + dataFind = find.offset((page - 1) * size).limit(size); + } + if (autoSort) { + find.addOrderBy(order, sort.toUpperCase()); + } + return { + list: await dataFind.getMany(), + pagination: { + page: parseInt(page), + size: parseInt(size), + total: count, + }, + }; + } + + /** + * 执行SQL并获得分页数据 + * @param sql 执行的sql语句 + * @param query 分页查询条件 + * @param autoSort 是否自动排序 + * @param connectionName 连接名称 + */ + async sqlRenderPage(sql, query, autoSort = true, connectionName?) { + const { + size = this._coolConfig.crud.pageSize, + page = 1, + order = 'createTime', + sort = 'desc', + isExport = false, + maxExportLimit, + } = query; + if (order && sort && autoSort) { + if (!(await this.paramSafetyCheck(order + sort))) { + throw new CoolValidateException('非法传参~'); + } + sql += ` ORDER BY ${SqlString.escapeId(order)} ${this.checkSort(sort)}`; + } + if (isExport && maxExportLimit > 0) { + this.sqlParams.push(parseInt(maxExportLimit)); + sql += ' LIMIT ? '; + } + if (!isExport) { + this.sqlParams.push((page - 1) * size); + this.sqlParams.push(parseInt(size)); + sql += ' LIMIT ?,? '; + } + + let params = []; + params = params.concat(this.sqlParams); + const result = await this.nativeQuery(sql, params, connectionName); + const countResult = await this.nativeQuery( + this.getCountSql(sql), + params, + connectionName + ); + return { + list: result, + pagination: { + page: parseInt(page), + size: parseInt(size), + total: parseInt(countResult[0] ? countResult[0].count : 0), + }, + }; + } + + /** + * 检查排序 + * @param sort 排序 + * @returns + */ + checkSort(sort) { + if (!['desc', 'asc'].includes(sort.toLowerCase())) { + throw new CoolValidateException('sort 非法传参~'); + } + return sort; + } + + /** + * 获得单个ID + * @param id ID + * @param infoIgnoreProperty 忽略返回属性 + */ + async info(id: any, infoIgnoreProperty?: string[]) { + if (!this.entity) throw new CoolValidateException(ERRINFO.NOENTITY); + if (!id) { + throw new CoolValidateException(ERRINFO.NOID); + } + const info = await this.entity.findOneBy({ id: Equal(id) }); + if (info && infoIgnoreProperty) { + for (const property of infoIgnoreProperty) { + delete info[property]; + } + } + return info; + } + + /** + * 删除 + * @param ids 删除的ID集合 如:[1,2,3] 或者 1,2,3 + */ + async delete(ids: any) { + if (!this.entity) throw new CoolValidateException(ERRINFO.NOENTITY); + if (ids instanceof String) { + ids = ids.split(','); + } + // 启动软删除发送事件 + if (this._coolConfig.crud?.softDelete) { + this.softDelete(ids); + } + await this.entity.delete(ids); + } + + /** + * 软删除 + * @param ids 删除的ID数组 + * @param entity 实体 + */ + async softDelete(ids: number[], entity?: Repository) { + const data = await this.entity.find({ + where: { + id: In(ids), + }, + }); + if (_.isEmpty(data)) return; + const _entity = entity ? entity : this.entity; + const params = { + data, + ctx: this.baseCtx, + entity: _entity, + }; + if (data.length > 0) { + this.coolEventManager.emit(EVENT.SOFT_DELETE, params); + } + } + + /** + * 新增|修改 + * @param param 数据 + */ + async addOrUpdate(param: any | any[], type: 'add' | 'update' = 'add') { + if (!this.entity) throw new CoolValidateException(ERRINFO.NOENTITY); + delete param.createTime; + // 判断是否是批量操作 + if (param instanceof Array) { + param.forEach(item => { + item.updateTime = new Date(); + item.createTime = new Date(); + }); + await this.entity.save(param); + } else { + const upsert = this._coolConfig.crud?.upsert || 'normal'; + if (type == 'update') { + if (upsert == 'save') { + const info = await this.entity.findOneBy({ id: param.id }); + param = { + ...info, + ...param, + }; + } + param.updateTime = new Date(); + upsert == 'normal' + ? await this.entity.update(param.id, param) + : await this.entity.save(param); + } + if (type == 'add') { + param.createTime = new Date(); + param.updateTime = new Date(); + upsert == 'normal' + ? await this.entity.insert(param) + : await this.entity.save(param); + } + } + } + + /** + * 非分页查询 + * @param query 查询条件 + * @param option 查询配置 + * @param connectionName 连接名 + */ + async list(query, option, connectionName?): Promise { + if (!this.entity) throw new CoolValidateException(ERRINFO.NOENTITY); + const sql = await this.getOptionFind(query, option); + return this.nativeQuery(sql, [], connectionName); + } + + /** + * 分页查询 + * @param query 查询条件 + * @param option 查询配置 + * @param connectionName 连接名 + */ + async page(query, option, connectionName?) { + if (!this.entity) throw new CoolValidateException(ERRINFO.NOENTITY); + const sql = await this.getOptionFind(query, option); + return this.sqlRenderPage(sql, query, false, connectionName); + } + + /** + * 构建查询配置 + * @param query 前端查询 + * @param option + */ + async getOptionFind(query, option: QueryOp) { + let { order = 'createTime', sort = 'desc', keyWord = '' } = query; + const sqlArr = ['SELECT']; + const selects = ['a.*']; + const find = this.entity.createQueryBuilder('a'); + if (option) { + if (typeof option === 'function') { + // @ts-ignore + option = await option(this.baseCtx, this.baseApp); + } + // 判断是否有关联查询,有的话取个别名 + if (!_.isEmpty(option.join)) { + for (const item of option.join) { + selects.push(`${item.alias}.*`); + find[item.type || 'leftJoin']( + item.entity, + item.alias, + item.condition + ); + } + } + // 默认条件 + if (option.where) { + const wheres = + typeof option.where === 'function' + ? await option.where(this.baseCtx, this.baseApp) + : option.where; + if (!_.isEmpty(wheres)) { + for (const item of wheres) { + if ( + item.length == 2 || + (item.length == 3 && (item[2] || item[2] === 0)) + ) { + for (const key in item[1]) { + this.sqlParams.push(item[1][key]); + } + find.andWhere(item[0], item[1]); + } + } + } + } + // 附加排序 + if (!_.isEmpty(option.addOrderBy)) { + for (const key in option.addOrderBy) { + if (order && order == key) { + sort = option.addOrderBy[key].toUpperCase(); + } + find.addOrderBy( + SqlString.escapeId(key), + this.checkSort(option.addOrderBy[key].toUpperCase()) + ); + } + } + // 关键字模糊搜索 + if (keyWord || keyWord === 0) { + keyWord = `%${keyWord}%`; + find.andWhere( + new Brackets(qb => { + const keyWordLikeFields = option.keyWordLikeFields || []; + for (let i = 0; i < option.keyWordLikeFields?.length || 0; i++) { + qb.orWhere(`${keyWordLikeFields[i]} like :keyWord`, { + keyWord, + }); + this.sqlParams.push(keyWord); + } + }) + ); + } + // 筛选字段 + if (!_.isEmpty(option.select)) { + sqlArr.push(option.select.join(',')); + find.select(option.select); + } else { + sqlArr.push(selects.join(',')); + } + // 字段全匹配 + if (!_.isEmpty(option.fieldEq)) { + for (let key of option.fieldEq) { + const c = {}; + // 如果key有包含.的情况下操作 + if (typeof key === 'string' && key.includes('.')) { + const keys = key.split('.'); + const lastKey = keys.pop(); + key = { requestParam: lastKey, column: key }; + } + // 单表字段无别名的情况下操作 + if (typeof key === 'string') { + if (query[key] || query[key] === 0) { + c[key] = query[key]; + const eq = query[key] instanceof Array ? 'in' : '='; + if (eq === 'in') { + find.andWhere(`${key} ${eq} (:${key})`, c); + } else { + find.andWhere(`${key} ${eq} :${key}`, c); + } + this.sqlParams.push(query[key]); + } + } else { + if (query[key.requestParam] || query[key.requestParam] === 0) { + c[key.column] = query[key.requestParam]; + const eq = query[key.requestParam] instanceof Array ? 'in' : '='; + if (eq === 'in') { + find.andWhere(`${key.column} ${eq} (:${key.column})`, c); + } else { + find.andWhere(`${key.column} ${eq} :${key.column}`, c); + } + this.sqlParams.push(query[key.requestParam]); + } + } + } + } + } else { + sqlArr.push(selects.join(',')); + } + // 接口请求的排序 + if (sort && order) { + const sorts = sort.toUpperCase().split(','); + const orders = order.split(','); + if (sorts.length != orders.length) { + throw new CoolValidateException(ERRINFO.SORTFIELD); + } + for (const i in sorts) { + find.addOrderBy( + SqlString.escapeId(orders[i]), + this.checkSort(sorts[i]) + ); + } + } + if (option?.extend) { + await option?.extend(find, this.baseCtx, this.baseApp); + } + const sqls = find.getSql().split('FROM'); + sqlArr.push('FROM'); + // 取sqls的最后一个 + sqlArr.push(sqls[sqls.length - 1]); + return sqlArr.join(' '); + } +} diff --git a/core/src/service/postgres.ts b/core/src/service/postgres.ts new file mode 100644 index 0000000..2d7f726 --- /dev/null +++ b/core/src/service/postgres.ts @@ -0,0 +1,639 @@ +import { Init, Provide, Inject, App, Config } from '@midwayjs/core'; +import { CoolValidateException } from '../exception/validate'; +import { ERRINFO, EVENT } from '../constant/global'; +import { Application, Context } from '@midwayjs/koa'; +import { Scope, ScopeEnum } from '@midwayjs/core'; +import { CoolConfig } from '../interface'; +import { TypeORMDataSourceManager } from '@midwayjs/typeorm'; +import { Brackets, In, Repository, SelectQueryBuilder } from 'typeorm'; +import { QueryOp } from '../decorator/controller'; +import * as _ from 'lodash'; +import { CoolEventManager } from '../event'; + +/** + * 服务基类 + */ +@Provide() +@Scope(ScopeEnum.Request, { allowDowngrade: true }) +export abstract class BasePgService { + // 分页配置 + @Config('cool') + private _coolConfig: CoolConfig; + + // 模型 + entity: Repository; + + sqlParams; + + @Inject() + typeORMDataSourceManager: TypeORMDataSourceManager; + + @Inject() + coolEventManager: CoolEventManager; + + // 设置模型 + setEntity(entity: any) { + this.entity = entity; + } + + // 设置请求上下文 + setCtx(ctx: Context) { + this.baseCtx = ctx; + } + + @App() + baseApp: Application; + + // 设置应用对象 + setApp(app: Application) { + this.baseApp = app; + } + + @Inject('ctx') + baseCtx: Context; + + // 初始化 + @Init() + init() { + this.sqlParams = []; + } + + /** + * 设置sql + * @param condition 条件是否成立 + * @param sql sql语句 + * @param params 参数 + */ + setSql(condition, sql, params) { + let rSql = false; + if (condition || condition === 0) { + rSql = true; + for (let i = 0; i < params.length; i++) { + const param = params[i]; + if (param instanceof Array) { + // 将这个? 替换成 $1,$2,$3 + const replaceStr = []; + for (let j = 0; j < param.length; j++) { + replaceStr.push('$' + (this.sqlParams.length + j + 1)); + } + this.sqlParams = this.sqlParams.concat(...params); + sql = sql.replace('?', replaceStr.join(',')); + } else { + sql = sql.replace('?', '$' + (this.sqlParams.length + 1)); + this.sqlParams.push(param); + } + } + } + return rSql ? sql : ''; + } + + /** + * 获得查询个数的SQL + * @param sql + */ + getCountSql(sql) { + sql = sql + .replace(new RegExp('LIMIT', 'gm'), 'limit ') + .replace(new RegExp('\n', 'gm'), ' '); + if (sql.includes('limit')) { + const sqlArr = sql.split('limit '); + sqlArr.pop(); + sql = sqlArr.join('limit '); + } + return `select count(*) as count from (${sql}) a`; + } + + /** + * 参数安全性检查 + * @param params + */ + async paramSafetyCheck(params) { + const lp = params.toLowerCase(); + return !( + lp.indexOf('update ') > -1 || + lp.indexOf('select ') > -1 || + lp.indexOf('delete ') > -1 || + lp.indexOf('insert ') > -1 + ); + } + + /** + * 原生查询 + * @param sql + * @param params + * @param connectionName + */ + async nativeQuery(sql, params?, connectionName?) { + sql = this.convertToPostgres(sql); + if (_.isEmpty(params)) { + params = this.sqlParams; + } + let newParams = []; + // sql没处理过?的情况下 + if (sql.includes('?')) { + for (const item of params) { + // 如果是数组,将这个? 替换成 $1,$2,$3 + if (item instanceof Array) { + const replaceStr = []; + for (let i = 0; i < item.length; i++) { + replaceStr.push('$' + (newParams.length + i + 1)); + } + newParams.push(...item); + sql = sql.replace('?', replaceStr.join(',')); + } else { + sql = sql.replace('?', '$' + (newParams.length + 1)); + newParams.push(item); + } + } + } else { + newParams = params; + } + this.sqlParams = []; + return await this.getOrmManager(connectionName).query(sql, newParams || []); + } + + /** + * 获得ORM管理 + * @param connectionName 连接名称 + */ + getOrmManager(connectionName = 'default') { + return this.typeORMDataSourceManager.getDataSource(connectionName); + } + + /** + * 操作entity获得分页数据,不用写sql + * @param find QueryBuilder + * @param query + * @param autoSort + * @param connectionName + */ + async entityRenderPage( + find: SelectQueryBuilder, + query, + autoSort = true + ) { + const { + size = this._coolConfig.crud.pageSize, + page = 1, + order = 'createTime', + sort = 'desc', + isExport = false, + maxExportLimit, + } = query; + const count = await find.getCount(); + let dataFind: SelectQueryBuilder; + if (isExport && maxExportLimit > 0) { + dataFind = find.limit(maxExportLimit); + } else { + dataFind = find.offset((page - 1) * size).limit(size); + } + if (autoSort) { + find.addOrderBy(order, sort.toUpperCase()); + } + return { + list: await dataFind.getMany(), + pagination: { + page: parseInt(page), + size: parseInt(size), + total: count, + }, + }; + } + + /** + * 将mysql语句转换为postgres语句 + * @param sql + * @returns + */ + protected convertToPostgres(sql) { + // 首先确保表名被正确引用 + sql = sql.replace(/(? 0) { + this.sqlParams.push(parseInt(maxExportLimit)); + cutParams = 1; + sql += ` LIMIT $${paramCount + 1}`; + } + if (!isExport) { + this.sqlParams.push(parseInt(size)); + this.sqlParams.push((page - 1) * size); + cutParams = 2; + sql += ` LIMIT $${paramCount + 1} OFFSET $${paramCount + 2}`; + } + let params = []; + params = params.concat(this.sqlParams); + const result = await this.nativeQuery(sql, params, connectionName); + params = params.slice(0, -cutParams); + const countResult = await this.nativeQuery( + this.getCountSql(sql), + params, + connectionName + ); + return { + list: result, + pagination: { + page: parseInt(page), + size: parseInt(size), + total: parseInt(countResult[0] ? countResult[0].count : 0), + }, + }; + } + + /** + * 检查排序 + * @param sort 排序 + * @returns + */ + checkSort(sort) { + if (!['desc', 'asc'].includes(sort.toLowerCase())) { + throw new CoolValidateException('sort 非法传参~'); + } + return sort; + } + + /** + * 获得单个ID + * @param id ID + * @param infoIgnoreProperty 忽略返回属性 + */ + async info(id: any, infoIgnoreProperty?: string[]) { + if (!this.entity) throw new CoolValidateException(ERRINFO.NOENTITY); + if (!id) { + throw new CoolValidateException(ERRINFO.NOID); + } + const info = await this.entity.findOneBy({ id }); + if (info && infoIgnoreProperty) { + for (const property of infoIgnoreProperty) { + delete info[property]; + } + } + return info; + } + + /** + * 删除 + * @param ids 删除的ID集合 如:[1,2,3] 或者 1,2,3 + */ + async delete(ids: any) { + if (!this.entity) throw new CoolValidateException(ERRINFO.NOENTITY); + if (ids instanceof String) { + ids = ids.split(','); + } + // 启动软删除发送事件 + if (this._coolConfig.crud?.softDelete) { + this.softDelete(ids); + } + await this.entity.delete(ids); + } + + /** + * 软删除 + * @param ids 删除的ID数组 + * @param entity 实体 + */ + async softDelete(ids: number[], entity?: Repository) { + const data = await this.entity.find({ + where: { + id: In(ids), + }, + }); + if (_.isEmpty(data)) return; + const _entity = entity ? entity : this.entity; + const params = { + data, + ctx: this.baseCtx, + entity: _entity, + }; + if (data.length > 0) { + this.coolEventManager.emit(EVENT.SOFT_DELETE, params); + } + } + + /** + * 新增|修改 + * @param param 数据 + */ + async addOrUpdate(param: any | any[], type: 'add' | 'update' = 'add') { + if (!this.entity) throw new CoolValidateException(ERRINFO.NOENTITY); + delete param.createTime; + // 判断是否是批量操作 + if (param instanceof Array) { + param.forEach(item => { + item.updateTime = new Date(); + item.createTime = new Date(); + }); + await this.entity.save(param); + } else { + const upsert = this._coolConfig.crud?.upsert || 'normal'; + if (type == 'update') { + if (upsert == 'save') { + const info = await this.entity.findOneBy({ id: param.id }); + param = { + ...info, + ...param, + }; + } + param.updateTime = new Date(); + upsert == 'normal' + ? await this.entity.update(param.id, param) + : await this.entity.save(param); + } + if (type == 'add') { + param.createTime = new Date(); + param.updateTime = new Date(); + upsert == 'normal' + ? await this.entity.insert(param) + : await this.entity.save(param); + } + } + } + + /** + * 非分页查询 + * @param query 查询条件 + * @param option 查询配置 + * @param connectionName 连接名 + */ + async list(query, option, connectionName?): Promise { + if (!this.entity) throw new CoolValidateException(ERRINFO.NOENTITY); + const sql = await this.getOptionFind(query, option); + return this.nativeQuery(sql, [], connectionName); + } + + /** + * 分页查询 + * @param query 查询条件 + * @param option 查询配置 + * @param connectionName 连接名 + */ + async page(query, option, connectionName?) { + if (!this.entity) throw new CoolValidateException(ERRINFO.NOENTITY); + const sql = await this.getOptionFind(query, option); + return this.sqlRenderPage(sql, query, false, connectionName); + } + + /** + * 构建查询配置 + * @param query 前端查询 + * @param option + */ + async getOptionFind(query, option: QueryOp) { + let { order = 'createTime', sort = 'desc', keyWord = '' } = query; + const sqlArr = ['SELECT']; + const selects = ['a.*']; + const find = this.entity.createQueryBuilder('a'); + if (option) { + if (typeof option === 'function') { + // @ts-ignore + option = await option(this.baseCtx, this.baseApp); + } + // 判断是否有关联查询,有的话取个别名 + if (!_.isEmpty(option.join)) { + for (const item of option.join) { + selects.push(`${item.alias}.*`); + find[item.type || 'leftJoin']( + item.entity, + item.alias, + item.condition + ); + } + } + // 默认条件 + if (option.where) { + const wheres = + typeof option.where === 'function' + ? await option.where(this.baseCtx, this.baseApp) + : option.where; + if (!_.isEmpty(wheres)) { + for (const item of wheres) { + if ( + item.length == 2 || + (item.length == 3 && (item[2] || item[2] === 0)) + ) { + for (const key in item[1]) { + this.sqlParams.push(item[1][key]); + } + find.andWhere(item[0], item[1]); + } + } + } + } + // 附加排序 + if (!_.isEmpty(option.addOrderBy)) { + for (const key in option.addOrderBy) { + if (order && order == key) { + sort = option.addOrderBy[key].toUpperCase(); + } + find.addOrderBy( + `${this.matchColumn(option?.select, key)}.${key}`, + this.checkSort(option.addOrderBy[key].toUpperCase()) + ); + } + } + // 关键字模糊搜索 + if (keyWord || keyWord == 0) { + keyWord = `%${keyWord}%`; + find.andWhere( + new Brackets(qb => { + const keyWordLikeFields = option.keyWordLikeFields || []; + for (let i = 0; i < option.keyWordLikeFields?.length || 0; i++) { + let column = keyWordLikeFields[i]; + column = column.includes('.') ? column : `a.${column}`; + const values = {}; + values[`keyWord${i}`] = keyWord; + qb.orWhere(`${column} like :keyWord${i}`, values); + this.sqlParams.push(keyWord); + } + }) + ); + } + // 筛选字段 + if (!_.isEmpty(option.select)) { + sqlArr.push(option.select.join(',')); + find.select(option.select); + } else { + sqlArr.push(selects.join(',')); + } + // 字段全匹配 + if (!_.isEmpty(option.fieldEq)) { + for (let key of option.fieldEq) { + const c = {}; + let column; + // 如果key有包含.的情况下操作 + if (typeof key === 'string' && key.includes('.')) { + const keys = key.split('.'); + const lastKey = keys.pop(); + key = { requestParam: lastKey, column: key }; + column = key; + } else { + column = `a.${key}`; + } + // 单表字段无别名的情况下操作 + if (typeof key === 'string') { + if (query[key] || query[key] == 0) { + c[key] = query[key]; + const eq = query[key] instanceof Array ? 'in' : '='; + if (eq === 'in') { + find.andWhere(`${column} ${eq} (:...${key})`, c); + } else { + find.andWhere(`${column} ${eq} :${key}`, c); + } + this.sqlParams.push(query[key]); + } + } else { + if (query[key.requestParam] || query[key.requestParam] == 0) { + c[key.column] = query[key.requestParam]; + const eq = query[key.requestParam] instanceof Array ? 'in' : '='; + if (eq === 'in') { + find.andWhere(`${key.column} ${eq} (:${key.column})`, c); + } else { + find.andWhere(`${key.column} ${eq} :${key.column}`, c); + } + this.sqlParams.push(query[key.requestParam]); + } + } + } + } + } else { + sqlArr.push(selects.join(',')); + } + // 接口请求的排序 + if (sort && order) { + const sorts = sort.toUpperCase().split(','); + const orders = order.split(','); + if (sorts.length != orders.length) { + throw new CoolValidateException(ERRINFO.SORTFIELD); + } + for (const i in sorts) { + find.addOrderBy( + `${this.matchColumn(option?.select, orders[i])}.${orders[i]}`, + this.checkSort(sorts[i]) + ); + } + } + if (option?.extend) { + await option?.extend(find, this.baseCtx, this.baseApp); + } + const sqls = find.getSql().split('FROM'); + sqlArr.push('FROM'); + // 取sqls的最后一个 + sqlArr.push(sqls[sqls.length - 1]); + sqlArr.forEach((item, index) => { + if (item.includes('ORDER BY')) { + sqlArr[index] = this.replaceOrderByPrefix(item); + } + }); + return sqlArr.join(' '); + } + + /** + * 替换sql中的表别名 + * @param sql + * @returns + */ + replaceOrderByPrefix(sql) { + // 使用正则表达式匹配 ORDER BY 后面的部分 + // 这里假设 ORDER BY 后面跟着的是由空格分隔的字段名,且字段名由双引号包围 + const orderByRegex = + /ORDER BY\s+("[^"]+_[^"]+")(\s*(ASC|DESC)?\s*(,\s*"[^"]+_[^"]+")*)/gi; + + // 定义替换函数 + // @ts-ignore + function replaceMatch(match, p1, p2) { + // 将 p1 中的 "a_" 替换为 "a." + const replacedField = p1.replace(/a_([^"]+)/g, 'a.$1'); + // 如果有其他字段,递归调用替换函数 + const replacedRest = p2.replace(/("[^"]+_)/g, (m, p) => + p.replace('a_', 'a.') + ); + // 组合替换后的字段和其他部分 + return `ORDER BY ${replacedField.replace(/"/g, '')}${replacedRest.replace( + /"/g, + '' + )}`; + } + + // 使用替换函数替换匹配到的内容 + const replacedOrderBySql = sql.replace(orderByRegex, replaceMatch); + + // 移除所有双引号 + const sqlWithoutQuotes = replacedOrderBySql.replace(/"/g, ''); + + return sqlWithoutQuotes; + } + + /** + * 筛选的字段匹配 + * @param select 筛选的字段 + * @param field 字段 + * @returns 字段在哪个表中 + */ + protected matchColumn(select: string[] = [], field: string) { + for (const column of select) { + // 检查字段是否有别名,考虑 'AS' 关键字的不同大小写形式 + const aliasPattern = new RegExp(`\\b\\w+\\s+as\\s+${field}\\b`, 'i'); + const aliasMatch = column.match(aliasPattern); + if (aliasMatch) { + // 提取别名前的字段和表名 + const fieldPattern = new RegExp( + `(\\w+)\\.(\\w+)\\s+as\\s+${field}`, + 'i' + ); + const fieldMatch = column.match(fieldPattern); + if (fieldMatch) { + // 返回匹配到的表名 + return fieldMatch[1]; + } + } + + // 检查字段是否直接在选择列表中 + const fieldPattern = new RegExp(`\\b(\\w+)\\.${field}\\b`, 'i'); + const fieldMatch = column.match(fieldPattern); + if (fieldMatch) { + // 如果直接匹配到字段,返回字段所属的表名 + return fieldMatch[1]; + } + } + + // 如果没有匹配到任何特定的表或别名,返回默认的 'a' 表 + return 'a'; + } +} diff --git a/core/src/service/sqlite.ts b/core/src/service/sqlite.ts new file mode 100644 index 0000000..ef4cb7d --- /dev/null +++ b/core/src/service/sqlite.ts @@ -0,0 +1,532 @@ +import { Init, Provide, Inject, App, Config } from '@midwayjs/core'; +import { Scope, ScopeEnum } from '@midwayjs/core'; +import { CoolValidateException } from '../exception/validate'; +import { ERRINFO, EVENT } from '../constant/global'; +import { Application, Context } from '@midwayjs/koa'; +import * as SqlString from 'sqlstring'; +import { CoolConfig } from '../interface'; +import { TypeORMDataSourceManager } from '@midwayjs/typeorm'; +import { Brackets, In, Repository, SelectQueryBuilder } from 'typeorm'; +import { QueryOp } from '../decorator/controller'; +import * as _ from 'lodash'; +import { CoolEventManager } from '../event'; + +/** + * 服务基类 + */ +@Provide() +@Scope(ScopeEnum.Request, { allowDowngrade: true }) +export abstract class BaseSqliteService { + // 分页配置 + @Config('cool') + private _coolConfig: CoolConfig; + + // 模型 + entity: Repository; + + sqlParams; + + @Inject() + typeORMDataSourceManager: TypeORMDataSourceManager; + + @Inject() + coolEventManager: CoolEventManager; + + // 设置模型 + setEntity(entity: any) { + this.entity = entity; + } + + // 设置请求上下文 + setCtx(ctx: Context) { + this.baseCtx = ctx; + } + + @App() + baseApp: Application; + + // 设置应用对象 + setApp(app: Application) { + this.baseApp = app; + } + + @Inject('ctx') + baseCtx: Context; + + // 初始化 + @Init() + init() { + this.sqlParams = []; + } + + /** + * 设置sql + * @param condition 条件是否成立 + * @param sql sql语句 + * @param params 参数 + */ + setSql(condition, sql, params) { + let rSql = false; + if (condition || condition === 0) { + rSql = true; + for (let i = 0; i < params.length; i++) { + const param = params[i]; + if (param instanceof Array) { + // 将这个? 替换成 $1,$2,$3 + const replaceStr = []; + for (let j = 0; j < param.length; j++) { + replaceStr.push('$' + (this.sqlParams.length + j + 1)); + } + this.sqlParams = this.sqlParams.concat(...params); + sql = sql.replace('?', replaceStr.join(',')); + } else { + sql = sql.replace('?', '$' + (this.sqlParams.length + 1)); + this.sqlParams.push(param); + } + } + } + return (rSql ? sql : '').replace(/\$\d+/g, '?'); + } + + /** + * 获得查询个数的SQL + * @param sql + */ + getCountSql(sql) { + sql = sql + .replace(new RegExp('LIMIT', 'gm'), 'limit ') + .replace(new RegExp('\n', 'gm'), ' '); + if (sql.includes('limit')) { + const sqlArr = sql.split('limit '); + sqlArr.pop(); + sql = sqlArr.join('limit '); + } + return `select count(*) as count from (${sql}) a`; + } + + /** + * 参数安全性检查 + * @param params + */ + async paramSafetyCheck(params) { + const lp = params.toLowerCase(); + return !( + lp.indexOf('update ') > -1 || + lp.indexOf('select ') > -1 || + lp.indexOf('delete ') > -1 || + lp.indexOf('insert ') > -1 + ); + } + + /** + * 原生查询 + * @param sql + * @param params + * @param connectionName + */ + async nativeQuery(sql, params?, connectionName?) { + if (_.isEmpty(params)) { + params = this.sqlParams; + } + const newParams = []; + // sql没处理过?的情况下 + for (const item of params) { + // 如果是数组,将这个? 替换成 $1,$2,$3 + if (item instanceof Array) { + const replaceStr = []; + for (let i = 0; i < item.length; i++) { + replaceStr.push('$' + (newParams.length + i + 1)); + } + newParams.push(...item); + sql = sql.replace('?', replaceStr.join(',')); + } else { + sql = sql.replace('?', '$' + (newParams.length + 1)); + newParams.push(item); + } + } + this.sqlParams = []; + return await this.getOrmManager(connectionName).query( + sql.replace(/\$\d+/g, '?'), + newParams || [] + ); + } + + /** + * 获得ORM管理 + * @param connectionName 连接名称 + */ + getOrmManager(connectionName = 'default') { + return this.typeORMDataSourceManager.getDataSource(connectionName); + } + + /** + * 操作entity获得分页数据,不用写sql + * @param find QueryBuilder + * @param query + * @param autoSort + * @param connectionName + */ + async entityRenderPage( + find: SelectQueryBuilder, + query, + autoSort = true + ) { + const { + size = this._coolConfig.crud.pageSize, + page = 1, + order = 'createTime', + sort = 'desc', + isExport = false, + maxExportLimit, + } = query; + const count = await find.getCount(); + let dataFind: SelectQueryBuilder; + if (isExport && maxExportLimit > 0) { + dataFind = find.limit(maxExportLimit); + } else { + dataFind = find.offset((page - 1) * size).limit(size); + } + if (autoSort) { + find.addOrderBy(order, sort.toUpperCase()); + } + return { + list: await dataFind.getMany(), + pagination: { + page: parseInt(page), + size: parseInt(size), + total: count, + }, + }; + } + + /** + * 执行SQL并获得分页数据 + * @param sql 执行的sql语句 + * @param query 分页查询条件 + * @param autoSort 是否自动排序 + * @param connectionName 连接名称 + */ + async sqlRenderPage(sql, query, autoSort = true, connectionName?) { + const { + size = this._coolConfig.crud.pageSize, + page = 1, + order = 'createTime', + sort = 'desc', + isExport = false, + maxExportLimit, + } = query; + sql = `SELECT * FROM (${sql}) a`; + if (order && sort && autoSort) { + if (!(await this.paramSafetyCheck(order + sort))) { + throw new CoolValidateException('非法传参~'); + } + sql += ` ORDER BY a.${SqlString.escapeId(order)} ${this.checkSort(sort)}`; + } + let cutParams = 0; + if (isExport && maxExportLimit > 0) { + this.sqlParams.push(parseInt(maxExportLimit)); + cutParams = 1; + sql += ' LIMIT ? '; + } + if (!isExport) { + this.sqlParams.push((page - 1) * size); + this.sqlParams.push(parseInt(size)); + cutParams = 2; + sql += ' LIMIT ?,? '; + } + + let params = []; + params = params.concat(this.sqlParams); + const result = await this.nativeQuery(sql, params, connectionName); + params = params.slice(0, -cutParams); + const countResult = await this.nativeQuery( + this.getCountSql(sql), + params, + connectionName + ); + return { + list: result, + pagination: { + page: parseInt(page), + size: parseInt(size), + total: parseInt(countResult[0] ? countResult[0].count : 0), + }, + }; + } + + /** + * 检查排序 + * @param sort 排序 + * @returns + */ + checkSort(sort) { + if (!['desc', 'asc'].includes(sort.toLowerCase())) { + throw new CoolValidateException('sort 非法传参~'); + } + return sort; + } + + /** + * 获得单个ID + * @param id ID + * @param infoIgnoreProperty 忽略返回属性 + */ + async info(id: any, infoIgnoreProperty?: string[]) { + if (!this.entity) throw new CoolValidateException(ERRINFO.NOENTITY); + if (!id) { + throw new CoolValidateException(ERRINFO.NOID); + } + const info = await this.entity.findOneBy({ id }); + if (info && infoIgnoreProperty) { + for (const property of infoIgnoreProperty) { + delete info[property]; + } + } + return info; + } + + /** + * 删除 + * @param ids 删除的ID集合 如:[1,2,3] 或者 1,2,3 + */ + async delete(ids: any) { + if (!this.entity) throw new CoolValidateException(ERRINFO.NOENTITY); + if (ids instanceof String) { + ids = ids.split(','); + } + // 启动软删除发送事件 + if (this._coolConfig.crud?.softDelete) { + this.softDelete(ids); + } + await this.entity.delete(ids); + } + + /** + * 软删除 + * @param ids 删除的ID数组 + * @param entity 实体 + */ + async softDelete(ids: number[], entity?: Repository) { + const data = await this.entity.find({ + where: { + id: In(ids), + }, + }); + if (_.isEmpty(data)) return; + const _entity = entity ? entity : this.entity; + const params = { + data, + ctx: this.baseCtx, + entity: _entity, + }; + if (data.length > 0) { + this.coolEventManager.emit(EVENT.SOFT_DELETE, params); + } + } + + /** + * 新增|修改 + * @param param 数据 + */ + async addOrUpdate(param: any | any[], type: 'add' | 'update' = 'add') { + if (!this.entity) throw new CoolValidateException(ERRINFO.NOENTITY); + delete param.createTime; + // 判断是否是批量操作 + if (param instanceof Array) { + param.forEach(item => { + item.updateTime = new Date(); + item.createTime = new Date(); + }); + await this.entity.save(param); + } else { + const upsert = this._coolConfig.crud?.upsert || 'normal'; + if (type == 'update') { + if (upsert == 'save') { + const info = await this.entity.findOneBy({ id: param.id }); + param = { + ...info, + ...param, + }; + } + param.updateTime = new Date(); + upsert == 'normal' + ? await this.entity.update(param.id, param) + : await this.entity.save(param); + } + if (type == 'add') { + param.createTime = new Date(); + param.updateTime = new Date(); + upsert == 'normal' + ? await this.entity.insert(param) + : await this.entity.save(param); + } + } + } + + /** + * 非分页查询 + * @param query 查询条件 + * @param option 查询配置 + * @param connectionName 连接名 + */ + async list(query, option, connectionName?): Promise { + if (!this.entity) throw new CoolValidateException(ERRINFO.NOENTITY); + const sql = await this.getOptionFind(query, option); + return this.nativeQuery(sql, [], connectionName); + } + + /** + * 分页查询 + * @param query 查询条件 + * @param option 查询配置 + * @param connectionName 连接名 + */ + async page(query, option, connectionName?) { + if (!this.entity) throw new CoolValidateException(ERRINFO.NOENTITY); + const sql = await this.getOptionFind(query, option); + return this.sqlRenderPage(sql, query, false, connectionName); + } + + /** + * 构建查询配置 + * @param query 前端查询 + * @param option + */ + async getOptionFind(query, option: QueryOp) { + let { order = 'createTime', sort = 'desc', keyWord = '' } = query; + const sqlArr = ['SELECT']; + const selects = ['a.*']; + const find = this.entity.createQueryBuilder('a'); + if (option) { + if (typeof option === 'function') { + // @ts-ignore + option = await option(this.baseCtx, this.baseApp); + } + // 判断是否有关联查询,有的话取个别名 + if (!_.isEmpty(option.join)) { + for (const item of option.join) { + selects.push(`${item.alias}.*`); + find[item.type || 'leftJoin']( + item.entity, + item.alias, + item.condition + ); + } + } + // 默认条件 + if (option.where) { + const wheres = + typeof option.where === 'function' + ? await option.where(this.baseCtx, this.baseApp) + : option.where; + if (!_.isEmpty(wheres)) { + for (const item of wheres) { + if ( + item.length == 2 || + (item.length == 3 && (item[2] || item[2] === 0)) + ) { + for (const key in item[1]) { + this.sqlParams.push(item[1][key]); + } + find.andWhere(item[0], item[1]); + } + } + } + } + // 附加排序 + if (!_.isEmpty(option.addOrderBy)) { + for (const key in option.addOrderBy) { + if (order && order == key) { + sort = option.addOrderBy[key].toUpperCase(); + } + find.addOrderBy( + SqlString.escapeId(key), + this.checkSort(option.addOrderBy[key].toUpperCase()) + ); + } + } + // 关键字模糊搜索 + if (keyWord || keyWord === 0) { + keyWord = `%${keyWord}%`; + find.andWhere( + new Brackets(qb => { + const keyWordLikeFields = option.keyWordLikeFields || []; + for (let i = 0; i < option.keyWordLikeFields?.length || 0; i++) { + qb.orWhere(`${keyWordLikeFields[i]} like :keyWord`, { + keyWord, + }); + this.sqlParams.push(keyWord); + } + }) + ); + } + // 筛选字段 + if (!_.isEmpty(option.select)) { + sqlArr.push(option.select.join(',')); + find.select(option.select); + } else { + sqlArr.push(selects.join(',')); + } + // 字段全匹配 + if (!_.isEmpty(option.fieldEq)) { + for (let key of option.fieldEq) { + const c = {}; + // 如果key有包含.的情况下操作 + if (typeof key === 'string' && key.includes('.')) { + const keys = key.split('.'); + const lastKey = keys.pop(); + key = { requestParam: lastKey, column: key }; + } + // 单表字段无别名的情况下操作 + if (typeof key === 'string') { + if (query[key] || query[key] == 0) { + c[key] = query[key]; + const eq = query[key] instanceof Array ? 'in' : '='; + if (eq === 'in') { + find.andWhere(`${key} ${eq} (:${key})`, c); + } else { + find.andWhere(`${key} ${eq} :${key}`, c); + } + // this.sqlParams.push(query[key]); + } + } else { + if (query[key.requestParam] || query[key.requestParam] == 0) { + c[key.column] = query[key.requestParam]; + const eq = query[key.requestParam] instanceof Array ? 'in' : '='; + if (eq === 'in') { + find.andWhere(`${key.column} ${eq} (:${key.column})`, c); + } else { + find.andWhere(`${key.column} ${eq} :${key.column}`, c); + } + // this.sqlParams.push(query[key.requestParam]); + } + } + } + } + } else { + sqlArr.push(selects.join(',')); + } + // 接口请求的排序 + if (sort && order) { + const sorts = sort.toUpperCase().split(','); + const orders = order.split(','); + if (sorts.length != orders.length) { + throw new CoolValidateException(ERRINFO.SORTFIELD); + } + for (const i in sorts) { + find.addOrderBy( + SqlString.escapeId(orders[i]), + this.checkSort(sorts[i]) + ); + } + } + if (option?.extend) { + await option?.extend(find, this.baseCtx, this.baseApp); + } + const sqls = find.getSql().split('FROM'); + sqlArr.push('FROM'); + // 取sqls的最后一个 + sqlArr.push(sqls[sqls.length - 1]); + return sqlArr.join(' '); + } +} diff --git a/core/src/tag/data.ts b/core/src/tag/data.ts new file mode 100644 index 0000000..8968a6c --- /dev/null +++ b/core/src/tag/data.ts @@ -0,0 +1,94 @@ +import { COOL_METHOD_TAG_KEY, CoolUrlTagConfig } from './../decorator/tag'; +import { + CONTROLLER_KEY, + getClassMetadata, + listPropertyDataFromClass, + listModule, + Provide, + Scope, + ScopeEnum, + WEB_ROUTER_KEY, +} from '@midwayjs/core'; +import { COOL_URL_TAG_KEY } from '../decorator/tag'; +import * as _ from 'lodash'; + +/** + * URL标签 + */ +@Provide() +@Scope(ScopeEnum.Singleton) +export class CoolUrlTagData { + data = {}; + + /** + * 初始化 + */ + async init() { + // 类标记 + await this.classTag(); + // 方法标记 + await this.methodTag(); + } + + /** + * 类标记 + */ + async classTag() { + const tags = listModule(COOL_URL_TAG_KEY); + for (const controller of tags) { + // class的标记 + const controllerOption = getClassMetadata(CONTROLLER_KEY, controller); + const tagOption: CoolUrlTagConfig = getClassMetadata( + COOL_URL_TAG_KEY, + controller + ); + if (tagOption?.key) { + const data: string[] = this.data[tagOption.key] || []; + this.data[tagOption.key] = _.uniq( + data.concat( + (tagOption?.value || []).map(e => { + return controllerOption.prefix + '/' + e; + }) + ) + ); + } + } + } + + /** + * 方法标记 + */ + async methodTag() { + const controllers = listModule(CONTROLLER_KEY); + for (const controller of controllers) { + const controllerOption = getClassMetadata(CONTROLLER_KEY, controller); + // 方法标记 + const listPropertyMetas = listPropertyDataFromClass( + COOL_METHOD_TAG_KEY, + controller + ); + const requestMetas = getClassMetadata(WEB_ROUTER_KEY, controller); + for (const propertyMeta of listPropertyMetas) { + const _data = this.data[propertyMeta.tag] || []; + const requestMeta = _.find(requestMetas, { method: propertyMeta.key }); + if (requestMeta && controllerOption) { + this.data[propertyMeta.tag] = _.uniq( + _data.concat(controllerOption.prefix + requestMeta.path) + ); + } + } + } + } + + /** + * 根据键获得 + * @param key + * @param type + * @returns + */ + byKey(key: string, type?: 'app' | 'admin'): string[] { + return this.data[key]?.filter(e => { + return type ? _.startsWith(e, `/${type}/`) : true; + }); + } +} diff --git a/core/src/util/func.ts b/core/src/util/func.ts new file mode 100644 index 0000000..d4ef381 --- /dev/null +++ b/core/src/util/func.ts @@ -0,0 +1,27 @@ +import { ILogger } from '@midwayjs/core'; +import { Init, Logger, Provide, Scope, ScopeEnum } from '@midwayjs/core'; +import * as moment from 'moment'; + +/** + * 常用函数处理 + */ +@Provide() +@Scope(ScopeEnum.Singleton) +export class FuncUtil { + @Logger() + coreLogger: ILogger; + + @Init() + async init() { + Date.prototype.toJSON = function () { + return moment(this).format('YYYY-MM-DD HH:mm:ss'); + }; + // 新增String支持replaceAll方法 + String.prototype['replaceAll'] = function (s1, s2) { + return this.replace(new RegExp(s1, 'gm'), s2); + }; + this.coreLogger.info( + '\x1B[36m [cool:core] midwayjs cool core func handler \x1B[0m' + ); + } +} diff --git a/core/src/util/location.ts b/core/src/util/location.ts new file mode 100644 index 0000000..c03fb45 --- /dev/null +++ b/core/src/util/location.ts @@ -0,0 +1,68 @@ +import * as fs from 'fs'; +import * as path from 'path'; + +/** + * Location 工具类 + */ +class LocationUtil { + private locationCache = new Map(); + + /** + * 获取目标类的定义位置 + * @param target 目标类 + * @returns 目标类的定义位置 + */ + async scriptPath(target: any) { + const targetName = target.name; + + // 检查缓存 + if (this.locationCache.has(targetName)) { + return this.locationCache.get(targetName); + } + + const originalPrepareStackTrace = Error.prepareStackTrace; + let targetFile; + + try { + Error.prepareStackTrace = (error, stack) => stack; + const stack = new Error().stack as any; + + for (const site of stack) { + const fileName = site.getFileName(); + // 如果文件名不存在,则跳过 + if (!fileName || !fs.existsSync(fileName)) continue; + if (!fileName.includes('/modules/')) continue; + targetFile = { + path: fileName, + line: site.getLineNumber(), + column: site.getColumnNumber(), + source: `file://${fileName}`, + }; + this.locationCache.set(targetName, targetFile); + break; + } + } finally { + Error.prepareStackTrace = originalPrepareStackTrace; + } + + return targetFile; + } + + /** + * 获取使用此包的项目的真实根目录路径 + * @returns 项目根目录的绝对路径 + */ + getRootPath(): string { + const err = new Error(); + const callerfile = err.stack.split('\n')[2].match(/\(([^)]+)\)/)[1]; + const dirPath = path.dirname(callerfile); + const nodeModulesIndex = dirPath.indexOf('/node_modules/'); + if (nodeModulesIndex !== -1) { + return dirPath.substring(0, nodeModulesIndex) + '/dist'; + } + return dirPath; + } +} + +// 不再需要单例模式,直接导出实例即可 +export default new LocationUtil();