├── simple-server ├── .dockerignore ├── Comfortaa-Regular.ttf ├── template-beer-css.html ├── package.json ├── Dockerfile ├── src │ └── simple-server.ts ├── template-test-reporter.svg ├── tsconfig.json └── package-lock.json ├── .commit-template ├── commitlint.config.js ├── Comfortaa-Regular.ttf ├── src ├── __image_snapshots__ │ ├── image-maker-spec-ts-image-maker-should-generate-changelog-from-html-template-1-snap.png │ ├── image-maker-spec-ts-image-maker-should-generate-changelog-from-html-template-2-snap.png │ ├── image-maker-spec-ts-image-maker-should-generate-a-coverage-image-from-template-1-snap.png │ ├── image-maker-spec-ts-image-maker-should-generate-a-coverage-image-from-template-2-snap.png │ └── image-maker-spec-ts-image-maker-should-generate-image-from-html-template-with-external-template-1-snap.png ├── image-maker.ts └── image-maker.spec.ts ├── test-assets └── my-template │ ├── style.css │ └── index.html ├── .vscode ├── extensions.json └── settings.json ├── tsconfig.json ├── .travis.yml ├── LICENSE ├── .github └── workflows │ └── release.yml ├── templates ├── style-changelog-template.css ├── changelog-template.html └── template-test-reporter.svg ├── .gitignore ├── tslint.json ├── README.md ├── docs └── CHANGELOG.md ├── package.json └── hologram.svg /simple-server/.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /.commit-template: -------------------------------------------------------------------------------- 1 | type(scope): subject 2 | 3 | description 4 | -------------------------------------------------------------------------------- /commitlint.config.js: -------------------------------------------------------------------------------- 1 | module.exports = {extends: ['@commitlint/config-conventional']} 2 | -------------------------------------------------------------------------------- /Comfortaa-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kibibit/kb-hologram/next/Comfortaa-Regular.ttf -------------------------------------------------------------------------------- /simple-server/Comfortaa-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kibibit/kb-hologram/next/simple-server/Comfortaa-Regular.ttf -------------------------------------------------------------------------------- /src/__image_snapshots__/image-maker-spec-ts-image-maker-should-generate-changelog-from-html-template-1-snap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kibibit/kb-hologram/next/src/__image_snapshots__/image-maker-spec-ts-image-maker-should-generate-changelog-from-html-template-1-snap.png -------------------------------------------------------------------------------- /src/__image_snapshots__/image-maker-spec-ts-image-maker-should-generate-changelog-from-html-template-2-snap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kibibit/kb-hologram/next/src/__image_snapshots__/image-maker-spec-ts-image-maker-should-generate-changelog-from-html-template-2-snap.png -------------------------------------------------------------------------------- /src/__image_snapshots__/image-maker-spec-ts-image-maker-should-generate-a-coverage-image-from-template-1-snap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kibibit/kb-hologram/next/src/__image_snapshots__/image-maker-spec-ts-image-maker-should-generate-a-coverage-image-from-template-1-snap.png -------------------------------------------------------------------------------- /src/__image_snapshots__/image-maker-spec-ts-image-maker-should-generate-a-coverage-image-from-template-2-snap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kibibit/kb-hologram/next/src/__image_snapshots__/image-maker-spec-ts-image-maker-should-generate-a-coverage-image-from-template-2-snap.png -------------------------------------------------------------------------------- /src/__image_snapshots__/image-maker-spec-ts-image-maker-should-generate-image-from-html-template-with-external-template-1-snap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kibibit/kb-hologram/next/src/__image_snapshots__/image-maker-spec-ts-image-maker-should-generate-image-from-html-template-with-external-template-1-snap.png -------------------------------------------------------------------------------- /test-assets/my-template/style.css: -------------------------------------------------------------------------------- 1 | html, body { 2 | margin: 0; 3 | padding: 0; 4 | } 5 | 6 | body { 7 | width: 100vw; 8 | height: 100vh; 9 | display: flex; 10 | background: #212121; 11 | } 12 | 13 | img { 14 | height: 100%; 15 | width: 100%; 16 | object-fit: cover; 17 | } 18 | 19 | .side { 20 | width: 10%; 21 | background: pink; 22 | } 23 | 24 | .main { 25 | width: 40%; 26 | background: green; 27 | } -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "dbaeumer.vscode-eslint", 4 | "msjsdiag.debugger-for-chrome", 5 | "formulahendry.auto-close-tag", 6 | "formulahendry.auto-rename-tag", 7 | "eamodio.gitlens", 8 | "wix.vscode-import-cost", 9 | "Orta.vscode-jest", 10 | "wayou.vscode-todo-highlight", 11 | "MS-vsliveshare.vsliveshare", 12 | "vscode-icons-team.vscode-icons", 13 | "EliverLara.andromeda", 14 | "github.vscode-pull-request-github", 15 | "coenraads.bracket-pair-colorizer" 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "declaration": true, 5 | "removeComments": true, 6 | "emitDecoratorMetadata": true, 7 | "experimentalDecorators": true, 8 | "skipLibCheck": true, 9 | "esModuleInterop": true, 10 | "target": "es2017", 11 | "sourceMap": true, 12 | "outDir": "./lib", 13 | "incremental": true, 14 | "baseUrl": "./", 15 | "paths": {} 16 | }, 17 | "exclude": [ 18 | "node_modules", 19 | "lib", 20 | "**/*.spec.ts", 21 | "simple-server" 22 | ] 23 | } 24 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: false 2 | language: node_js 3 | cache: 4 | directories: 5 | - ~/.npm 6 | node_js: 7 | - "8.3" 8 | notifications: 9 | email: false 10 | jobs: 11 | include: 12 | - stage: test 13 | node_js: lts/* 14 | script: 15 | - npm run build 16 | - npm run test:cov 17 | - npm run deploy-test-results 18 | - npm run coveralls 19 | - stage: release 20 | node_js: lts/* 21 | script: 22 | - npm run build 23 | - npm run semantic-release 24 | branches: 25 | except: 26 | - /^v\d+\.\d+\.\d+$/ 27 | -------------------------------------------------------------------------------- /simple-server/template-beer-css.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | beer css template 9 | 10 | 11 | 12 | 13 | 14 |
15 | {{ content }} 16 |
17 | 18 | 19 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /simple-server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "simple-server", 3 | "version": "1.0.0", 4 | "main": "simple-server.js", 5 | "scripts": { 6 | "build": "tsc", 7 | "start": "node dist/simple-server.js", 8 | "start:dev": "ts-node src/simple-server.ts", 9 | "test": "echo \"Error: no test specified\" && exit 1" 10 | }, 11 | "author": "", 12 | "license": "ISC", 13 | "description": "", 14 | "devDependencies": { 15 | "@types/express": "^5.0.0", 16 | "@types/node": "^22.9.0", 17 | "ts-node": "^10.9.2", 18 | "typescript": "^5.6.3" 19 | }, 20 | "dependencies": { 21 | "@kibibit/kb-hologram": "^2.1.0-next.4", 22 | "body-parser": "^1.20.3", 23 | "cache-manager": "^6.1.3", 24 | "cacheable": "^1.8.4", 25 | "express": "^4.21.1", 26 | "handlebars": "^4.7.8", 27 | "keyv": "^5.2.1" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /test-assets/my-template/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CodePen - 3dboxtemplate 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 |
14 |
15 | 16 |
17 |
18 | 19 |
20 |
21 | 22 |
23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 kibibit 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /simple-server/Dockerfile: -------------------------------------------------------------------------------- 1 | # Use a Node.js base image 2 | FROM node:20 3 | 4 | # Set the working directory inside the container 5 | WORKDIR /usr/src/app 6 | 7 | # Install Chromium dependencies and Chromium 8 | RUN apt-get update && apt-get install -y \ 9 | chromium \ 10 | ca-certificates \ 11 | fonts-liberation \ 12 | libappindicator3-1 \ 13 | libasound2 \ 14 | libatk-bridge2.0-0 \ 15 | libatk1.0-0 \ 16 | libcups2 \ 17 | libdbus-1-3 \ 18 | libgbm1 \ 19 | libnspr4 \ 20 | libnss3 \ 21 | libxcomposite1 \ 22 | libxrandr2 \ 23 | libxshmfence1 \ 24 | xdg-utils \ 25 | --no-install-recommends && \ 26 | apt-get clean && rm -rf /var/lib/apt/lists/* 27 | 28 | # Set environment variable to skip Chromium download 29 | ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true 30 | 31 | # Copy the application files to the container 32 | COPY package*.json ./ 33 | 34 | # Install application dependencies 35 | RUN npm install 36 | 37 | # Copy the rest of the application files 38 | COPY . . 39 | 40 | # Build the application 41 | RUN npm run build 42 | 43 | # Expose the API port 44 | EXPOSE 3000 45 | 46 | # Run the server 47 | CMD ["node", "dist/simple-server.js"] 48 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | on: 3 | push: 4 | branches: 5 | - master 6 | - next 7 | jobs: 8 | release: 9 | name: Release 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: Checkout Commit 13 | uses: actions/checkout@v3 14 | with: 15 | fetch-depth: 0 16 | token: ${{ secrets.BOT_TOKEN }} 17 | - name: Setup Node.js 18 | uses: actions/setup-node@v3 19 | with: 20 | node-version: 20 21 | - name: Cache node modules 22 | uses: actions/cache@v3 23 | env: 24 | cache-name: cache-node-modules 25 | with: 26 | path: "**/node_modules" 27 | key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} 28 | restore-keys: ${{ runner.os }}-modules-${{ hashFiles('**/package-lock.lock') }} 29 | - name: Install Dependencies 30 | if: steps.cache-node-modules.outputs.cache-hit != 'true' 31 | run: npm ci 32 | env: 33 | NODE_AUTH_TOKEN: ${{ secrets.BOT_TOKEN }} 34 | - name: Build 35 | run: npm run build --if-present 36 | - name: Release 37 | env: 38 | GITHUB_TOKEN: ${{ secrets.BOT_TOKEN }} 39 | GIT_AUTHOR_NAME: k1b1b0t 40 | GIT_AUTHOR_EMAIL: k1b1b0t@kibibit.io 41 | GIT_COMMITTER_NAME: k1b1b0t 42 | GIT_COMMITTER_EMAIL: k1b1b0t@kibibit.io 43 | NPM_TOKEN: ${{ secrets.NPM_TOKEN }} 44 | NODE_AUTH_TOKEN: ${{ secrets.BOT_TOKEN }} 45 | run: npm run semantic-release 46 | -------------------------------------------------------------------------------- /templates/style-changelog-template.css: -------------------------------------------------------------------------------- 1 | html { 2 | box-sizing: border-box; 3 | } 4 | 5 | *, 6 | *:before, 7 | *:after { 8 | box-sizing: inherit; 9 | font-smoothing: antialiased; 10 | -webkit-font-smoothing: antialiased; 11 | } 12 | 13 | body { 14 | font-family: 'Comfortaa', cursive; 15 | height: 100vh; 16 | display: flex; 17 | flex-direction: column; 18 | } 19 | 20 | .kb-title { 21 | display: flex; 22 | align-items: center; 23 | justify-content: center; 24 | height: 20%; 25 | } 26 | 27 | .kb-body .kb-hero { 28 | height: 15%; 29 | } 30 | 31 | .kb-body .kb-hero .hero-body { 32 | display: flex; 33 | align-items: center; 34 | } 35 | 36 | .kb-title img { 37 | height: 45%; 38 | margin: 0 2em 0 0; 39 | } 40 | 41 | .kb-title .title { 42 | font-size: 3.5vw; 43 | } 44 | 45 | #img-container { 46 | height: 100%; 47 | display: flex; 48 | align-items: center; 49 | justify-content: center; 50 | } 51 | 52 | .kb-body #container ul li { 53 | font-size: 2.11vw; 54 | } 55 | 56 | .kb-powered { 57 | display: none; 58 | } 59 | 60 | .hero-body { 61 | padding: 1.5rem; 62 | } 63 | 64 | .hero-body .title { 65 | display: flex; 66 | align-items: center; 67 | justify-content: center; 68 | font-size: 2.5vw; 69 | } 70 | 71 | .kb-list { 72 | padding: 3em; 73 | columns: 2; 74 | -webkit-columns: 2; 75 | -moz-columns: 2; 76 | } 77 | 78 | #container { 79 | padding: 2em; 80 | display: flex; 81 | flex-flow: row nowrap; 82 | justify-content: center; 83 | flex-grow: 1; 84 | align-items: center; 85 | /* it will calculate automatically, try space-between too */ 86 | } 87 | 88 | #container ul { 89 | max-width: 50%; 90 | list-style: square inside; 91 | margin: 0 1em; 92 | } 93 | 94 | #container ul li { 95 | font-size: 1.4em; 96 | padding-bottom: 0.2em; 97 | } 98 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # TypeScript v1 declaration files 45 | typings/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | 78 | # Next.js build output 79 | .next 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | dist 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # Serverless directories 95 | .serverless/ 96 | 97 | # FuseBox cache 98 | .fusebox/ 99 | 100 | # DynamoDB Local files 101 | .dynamodb/ 102 | 103 | # TernJS port file 104 | .tern-port 105 | 106 | .DS_Store 107 | 108 | # kibibit 109 | test-results 110 | __diff_output__ 111 | lib -------------------------------------------------------------------------------- /templates/changelog-template.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 12 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | Bulma: a modern CSS framework based on Flexbox 24 |
25 | 26 |
27 | 28 |

30 | Visual Studio Code 31 |

32 |
33 |
34 |
35 |
36 |

38 | November Update [1.41] - Released 39 |

40 |
41 |
42 |
43 |
44 | 45 | 46 |
47 | 48 | 49 | 50 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | // Editor 3 | "editor.detectIndentation": false, 4 | "editor.insertSpaces": true, 5 | "editor.tabSize": 2, 6 | "editor.rulers": [80], 7 | "editor.fontFamily": "Hack, Menlo, Monaco, 'Courier New', monospace", 8 | "editor.matchBrackets": "always", 9 | // Terminal 10 | "terminal.integrated.fontFamily": "Hack, Menlo, Monaco, 'Courier New', monospace", 11 | "terminal.integrated.fontSize": 12, 12 | // Workbench 13 | "workbench.colorTheme": "Andromeda", 14 | "workbench.editor.showIcons": true, 15 | "workbench.iconTheme": "vs-seti", 16 | // Bracket Pair Colorizer 17 | "bracketPairColorizer.colorMode": "Consecutive", 18 | "bracketPairColorizer.forceUniqueOpeningColor": true, 19 | "bracketPairColorizer.showBracketsInGutter": true, 20 | // Misc 21 | "files.insertFinalNewline": true, 22 | "githubPullRequests.includeRemotes": "all", 23 | "eslint.enable": true, 24 | "eslint.autoFixOnSave": true, 25 | "eslint.alwaysShowStatus": true, 26 | "editor.formatOnSave": true, 27 | "[javascript]": { 28 | "editor.formatOnSave": false 29 | }, 30 | "jshint.enable": false, 31 | "cSpell.enabled": false, 32 | // Jest 33 | "jest.autoEnable": true, 34 | "jest.coverageFormatter": "DefaultFormatter", 35 | "jest.debugCodeLens.showWhenTestStateIn": [ 36 | "fail", 37 | "unknown" 38 | ], 39 | "jest.debugMode": false, 40 | "jest.enableCodeLens": true, 41 | "jest.enableInlineErrorMessages": true, 42 | "jest.enableSnapshotPreviews": true, 43 | "jest.enableSnapshotUpdateMessages": true, 44 | "jest.pathToConfig": "", 45 | "jest.pathToJest": "npm test --", 46 | "jest.restartJestOnSnapshotUpdate": false, 47 | "jest.rootPath": "", 48 | "jest.runAllTestsFirst": true, 49 | "jest.showCoverageOnLoad": true, 50 | // Todo Highlight 51 | "todohighlight.isEnable": true, 52 | "todohighlight.keywords": [ 53 | "TODO", 54 | "NOTE", 55 | { 56 | "text": "BEWARE", 57 | "color": "#ff3860", 58 | "backgroundColor": "rgba(255, 221, 87, 1)", 59 | "overviewRulerColor": "grey" 60 | } 61 | ], 62 | "todohighlight.isCaseSensitive": true, 63 | "todohighlight.defaultStyle": { 64 | "color": "#ffdd57", 65 | "backgroundColor": "rgba(128,0,128, 1)", 66 | "overviewRulerColor": "rgba(128,0,128, 1)", 67 | "borderRadius": "2px", 68 | "isWholeLine": true, 69 | }, 70 | "window.title": "${activeEditorShort}${separator}${rootName} [kibibit]", 71 | "workbench.colorCustomizations": { 72 | "titleBar.activeForeground": "#ffdd57" 73 | }, 74 | "typescriptHero.imports.stringQuoteStyle": "'", 75 | "typescriptHero.imports.grouping": [ 76 | "Plains", 77 | "Modules", 78 | "/^@kb-/", 79 | "Workspace" 80 | 81 | ], 82 | "typescriptHero.imports.organizeOnSave": true, 83 | "typescriptHero.imports.multiLineTrailingComma": false, 84 | "tslint.autoFixOnSave": true, 85 | "editor.codeActionsOnSave": { 86 | "source.fixAll.eslint": true 87 | }, 88 | "svg.preview.background": "black" 89 | } 90 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "defaultSeverity": "error", 3 | "extends": ["tslint:recommended"], 4 | "linterOptions": { 5 | "exclude": [ 6 | "node_modules" 7 | ] 8 | }, 9 | "jsRules": { 10 | "no-unused-expression": true 11 | }, 12 | "rules": { 13 | "arrow-return-shorthand": true, 14 | "callable-types": true, 15 | "class-name": true, 16 | "comment-format": [ 17 | true, 18 | "check-space" 19 | ], 20 | "curly": true, 21 | "deprecation": { 22 | "severity": "warn" 23 | }, 24 | "eofline": true, 25 | "forin": true, 26 | "import-blacklist": [ 27 | true, 28 | "rxjs/Rx" 29 | ], 30 | "import-spacing": true, 31 | "indent": [ 32 | true, 33 | "spaces" 34 | ], 35 | "interface-over-type-literal": true, 36 | "label-position": true, 37 | "max-line-length": [ 38 | true, 39 | 140 40 | ], 41 | "member-access": false, 42 | "member-ordering": [ 43 | true, 44 | { 45 | "order": [ 46 | "static-field", 47 | "instance-field", 48 | "static-method", 49 | "instance-method" 50 | ] 51 | } 52 | ], 53 | "no-arg": true, 54 | "no-bitwise": true, 55 | "no-console": [ 56 | true, 57 | "debug", 58 | "info", 59 | "time", 60 | "timeEnd", 61 | "trace" 62 | ], 63 | "no-construct": true, 64 | "no-debugger": true, 65 | "no-duplicate-super": true, 66 | "no-empty": false, 67 | "no-empty-interface": true, 68 | "no-eval": true, 69 | "no-inferrable-types": [ 70 | true, 71 | "ignore-params" 72 | ], 73 | "no-misused-new": true, 74 | "no-non-null-assertion": true, 75 | "no-redundant-jsdoc": true, 76 | "no-shadowed-variable": true, 77 | "no-string-literal": false, 78 | "no-string-throw": true, 79 | "no-switch-case-fall-through": true, 80 | "no-trailing-whitespace": true, 81 | "no-unnecessary-initializer": true, 82 | "no-unused-expression": true, 83 | "no-use-before-declare": true, 84 | "no-var-keyword": true, 85 | "object-literal-sort-keys": false, 86 | "one-line": [ 87 | true, 88 | "check-open-brace", 89 | "check-catch", 90 | "check-else", 91 | "check-whitespace" 92 | ], 93 | "prefer-const": true, 94 | "quotemark": [ 95 | true, 96 | "single" 97 | ], 98 | "radix": true, 99 | "semicolon": [ 100 | true, 101 | "always" 102 | ], 103 | "triple-equals": [ 104 | true, 105 | "allow-null-check" 106 | ], 107 | "typedef-whitespace": [ 108 | true, 109 | { 110 | "call-signature": "nospace", 111 | "index-signature": "nospace", 112 | "parameter": "nospace", 113 | "property-declaration": "nospace", 114 | "variable-declaration": "nospace" 115 | } 116 | ], 117 | "unified-signatures": true, 118 | "variable-name": false, 119 | "whitespace": [ 120 | true, 121 | "check-branch", 122 | "check-decl", 123 | "check-operator", 124 | "check-separator", 125 | "check-type" 126 | ], 127 | "trailing-comma": [true, { 128 | "multiline": "never", 129 | "singleline": "never" 130 | }] 131 | }, 132 | "rulesDirectory": [] 133 | } 134 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |

4 | @kibibit/kb-hologram 5 |

6 |

7 |

8 | 9 |

10 |

11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |

23 |

24 | Create images from templates and data 25 |

26 |
27 | 28 | ## how to use 29 | 30 | ### Installation 31 | 32 | ```bash 33 | $ npm install --save @kibibit/kb-hologram 34 | ``` 35 | 36 | ### Usage 37 | 38 | ```javascript 39 | import { KbHologram, KbHologramResultType } from "@kibibit/kb-hologram"; 40 | 41 | const kbHologram = new KbHologram({ 42 | fontName: "../Comfortaa-Regular.ttf", 43 | templateName: "changelog-template", 44 | height: 534 * 2, 45 | width: 1069 * 2, 46 | data: { 47 | columnOne: [ 48 | "Compact folders in Explorer", 49 | "Edit both files in diff view", 50 | "Search results update while typing", 51 | "Problems panel filtering by type", 52 | "Minimap highlights errors, changes", 53 | "Terminal minimum contrast ratio", 54 | ], 55 | columnTwo: [ 56 | "Mirror cursor in HTML tags", 57 | "Optional chaining support in JS\\TS", 58 | "Extract to interface TS refactoring", 59 | "Sass module support for @use", 60 | "Remote - Containers improvements", 61 | "Visual Studio Online preview", 62 | ], 63 | title: "achievibit", 64 | subtitle: "v2.1.4 - CHANGELOG", 65 | logo: { 66 | url: "data:image/png;base64,", 67 | alt: "kibibit", 68 | }, 69 | }, 70 | type: "html", 71 | }); 72 | 73 | const pngBuffer = await kbHologram.render(KbHologramResultType.PngBuffer); 74 | ``` 75 | 76 | Which will return a **png buffer** for the following image: 77 | ![generated changelog](https://raw.githubusercontent.com/Kibibit/kb-hologram/next/src/__image_snapshots__/image-maker-spec-ts-image-maker-should-generate-changelog-from-html-template-1-snap.png) 78 | 79 | ### Test 80 | 81 | ```bash 82 | # unit tests 83 | $ npm run test 84 | 85 | # e2e tests 86 | $ npm run test:e2e 87 | 88 | # test coverage 89 | $ npm run test:cov 90 | ``` 91 | 92 | ## Stay in touch 93 | 94 | - Author - [Neil Kalman](https://github.com/thatkookooguy) 95 | 96 | ## Contributors 97 | 98 | Want to file a bug, contribute some code, or improve documentation? Excellent! Read up on our guidelines for [contributing](CONTRIBUTING.MD). 99 | 100 | You can check out some easy to start with issues in the [Easy Pick](https://github.com/Kibibit/kb-hologram/labels/Easy%20Pick). 101 | 102 | ## Contributor Code of Conduct 103 | 104 | Please note that this project is released with a [Contributor Code of Conduct](CODE_OF_CONDUCT.md). 105 | 106 | By participating in this project you agree to abide by its terms. 107 | 108 | ## License 109 | 110 | [MIT License](LICENSE) 111 | 112 | Copyright (c) 2020 Neil Kalman <neilkalman@gmail.com> 113 | 114 |
Module Icon made by Freepik from www.flaticon.com
115 | -------------------------------------------------------------------------------- /docs/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # [2.1.0-next.5](https://github.com/Kibibit/kb-hologram/compare/v2.1.0-next.4...v2.1.0-next.5) (2024-11-27) 2 | 3 | 4 | ### Features 5 | 6 | * **server:** add beer css template ([a25ce31](https://github.com/Kibibit/kb-hologram/commit/a25ce3196249d8aea84b01fb4d1b00f116122ecd)) 7 | * **server:** add get for generate images ([89ad7e1](https://github.com/Kibibit/kb-hologram/commit/89ad7e1c9d105e5e8e6ad6cb7f915d6ba1cd3d27)) 8 | 9 | # [2.1.0-next.4](https://github.com/Kibibit/kb-hologram/compare/v2.1.0-next.3...v2.1.0-next.4) (2024-11-17) 10 | 11 | 12 | ### Features 13 | 14 | * **render:** add no-sandbox if path is given ([b8b3aa9](https://github.com/Kibibit/kb-hologram/commit/b8b3aa92918013c7bdd6ad6d3d438c9e0d8df595)) 15 | * **server:** update dockerfile ([fdc978d](https://github.com/Kibibit/kb-hologram/commit/fdc978da305c9224010dca70e22f3a6d47fd2231)) 16 | 17 | # [2.1.0-next.3](https://github.com/Kibibit/kb-hologram/compare/v2.1.0-next.2...v2.1.0-next.3) (2024-11-17) 18 | 19 | 20 | ### Features 21 | 22 | * **render:** optional executable path configuration ([8da4f07](https://github.com/Kibibit/kb-hologram/commit/8da4f071b408cc740e28f96ca24084b3c55fd187)) 23 | 24 | # [2.1.0-next.2](https://github.com/Kibibit/kb-hologram/compare/v2.1.0-next.1...v2.1.0-next.2) (2024-11-17) 25 | 26 | 27 | ### Features 28 | 29 | * **render:** remove dep svg2png ([d8c3354](https://github.com/Kibibit/kb-hologram/commit/d8c33548851fa31fe604d4c39a3a0f07edf83ca4)) 30 | * **server:** build app before running ([407f0dc](https://github.com/Kibibit/kb-hologram/commit/407f0dc41ee957e3dbafec92718cafb200fd38c1)) 31 | 32 | # [2.1.0-next.1](https://github.com/Kibibit/kb-hologram/compare/v2.0.0...v2.1.0-next.1) (2024-11-17) 33 | 34 | 35 | ### Bug Fixes 36 | 37 | * **ts:** exclude server from kb-hologram build ([93f0f7e](https://github.com/Kibibit/kb-hologram/commit/93f0f7eea85394a7ebc71b466905247b1319d3ea)) 38 | 39 | 40 | ### Features 41 | 42 | * **deps:** update dependencies and devDependencies to latest versions ([5fe1cf7](https://github.com/Kibibit/kb-hologram/commit/5fe1cf7ea399018795106065bd66a836ef213476)) 43 | * **render:** fix code and tests after deps upgrade ([5df26ad](https://github.com/Kibibit/kb-hologram/commit/5df26ad8a75c4885e34d32251ec4c76b253327ab)) 44 | * **server:** add simple server for deploying ([6919708](https://github.com/Kibibit/kb-hologram/commit/691970838dda3ee50db8986a34f8acb94c7d50e9)) 45 | 46 | # [2.0.0](https://github.com/Kibibit/kb-hologram/compare/v1.1.0...v2.0.0) (2023-10-21) 47 | 48 | 49 | ### Bug Fixes 50 | 51 | * **deps:** update module to latest deps ([7b06999](https://github.com/Kibibit/kb-hologram/commit/7b069990000ee6cac51d389ec53e20b94482bb7a)) 52 | * **release:** change main branches ([9c0b778](https://github.com/Kibibit/kb-hologram/commit/9c0b778cd956836eea50a79705f0f75c54bce2c1)) 53 | * **release:** missing details for semantic release ([557d21d](https://github.com/Kibibit/kb-hologram/commit/557d21d8d092123e58b940aa3383478fb8372948)) 54 | * **template-file:** fix passing template file to generate image ([eb917a8](https://github.com/Kibibit/kb-hologram/commit/eb917a8ea938d93267f0781ebe41a96e1245e241)) 55 | 56 | 57 | ### Features 58 | 59 | * **app:** rename main class to KbHologram ([8a8f2b3](https://github.com/Kibibit/kb-hologram/commit/8a8f2b345f784af6796c266d02e2dbf3d246faef)) 60 | 61 | 62 | ### BREAKING CHANGES 63 | 64 | * **app:** main class name has been changed 65 | 66 | # [1.0.0-next.5](https://github.com/Kibibit/kb-hologram/compare/v1.0.0-next.4...v1.0.0-next.5) (2023-10-21) 67 | 68 | 69 | ### Features 70 | 71 | * **app:** rename main class to KbHologram ([8a8f2b3](https://github.com/Kibibit/kb-hologram/commit/8a8f2b345f784af6796c266d02e2dbf3d246faef)) 72 | 73 | 74 | ### BREAKING CHANGES 75 | 76 | * **app:** main class name has been changed 77 | 78 | # [1.0.0-next.4](https://github.com/Kibibit/kb-hologram/compare/v1.0.0-next.3...v1.0.0-next.4) (2023-10-20) 79 | 80 | 81 | ### Bug Fixes 82 | 83 | * **template-file:** fix passing template file to generate image ([eb917a8](https://github.com/Kibibit/kb-hologram/commit/eb917a8ea938d93267f0781ebe41a96e1245e241)) 84 | 85 | # [1.0.0-next.3](https://github.com/Kibibit/kb-hologram/compare/v1.0.0-next.2...v1.0.0-next.3) (2023-10-20) 86 | 87 | 88 | ### Bug Fixes 89 | 90 | * **deps:** update module to latest deps ([7b06999](https://github.com/Kibibit/kb-hologram/commit/7b069990000ee6cac51d389ec53e20b94482bb7a)) 91 | * **release:** change main branches ([9c0b778](https://github.com/Kibibit/kb-hologram/commit/9c0b778cd956836eea50a79705f0f75c54bce2c1)) 92 | * **release:** missing details for semantic release ([557d21d](https://github.com/Kibibit/kb-hologram/commit/557d21d8d092123e58b940aa3383478fb8372948)) 93 | 94 | # [1.0.0-next.2](https://github.com/Kibibit/kb-hologram/compare/v1.0.0-next.1...v1.0.0-next.2) (2019-12-25) 95 | 96 | 97 | ### Bug Fixes 98 | 99 | * **changelog:** add dependency on @semantic-release/changelog ([060a30d](https://github.com/Kibibit/kb-hologram/commit/060a30dff8f23ad8c58fa23f83e1ec1ea2485d3a)) 100 | 101 | 102 | ### Features 103 | 104 | * **docs:** generate automatic changelog file ([a984c3c](https://github.com/Kibibit/kb-hologram/commit/a984c3c1812407d867992f72f2cc2241e8826d45)) 105 | -------------------------------------------------------------------------------- /simple-server/src/simple-server.ts: -------------------------------------------------------------------------------- 1 | import { IKbHologramBaseOptions, KbHologram, KbHologramResultType } from "@kibibit/kb-hologram"; 2 | import express, { Request, Response } from 'express'; 3 | import bodyParser from "body-parser"; 4 | import { join } from "path"; 5 | import { createCache } from "cache-manager"; 6 | import { CacheableMemory } from "cacheable"; 7 | import { Keyv } from 'keyv'; 8 | 9 | const app = express(); 10 | const port = 3000; 11 | 12 | // parse application/x-www-form-urlencoded 13 | app.use(bodyParser.urlencoded()); 14 | 15 | // parse application/json 16 | app.use(bodyParser.json()); 17 | // parse query params 18 | app.use(bodyParser.urlencoded({ extended: true })); 19 | 20 | // Create a memory cache with a TTL of 1 week 21 | const memoryCache = createCache({ 22 | stores: [ 23 | new Keyv({ 24 | store: new CacheableMemory({ ttl: 7 * 24 * 60 * 60, lruSize: 5000 }), 25 | }) 26 | ], 27 | ttl: 7 * 24 * 60 * 60 // TTL in seconds (1 week) 28 | }); 29 | 30 | app.get('/', async (req: Request, res: Response) => { 31 | // if got query param with data- prefix, put it inside data object 32 | if (req.query) { 33 | const dataKeys = Object.keys(req.query).filter(key => key.startsWith('data-')); 34 | if (dataKeys.length > 0) { 35 | req.query.data = dataKeys.reduce((acc, key) => { 36 | const dataKey = key.replace('data-', ''); 37 | acc[dataKey] = req.query[key]; 38 | return acc; 39 | }, {} as Record); 40 | } 41 | } 42 | 43 | const cacheKey = JSON.stringify(req.query); 44 | 45 | try { 46 | // Check if the image is cached 47 | const cachedImage: Buffer | null = await memoryCache.get(cacheKey); 48 | 49 | if (cachedImage) { 50 | console.log('Cache hit'); 51 | res.writeHead(200, { 52 | 'Content-Type': 'image/png', 53 | 'Content-Length': cachedImage.length 54 | }); 55 | 56 | res.end(cachedImage); 57 | 58 | return; 59 | } 60 | 61 | console.log('Cache miss'); 62 | // Generate a new image if not cached 63 | const kbHologramOptions = getKbHologramOptions(req.query); 64 | const kbHologram = new KbHologram(kbHologramOptions); 65 | const pngBuffer = await kbHologram.render(KbHologramResultType.PngBuffer); 66 | 67 | // Cache the generated image 68 | await memoryCache.set(cacheKey, pngBuffer); 69 | 70 | res.writeHead(200, { 71 | 'Content-Type': 'image/png', 72 | 'Content-Length': pngBuffer.length 73 | }); 74 | res.end(pngBuffer); 75 | 76 | } catch (error) { 77 | console.error('Error generating image:', error); 78 | res.status(500).send('Error generating image'); 79 | } 80 | }); 81 | 82 | app.post('/', async (req: Request, res: Response) => { 83 | const cacheKey = JSON.stringify(req.body); 84 | 85 | try { 86 | // Check if the image is cached 87 | const cachedImage: Buffer | null = await memoryCache.get(cacheKey); 88 | 89 | if (cachedImage) { 90 | console.log('Cache hit'); 91 | res.writeHead(200, { 92 | 'Content-Type': 'image/png', 93 | 'Content-Length': cachedImage.length 94 | }); 95 | 96 | res.end(cachedImage); 97 | 98 | return; 99 | } 100 | 101 | console.log('Cache miss'); 102 | // Generate a new image if not cached 103 | const kbHologramOptions = getKbHologramOptions(req.body); 104 | const kbHologram = new KbHologram(kbHologramOptions); 105 | const pngBuffer = await kbHologram.render(KbHologramResultType.PngBuffer); 106 | 107 | // Cache the generated image 108 | await memoryCache.set(cacheKey, pngBuffer); 109 | 110 | res.writeHead(200, { 111 | 'Content-Type': 'image/png', 112 | 'Content-Length': pngBuffer.length 113 | }); 114 | res.end(pngBuffer); 115 | 116 | } catch (error) { 117 | console.error('Error generating image:', error); 118 | res.status(500).send('Error generating image'); 119 | } 120 | }); 121 | 122 | app.listen(port, () => { 123 | console.log(`kb-hologram server listening on port ${port}`); 124 | }); 125 | 126 | function getKbHologramOptions( 127 | body: Record = {} 128 | ): IKbHologramBaseOptions { 129 | const { 130 | templateName, 131 | templateFile, 132 | height, 133 | width, 134 | data 135 | } = body || {}; 136 | 137 | // same as IKbHologramBaseOptions but without the templateName or templateFile 138 | // properties 139 | const baseOptions: Omit = { 140 | fontName: "../Comfortaa-Regular.ttf", 141 | height: height || Math.floor(534), 142 | width: width || Math.floor(1069), 143 | data: data || { 144 | apiStatus: 'FAILED', 145 | e2eStatus: 'PASSED' 146 | }, 147 | type: "svg", 148 | executablePath: '/usr/bin/chromium' 149 | }; 150 | 151 | if (templateName) { 152 | const fullOptions: IKbHologramBaseOptions = { 153 | ...baseOptions, 154 | templateName 155 | }; 156 | 157 | return fullOptions; 158 | } 159 | 160 | if (templateFile) { 161 | const fullOptions: IKbHologramBaseOptions = { 162 | ...baseOptions, 163 | templateFile 164 | }; 165 | 166 | return fullOptions; 167 | } 168 | 169 | return { 170 | ...baseOptions, 171 | templateFile: join(__dirname, '../template-test-reporter.svg') 172 | }; 173 | } 174 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@kibibit/kb-hologram", 3 | "version": "2.1.0-next.5", 4 | "description": "create images from templates and data", 5 | "types": "lib/image-maker.d.ts", 6 | "main": "lib/image-maker.js", 7 | "files": [ 8 | "/lib", 9 | "/bin", 10 | "/templates", 11 | "Comfortaa-Regular.ttf" 12 | ], 13 | "scripts": { 14 | "build": "tsc", 15 | "generate-barrels": "barrelsby --delete -d ./src -l below -q", 16 | "coveralls": "cat ./test-results/coverage/lcov.info | coveralls", 17 | "commit": "npx git-cz", 18 | "lint": "tslint -p tsconfig.json -c tslint.json", 19 | "test": "jest --coverage", 20 | "test:watch": "jest --watch", 21 | "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", 22 | "test:e2e": "jest --config ./test/jest-e2e.json", 23 | "semantic-release": "semantic-release", 24 | "deploy-test-results": "kb-reporter" 25 | }, 26 | "repository": { 27 | "type": "git", 28 | "url": "https://github.com/Kibibit/kb-hologram.git" 29 | }, 30 | "author": "", 31 | "license": "ISC", 32 | "bugs": { 33 | "url": "https://github.com/Kibibit/kb-hologram/issues" 34 | }, 35 | "homepage": "https://github.com/Kibibit/kb-hologram#readme", 36 | "dependencies": { 37 | "class-transformer": "^0.5.1", 38 | "class-validator": "^0.14.1", 39 | "file-type": "^16.5.4", 40 | "fs-extra": "^11.2.0", 41 | "jsdom": "^25.0.1", 42 | "lodash": "^4.17.21", 43 | "moment": "^2.30.1", 44 | "puppeteer": "^23.8.0" 45 | }, 46 | "devDependencies": { 47 | "@commitlint/cli": "^19.5.0", 48 | "@commitlint/config-conventional": "^19.5.0", 49 | "@kibibit/test-report-now": "^1.0.0", 50 | "@semantic-release/changelog": "^6.0.3", 51 | "@semantic-release/commit-analyzer": "^13.0.0", 52 | "@semantic-release/exec": "^6.0.3", 53 | "@semantic-release/git": "^10.0.1", 54 | "@semantic-release/github": "^11.0.1", 55 | "@semantic-release/npm": "^12.0.1", 56 | "@semantic-release/release-notes-generator": "^14.0.1", 57 | "@types/fs-extra": "^11.0.4", 58 | "@types/jest-image-snapshot": "^6.4.0", 59 | "@types/jsdom": "^21.1.7", 60 | "@types/lodash": "^4.17.13", 61 | "@types/node": "^22.9.0", 62 | "@types/semantic-release": "^20.0.6", 63 | "@types/svg2png": "^4.1.5", 64 | "barrelsby": "^2.8.1", 65 | "commitizen": "^4.3.1", 66 | "coveralls": "^3.1.1", 67 | "cz-conventional-changelog": "^3.3.0", 68 | "depcheck": "^1.4.7", 69 | "husky": "^9.1.6", 70 | "jest": "^29.7.0", 71 | "jest-github-reporter": "^1.1.1", 72 | "jest-image-snapshot": "^6.4.0", 73 | "jest-stare": "^2.5.2", 74 | "semantic-release": "24.2.0", 75 | "semantic-release-cli": "^5.4.6", 76 | "supertest": "^7.0.0", 77 | "ts-jest": "^29.2.5", 78 | "ts-loader": "^9.5.1", 79 | "ts-node": "^10.9.2", 80 | "tsconfig-paths": "^4.2.0", 81 | "typescript": "^5.6.3" 82 | }, 83 | "jest": { 84 | "coverageReporters": [ 85 | "json", 86 | "lcov", 87 | "text", 88 | "clover", 89 | "html" 90 | ], 91 | "verbose": true, 92 | "reporters": [ 93 | "default", 94 | "jest-stare", 95 | "jest-github-reporter" 96 | ], 97 | "testResultsProcessor": "./node_modules/jest-stare", 98 | "watchPathIgnorePatterns": [ 99 | ".*test-results.*\\.js" 100 | ], 101 | "collectCoverageFrom": [ 102 | "src/**/*.ts", 103 | "!src/**/index.ts" 104 | ], 105 | "moduleFileExtensions": [ 106 | "js", 107 | "json", 108 | "ts" 109 | ], 110 | "rootDir": ".", 111 | "testRegex": "\\.spec\\.ts$", 112 | "transform": { 113 | "^.+\\.(t|j)s$": "ts-jest" 114 | }, 115 | "coverageDirectory": "./test-results/coverage", 116 | "testEnvironment": "node", 117 | "moduleNameMapper": {} 118 | }, 119 | "jest-stare": { 120 | "resultDir": "test-results/", 121 | "coverageLink": "./coverage/index.html" 122 | }, 123 | "husky": { 124 | "hooks": { 125 | "prepare-commit-msg": "exec < /dev/tty && (npm run commit -- --hook) || true", 126 | "commit-msg": "commitlint -E HUSKY_GIT_PARAMS || (git config commit.template .commit-template && false)" 127 | } 128 | }, 129 | "config": { 130 | "commitizen": { 131 | "path": "./node_modules/cz-conventional-changelog" 132 | } 133 | }, 134 | "release": { 135 | "branches": [ 136 | "master", 137 | { 138 | "name": "next", 139 | "prerelease": true 140 | } 141 | ], 142 | "npmPublish": true, 143 | "analyzeCommits": [ 144 | "@semantic-release/commit-analyzer" 145 | ], 146 | "verifyConditions": [ 147 | "@semantic-release/npm", 148 | "@semantic-release/git", 149 | "@semantic-release/github" 150 | ], 151 | "prepare": [ 152 | "@semantic-release/npm", 153 | [ 154 | "@semantic-release/changelog", 155 | { 156 | "changelogFile": "docs/CHANGELOG.md" 157 | } 158 | ], 159 | { 160 | "path": "@semantic-release/git", 161 | "assets": [ 162 | "package.json", 163 | "docs/CHANGELOG.md" 164 | ], 165 | "message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}" 166 | } 167 | ], 168 | "publish": [ 169 | "@semantic-release/npm", 170 | "@semantic-release/github" 171 | ], 172 | "success": [ 173 | "@semantic-release/github" 174 | ], 175 | "fail": [ 176 | "@semantic-release/github" 177 | ] 178 | } 179 | } 180 | -------------------------------------------------------------------------------- /simple-server/template-test-reporter.svg: -------------------------------------------------------------------------------- 1 | 9 | {{#if fontBase64}} 10 | 22 | {{/if}} 23 | 59 | 60 | 64 | 65 | 66 | 70 | 120 | Reporter 123 | 124 | 125 | API Tests - {{ apiStatus }} 128 | E2E Tests - {{ e2eStatus }} 131 | 132 | 133 | -------------------------------------------------------------------------------- /templates/template-test-reporter.svg: -------------------------------------------------------------------------------- 1 | 9 | {{#if fontBase64}} 10 | 22 | {{/if}} 23 | 59 | 60 | 64 | 65 | 66 | 70 | 120 | Reporter 123 | 124 | 125 | Unit Tests - {{ unitCoverage }}% 128 | E2E Tests - {{ e2eCoverage }}% 131 | 132 | 133 | -------------------------------------------------------------------------------- /src/image-maker.ts: -------------------------------------------------------------------------------- 1 | import fileType from "file-type"; 2 | import fs from "fs-extra"; 3 | import { compile } from "handlebars"; 4 | import { isString, startsWith } from "lodash"; 5 | import { join } from "path"; 6 | import puppeteer from "puppeteer"; 7 | 8 | export enum KbHologramResultType { 9 | Base64Png = "Base64Png", 10 | Base64Svg = "Base64Svg", 11 | SvgString = "SvgString", 12 | SvgBuffer = "SvgBuffer", 13 | PngBuffer = "PngBuffer", 14 | } 15 | 16 | export type StringReturnInputs = 17 | | KbHologramResultType.Base64Png 18 | | KbHologramResultType.Base64Svg 19 | | KbHologramResultType.SvgString; 20 | 21 | export type BufferReturnInputs = 22 | | KbHologramResultType.SvgBuffer 23 | | KbHologramResultType.PngBuffer; 24 | 25 | export interface IKbHologramBaseOptions { 26 | templateName?: string; 27 | templateFile?: string | Buffer; 28 | templateString?: string; 29 | fontName?: string; 30 | width: number; 31 | height: number; 32 | data: { 33 | [key: string]: any; 34 | }; 35 | type?: "svg" | "html"; 36 | executablePath?: string; 37 | } 38 | 39 | export class KbHologram { 40 | private templateFilePath = ""; 41 | constructor(public options: IKbHologramBaseOptions) { } 42 | 43 | async render(resultType: StringReturnInputs): Promise; 44 | async render(resultType: BufferReturnInputs): Promise; 45 | async render( 46 | resultType: KbHologramResultType = KbHologramResultType.SvgString 47 | ): Promise { 48 | try { 49 | const template = await this.getTemplateAsString(); 50 | 51 | const handlebarsTemplate = compile(template); 52 | const fontBase64 = this.options.fontName 53 | ? await this.convertFontToBase64String( 54 | join(__dirname, this.options.fontName) 55 | ) 56 | : undefined; 57 | 58 | const data = { 59 | ...this.options.data, 60 | fontBase64, 61 | width: this.options.width, 62 | height: this.options.height, 63 | }; 64 | 65 | const svgString = handlebarsTemplate(data); 66 | 67 | if (this.options.type === "html") { 68 | this.templateFilePath = 69 | this.templateFilePath || (this.options.templateFile as string); 70 | const browser = await puppeteer.launch({ 71 | headless: true, 72 | timeout: 0, 73 | executablePath: this.options.executablePath, 74 | args: this.options.executablePath ? 75 | ['--no-sandbox', '--disable-setuid-sandbox'] : 76 | [] 77 | }); 78 | const page = await browser.newPage(); 79 | await page.setViewport({ 80 | height: this.options.height, 81 | width: this.options.width, 82 | }); 83 | await page.goto("file://" + this.templateFilePath, { 84 | waitUntil: "networkidle0", 85 | timeout: 0, 86 | }); 87 | await page.addScriptTag({ 88 | content: ` 89 | activate(${JSON.stringify(this.options.data)}) 90 | `, 91 | }); 92 | const imageBuffer = await page.screenshot({ 93 | omitBackground: true, 94 | encoding: "binary", 95 | }); 96 | 97 | await browser.close(); 98 | 99 | const bufferImage = Buffer.from(imageBuffer); 100 | 101 | if (resultType === KbHologramResultType.Base64Png) { 102 | return await this.bufferToBase64String(bufferImage); 103 | } 104 | 105 | return bufferImage; 106 | } else { 107 | if (resultType === KbHologramResultType.SvgString) { 108 | return svgString; 109 | } 110 | 111 | const svgBuffer = Buffer.from(svgString, "utf8"); 112 | 113 | if (resultType === KbHologramResultType.SvgBuffer) { 114 | return svgBuffer; 115 | } 116 | 117 | if (resultType === KbHologramResultType.Base64Svg) { 118 | return await this.bufferToBase64String(svgBuffer, { 119 | mime: "image/svg+xml", 120 | ext: "svg", 121 | }); 122 | } 123 | 124 | // Use Puppeteer to render the SVG and take a screenshot 125 | const browser = await puppeteer.launch({ 126 | headless: true, 127 | timeout: 0, 128 | executablePath: this.options.executablePath, 129 | args: this.options.executablePath ? 130 | ['--no-sandbox', '--disable-setuid-sandbox'] : 131 | [] 132 | }); 133 | const page = await browser.newPage(); 134 | await page.setViewport({ 135 | width: this.options.width, 136 | height: this.options.height, 137 | }); 138 | await page.setContent(svgString); 139 | const imageBuffer = await page.screenshot({ 140 | omitBackground: true, 141 | encoding: "binary", 142 | }); 143 | await browser.close(); 144 | 145 | const pngBuffer = Buffer.from(imageBuffer); 146 | 147 | if (resultType === KbHologramResultType.PngBuffer) { 148 | return pngBuffer; 149 | } 150 | 151 | // Default to Base64Png if resultType is not specified 152 | return await this.bufferToBase64String(pngBuffer); 153 | } 154 | } catch (err) { 155 | console.error(err); 156 | throw err; 157 | } 158 | } 159 | 160 | async convertFontToBase64String(fontFile: string): Promise { 161 | const data = await fs.readFile(fontFile); 162 | const buff = Buffer.from(data); 163 | const filetype = await this.fileType(buff); 164 | 165 | const base64data = buff.toString("base64"); 166 | 167 | return `data:${filetype.mime};base64,${base64data}`; 168 | } 169 | 170 | async bufferToBase64String( 171 | buff: Buffer, 172 | filetype?: { mime: string; ext: string } 173 | ): Promise { 174 | if (!filetype) { 175 | const detectedFileType = await this.fileType(buff); 176 | filetype = { mime: detectedFileType.mime, ext: detectedFileType.ext }; 177 | } 178 | return `data:${filetype.mime};base64,${buff.toString("base64")}`; 179 | } 180 | 181 | async fileType(buff: Buffer): Promise { 182 | const filetype = await fileType.fromBuffer(buff); 183 | 184 | if (!filetype) { 185 | throw new Error("filetype returned undefined"); 186 | } 187 | 188 | return filetype; 189 | } 190 | 191 | async getTemplateAsString(): Promise { 192 | let template = ""; 193 | 194 | if (isString(this.options.templateName)) { 195 | const allTemplates = await fs.readdir(join(__dirname, "../templates")); 196 | 197 | const templateFilename = allTemplates.find((templateFilename) => 198 | startsWith(templateFilename, this.options.templateName) 199 | ); 200 | 201 | if (!templateFilename) { 202 | throw new Error("template filename not found"); 203 | } 204 | 205 | this.templateFilePath = join(__dirname, "../templates", templateFilename); 206 | 207 | const filePath = join(__dirname, "../templates", `/${templateFilename}`); 208 | template = await fs.readFile(filePath, { encoding: "utf8" }); 209 | } else if (this.options.templateFile) { 210 | template = isString(this.options.templateFile) 211 | ? await fs.readFile(this.options.templateFile as string, { 212 | encoding: "utf8", 213 | }) 214 | : this.options.templateFile.toString(); 215 | } else if (this.options.templateString) { 216 | template = this.options.templateString; 217 | } 218 | 219 | return template; 220 | } 221 | } 222 | -------------------------------------------------------------------------------- /simple-server/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig to read more about this file */ 4 | /* Projects */ 5 | // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ 6 | // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ 7 | // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ 8 | // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ 9 | // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ 10 | // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ 11 | /* Language and Environment */ 12 | "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ 13 | // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ 14 | // "jsx": "preserve", /* Specify what JSX code is generated. */ 15 | // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ 16 | // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ 17 | // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ 18 | // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ 19 | // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ 20 | // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ 21 | // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ 22 | // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ 23 | // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ 24 | /* Modules */ 25 | "module": "commonjs", /* Specify what module code is generated. */ 26 | // "rootDir": "./", /* Specify the root folder within your source files. */ 27 | // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ 28 | // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ 29 | // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ 30 | // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ 31 | // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ 32 | // "types": [], /* Specify type package names to be included without being referenced in a source file. */ 33 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 34 | // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ 35 | // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ 36 | // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ 37 | // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ 38 | // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ 39 | // "noUncheckedSideEffectImports": true, /* Check side effect imports. */ 40 | // "resolveJsonModule": true, /* Enable importing .json files. */ 41 | // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ 42 | // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ 43 | /* JavaScript Support */ 44 | // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ 45 | // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ 46 | // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ 47 | /* Emit */ 48 | // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ 49 | // "declarationMap": true, /* Create sourcemaps for d.ts files. */ 50 | // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ 51 | // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ 52 | // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ 53 | // "noEmit": true, /* Disable emitting files from a compilation. */ 54 | // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ 55 | "outDir": "./dist", /* Specify an output folder for all emitted files. */ 56 | // "removeComments": true, /* Disable emitting comments. */ 57 | // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ 58 | // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ 59 | // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ 60 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 61 | // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ 62 | // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ 63 | // "newLine": "crlf", /* Set the newline character for emitting files. */ 64 | // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ 65 | // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ 66 | // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ 67 | // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ 68 | // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ 69 | /* Interop Constraints */ 70 | // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ 71 | // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ 72 | // "isolatedDeclarations": true, /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */ 73 | // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ 74 | "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ 75 | // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ 76 | "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ 77 | /* Type Checking */ 78 | "strict": true, /* Enable all strict type-checking options. */ 79 | // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ 80 | // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ 81 | // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ 82 | // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ 83 | // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ 84 | // "strictBuiltinIteratorReturn": true, /* Built-in iterators are instantiated with a 'TReturn' type of 'undefined' instead of 'any'. */ 85 | // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ 86 | // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ 87 | // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ 88 | // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ 89 | // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ 90 | // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ 91 | // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ 92 | // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ 93 | // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ 94 | // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ 95 | // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ 96 | // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ 97 | // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ 98 | /* Completeness */ 99 | // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ 100 | "skipLibCheck": true /* Skip type checking all .d.ts files. */ 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /hologram.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/image-maker.spec.ts: -------------------------------------------------------------------------------- 1 | import { toMatchImageSnapshot } from "jest-image-snapshot"; 2 | 3 | import { KbHologram, KbHologramResultType } from "./image-maker"; 4 | import { join } from "path"; 5 | 6 | // const toMatchImageSnapshot = configureToMatchImageSnapshot(); 7 | 8 | expect.extend({ toMatchImageSnapshot }); 9 | 10 | const FONT_PATH = "../Comfortaa-Regular.ttf"; 11 | const HEIGHT = 534; 12 | const WIDTH = 1069; 13 | 14 | const customConfig = { 15 | customDiffConfig: { threshold: 0.5 }, 16 | failureThreshold: 0.02, 17 | failureThresholdType: "percent", 18 | }; 19 | 20 | describe("image maker", () => { 21 | it("should generate svg string with params", async () => { 22 | const kbHologram = new KbHologram({ 23 | fontName: FONT_PATH, 24 | templateName: "template-test-reporter", 25 | height: HEIGHT, 26 | width: WIDTH, 27 | data: { 28 | unitCoverage: 666, 29 | e2eCoverage: 333, 30 | }, 31 | }); 32 | 33 | const svgString = await kbHologram.render(KbHologramResultType.SvgString); 34 | 35 | expect(svgString).toContain("666"); 36 | expect(svgString).toContain("333"); 37 | expect(svgString).toMatchSnapshot(); 38 | }); 39 | 40 | it("should generate svg buffer", async () => { 41 | const kbHologram = new KbHologram({ 42 | fontName: FONT_PATH, 43 | templateName: "template-test-reporter", 44 | height: HEIGHT, 45 | width: WIDTH, 46 | data: { 47 | unitCoverage: 666, 48 | e2eCoverage: 333, 49 | }, 50 | }); 51 | 52 | const svgBuffer = await kbHologram.render(KbHologramResultType.SvgBuffer); 53 | 54 | expect(svgBuffer).toBeInstanceOf(Buffer); 55 | expect(svgBuffer.toString("base64")).toMatchSnapshot(); 56 | }); 57 | 58 | it("should generate svg Base64 string", async () => { 59 | const kbHologram = new KbHologram({ 60 | fontName: FONT_PATH, 61 | templateName: "template-test-reporter", 62 | height: HEIGHT, 63 | width: WIDTH, 64 | data: { 65 | unitCoverage: 666, 66 | e2eCoverage: 333, 67 | }, 68 | }); 69 | 70 | const svgB64String = await kbHologram.render( 71 | KbHologramResultType.Base64Svg 72 | ); 73 | 74 | expect(svgB64String).toMatchSnapshot(); 75 | }); 76 | 77 | it("should generate a coverage image from template", async () => { 78 | const kbHologram = new KbHologram({ 79 | fontName: FONT_PATH, 80 | templateName: "template-test-reporter", 81 | height: HEIGHT, 82 | width: WIDTH, 83 | data: { 84 | unitCoverage: 666, 85 | e2eCoverage: 333, 86 | }, 87 | }); 88 | 89 | const pngBuffer = await kbHologram.render(KbHologramResultType.PngBuffer); 90 | 91 | // writeFile('na.png', pngBuffer); 92 | 93 | (expect(pngBuffer) as any).toMatchImageSnapshot(customConfig); 94 | }, 10000); 95 | 96 | it("should generate changelog from html template", async () => { 97 | const kbHologram = new KbHologram({ 98 | fontName: "../Comfortaa-Regular.ttf", 99 | templateName: "changelog-template", 100 | height: 534 * 2, 101 | width: 1069 * 2, 102 | data: { 103 | columnOne: [ 104 | "Compact folders in Explorer", 105 | "Edit both files in diff view", 106 | "Search results update while typing", 107 | "Problems panel filtering by type", 108 | "Minimap highlights errors, changes", 109 | "Terminal minimum contrast ratio", 110 | ], 111 | columnTwo: [ 112 | "Mirror cursor in HTML tags", 113 | "Optional chaining support in JS\\TS", 114 | "Extract to interface TS refactoring", 115 | "Sass module support for @use", 116 | "Remote - Containers improvements", 117 | "Visual Studio Online preview", 118 | ], 119 | title: "achievibit", 120 | subtitle: "v2.1.4 - CHANGELOG", 121 | logo: { 122 | url: "data:image/png;base64,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", 123 | alt: "kibibit", 124 | }, 125 | }, 126 | type: "html", 127 | }); 128 | 129 | const pngBuffer = await kbHologram.render(KbHologramResultType.PngBuffer); 130 | 131 | // await writeFile('nice.svg', pngBuffer); 132 | 133 | (expect(pngBuffer) as any).toMatchImageSnapshot(customConfig); 134 | }, 20000); 135 | 136 | it("should generate image from html template with external template", async () => { 137 | const kbHologram = new KbHologram({ 138 | fontName: "../Comfortaa-Regular.ttf", 139 | templateFile: join( 140 | __dirname, 141 | "..", 142 | "test-assets", 143 | "my-template", 144 | "index.html" 145 | ), 146 | height: 534 * 2, 147 | width: 1069 * 2, 148 | data: { 149 | title: "achievibit", 150 | subtitle: "v2.1.4 - CHANGELOG", 151 | logo: { 152 | url: "data:image/png;base64,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", 153 | alt: "kibibit", 154 | }, 155 | }, 156 | type: "html", 157 | }); 158 | 159 | const pngBuffer = await kbHologram.render(KbHologramResultType.PngBuffer); 160 | 161 | // await writeFile('nice.svg', pngBuffer); 162 | 163 | (expect(pngBuffer) as any).toMatchImageSnapshot(customConfig); 164 | }, 10000000); 165 | }); 166 | -------------------------------------------------------------------------------- /simple-server/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "simple-server", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "simple-server", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@kibibit/kb-hologram": "^2.1.0-next.4", 13 | "body-parser": "^1.20.3", 14 | "cache-manager": "^6.1.3", 15 | "cacheable": "^1.8.4", 16 | "express": "^4.21.1", 17 | "handlebars": "^4.7.8", 18 | "keyv": "^5.2.1" 19 | }, 20 | "devDependencies": { 21 | "@types/express": "^5.0.0", 22 | "@types/node": "^22.9.0", 23 | "ts-node": "^10.9.2", 24 | "typescript": "^5.6.3" 25 | } 26 | }, 27 | "node_modules/@babel/code-frame": { 28 | "version": "7.26.2", 29 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", 30 | "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", 31 | "dependencies": { 32 | "@babel/helper-validator-identifier": "^7.25.9", 33 | "js-tokens": "^4.0.0", 34 | "picocolors": "^1.0.0" 35 | }, 36 | "engines": { 37 | "node": ">=6.9.0" 38 | } 39 | }, 40 | "node_modules/@babel/helper-validator-identifier": { 41 | "version": "7.25.9", 42 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", 43 | "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", 44 | "engines": { 45 | "node": ">=6.9.0" 46 | } 47 | }, 48 | "node_modules/@cspotcode/source-map-support": { 49 | "version": "0.8.1", 50 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 51 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 52 | "dev": true, 53 | "dependencies": { 54 | "@jridgewell/trace-mapping": "0.3.9" 55 | }, 56 | "engines": { 57 | "node": ">=12" 58 | } 59 | }, 60 | "node_modules/@jridgewell/resolve-uri": { 61 | "version": "3.1.2", 62 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 63 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 64 | "dev": true, 65 | "engines": { 66 | "node": ">=6.0.0" 67 | } 68 | }, 69 | "node_modules/@jridgewell/sourcemap-codec": { 70 | "version": "1.5.0", 71 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 72 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 73 | "dev": true 74 | }, 75 | "node_modules/@jridgewell/trace-mapping": { 76 | "version": "0.3.9", 77 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 78 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 79 | "dev": true, 80 | "dependencies": { 81 | "@jridgewell/resolve-uri": "^3.0.3", 82 | "@jridgewell/sourcemap-codec": "^1.4.10" 83 | } 84 | }, 85 | "node_modules/@keyv/serialize": { 86 | "version": "1.0.1", 87 | "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.0.1.tgz", 88 | "integrity": "sha512-kKXeynfORDGPUEEl2PvTExM2zs+IldC6ZD8jPcfvI351MDNtfMlw9V9s4XZXuJNDK2qR5gbEKxRyoYx3quHUVQ==", 89 | "dependencies": { 90 | "buffer": "^6.0.3" 91 | } 92 | }, 93 | "node_modules/@keyv/serialize/node_modules/buffer": { 94 | "version": "6.0.3", 95 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", 96 | "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", 97 | "funding": [ 98 | { 99 | "type": "github", 100 | "url": "https://github.com/sponsors/feross" 101 | }, 102 | { 103 | "type": "patreon", 104 | "url": "https://www.patreon.com/feross" 105 | }, 106 | { 107 | "type": "consulting", 108 | "url": "https://feross.org/support" 109 | } 110 | ], 111 | "dependencies": { 112 | "base64-js": "^1.3.1", 113 | "ieee754": "^1.2.1" 114 | } 115 | }, 116 | "node_modules/@kibibit/kb-hologram": { 117 | "version": "2.1.0-next.4", 118 | "resolved": "https://registry.npmjs.org/@kibibit/kb-hologram/-/kb-hologram-2.1.0-next.4.tgz", 119 | "integrity": "sha512-4VX+PnAJLXDFRtzC9JBuZDtrWFVS/Rbt/ttCYkHQKlV6Xd1Uzw4C6N29LtBoqNyYgLkL84dJLOzAUJw6QtV+ew==", 120 | "dependencies": { 121 | "class-transformer": "^0.5.1", 122 | "class-validator": "^0.14.1", 123 | "file-type": "^16.5.4", 124 | "fs-extra": "^11.2.0", 125 | "jsdom": "^25.0.1", 126 | "lodash": "^4.17.21", 127 | "moment": "^2.30.1", 128 | "puppeteer": "^23.8.0" 129 | } 130 | }, 131 | "node_modules/@puppeteer/browsers": { 132 | "version": "2.4.1", 133 | "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.4.1.tgz", 134 | "integrity": "sha512-0kdAbmic3J09I6dT8e9vE2JOCSt13wHCW5x/ly8TSt2bDtuIWe2TgLZZDHdcziw9AVCzflMAXCrVyRIhIs44Ng==", 135 | "dependencies": { 136 | "debug": "^4.3.7", 137 | "extract-zip": "^2.0.1", 138 | "progress": "^2.0.3", 139 | "proxy-agent": "^6.4.0", 140 | "semver": "^7.6.3", 141 | "tar-fs": "^3.0.6", 142 | "unbzip2-stream": "^1.4.3", 143 | "yargs": "^17.7.2" 144 | }, 145 | "bin": { 146 | "browsers": "lib/cjs/main-cli.js" 147 | }, 148 | "engines": { 149 | "node": ">=18" 150 | } 151 | }, 152 | "node_modules/@puppeteer/browsers/node_modules/debug": { 153 | "version": "4.3.7", 154 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 155 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 156 | "dependencies": { 157 | "ms": "^2.1.3" 158 | }, 159 | "engines": { 160 | "node": ">=6.0" 161 | }, 162 | "peerDependenciesMeta": { 163 | "supports-color": { 164 | "optional": true 165 | } 166 | } 167 | }, 168 | "node_modules/@puppeteer/browsers/node_modules/ms": { 169 | "version": "2.1.3", 170 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 171 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 172 | }, 173 | "node_modules/@puppeteer/browsers/node_modules/semver": { 174 | "version": "7.6.3", 175 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", 176 | "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", 177 | "bin": { 178 | "semver": "bin/semver.js" 179 | }, 180 | "engines": { 181 | "node": ">=10" 182 | } 183 | }, 184 | "node_modules/@tokenizer/token": { 185 | "version": "0.3.0", 186 | "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", 187 | "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" 188 | }, 189 | "node_modules/@tootallnate/quickjs-emscripten": { 190 | "version": "0.23.0", 191 | "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", 192 | "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==" 193 | }, 194 | "node_modules/@tsconfig/node10": { 195 | "version": "1.0.11", 196 | "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", 197 | "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", 198 | "dev": true 199 | }, 200 | "node_modules/@tsconfig/node12": { 201 | "version": "1.0.11", 202 | "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", 203 | "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", 204 | "dev": true 205 | }, 206 | "node_modules/@tsconfig/node14": { 207 | "version": "1.0.3", 208 | "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", 209 | "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", 210 | "dev": true 211 | }, 212 | "node_modules/@tsconfig/node16": { 213 | "version": "1.0.4", 214 | "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", 215 | "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", 216 | "dev": true 217 | }, 218 | "node_modules/@types/body-parser": { 219 | "version": "1.19.5", 220 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", 221 | "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", 222 | "dev": true, 223 | "dependencies": { 224 | "@types/connect": "*", 225 | "@types/node": "*" 226 | } 227 | }, 228 | "node_modules/@types/connect": { 229 | "version": "3.4.38", 230 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", 231 | "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", 232 | "dev": true, 233 | "dependencies": { 234 | "@types/node": "*" 235 | } 236 | }, 237 | "node_modules/@types/express": { 238 | "version": "5.0.0", 239 | "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.0.tgz", 240 | "integrity": "sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==", 241 | "dev": true, 242 | "dependencies": { 243 | "@types/body-parser": "*", 244 | "@types/express-serve-static-core": "^5.0.0", 245 | "@types/qs": "*", 246 | "@types/serve-static": "*" 247 | } 248 | }, 249 | "node_modules/@types/express-serve-static-core": { 250 | "version": "5.0.1", 251 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.1.tgz", 252 | "integrity": "sha512-CRICJIl0N5cXDONAdlTv5ShATZ4HEwk6kDDIW2/w9qOWKg+NU/5F8wYRWCrONad0/UKkloNSmmyN/wX4rtpbVA==", 253 | "dev": true, 254 | "dependencies": { 255 | "@types/node": "*", 256 | "@types/qs": "*", 257 | "@types/range-parser": "*", 258 | "@types/send": "*" 259 | } 260 | }, 261 | "node_modules/@types/http-errors": { 262 | "version": "2.0.4", 263 | "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", 264 | "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", 265 | "dev": true 266 | }, 267 | "node_modules/@types/mime": { 268 | "version": "1.3.5", 269 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", 270 | "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", 271 | "dev": true 272 | }, 273 | "node_modules/@types/node": { 274 | "version": "22.9.0", 275 | "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz", 276 | "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==", 277 | "devOptional": true, 278 | "dependencies": { 279 | "undici-types": "~6.19.8" 280 | } 281 | }, 282 | "node_modules/@types/qs": { 283 | "version": "6.9.17", 284 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", 285 | "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==", 286 | "dev": true 287 | }, 288 | "node_modules/@types/range-parser": { 289 | "version": "1.2.7", 290 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", 291 | "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", 292 | "dev": true 293 | }, 294 | "node_modules/@types/send": { 295 | "version": "0.17.4", 296 | "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", 297 | "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", 298 | "dev": true, 299 | "dependencies": { 300 | "@types/mime": "^1", 301 | "@types/node": "*" 302 | } 303 | }, 304 | "node_modules/@types/serve-static": { 305 | "version": "1.15.7", 306 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", 307 | "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", 308 | "dev": true, 309 | "dependencies": { 310 | "@types/http-errors": "*", 311 | "@types/node": "*", 312 | "@types/send": "*" 313 | } 314 | }, 315 | "node_modules/@types/validator": { 316 | "version": "13.12.2", 317 | "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.2.tgz", 318 | "integrity": "sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==" 319 | }, 320 | "node_modules/@types/yauzl": { 321 | "version": "2.10.3", 322 | "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", 323 | "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", 324 | "optional": true, 325 | "dependencies": { 326 | "@types/node": "*" 327 | } 328 | }, 329 | "node_modules/accepts": { 330 | "version": "1.3.8", 331 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 332 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 333 | "dependencies": { 334 | "mime-types": "~2.1.34", 335 | "negotiator": "0.6.3" 336 | }, 337 | "engines": { 338 | "node": ">= 0.6" 339 | } 340 | }, 341 | "node_modules/acorn": { 342 | "version": "8.14.0", 343 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", 344 | "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", 345 | "dev": true, 346 | "bin": { 347 | "acorn": "bin/acorn" 348 | }, 349 | "engines": { 350 | "node": ">=0.4.0" 351 | } 352 | }, 353 | "node_modules/acorn-walk": { 354 | "version": "8.3.4", 355 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", 356 | "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", 357 | "dev": true, 358 | "dependencies": { 359 | "acorn": "^8.11.0" 360 | }, 361 | "engines": { 362 | "node": ">=0.4.0" 363 | } 364 | }, 365 | "node_modules/agent-base": { 366 | "version": "7.1.1", 367 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", 368 | "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", 369 | "dependencies": { 370 | "debug": "^4.3.4" 371 | }, 372 | "engines": { 373 | "node": ">= 14" 374 | } 375 | }, 376 | "node_modules/agent-base/node_modules/debug": { 377 | "version": "4.3.7", 378 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 379 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 380 | "dependencies": { 381 | "ms": "^2.1.3" 382 | }, 383 | "engines": { 384 | "node": ">=6.0" 385 | }, 386 | "peerDependenciesMeta": { 387 | "supports-color": { 388 | "optional": true 389 | } 390 | } 391 | }, 392 | "node_modules/agent-base/node_modules/ms": { 393 | "version": "2.1.3", 394 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 395 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 396 | }, 397 | "node_modules/ansi-regex": { 398 | "version": "5.0.1", 399 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 400 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 401 | "engines": { 402 | "node": ">=8" 403 | } 404 | }, 405 | "node_modules/ansi-styles": { 406 | "version": "4.3.0", 407 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 408 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 409 | "dependencies": { 410 | "color-convert": "^2.0.1" 411 | }, 412 | "engines": { 413 | "node": ">=8" 414 | }, 415 | "funding": { 416 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 417 | } 418 | }, 419 | "node_modules/arg": { 420 | "version": "4.1.3", 421 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 422 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 423 | "dev": true 424 | }, 425 | "node_modules/argparse": { 426 | "version": "2.0.1", 427 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 428 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" 429 | }, 430 | "node_modules/array-flatten": { 431 | "version": "1.1.1", 432 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 433 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 434 | }, 435 | "node_modules/ast-types": { 436 | "version": "0.13.4", 437 | "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", 438 | "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", 439 | "dependencies": { 440 | "tslib": "^2.0.1" 441 | }, 442 | "engines": { 443 | "node": ">=4" 444 | } 445 | }, 446 | "node_modules/asynckit": { 447 | "version": "0.4.0", 448 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 449 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 450 | }, 451 | "node_modules/b4a": { 452 | "version": "1.6.7", 453 | "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", 454 | "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==" 455 | }, 456 | "node_modules/bare-events": { 457 | "version": "2.5.0", 458 | "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.0.tgz", 459 | "integrity": "sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==", 460 | "optional": true 461 | }, 462 | "node_modules/bare-fs": { 463 | "version": "2.3.5", 464 | "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz", 465 | "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==", 466 | "optional": true, 467 | "dependencies": { 468 | "bare-events": "^2.0.0", 469 | "bare-path": "^2.0.0", 470 | "bare-stream": "^2.0.0" 471 | } 472 | }, 473 | "node_modules/bare-os": { 474 | "version": "2.4.4", 475 | "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz", 476 | "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==", 477 | "optional": true 478 | }, 479 | "node_modules/bare-path": { 480 | "version": "2.1.3", 481 | "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", 482 | "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", 483 | "optional": true, 484 | "dependencies": { 485 | "bare-os": "^2.1.0" 486 | } 487 | }, 488 | "node_modules/bare-stream": { 489 | "version": "2.3.2", 490 | "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.3.2.tgz", 491 | "integrity": "sha512-EFZHSIBkDgSHIwj2l2QZfP4U5OcD4xFAOwhSb/vlr9PIqyGJGvB/nfClJbcnh3EY4jtPE4zsb5ztae96bVF79A==", 492 | "optional": true, 493 | "dependencies": { 494 | "streamx": "^2.20.0" 495 | } 496 | }, 497 | "node_modules/base64-js": { 498 | "version": "1.5.1", 499 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 500 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 501 | "funding": [ 502 | { 503 | "type": "github", 504 | "url": "https://github.com/sponsors/feross" 505 | }, 506 | { 507 | "type": "patreon", 508 | "url": "https://www.patreon.com/feross" 509 | }, 510 | { 511 | "type": "consulting", 512 | "url": "https://feross.org/support" 513 | } 514 | ] 515 | }, 516 | "node_modules/basic-ftp": { 517 | "version": "5.0.5", 518 | "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", 519 | "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", 520 | "engines": { 521 | "node": ">=10.0.0" 522 | } 523 | }, 524 | "node_modules/body-parser": { 525 | "version": "1.20.3", 526 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", 527 | "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", 528 | "dependencies": { 529 | "bytes": "3.1.2", 530 | "content-type": "~1.0.5", 531 | "debug": "2.6.9", 532 | "depd": "2.0.0", 533 | "destroy": "1.2.0", 534 | "http-errors": "2.0.0", 535 | "iconv-lite": "0.4.24", 536 | "on-finished": "2.4.1", 537 | "qs": "6.13.0", 538 | "raw-body": "2.5.2", 539 | "type-is": "~1.6.18", 540 | "unpipe": "1.0.0" 541 | }, 542 | "engines": { 543 | "node": ">= 0.8", 544 | "npm": "1.2.8000 || >= 1.4.16" 545 | } 546 | }, 547 | "node_modules/buffer": { 548 | "version": "5.7.1", 549 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 550 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 551 | "funding": [ 552 | { 553 | "type": "github", 554 | "url": "https://github.com/sponsors/feross" 555 | }, 556 | { 557 | "type": "patreon", 558 | "url": "https://www.patreon.com/feross" 559 | }, 560 | { 561 | "type": "consulting", 562 | "url": "https://feross.org/support" 563 | } 564 | ], 565 | "dependencies": { 566 | "base64-js": "^1.3.1", 567 | "ieee754": "^1.1.13" 568 | } 569 | }, 570 | "node_modules/buffer-crc32": { 571 | "version": "0.2.13", 572 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 573 | "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", 574 | "engines": { 575 | "node": "*" 576 | } 577 | }, 578 | "node_modules/bytes": { 579 | "version": "3.1.2", 580 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 581 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 582 | "engines": { 583 | "node": ">= 0.8" 584 | } 585 | }, 586 | "node_modules/cache-manager": { 587 | "version": "6.1.3", 588 | "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-6.1.3.tgz", 589 | "integrity": "sha512-IcBseSv1GquLxlTb1nH5KhOQQwwOjMC5hkBras+8zTYD/bRSCgT9bIah1DZ+4eKc3vcqqYtfUCI5pYvOHmDXtw==", 590 | "dependencies": { 591 | "keyv": "^5.2.1" 592 | } 593 | }, 594 | "node_modules/cacheable": { 595 | "version": "1.8.4", 596 | "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.8.4.tgz", 597 | "integrity": "sha512-eqcPwJIM8hcx2mQIZtgrBQ7BmOf2pkL+1URswJaKRikCDw5of/lGpBTxODL1z1VuVVuxZHTuTejAMd9vyAUpLg==", 598 | "dependencies": { 599 | "hookified": "^1.5.0", 600 | "keyv": "^5.2.1" 601 | } 602 | }, 603 | "node_modules/call-bind": { 604 | "version": "1.0.7", 605 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", 606 | "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", 607 | "dependencies": { 608 | "es-define-property": "^1.0.0", 609 | "es-errors": "^1.3.0", 610 | "function-bind": "^1.1.2", 611 | "get-intrinsic": "^1.2.4", 612 | "set-function-length": "^1.2.1" 613 | }, 614 | "engines": { 615 | "node": ">= 0.4" 616 | }, 617 | "funding": { 618 | "url": "https://github.com/sponsors/ljharb" 619 | } 620 | }, 621 | "node_modules/callsites": { 622 | "version": "3.1.0", 623 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 624 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 625 | "engines": { 626 | "node": ">=6" 627 | } 628 | }, 629 | "node_modules/chromium-bidi": { 630 | "version": "0.8.0", 631 | "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.8.0.tgz", 632 | "integrity": "sha512-uJydbGdTw0DEUjhoogGveneJVWX/9YuqkWePzMmkBYwtdAqo5d3J/ovNKFr+/2hWXYmYCr6it8mSSTIj6SS6Ug==", 633 | "dependencies": { 634 | "mitt": "3.0.1", 635 | "urlpattern-polyfill": "10.0.0", 636 | "zod": "3.23.8" 637 | }, 638 | "peerDependencies": { 639 | "devtools-protocol": "*" 640 | } 641 | }, 642 | "node_modules/class-transformer": { 643 | "version": "0.5.1", 644 | "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", 645 | "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==" 646 | }, 647 | "node_modules/class-validator": { 648 | "version": "0.14.1", 649 | "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.1.tgz", 650 | "integrity": "sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==", 651 | "dependencies": { 652 | "@types/validator": "^13.11.8", 653 | "libphonenumber-js": "^1.10.53", 654 | "validator": "^13.9.0" 655 | } 656 | }, 657 | "node_modules/cliui": { 658 | "version": "8.0.1", 659 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", 660 | "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", 661 | "dependencies": { 662 | "string-width": "^4.2.0", 663 | "strip-ansi": "^6.0.1", 664 | "wrap-ansi": "^7.0.0" 665 | }, 666 | "engines": { 667 | "node": ">=12" 668 | } 669 | }, 670 | "node_modules/color-convert": { 671 | "version": "2.0.1", 672 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 673 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 674 | "dependencies": { 675 | "color-name": "~1.1.4" 676 | }, 677 | "engines": { 678 | "node": ">=7.0.0" 679 | } 680 | }, 681 | "node_modules/color-name": { 682 | "version": "1.1.4", 683 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 684 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 685 | }, 686 | "node_modules/combined-stream": { 687 | "version": "1.0.8", 688 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 689 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 690 | "dependencies": { 691 | "delayed-stream": "~1.0.0" 692 | }, 693 | "engines": { 694 | "node": ">= 0.8" 695 | } 696 | }, 697 | "node_modules/content-disposition": { 698 | "version": "0.5.4", 699 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 700 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 701 | "dependencies": { 702 | "safe-buffer": "5.2.1" 703 | }, 704 | "engines": { 705 | "node": ">= 0.6" 706 | } 707 | }, 708 | "node_modules/content-type": { 709 | "version": "1.0.5", 710 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 711 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 712 | "engines": { 713 | "node": ">= 0.6" 714 | } 715 | }, 716 | "node_modules/cookie": { 717 | "version": "0.7.1", 718 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", 719 | "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", 720 | "engines": { 721 | "node": ">= 0.6" 722 | } 723 | }, 724 | "node_modules/cookie-signature": { 725 | "version": "1.0.6", 726 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 727 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 728 | }, 729 | "node_modules/cosmiconfig": { 730 | "version": "9.0.0", 731 | "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", 732 | "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", 733 | "dependencies": { 734 | "env-paths": "^2.2.1", 735 | "import-fresh": "^3.3.0", 736 | "js-yaml": "^4.1.0", 737 | "parse-json": "^5.2.0" 738 | }, 739 | "engines": { 740 | "node": ">=14" 741 | }, 742 | "funding": { 743 | "url": "https://github.com/sponsors/d-fischer" 744 | }, 745 | "peerDependencies": { 746 | "typescript": ">=4.9.5" 747 | }, 748 | "peerDependenciesMeta": { 749 | "typescript": { 750 | "optional": true 751 | } 752 | } 753 | }, 754 | "node_modules/create-require": { 755 | "version": "1.1.1", 756 | "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", 757 | "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", 758 | "dev": true 759 | }, 760 | "node_modules/cssstyle": { 761 | "version": "4.1.0", 762 | "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.1.0.tgz", 763 | "integrity": "sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==", 764 | "dependencies": { 765 | "rrweb-cssom": "^0.7.1" 766 | }, 767 | "engines": { 768 | "node": ">=18" 769 | } 770 | }, 771 | "node_modules/data-uri-to-buffer": { 772 | "version": "6.0.2", 773 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", 774 | "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", 775 | "engines": { 776 | "node": ">= 14" 777 | } 778 | }, 779 | "node_modules/data-urls": { 780 | "version": "5.0.0", 781 | "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", 782 | "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", 783 | "dependencies": { 784 | "whatwg-mimetype": "^4.0.0", 785 | "whatwg-url": "^14.0.0" 786 | }, 787 | "engines": { 788 | "node": ">=18" 789 | } 790 | }, 791 | "node_modules/debug": { 792 | "version": "2.6.9", 793 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 794 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 795 | "dependencies": { 796 | "ms": "2.0.0" 797 | } 798 | }, 799 | "node_modules/decimal.js": { 800 | "version": "10.4.3", 801 | "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", 802 | "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" 803 | }, 804 | "node_modules/define-data-property": { 805 | "version": "1.1.4", 806 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", 807 | "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", 808 | "dependencies": { 809 | "es-define-property": "^1.0.0", 810 | "es-errors": "^1.3.0", 811 | "gopd": "^1.0.1" 812 | }, 813 | "engines": { 814 | "node": ">= 0.4" 815 | }, 816 | "funding": { 817 | "url": "https://github.com/sponsors/ljharb" 818 | } 819 | }, 820 | "node_modules/degenerator": { 821 | "version": "5.0.1", 822 | "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", 823 | "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", 824 | "dependencies": { 825 | "ast-types": "^0.13.4", 826 | "escodegen": "^2.1.0", 827 | "esprima": "^4.0.1" 828 | }, 829 | "engines": { 830 | "node": ">= 14" 831 | } 832 | }, 833 | "node_modules/delayed-stream": { 834 | "version": "1.0.0", 835 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 836 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 837 | "engines": { 838 | "node": ">=0.4.0" 839 | } 840 | }, 841 | "node_modules/depd": { 842 | "version": "2.0.0", 843 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 844 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 845 | "engines": { 846 | "node": ">= 0.8" 847 | } 848 | }, 849 | "node_modules/destroy": { 850 | "version": "1.2.0", 851 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 852 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 853 | "engines": { 854 | "node": ">= 0.8", 855 | "npm": "1.2.8000 || >= 1.4.16" 856 | } 857 | }, 858 | "node_modules/devtools-protocol": { 859 | "version": "0.0.1367902", 860 | "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1367902.tgz", 861 | "integrity": "sha512-XxtPuC3PGakY6PD7dG66/o8KwJ/LkH2/EKe19Dcw58w53dv4/vSQEkn/SzuyhHE2q4zPgCkxQBxus3VV4ql+Pg==" 862 | }, 863 | "node_modules/diff": { 864 | "version": "4.0.2", 865 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 866 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 867 | "dev": true, 868 | "engines": { 869 | "node": ">=0.3.1" 870 | } 871 | }, 872 | "node_modules/ee-first": { 873 | "version": "1.1.1", 874 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 875 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 876 | }, 877 | "node_modules/emoji-regex": { 878 | "version": "8.0.0", 879 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 880 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 881 | }, 882 | "node_modules/encodeurl": { 883 | "version": "2.0.0", 884 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", 885 | "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", 886 | "engines": { 887 | "node": ">= 0.8" 888 | } 889 | }, 890 | "node_modules/end-of-stream": { 891 | "version": "1.4.4", 892 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 893 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 894 | "dependencies": { 895 | "once": "^1.4.0" 896 | } 897 | }, 898 | "node_modules/entities": { 899 | "version": "4.5.0", 900 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", 901 | "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", 902 | "engines": { 903 | "node": ">=0.12" 904 | }, 905 | "funding": { 906 | "url": "https://github.com/fb55/entities?sponsor=1" 907 | } 908 | }, 909 | "node_modules/env-paths": { 910 | "version": "2.2.1", 911 | "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", 912 | "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", 913 | "engines": { 914 | "node": ">=6" 915 | } 916 | }, 917 | "node_modules/error-ex": { 918 | "version": "1.3.2", 919 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 920 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 921 | "dependencies": { 922 | "is-arrayish": "^0.2.1" 923 | } 924 | }, 925 | "node_modules/es-define-property": { 926 | "version": "1.0.0", 927 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", 928 | "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", 929 | "dependencies": { 930 | "get-intrinsic": "^1.2.4" 931 | }, 932 | "engines": { 933 | "node": ">= 0.4" 934 | } 935 | }, 936 | "node_modules/es-errors": { 937 | "version": "1.3.0", 938 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 939 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 940 | "engines": { 941 | "node": ">= 0.4" 942 | } 943 | }, 944 | "node_modules/escalade": { 945 | "version": "3.2.0", 946 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", 947 | "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", 948 | "engines": { 949 | "node": ">=6" 950 | } 951 | }, 952 | "node_modules/escape-html": { 953 | "version": "1.0.3", 954 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 955 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 956 | }, 957 | "node_modules/escodegen": { 958 | "version": "2.1.0", 959 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", 960 | "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", 961 | "dependencies": { 962 | "esprima": "^4.0.1", 963 | "estraverse": "^5.2.0", 964 | "esutils": "^2.0.2" 965 | }, 966 | "bin": { 967 | "escodegen": "bin/escodegen.js", 968 | "esgenerate": "bin/esgenerate.js" 969 | }, 970 | "engines": { 971 | "node": ">=6.0" 972 | }, 973 | "optionalDependencies": { 974 | "source-map": "~0.6.1" 975 | } 976 | }, 977 | "node_modules/esprima": { 978 | "version": "4.0.1", 979 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 980 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 981 | "bin": { 982 | "esparse": "bin/esparse.js", 983 | "esvalidate": "bin/esvalidate.js" 984 | }, 985 | "engines": { 986 | "node": ">=4" 987 | } 988 | }, 989 | "node_modules/estraverse": { 990 | "version": "5.3.0", 991 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 992 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 993 | "engines": { 994 | "node": ">=4.0" 995 | } 996 | }, 997 | "node_modules/esutils": { 998 | "version": "2.0.3", 999 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1000 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1001 | "engines": { 1002 | "node": ">=0.10.0" 1003 | } 1004 | }, 1005 | "node_modules/etag": { 1006 | "version": "1.8.1", 1007 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 1008 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 1009 | "engines": { 1010 | "node": ">= 0.6" 1011 | } 1012 | }, 1013 | "node_modules/express": { 1014 | "version": "4.21.1", 1015 | "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", 1016 | "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", 1017 | "dependencies": { 1018 | "accepts": "~1.3.8", 1019 | "array-flatten": "1.1.1", 1020 | "body-parser": "1.20.3", 1021 | "content-disposition": "0.5.4", 1022 | "content-type": "~1.0.4", 1023 | "cookie": "0.7.1", 1024 | "cookie-signature": "1.0.6", 1025 | "debug": "2.6.9", 1026 | "depd": "2.0.0", 1027 | "encodeurl": "~2.0.0", 1028 | "escape-html": "~1.0.3", 1029 | "etag": "~1.8.1", 1030 | "finalhandler": "1.3.1", 1031 | "fresh": "0.5.2", 1032 | "http-errors": "2.0.0", 1033 | "merge-descriptors": "1.0.3", 1034 | "methods": "~1.1.2", 1035 | "on-finished": "2.4.1", 1036 | "parseurl": "~1.3.3", 1037 | "path-to-regexp": "0.1.10", 1038 | "proxy-addr": "~2.0.7", 1039 | "qs": "6.13.0", 1040 | "range-parser": "~1.2.1", 1041 | "safe-buffer": "5.2.1", 1042 | "send": "0.19.0", 1043 | "serve-static": "1.16.2", 1044 | "setprototypeof": "1.2.0", 1045 | "statuses": "2.0.1", 1046 | "type-is": "~1.6.18", 1047 | "utils-merge": "1.0.1", 1048 | "vary": "~1.1.2" 1049 | }, 1050 | "engines": { 1051 | "node": ">= 0.10.0" 1052 | } 1053 | }, 1054 | "node_modules/extract-zip": { 1055 | "version": "2.0.1", 1056 | "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", 1057 | "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", 1058 | "dependencies": { 1059 | "debug": "^4.1.1", 1060 | "get-stream": "^5.1.0", 1061 | "yauzl": "^2.10.0" 1062 | }, 1063 | "bin": { 1064 | "extract-zip": "cli.js" 1065 | }, 1066 | "engines": { 1067 | "node": ">= 10.17.0" 1068 | }, 1069 | "optionalDependencies": { 1070 | "@types/yauzl": "^2.9.1" 1071 | } 1072 | }, 1073 | "node_modules/extract-zip/node_modules/debug": { 1074 | "version": "4.3.7", 1075 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 1076 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 1077 | "dependencies": { 1078 | "ms": "^2.1.3" 1079 | }, 1080 | "engines": { 1081 | "node": ">=6.0" 1082 | }, 1083 | "peerDependenciesMeta": { 1084 | "supports-color": { 1085 | "optional": true 1086 | } 1087 | } 1088 | }, 1089 | "node_modules/extract-zip/node_modules/ms": { 1090 | "version": "2.1.3", 1091 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1092 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1093 | }, 1094 | "node_modules/fast-fifo": { 1095 | "version": "1.3.2", 1096 | "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", 1097 | "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" 1098 | }, 1099 | "node_modules/fd-slicer": { 1100 | "version": "1.1.0", 1101 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", 1102 | "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", 1103 | "dependencies": { 1104 | "pend": "~1.2.0" 1105 | } 1106 | }, 1107 | "node_modules/file-type": { 1108 | "version": "16.5.4", 1109 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", 1110 | "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", 1111 | "dependencies": { 1112 | "readable-web-to-node-stream": "^3.0.0", 1113 | "strtok3": "^6.2.4", 1114 | "token-types": "^4.1.1" 1115 | }, 1116 | "engines": { 1117 | "node": ">=10" 1118 | }, 1119 | "funding": { 1120 | "url": "https://github.com/sindresorhus/file-type?sponsor=1" 1121 | } 1122 | }, 1123 | "node_modules/finalhandler": { 1124 | "version": "1.3.1", 1125 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", 1126 | "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", 1127 | "dependencies": { 1128 | "debug": "2.6.9", 1129 | "encodeurl": "~2.0.0", 1130 | "escape-html": "~1.0.3", 1131 | "on-finished": "2.4.1", 1132 | "parseurl": "~1.3.3", 1133 | "statuses": "2.0.1", 1134 | "unpipe": "~1.0.0" 1135 | }, 1136 | "engines": { 1137 | "node": ">= 0.8" 1138 | } 1139 | }, 1140 | "node_modules/form-data": { 1141 | "version": "4.0.1", 1142 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", 1143 | "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", 1144 | "dependencies": { 1145 | "asynckit": "^0.4.0", 1146 | "combined-stream": "^1.0.8", 1147 | "mime-types": "^2.1.12" 1148 | }, 1149 | "engines": { 1150 | "node": ">= 6" 1151 | } 1152 | }, 1153 | "node_modules/forwarded": { 1154 | "version": "0.2.0", 1155 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 1156 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 1157 | "engines": { 1158 | "node": ">= 0.6" 1159 | } 1160 | }, 1161 | "node_modules/fresh": { 1162 | "version": "0.5.2", 1163 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 1164 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 1165 | "engines": { 1166 | "node": ">= 0.6" 1167 | } 1168 | }, 1169 | "node_modules/fs-extra": { 1170 | "version": "11.2.0", 1171 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", 1172 | "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", 1173 | "dependencies": { 1174 | "graceful-fs": "^4.2.0", 1175 | "jsonfile": "^6.0.1", 1176 | "universalify": "^2.0.0" 1177 | }, 1178 | "engines": { 1179 | "node": ">=14.14" 1180 | } 1181 | }, 1182 | "node_modules/function-bind": { 1183 | "version": "1.1.2", 1184 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 1185 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 1186 | "funding": { 1187 | "url": "https://github.com/sponsors/ljharb" 1188 | } 1189 | }, 1190 | "node_modules/get-caller-file": { 1191 | "version": "2.0.5", 1192 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1193 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1194 | "engines": { 1195 | "node": "6.* || 8.* || >= 10.*" 1196 | } 1197 | }, 1198 | "node_modules/get-intrinsic": { 1199 | "version": "1.2.4", 1200 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", 1201 | "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", 1202 | "dependencies": { 1203 | "es-errors": "^1.3.0", 1204 | "function-bind": "^1.1.2", 1205 | "has-proto": "^1.0.1", 1206 | "has-symbols": "^1.0.3", 1207 | "hasown": "^2.0.0" 1208 | }, 1209 | "engines": { 1210 | "node": ">= 0.4" 1211 | }, 1212 | "funding": { 1213 | "url": "https://github.com/sponsors/ljharb" 1214 | } 1215 | }, 1216 | "node_modules/get-stream": { 1217 | "version": "5.2.0", 1218 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", 1219 | "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", 1220 | "dependencies": { 1221 | "pump": "^3.0.0" 1222 | }, 1223 | "engines": { 1224 | "node": ">=8" 1225 | }, 1226 | "funding": { 1227 | "url": "https://github.com/sponsors/sindresorhus" 1228 | } 1229 | }, 1230 | "node_modules/get-uri": { 1231 | "version": "6.0.3", 1232 | "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", 1233 | "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", 1234 | "dependencies": { 1235 | "basic-ftp": "^5.0.2", 1236 | "data-uri-to-buffer": "^6.0.2", 1237 | "debug": "^4.3.4", 1238 | "fs-extra": "^11.2.0" 1239 | }, 1240 | "engines": { 1241 | "node": ">= 14" 1242 | } 1243 | }, 1244 | "node_modules/get-uri/node_modules/debug": { 1245 | "version": "4.3.7", 1246 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 1247 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 1248 | "dependencies": { 1249 | "ms": "^2.1.3" 1250 | }, 1251 | "engines": { 1252 | "node": ">=6.0" 1253 | }, 1254 | "peerDependenciesMeta": { 1255 | "supports-color": { 1256 | "optional": true 1257 | } 1258 | } 1259 | }, 1260 | "node_modules/get-uri/node_modules/ms": { 1261 | "version": "2.1.3", 1262 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1263 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1264 | }, 1265 | "node_modules/gopd": { 1266 | "version": "1.0.1", 1267 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 1268 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 1269 | "dependencies": { 1270 | "get-intrinsic": "^1.1.3" 1271 | }, 1272 | "funding": { 1273 | "url": "https://github.com/sponsors/ljharb" 1274 | } 1275 | }, 1276 | "node_modules/graceful-fs": { 1277 | "version": "4.2.11", 1278 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 1279 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" 1280 | }, 1281 | "node_modules/handlebars": { 1282 | "version": "4.7.8", 1283 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", 1284 | "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", 1285 | "dependencies": { 1286 | "minimist": "^1.2.5", 1287 | "neo-async": "^2.6.2", 1288 | "source-map": "^0.6.1", 1289 | "wordwrap": "^1.0.0" 1290 | }, 1291 | "bin": { 1292 | "handlebars": "bin/handlebars" 1293 | }, 1294 | "engines": { 1295 | "node": ">=0.4.7" 1296 | }, 1297 | "optionalDependencies": { 1298 | "uglify-js": "^3.1.4" 1299 | } 1300 | }, 1301 | "node_modules/has-property-descriptors": { 1302 | "version": "1.0.2", 1303 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", 1304 | "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", 1305 | "dependencies": { 1306 | "es-define-property": "^1.0.0" 1307 | }, 1308 | "funding": { 1309 | "url": "https://github.com/sponsors/ljharb" 1310 | } 1311 | }, 1312 | "node_modules/has-proto": { 1313 | "version": "1.0.3", 1314 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", 1315 | "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", 1316 | "engines": { 1317 | "node": ">= 0.4" 1318 | }, 1319 | "funding": { 1320 | "url": "https://github.com/sponsors/ljharb" 1321 | } 1322 | }, 1323 | "node_modules/has-symbols": { 1324 | "version": "1.0.3", 1325 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 1326 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 1327 | "engines": { 1328 | "node": ">= 0.4" 1329 | }, 1330 | "funding": { 1331 | "url": "https://github.com/sponsors/ljharb" 1332 | } 1333 | }, 1334 | "node_modules/hasown": { 1335 | "version": "2.0.2", 1336 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 1337 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 1338 | "dependencies": { 1339 | "function-bind": "^1.1.2" 1340 | }, 1341 | "engines": { 1342 | "node": ">= 0.4" 1343 | } 1344 | }, 1345 | "node_modules/hookified": { 1346 | "version": "1.5.0", 1347 | "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.5.0.tgz", 1348 | "integrity": "sha512-4U0zw2ibOws7kfGdNCIL6oRg+t6ITxkgi9kUaJ71IDp0ZATHjvY6o7l90RBa/R8H2qOKl47SZISA5a3hNnei1g==" 1349 | }, 1350 | "node_modules/html-encoding-sniffer": { 1351 | "version": "4.0.0", 1352 | "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", 1353 | "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", 1354 | "dependencies": { 1355 | "whatwg-encoding": "^3.1.1" 1356 | }, 1357 | "engines": { 1358 | "node": ">=18" 1359 | } 1360 | }, 1361 | "node_modules/http-errors": { 1362 | "version": "2.0.0", 1363 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 1364 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 1365 | "dependencies": { 1366 | "depd": "2.0.0", 1367 | "inherits": "2.0.4", 1368 | "setprototypeof": "1.2.0", 1369 | "statuses": "2.0.1", 1370 | "toidentifier": "1.0.1" 1371 | }, 1372 | "engines": { 1373 | "node": ">= 0.8" 1374 | } 1375 | }, 1376 | "node_modules/http-proxy-agent": { 1377 | "version": "7.0.2", 1378 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", 1379 | "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", 1380 | "dependencies": { 1381 | "agent-base": "^7.1.0", 1382 | "debug": "^4.3.4" 1383 | }, 1384 | "engines": { 1385 | "node": ">= 14" 1386 | } 1387 | }, 1388 | "node_modules/http-proxy-agent/node_modules/debug": { 1389 | "version": "4.3.7", 1390 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 1391 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 1392 | "dependencies": { 1393 | "ms": "^2.1.3" 1394 | }, 1395 | "engines": { 1396 | "node": ">=6.0" 1397 | }, 1398 | "peerDependenciesMeta": { 1399 | "supports-color": { 1400 | "optional": true 1401 | } 1402 | } 1403 | }, 1404 | "node_modules/http-proxy-agent/node_modules/ms": { 1405 | "version": "2.1.3", 1406 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1407 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1408 | }, 1409 | "node_modules/https-proxy-agent": { 1410 | "version": "7.0.5", 1411 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", 1412 | "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", 1413 | "dependencies": { 1414 | "agent-base": "^7.0.2", 1415 | "debug": "4" 1416 | }, 1417 | "engines": { 1418 | "node": ">= 14" 1419 | } 1420 | }, 1421 | "node_modules/https-proxy-agent/node_modules/debug": { 1422 | "version": "4.3.7", 1423 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 1424 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 1425 | "dependencies": { 1426 | "ms": "^2.1.3" 1427 | }, 1428 | "engines": { 1429 | "node": ">=6.0" 1430 | }, 1431 | "peerDependenciesMeta": { 1432 | "supports-color": { 1433 | "optional": true 1434 | } 1435 | } 1436 | }, 1437 | "node_modules/https-proxy-agent/node_modules/ms": { 1438 | "version": "2.1.3", 1439 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1440 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1441 | }, 1442 | "node_modules/iconv-lite": { 1443 | "version": "0.4.24", 1444 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1445 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1446 | "dependencies": { 1447 | "safer-buffer": ">= 2.1.2 < 3" 1448 | }, 1449 | "engines": { 1450 | "node": ">=0.10.0" 1451 | } 1452 | }, 1453 | "node_modules/ieee754": { 1454 | "version": "1.2.1", 1455 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 1456 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 1457 | "funding": [ 1458 | { 1459 | "type": "github", 1460 | "url": "https://github.com/sponsors/feross" 1461 | }, 1462 | { 1463 | "type": "patreon", 1464 | "url": "https://www.patreon.com/feross" 1465 | }, 1466 | { 1467 | "type": "consulting", 1468 | "url": "https://feross.org/support" 1469 | } 1470 | ] 1471 | }, 1472 | "node_modules/import-fresh": { 1473 | "version": "3.3.0", 1474 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 1475 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 1476 | "dependencies": { 1477 | "parent-module": "^1.0.0", 1478 | "resolve-from": "^4.0.0" 1479 | }, 1480 | "engines": { 1481 | "node": ">=6" 1482 | }, 1483 | "funding": { 1484 | "url": "https://github.com/sponsors/sindresorhus" 1485 | } 1486 | }, 1487 | "node_modules/inherits": { 1488 | "version": "2.0.4", 1489 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1490 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1491 | }, 1492 | "node_modules/ip-address": { 1493 | "version": "9.0.5", 1494 | "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", 1495 | "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", 1496 | "dependencies": { 1497 | "jsbn": "1.1.0", 1498 | "sprintf-js": "^1.1.3" 1499 | }, 1500 | "engines": { 1501 | "node": ">= 12" 1502 | } 1503 | }, 1504 | "node_modules/ipaddr.js": { 1505 | "version": "1.9.1", 1506 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1507 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 1508 | "engines": { 1509 | "node": ">= 0.10" 1510 | } 1511 | }, 1512 | "node_modules/is-arrayish": { 1513 | "version": "0.2.1", 1514 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1515 | "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" 1516 | }, 1517 | "node_modules/is-fullwidth-code-point": { 1518 | "version": "3.0.0", 1519 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1520 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1521 | "engines": { 1522 | "node": ">=8" 1523 | } 1524 | }, 1525 | "node_modules/is-potential-custom-element-name": { 1526 | "version": "1.0.1", 1527 | "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", 1528 | "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" 1529 | }, 1530 | "node_modules/js-tokens": { 1531 | "version": "4.0.0", 1532 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1533 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 1534 | }, 1535 | "node_modules/js-yaml": { 1536 | "version": "4.1.0", 1537 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1538 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1539 | "dependencies": { 1540 | "argparse": "^2.0.1" 1541 | }, 1542 | "bin": { 1543 | "js-yaml": "bin/js-yaml.js" 1544 | } 1545 | }, 1546 | "node_modules/jsbn": { 1547 | "version": "1.1.0", 1548 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", 1549 | "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" 1550 | }, 1551 | "node_modules/jsdom": { 1552 | "version": "25.0.1", 1553 | "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.1.tgz", 1554 | "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==", 1555 | "dependencies": { 1556 | "cssstyle": "^4.1.0", 1557 | "data-urls": "^5.0.0", 1558 | "decimal.js": "^10.4.3", 1559 | "form-data": "^4.0.0", 1560 | "html-encoding-sniffer": "^4.0.0", 1561 | "http-proxy-agent": "^7.0.2", 1562 | "https-proxy-agent": "^7.0.5", 1563 | "is-potential-custom-element-name": "^1.0.1", 1564 | "nwsapi": "^2.2.12", 1565 | "parse5": "^7.1.2", 1566 | "rrweb-cssom": "^0.7.1", 1567 | "saxes": "^6.0.0", 1568 | "symbol-tree": "^3.2.4", 1569 | "tough-cookie": "^5.0.0", 1570 | "w3c-xmlserializer": "^5.0.0", 1571 | "webidl-conversions": "^7.0.0", 1572 | "whatwg-encoding": "^3.1.1", 1573 | "whatwg-mimetype": "^4.0.0", 1574 | "whatwg-url": "^14.0.0", 1575 | "ws": "^8.18.0", 1576 | "xml-name-validator": "^5.0.0" 1577 | }, 1578 | "engines": { 1579 | "node": ">=18" 1580 | }, 1581 | "peerDependencies": { 1582 | "canvas": "^2.11.2" 1583 | }, 1584 | "peerDependenciesMeta": { 1585 | "canvas": { 1586 | "optional": true 1587 | } 1588 | } 1589 | }, 1590 | "node_modules/json-parse-even-better-errors": { 1591 | "version": "2.3.1", 1592 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", 1593 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" 1594 | }, 1595 | "node_modules/jsonfile": { 1596 | "version": "6.1.0", 1597 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", 1598 | "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", 1599 | "dependencies": { 1600 | "universalify": "^2.0.0" 1601 | }, 1602 | "optionalDependencies": { 1603 | "graceful-fs": "^4.1.6" 1604 | } 1605 | }, 1606 | "node_modules/keyv": { 1607 | "version": "5.2.1", 1608 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.2.1.tgz", 1609 | "integrity": "sha512-tpIgCaY02VCW2Pz0zAn4guyct+IeH6Mb5wZdOvpe4oqXeQOJO0C3Wo8fTnf7P3ZD83Vr9kghbkNmzG3lTOhy/A==", 1610 | "dependencies": { 1611 | "@keyv/serialize": "*" 1612 | } 1613 | }, 1614 | "node_modules/libphonenumber-js": { 1615 | "version": "1.11.14", 1616 | "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.11.14.tgz", 1617 | "integrity": "sha512-sexvAfwcW1Lqws4zFp8heAtAEXbEDnvkYCEGzvOoMgZR7JhXo/IkE9MkkGACgBed5fWqh3ShBGnJBdDnU9N8EQ==" 1618 | }, 1619 | "node_modules/lines-and-columns": { 1620 | "version": "1.2.4", 1621 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 1622 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" 1623 | }, 1624 | "node_modules/lodash": { 1625 | "version": "4.17.21", 1626 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1627 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 1628 | }, 1629 | "node_modules/lru-cache": { 1630 | "version": "7.18.3", 1631 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", 1632 | "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", 1633 | "engines": { 1634 | "node": ">=12" 1635 | } 1636 | }, 1637 | "node_modules/make-error": { 1638 | "version": "1.3.6", 1639 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 1640 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 1641 | "dev": true 1642 | }, 1643 | "node_modules/media-typer": { 1644 | "version": "0.3.0", 1645 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1646 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 1647 | "engines": { 1648 | "node": ">= 0.6" 1649 | } 1650 | }, 1651 | "node_modules/merge-descriptors": { 1652 | "version": "1.0.3", 1653 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", 1654 | "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", 1655 | "funding": { 1656 | "url": "https://github.com/sponsors/sindresorhus" 1657 | } 1658 | }, 1659 | "node_modules/methods": { 1660 | "version": "1.1.2", 1661 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1662 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 1663 | "engines": { 1664 | "node": ">= 0.6" 1665 | } 1666 | }, 1667 | "node_modules/mime": { 1668 | "version": "1.6.0", 1669 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1670 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 1671 | "bin": { 1672 | "mime": "cli.js" 1673 | }, 1674 | "engines": { 1675 | "node": ">=4" 1676 | } 1677 | }, 1678 | "node_modules/mime-db": { 1679 | "version": "1.52.0", 1680 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1681 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 1682 | "engines": { 1683 | "node": ">= 0.6" 1684 | } 1685 | }, 1686 | "node_modules/mime-types": { 1687 | "version": "2.1.35", 1688 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1689 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1690 | "dependencies": { 1691 | "mime-db": "1.52.0" 1692 | }, 1693 | "engines": { 1694 | "node": ">= 0.6" 1695 | } 1696 | }, 1697 | "node_modules/minimist": { 1698 | "version": "1.2.8", 1699 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 1700 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 1701 | "funding": { 1702 | "url": "https://github.com/sponsors/ljharb" 1703 | } 1704 | }, 1705 | "node_modules/mitt": { 1706 | "version": "3.0.1", 1707 | "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", 1708 | "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" 1709 | }, 1710 | "node_modules/moment": { 1711 | "version": "2.30.1", 1712 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", 1713 | "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", 1714 | "engines": { 1715 | "node": "*" 1716 | } 1717 | }, 1718 | "node_modules/ms": { 1719 | "version": "2.0.0", 1720 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1721 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 1722 | }, 1723 | "node_modules/negotiator": { 1724 | "version": "0.6.3", 1725 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1726 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 1727 | "engines": { 1728 | "node": ">= 0.6" 1729 | } 1730 | }, 1731 | "node_modules/neo-async": { 1732 | "version": "2.6.2", 1733 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", 1734 | "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" 1735 | }, 1736 | "node_modules/netmask": { 1737 | "version": "2.0.2", 1738 | "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", 1739 | "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", 1740 | "engines": { 1741 | "node": ">= 0.4.0" 1742 | } 1743 | }, 1744 | "node_modules/nwsapi": { 1745 | "version": "2.2.13", 1746 | "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.13.tgz", 1747 | "integrity": "sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==" 1748 | }, 1749 | "node_modules/object-inspect": { 1750 | "version": "1.13.3", 1751 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", 1752 | "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", 1753 | "engines": { 1754 | "node": ">= 0.4" 1755 | }, 1756 | "funding": { 1757 | "url": "https://github.com/sponsors/ljharb" 1758 | } 1759 | }, 1760 | "node_modules/on-finished": { 1761 | "version": "2.4.1", 1762 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 1763 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1764 | "dependencies": { 1765 | "ee-first": "1.1.1" 1766 | }, 1767 | "engines": { 1768 | "node": ">= 0.8" 1769 | } 1770 | }, 1771 | "node_modules/once": { 1772 | "version": "1.4.0", 1773 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1774 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1775 | "dependencies": { 1776 | "wrappy": "1" 1777 | } 1778 | }, 1779 | "node_modules/pac-proxy-agent": { 1780 | "version": "7.0.2", 1781 | "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.2.tgz", 1782 | "integrity": "sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==", 1783 | "dependencies": { 1784 | "@tootallnate/quickjs-emscripten": "^0.23.0", 1785 | "agent-base": "^7.0.2", 1786 | "debug": "^4.3.4", 1787 | "get-uri": "^6.0.1", 1788 | "http-proxy-agent": "^7.0.0", 1789 | "https-proxy-agent": "^7.0.5", 1790 | "pac-resolver": "^7.0.1", 1791 | "socks-proxy-agent": "^8.0.4" 1792 | }, 1793 | "engines": { 1794 | "node": ">= 14" 1795 | } 1796 | }, 1797 | "node_modules/pac-proxy-agent/node_modules/debug": { 1798 | "version": "4.3.7", 1799 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 1800 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 1801 | "dependencies": { 1802 | "ms": "^2.1.3" 1803 | }, 1804 | "engines": { 1805 | "node": ">=6.0" 1806 | }, 1807 | "peerDependenciesMeta": { 1808 | "supports-color": { 1809 | "optional": true 1810 | } 1811 | } 1812 | }, 1813 | "node_modules/pac-proxy-agent/node_modules/ms": { 1814 | "version": "2.1.3", 1815 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1816 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1817 | }, 1818 | "node_modules/pac-resolver": { 1819 | "version": "7.0.1", 1820 | "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", 1821 | "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", 1822 | "dependencies": { 1823 | "degenerator": "^5.0.0", 1824 | "netmask": "^2.0.2" 1825 | }, 1826 | "engines": { 1827 | "node": ">= 14" 1828 | } 1829 | }, 1830 | "node_modules/parent-module": { 1831 | "version": "1.0.1", 1832 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1833 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1834 | "dependencies": { 1835 | "callsites": "^3.0.0" 1836 | }, 1837 | "engines": { 1838 | "node": ">=6" 1839 | } 1840 | }, 1841 | "node_modules/parse-json": { 1842 | "version": "5.2.0", 1843 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", 1844 | "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", 1845 | "dependencies": { 1846 | "@babel/code-frame": "^7.0.0", 1847 | "error-ex": "^1.3.1", 1848 | "json-parse-even-better-errors": "^2.3.0", 1849 | "lines-and-columns": "^1.1.6" 1850 | }, 1851 | "engines": { 1852 | "node": ">=8" 1853 | }, 1854 | "funding": { 1855 | "url": "https://github.com/sponsors/sindresorhus" 1856 | } 1857 | }, 1858 | "node_modules/parse5": { 1859 | "version": "7.2.1", 1860 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", 1861 | "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", 1862 | "dependencies": { 1863 | "entities": "^4.5.0" 1864 | }, 1865 | "funding": { 1866 | "url": "https://github.com/inikulin/parse5?sponsor=1" 1867 | } 1868 | }, 1869 | "node_modules/parseurl": { 1870 | "version": "1.3.3", 1871 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1872 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 1873 | "engines": { 1874 | "node": ">= 0.8" 1875 | } 1876 | }, 1877 | "node_modules/path-to-regexp": { 1878 | "version": "0.1.10", 1879 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", 1880 | "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" 1881 | }, 1882 | "node_modules/peek-readable": { 1883 | "version": "4.1.0", 1884 | "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", 1885 | "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", 1886 | "engines": { 1887 | "node": ">=8" 1888 | }, 1889 | "funding": { 1890 | "type": "github", 1891 | "url": "https://github.com/sponsors/Borewit" 1892 | } 1893 | }, 1894 | "node_modules/pend": { 1895 | "version": "1.2.0", 1896 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 1897 | "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" 1898 | }, 1899 | "node_modules/picocolors": { 1900 | "version": "1.1.1", 1901 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 1902 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" 1903 | }, 1904 | "node_modules/progress": { 1905 | "version": "2.0.3", 1906 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1907 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1908 | "engines": { 1909 | "node": ">=0.4.0" 1910 | } 1911 | }, 1912 | "node_modules/proxy-addr": { 1913 | "version": "2.0.7", 1914 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1915 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1916 | "dependencies": { 1917 | "forwarded": "0.2.0", 1918 | "ipaddr.js": "1.9.1" 1919 | }, 1920 | "engines": { 1921 | "node": ">= 0.10" 1922 | } 1923 | }, 1924 | "node_modules/proxy-agent": { 1925 | "version": "6.4.0", 1926 | "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", 1927 | "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", 1928 | "dependencies": { 1929 | "agent-base": "^7.0.2", 1930 | "debug": "^4.3.4", 1931 | "http-proxy-agent": "^7.0.1", 1932 | "https-proxy-agent": "^7.0.3", 1933 | "lru-cache": "^7.14.1", 1934 | "pac-proxy-agent": "^7.0.1", 1935 | "proxy-from-env": "^1.1.0", 1936 | "socks-proxy-agent": "^8.0.2" 1937 | }, 1938 | "engines": { 1939 | "node": ">= 14" 1940 | } 1941 | }, 1942 | "node_modules/proxy-agent/node_modules/debug": { 1943 | "version": "4.3.7", 1944 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 1945 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 1946 | "dependencies": { 1947 | "ms": "^2.1.3" 1948 | }, 1949 | "engines": { 1950 | "node": ">=6.0" 1951 | }, 1952 | "peerDependenciesMeta": { 1953 | "supports-color": { 1954 | "optional": true 1955 | } 1956 | } 1957 | }, 1958 | "node_modules/proxy-agent/node_modules/ms": { 1959 | "version": "2.1.3", 1960 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1961 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1962 | }, 1963 | "node_modules/proxy-from-env": { 1964 | "version": "1.1.0", 1965 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 1966 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 1967 | }, 1968 | "node_modules/pump": { 1969 | "version": "3.0.2", 1970 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", 1971 | "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", 1972 | "dependencies": { 1973 | "end-of-stream": "^1.1.0", 1974 | "once": "^1.3.1" 1975 | } 1976 | }, 1977 | "node_modules/punycode": { 1978 | "version": "2.3.1", 1979 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 1980 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 1981 | "engines": { 1982 | "node": ">=6" 1983 | } 1984 | }, 1985 | "node_modules/puppeteer": { 1986 | "version": "23.8.0", 1987 | "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-23.8.0.tgz", 1988 | "integrity": "sha512-MFWDMWoCcOpwNwQIjA9gPKWrEUbj8bLCzkK56w5lZPMUT6wK4FfpgOEPxKffVmXEMYMZzgcjxzqy15b/Q1ibaw==", 1989 | "hasInstallScript": true, 1990 | "dependencies": { 1991 | "@puppeteer/browsers": "2.4.1", 1992 | "chromium-bidi": "0.8.0", 1993 | "cosmiconfig": "^9.0.0", 1994 | "devtools-protocol": "0.0.1367902", 1995 | "puppeteer-core": "23.8.0", 1996 | "typed-query-selector": "^2.12.0" 1997 | }, 1998 | "bin": { 1999 | "puppeteer": "lib/cjs/puppeteer/node/cli.js" 2000 | }, 2001 | "engines": { 2002 | "node": ">=18" 2003 | } 2004 | }, 2005 | "node_modules/puppeteer-core": { 2006 | "version": "23.8.0", 2007 | "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-23.8.0.tgz", 2008 | "integrity": "sha512-c2ymGN2M//We7pC+JhP2dE/g4+qnT89BO+EMSZyJmecN3DN6RNqErA7eH7DrWoNIcU75r2nP4VHa4pswAL6NVg==", 2009 | "dependencies": { 2010 | "@puppeteer/browsers": "2.4.1", 2011 | "chromium-bidi": "0.8.0", 2012 | "debug": "^4.3.7", 2013 | "devtools-protocol": "0.0.1367902", 2014 | "typed-query-selector": "^2.12.0", 2015 | "ws": "^8.18.0" 2016 | }, 2017 | "engines": { 2018 | "node": ">=18" 2019 | } 2020 | }, 2021 | "node_modules/puppeteer-core/node_modules/debug": { 2022 | "version": "4.3.7", 2023 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 2024 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 2025 | "dependencies": { 2026 | "ms": "^2.1.3" 2027 | }, 2028 | "engines": { 2029 | "node": ">=6.0" 2030 | }, 2031 | "peerDependenciesMeta": { 2032 | "supports-color": { 2033 | "optional": true 2034 | } 2035 | } 2036 | }, 2037 | "node_modules/puppeteer-core/node_modules/ms": { 2038 | "version": "2.1.3", 2039 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2040 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 2041 | }, 2042 | "node_modules/qs": { 2043 | "version": "6.13.0", 2044 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", 2045 | "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", 2046 | "dependencies": { 2047 | "side-channel": "^1.0.6" 2048 | }, 2049 | "engines": { 2050 | "node": ">=0.6" 2051 | }, 2052 | "funding": { 2053 | "url": "https://github.com/sponsors/ljharb" 2054 | } 2055 | }, 2056 | "node_modules/queue-tick": { 2057 | "version": "1.0.1", 2058 | "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", 2059 | "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" 2060 | }, 2061 | "node_modules/range-parser": { 2062 | "version": "1.2.1", 2063 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 2064 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 2065 | "engines": { 2066 | "node": ">= 0.6" 2067 | } 2068 | }, 2069 | "node_modules/raw-body": { 2070 | "version": "2.5.2", 2071 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", 2072 | "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", 2073 | "dependencies": { 2074 | "bytes": "3.1.2", 2075 | "http-errors": "2.0.0", 2076 | "iconv-lite": "0.4.24", 2077 | "unpipe": "1.0.0" 2078 | }, 2079 | "engines": { 2080 | "node": ">= 0.8" 2081 | } 2082 | }, 2083 | "node_modules/readable-web-to-node-stream": { 2084 | "version": "3.0.2", 2085 | "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", 2086 | "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", 2087 | "dependencies": { 2088 | "readable-stream": "^3.6.0" 2089 | }, 2090 | "engines": { 2091 | "node": ">=8" 2092 | }, 2093 | "funding": { 2094 | "type": "github", 2095 | "url": "https://github.com/sponsors/Borewit" 2096 | } 2097 | }, 2098 | "node_modules/readable-web-to-node-stream/node_modules/readable-stream": { 2099 | "version": "3.6.2", 2100 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", 2101 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", 2102 | "dependencies": { 2103 | "inherits": "^2.0.3", 2104 | "string_decoder": "^1.1.1", 2105 | "util-deprecate": "^1.0.1" 2106 | }, 2107 | "engines": { 2108 | "node": ">= 6" 2109 | } 2110 | }, 2111 | "node_modules/require-directory": { 2112 | "version": "2.1.1", 2113 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 2114 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 2115 | "engines": { 2116 | "node": ">=0.10.0" 2117 | } 2118 | }, 2119 | "node_modules/resolve-from": { 2120 | "version": "4.0.0", 2121 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 2122 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 2123 | "engines": { 2124 | "node": ">=4" 2125 | } 2126 | }, 2127 | "node_modules/rrweb-cssom": { 2128 | "version": "0.7.1", 2129 | "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", 2130 | "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==" 2131 | }, 2132 | "node_modules/safe-buffer": { 2133 | "version": "5.2.1", 2134 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2135 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 2136 | "funding": [ 2137 | { 2138 | "type": "github", 2139 | "url": "https://github.com/sponsors/feross" 2140 | }, 2141 | { 2142 | "type": "patreon", 2143 | "url": "https://www.patreon.com/feross" 2144 | }, 2145 | { 2146 | "type": "consulting", 2147 | "url": "https://feross.org/support" 2148 | } 2149 | ] 2150 | }, 2151 | "node_modules/safer-buffer": { 2152 | "version": "2.1.2", 2153 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2154 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 2155 | }, 2156 | "node_modules/saxes": { 2157 | "version": "6.0.0", 2158 | "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", 2159 | "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", 2160 | "dependencies": { 2161 | "xmlchars": "^2.2.0" 2162 | }, 2163 | "engines": { 2164 | "node": ">=v12.22.7" 2165 | } 2166 | }, 2167 | "node_modules/send": { 2168 | "version": "0.19.0", 2169 | "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", 2170 | "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", 2171 | "dependencies": { 2172 | "debug": "2.6.9", 2173 | "depd": "2.0.0", 2174 | "destroy": "1.2.0", 2175 | "encodeurl": "~1.0.2", 2176 | "escape-html": "~1.0.3", 2177 | "etag": "~1.8.1", 2178 | "fresh": "0.5.2", 2179 | "http-errors": "2.0.0", 2180 | "mime": "1.6.0", 2181 | "ms": "2.1.3", 2182 | "on-finished": "2.4.1", 2183 | "range-parser": "~1.2.1", 2184 | "statuses": "2.0.1" 2185 | }, 2186 | "engines": { 2187 | "node": ">= 0.8.0" 2188 | } 2189 | }, 2190 | "node_modules/send/node_modules/encodeurl": { 2191 | "version": "1.0.2", 2192 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 2193 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 2194 | "engines": { 2195 | "node": ">= 0.8" 2196 | } 2197 | }, 2198 | "node_modules/send/node_modules/ms": { 2199 | "version": "2.1.3", 2200 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2201 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 2202 | }, 2203 | "node_modules/serve-static": { 2204 | "version": "1.16.2", 2205 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", 2206 | "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", 2207 | "dependencies": { 2208 | "encodeurl": "~2.0.0", 2209 | "escape-html": "~1.0.3", 2210 | "parseurl": "~1.3.3", 2211 | "send": "0.19.0" 2212 | }, 2213 | "engines": { 2214 | "node": ">= 0.8.0" 2215 | } 2216 | }, 2217 | "node_modules/set-function-length": { 2218 | "version": "1.2.2", 2219 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", 2220 | "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", 2221 | "dependencies": { 2222 | "define-data-property": "^1.1.4", 2223 | "es-errors": "^1.3.0", 2224 | "function-bind": "^1.1.2", 2225 | "get-intrinsic": "^1.2.4", 2226 | "gopd": "^1.0.1", 2227 | "has-property-descriptors": "^1.0.2" 2228 | }, 2229 | "engines": { 2230 | "node": ">= 0.4" 2231 | } 2232 | }, 2233 | "node_modules/setprototypeof": { 2234 | "version": "1.2.0", 2235 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 2236 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 2237 | }, 2238 | "node_modules/side-channel": { 2239 | "version": "1.0.6", 2240 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", 2241 | "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", 2242 | "dependencies": { 2243 | "call-bind": "^1.0.7", 2244 | "es-errors": "^1.3.0", 2245 | "get-intrinsic": "^1.2.4", 2246 | "object-inspect": "^1.13.1" 2247 | }, 2248 | "engines": { 2249 | "node": ">= 0.4" 2250 | }, 2251 | "funding": { 2252 | "url": "https://github.com/sponsors/ljharb" 2253 | } 2254 | }, 2255 | "node_modules/smart-buffer": { 2256 | "version": "4.2.0", 2257 | "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", 2258 | "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", 2259 | "engines": { 2260 | "node": ">= 6.0.0", 2261 | "npm": ">= 3.0.0" 2262 | } 2263 | }, 2264 | "node_modules/socks": { 2265 | "version": "2.8.3", 2266 | "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", 2267 | "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", 2268 | "dependencies": { 2269 | "ip-address": "^9.0.5", 2270 | "smart-buffer": "^4.2.0" 2271 | }, 2272 | "engines": { 2273 | "node": ">= 10.0.0", 2274 | "npm": ">= 3.0.0" 2275 | } 2276 | }, 2277 | "node_modules/socks-proxy-agent": { 2278 | "version": "8.0.4", 2279 | "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", 2280 | "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", 2281 | "dependencies": { 2282 | "agent-base": "^7.1.1", 2283 | "debug": "^4.3.4", 2284 | "socks": "^2.8.3" 2285 | }, 2286 | "engines": { 2287 | "node": ">= 14" 2288 | } 2289 | }, 2290 | "node_modules/socks-proxy-agent/node_modules/debug": { 2291 | "version": "4.3.7", 2292 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 2293 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 2294 | "dependencies": { 2295 | "ms": "^2.1.3" 2296 | }, 2297 | "engines": { 2298 | "node": ">=6.0" 2299 | }, 2300 | "peerDependenciesMeta": { 2301 | "supports-color": { 2302 | "optional": true 2303 | } 2304 | } 2305 | }, 2306 | "node_modules/socks-proxy-agent/node_modules/ms": { 2307 | "version": "2.1.3", 2308 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2309 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 2310 | }, 2311 | "node_modules/source-map": { 2312 | "version": "0.6.1", 2313 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 2314 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 2315 | "engines": { 2316 | "node": ">=0.10.0" 2317 | } 2318 | }, 2319 | "node_modules/sprintf-js": { 2320 | "version": "1.1.3", 2321 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", 2322 | "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" 2323 | }, 2324 | "node_modules/statuses": { 2325 | "version": "2.0.1", 2326 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 2327 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 2328 | "engines": { 2329 | "node": ">= 0.8" 2330 | } 2331 | }, 2332 | "node_modules/streamx": { 2333 | "version": "2.20.2", 2334 | "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.2.tgz", 2335 | "integrity": "sha512-aDGDLU+j9tJcUdPGOaHmVF1u/hhI+CsGkT02V3OKlHDV7IukOI+nTWAGkiZEKCO35rWN1wIr4tS7YFr1f4qSvA==", 2336 | "dependencies": { 2337 | "fast-fifo": "^1.3.2", 2338 | "queue-tick": "^1.0.1", 2339 | "text-decoder": "^1.1.0" 2340 | }, 2341 | "optionalDependencies": { 2342 | "bare-events": "^2.2.0" 2343 | } 2344 | }, 2345 | "node_modules/string_decoder": { 2346 | "version": "1.1.1", 2347 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2348 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2349 | "dependencies": { 2350 | "safe-buffer": "~5.1.0" 2351 | } 2352 | }, 2353 | "node_modules/string_decoder/node_modules/safe-buffer": { 2354 | "version": "5.1.2", 2355 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2356 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 2357 | }, 2358 | "node_modules/string-width": { 2359 | "version": "4.2.3", 2360 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2361 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2362 | "dependencies": { 2363 | "emoji-regex": "^8.0.0", 2364 | "is-fullwidth-code-point": "^3.0.0", 2365 | "strip-ansi": "^6.0.1" 2366 | }, 2367 | "engines": { 2368 | "node": ">=8" 2369 | } 2370 | }, 2371 | "node_modules/strip-ansi": { 2372 | "version": "6.0.1", 2373 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2374 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2375 | "dependencies": { 2376 | "ansi-regex": "^5.0.1" 2377 | }, 2378 | "engines": { 2379 | "node": ">=8" 2380 | } 2381 | }, 2382 | "node_modules/strtok3": { 2383 | "version": "6.3.0", 2384 | "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", 2385 | "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", 2386 | "dependencies": { 2387 | "@tokenizer/token": "^0.3.0", 2388 | "peek-readable": "^4.1.0" 2389 | }, 2390 | "engines": { 2391 | "node": ">=10" 2392 | }, 2393 | "funding": { 2394 | "type": "github", 2395 | "url": "https://github.com/sponsors/Borewit" 2396 | } 2397 | }, 2398 | "node_modules/symbol-tree": { 2399 | "version": "3.2.4", 2400 | "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", 2401 | "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" 2402 | }, 2403 | "node_modules/tar-fs": { 2404 | "version": "3.0.6", 2405 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", 2406 | "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", 2407 | "dependencies": { 2408 | "pump": "^3.0.0", 2409 | "tar-stream": "^3.1.5" 2410 | }, 2411 | "optionalDependencies": { 2412 | "bare-fs": "^2.1.1", 2413 | "bare-path": "^2.1.0" 2414 | } 2415 | }, 2416 | "node_modules/tar-stream": { 2417 | "version": "3.1.7", 2418 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", 2419 | "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", 2420 | "dependencies": { 2421 | "b4a": "^1.6.4", 2422 | "fast-fifo": "^1.2.0", 2423 | "streamx": "^2.15.0" 2424 | } 2425 | }, 2426 | "node_modules/text-decoder": { 2427 | "version": "1.2.1", 2428 | "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.1.tgz", 2429 | "integrity": "sha512-x9v3H/lTKIJKQQe7RPQkLfKAnc9lUTkWDypIQgTzPJAq+5/GCDHonmshfvlsNSj58yyshbIJJDLmU15qNERrXQ==" 2430 | }, 2431 | "node_modules/through": { 2432 | "version": "2.3.8", 2433 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 2434 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" 2435 | }, 2436 | "node_modules/tldts": { 2437 | "version": "6.1.61", 2438 | "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.61.tgz", 2439 | "integrity": "sha512-rv8LUyez4Ygkopqn+M6OLItAOT9FF3REpPQDkdMx5ix8w4qkuE7Vo2o/vw1nxKQYmJDV8JpAMJQr1b+lTKf0FA==", 2440 | "dependencies": { 2441 | "tldts-core": "^6.1.61" 2442 | }, 2443 | "bin": { 2444 | "tldts": "bin/cli.js" 2445 | } 2446 | }, 2447 | "node_modules/tldts-core": { 2448 | "version": "6.1.61", 2449 | "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.61.tgz", 2450 | "integrity": "sha512-In7VffkDWUPgwa+c9picLUxvb0RltVwTkSgMNFgvlGSWveCzGBemBqTsgJCL4EDFWZ6WH0fKTsot6yNhzy3ZzQ==" 2451 | }, 2452 | "node_modules/toidentifier": { 2453 | "version": "1.0.1", 2454 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 2455 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 2456 | "engines": { 2457 | "node": ">=0.6" 2458 | } 2459 | }, 2460 | "node_modules/token-types": { 2461 | "version": "4.2.1", 2462 | "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", 2463 | "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", 2464 | "dependencies": { 2465 | "@tokenizer/token": "^0.3.0", 2466 | "ieee754": "^1.2.1" 2467 | }, 2468 | "engines": { 2469 | "node": ">=10" 2470 | }, 2471 | "funding": { 2472 | "type": "github", 2473 | "url": "https://github.com/sponsors/Borewit" 2474 | } 2475 | }, 2476 | "node_modules/tough-cookie": { 2477 | "version": "5.0.0", 2478 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.0.0.tgz", 2479 | "integrity": "sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==", 2480 | "dependencies": { 2481 | "tldts": "^6.1.32" 2482 | }, 2483 | "engines": { 2484 | "node": ">=16" 2485 | } 2486 | }, 2487 | "node_modules/tr46": { 2488 | "version": "5.0.0", 2489 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", 2490 | "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", 2491 | "dependencies": { 2492 | "punycode": "^2.3.1" 2493 | }, 2494 | "engines": { 2495 | "node": ">=18" 2496 | } 2497 | }, 2498 | "node_modules/ts-node": { 2499 | "version": "10.9.2", 2500 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", 2501 | "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", 2502 | "dev": true, 2503 | "dependencies": { 2504 | "@cspotcode/source-map-support": "^0.8.0", 2505 | "@tsconfig/node10": "^1.0.7", 2506 | "@tsconfig/node12": "^1.0.7", 2507 | "@tsconfig/node14": "^1.0.0", 2508 | "@tsconfig/node16": "^1.0.2", 2509 | "acorn": "^8.4.1", 2510 | "acorn-walk": "^8.1.1", 2511 | "arg": "^4.1.0", 2512 | "create-require": "^1.1.0", 2513 | "diff": "^4.0.1", 2514 | "make-error": "^1.1.1", 2515 | "v8-compile-cache-lib": "^3.0.1", 2516 | "yn": "3.1.1" 2517 | }, 2518 | "bin": { 2519 | "ts-node": "dist/bin.js", 2520 | "ts-node-cwd": "dist/bin-cwd.js", 2521 | "ts-node-esm": "dist/bin-esm.js", 2522 | "ts-node-script": "dist/bin-script.js", 2523 | "ts-node-transpile-only": "dist/bin-transpile.js", 2524 | "ts-script": "dist/bin-script-deprecated.js" 2525 | }, 2526 | "peerDependencies": { 2527 | "@swc/core": ">=1.2.50", 2528 | "@swc/wasm": ">=1.2.50", 2529 | "@types/node": "*", 2530 | "typescript": ">=2.7" 2531 | }, 2532 | "peerDependenciesMeta": { 2533 | "@swc/core": { 2534 | "optional": true 2535 | }, 2536 | "@swc/wasm": { 2537 | "optional": true 2538 | } 2539 | } 2540 | }, 2541 | "node_modules/tslib": { 2542 | "version": "2.8.1", 2543 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", 2544 | "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" 2545 | }, 2546 | "node_modules/type-is": { 2547 | "version": "1.6.18", 2548 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 2549 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 2550 | "dependencies": { 2551 | "media-typer": "0.3.0", 2552 | "mime-types": "~2.1.24" 2553 | }, 2554 | "engines": { 2555 | "node": ">= 0.6" 2556 | } 2557 | }, 2558 | "node_modules/typed-query-selector": { 2559 | "version": "2.12.0", 2560 | "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", 2561 | "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==" 2562 | }, 2563 | "node_modules/typescript": { 2564 | "version": "5.6.3", 2565 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", 2566 | "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", 2567 | "devOptional": true, 2568 | "bin": { 2569 | "tsc": "bin/tsc", 2570 | "tsserver": "bin/tsserver" 2571 | }, 2572 | "engines": { 2573 | "node": ">=14.17" 2574 | } 2575 | }, 2576 | "node_modules/uglify-js": { 2577 | "version": "3.19.3", 2578 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", 2579 | "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", 2580 | "optional": true, 2581 | "bin": { 2582 | "uglifyjs": "bin/uglifyjs" 2583 | }, 2584 | "engines": { 2585 | "node": ">=0.8.0" 2586 | } 2587 | }, 2588 | "node_modules/unbzip2-stream": { 2589 | "version": "1.4.3", 2590 | "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", 2591 | "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", 2592 | "dependencies": { 2593 | "buffer": "^5.2.1", 2594 | "through": "^2.3.8" 2595 | } 2596 | }, 2597 | "node_modules/undici-types": { 2598 | "version": "6.19.8", 2599 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", 2600 | "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", 2601 | "devOptional": true 2602 | }, 2603 | "node_modules/universalify": { 2604 | "version": "2.0.1", 2605 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", 2606 | "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", 2607 | "engines": { 2608 | "node": ">= 10.0.0" 2609 | } 2610 | }, 2611 | "node_modules/unpipe": { 2612 | "version": "1.0.0", 2613 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 2614 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 2615 | "engines": { 2616 | "node": ">= 0.8" 2617 | } 2618 | }, 2619 | "node_modules/urlpattern-polyfill": { 2620 | "version": "10.0.0", 2621 | "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", 2622 | "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==" 2623 | }, 2624 | "node_modules/util-deprecate": { 2625 | "version": "1.0.2", 2626 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2627 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 2628 | }, 2629 | "node_modules/utils-merge": { 2630 | "version": "1.0.1", 2631 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 2632 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 2633 | "engines": { 2634 | "node": ">= 0.4.0" 2635 | } 2636 | }, 2637 | "node_modules/v8-compile-cache-lib": { 2638 | "version": "3.0.1", 2639 | "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", 2640 | "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", 2641 | "dev": true 2642 | }, 2643 | "node_modules/validator": { 2644 | "version": "13.12.0", 2645 | "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", 2646 | "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==", 2647 | "engines": { 2648 | "node": ">= 0.10" 2649 | } 2650 | }, 2651 | "node_modules/vary": { 2652 | "version": "1.1.2", 2653 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 2654 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 2655 | "engines": { 2656 | "node": ">= 0.8" 2657 | } 2658 | }, 2659 | "node_modules/w3c-xmlserializer": { 2660 | "version": "5.0.0", 2661 | "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", 2662 | "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", 2663 | "dependencies": { 2664 | "xml-name-validator": "^5.0.0" 2665 | }, 2666 | "engines": { 2667 | "node": ">=18" 2668 | } 2669 | }, 2670 | "node_modules/webidl-conversions": { 2671 | "version": "7.0.0", 2672 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", 2673 | "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", 2674 | "engines": { 2675 | "node": ">=12" 2676 | } 2677 | }, 2678 | "node_modules/whatwg-encoding": { 2679 | "version": "3.1.1", 2680 | "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", 2681 | "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", 2682 | "dependencies": { 2683 | "iconv-lite": "0.6.3" 2684 | }, 2685 | "engines": { 2686 | "node": ">=18" 2687 | } 2688 | }, 2689 | "node_modules/whatwg-encoding/node_modules/iconv-lite": { 2690 | "version": "0.6.3", 2691 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 2692 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 2693 | "dependencies": { 2694 | "safer-buffer": ">= 2.1.2 < 3.0.0" 2695 | }, 2696 | "engines": { 2697 | "node": ">=0.10.0" 2698 | } 2699 | }, 2700 | "node_modules/whatwg-mimetype": { 2701 | "version": "4.0.0", 2702 | "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", 2703 | "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", 2704 | "engines": { 2705 | "node": ">=18" 2706 | } 2707 | }, 2708 | "node_modules/whatwg-url": { 2709 | "version": "14.0.0", 2710 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", 2711 | "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", 2712 | "dependencies": { 2713 | "tr46": "^5.0.0", 2714 | "webidl-conversions": "^7.0.0" 2715 | }, 2716 | "engines": { 2717 | "node": ">=18" 2718 | } 2719 | }, 2720 | "node_modules/wordwrap": { 2721 | "version": "1.0.0", 2722 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 2723 | "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" 2724 | }, 2725 | "node_modules/wrap-ansi": { 2726 | "version": "7.0.0", 2727 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 2728 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 2729 | "dependencies": { 2730 | "ansi-styles": "^4.0.0", 2731 | "string-width": "^4.1.0", 2732 | "strip-ansi": "^6.0.0" 2733 | }, 2734 | "engines": { 2735 | "node": ">=10" 2736 | }, 2737 | "funding": { 2738 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 2739 | } 2740 | }, 2741 | "node_modules/wrappy": { 2742 | "version": "1.0.2", 2743 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2744 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 2745 | }, 2746 | "node_modules/ws": { 2747 | "version": "8.18.0", 2748 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", 2749 | "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", 2750 | "engines": { 2751 | "node": ">=10.0.0" 2752 | }, 2753 | "peerDependencies": { 2754 | "bufferutil": "^4.0.1", 2755 | "utf-8-validate": ">=5.0.2" 2756 | }, 2757 | "peerDependenciesMeta": { 2758 | "bufferutil": { 2759 | "optional": true 2760 | }, 2761 | "utf-8-validate": { 2762 | "optional": true 2763 | } 2764 | } 2765 | }, 2766 | "node_modules/xml-name-validator": { 2767 | "version": "5.0.0", 2768 | "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", 2769 | "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", 2770 | "engines": { 2771 | "node": ">=18" 2772 | } 2773 | }, 2774 | "node_modules/xmlchars": { 2775 | "version": "2.2.0", 2776 | "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", 2777 | "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" 2778 | }, 2779 | "node_modules/y18n": { 2780 | "version": "5.0.8", 2781 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 2782 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 2783 | "engines": { 2784 | "node": ">=10" 2785 | } 2786 | }, 2787 | "node_modules/yargs": { 2788 | "version": "17.7.2", 2789 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", 2790 | "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", 2791 | "dependencies": { 2792 | "cliui": "^8.0.1", 2793 | "escalade": "^3.1.1", 2794 | "get-caller-file": "^2.0.5", 2795 | "require-directory": "^2.1.1", 2796 | "string-width": "^4.2.3", 2797 | "y18n": "^5.0.5", 2798 | "yargs-parser": "^21.1.1" 2799 | }, 2800 | "engines": { 2801 | "node": ">=12" 2802 | } 2803 | }, 2804 | "node_modules/yargs-parser": { 2805 | "version": "21.1.1", 2806 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", 2807 | "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", 2808 | "engines": { 2809 | "node": ">=12" 2810 | } 2811 | }, 2812 | "node_modules/yauzl": { 2813 | "version": "2.10.0", 2814 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 2815 | "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", 2816 | "dependencies": { 2817 | "buffer-crc32": "~0.2.3", 2818 | "fd-slicer": "~1.1.0" 2819 | } 2820 | }, 2821 | "node_modules/yn": { 2822 | "version": "3.1.1", 2823 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 2824 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 2825 | "dev": true, 2826 | "engines": { 2827 | "node": ">=6" 2828 | } 2829 | }, 2830 | "node_modules/zod": { 2831 | "version": "3.23.8", 2832 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", 2833 | "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", 2834 | "funding": { 2835 | "url": "https://github.com/sponsors/colinhacks" 2836 | } 2837 | } 2838 | } 2839 | } 2840 | --------------------------------------------------------------------------------