├── .github ├── dependabot.yml └── workflows │ ├── build.yml │ ├── publish.yml │ └── test.yml ├── .gitignore ├── .gitpod.yml ├── LICENSE.md ├── README.md ├── package.json ├── pnpm-lock.yaml ├── prettier.config.cjs ├── src ├── main.ts ├── transport.spec.ts ├── transport.ts └── types │ └── transport.ts ├── tsconfig.json ├── tsup.config.mjs └── vitest.config.ts /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "npm" 4 | directory: "/" 5 | schedule: 6 | interval: "weekly" -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build Package 2 | on: [push, pull_request] 3 | jobs: 4 | build: 5 | runs-on: ubuntu-latest 6 | strategy: 7 | matrix: 8 | node: [18, 20] 9 | name: Build on Node ${{ matrix.node }} 10 | steps: 11 | - uses: actions/checkout@v4 12 | - uses: pnpm/action-setup@v2 13 | name: Install pnpm 14 | with: 15 | version: 8 16 | run_install: false 17 | - name: Setup node 18 | uses: actions/setup-node@v3 19 | with: 20 | node-version: ${{ matrix.node }} 21 | registry-url: 'https://registry.npmjs.org' 22 | cache: 'pnpm' 23 | - run: pnpm install 24 | - run: pnpm build 25 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish Package to npmjs 2 | on: 3 | release: 4 | types: [published] 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/checkout@v4 10 | - uses: pnpm/action-setup@v2 11 | name: Install pnpm 12 | with: 13 | version: 8 14 | run_install: false 15 | - uses: actions/setup-node@v3 16 | with: 17 | node-version: '20.x' 18 | registry-url: 'https://registry.npmjs.org' 19 | cache: 'pnpm' 20 | - run: pnpm install 21 | - run: pnpm build 22 | - run: pnpm publish --no-git-checks 23 | env: 24 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 25 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Test Package 2 | on: [push, pull_request] 3 | jobs: 4 | build: 5 | runs-on: ubuntu-latest 6 | strategy: 7 | matrix: 8 | node: [18, 20] 9 | name: Test on Node ${{ matrix.node }} 10 | steps: 11 | - uses: actions/checkout@v4 12 | - uses: pnpm/action-setup@v2 13 | name: Install pnpm 14 | with: 15 | version: 8 16 | run_install: false 17 | - name: Setup node 18 | uses: actions/setup-node@v3 19 | with: 20 | node-version: ${{ matrix.node }} 21 | registry-url: 'https://registry.npmjs.org' 22 | cache: 'pnpm' 23 | - run: pnpm install 24 | - run: pnpm test:coverage 25 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | .idea 10 | 11 | # Diagnostic reports (https://nodejs.org/api/report.html) 12 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 13 | 14 | # Runtime data 15 | pids 16 | *.pid 17 | *.seed 18 | *.pid.lock 19 | 20 | # Directory for instrumented libs generated by jscoverage/JSCover 21 | lib-cov 22 | 23 | # Coverage directory used by tools like istanbul 24 | coverage 25 | *.lcov 26 | 27 | # nyc test coverage 28 | .nyc_output 29 | 30 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 31 | .grunt 32 | 33 | # Bower dependency directory (https://bower.io/) 34 | bower_components 35 | 36 | # node-waf configuration 37 | .lock-wscript 38 | 39 | # Compiled binary addons (https://nodejs.org/api/addons.html) 40 | build/Release 41 | 42 | # Dependency directories 43 | node_modules/ 44 | jspm_packages/ 45 | 46 | # Snowpack dependency directory (https://snowpack.dev/) 47 | web_modules/ 48 | 49 | # TypeScript cache 50 | *.tsbuildinfo 51 | 52 | # Optional npm cache directory 53 | .npm 54 | 55 | # Optional eslint cache 56 | .eslintcache 57 | 58 | # Optional stylelint cache 59 | .stylelintcache 60 | 61 | # Microbundle cache 62 | .rpt2_cache/ 63 | .rts2_cache_cjs/ 64 | .rts2_cache_es/ 65 | .rts2_cache_umd/ 66 | 67 | # Optional REPL history 68 | .node_repl_history 69 | 70 | # Output of 'npm pack' 71 | *.tgz 72 | 73 | # Yarn Integrity file 74 | .yarn-integrity 75 | 76 | # dotenv environment variable files 77 | .env 78 | .dev.vars 79 | .env.development.local 80 | .env.test.local 81 | .env.production.local 82 | .env.local 83 | 84 | # parcel-bundler cache (https://parceljs.org/) 85 | .cache 86 | .parcel-cache 87 | 88 | # Next.js build output 89 | .next 90 | out 91 | 92 | # Nuxt.js build / generate output 93 | .nuxt 94 | dist 95 | 96 | # Gatsby files 97 | .cache/ 98 | # Comment in the public line in if your project uses Gatsby and not Next.js 99 | # https://nextjs.org/blog/next-9-1#public-directory-support 100 | # public 101 | 102 | # vuepress build output 103 | .vuepress/dist 104 | 105 | # vuepress v2.x temp and cache directory 106 | .temp 107 | .cache 108 | 109 | # Docusaurus cache and generated files 110 | .docusaurus 111 | 112 | # Serverless directories 113 | .serverless/ 114 | 115 | # FuseBox cache 116 | .fusebox/ 117 | 118 | # DynamoDB Local files 119 | .dynamodb/ 120 | 121 | # TernJS port file 122 | .tern-port 123 | 124 | # Stores VSCode versions used for testing VSCode extensions 125 | .vscode-test 126 | 127 | # yarn v2 128 | .yarn/cache 129 | .yarn/unplugged 130 | .yarn/build-state.yml 131 | .yarn/install-state.gz 132 | .pnp.* 133 | 134 | # MacOS 135 | .DS_Store -------------------------------------------------------------------------------- /.gitpod.yml: -------------------------------------------------------------------------------- 1 | tasks: 2 | - init: pnpm install 3 | command: pnpm run dev 4 | 5 | 6 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Lucas Smith 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Nodemailer Resend 2 | 3 | > Transport for sending email via the Resend SDK 4 | 5 |

6 | NPM Version 7 | GitHub Repo stars 8 | GitHub 9 |

10 | 11 | ### Getting Started! 12 | 13 | #### Install the package 14 | 15 | ```bash 16 | npm install @documenso/nodemailer-resend 17 | ``` 18 | 19 | ### Usage 20 | 21 | #### Create Nodemailer Transport 22 | 23 | ```typescript 24 | import { ResendTransport } from '@documenso/nodemailer-resend'; 25 | import { createTransport } from 'nodemailer'; 26 | 27 | const mailer = createTransport( 28 | createTransport( 29 | ResendTransport.makeTransport({ 30 | apiKey: process.env.NEXT_PRIVATE_RESEND_API_KEY || '', 31 | }), 32 | ), 33 | ); 34 | ``` 35 | 36 | #### Send an Email 37 | 38 | ```typescript 39 | mailer.sendMail({ 40 | from: 'timur@documenso.com', 41 | to: 'zeno@resend.com', 42 | subject: 'Hello from Resend!', 43 | html: '

Hello world!

', 44 | }); 45 | ``` 46 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@documenso/nodemailer-resend", 3 | "version": "4.0.0", 4 | "description": "Transport for sending email via the Resend SDK", 5 | "author": "Lucas Smith", 6 | "license": "MIT", 7 | "main": "dist/main.js", 8 | "module": "dist/main.mjs", 9 | "types": "dist/main.d.ts", 10 | "repository": { 11 | "type": "git", 12 | "url": "git+https://github.com/documenso/nodemailer-resend.git" 13 | }, 14 | "scripts": { 15 | "dev": "tsup --watch", 16 | "build": "tsup", 17 | "typecheck": "tsc --noEmit", 18 | "test": "vitest", 19 | "test:coverage": "vitest --coverage", 20 | "format": "prettier --write .", 21 | "preversion": "npm run format && npm run test:coverage" 22 | }, 23 | "dependencies": { 24 | "resend": "^4.0.0" 25 | }, 26 | "peerDependencies": { 27 | "nodemailer": "^6.9.3" 28 | }, 29 | "devDependencies": { 30 | "@trivago/prettier-plugin-sort-imports": "^4.3.0", 31 | "@types/node": "^20.11.24", 32 | "@types/nodemailer": "^6.4.14", 33 | "@vitest/coverage-v8": "^1.3.1", 34 | "prettier": "^3.2.5", 35 | "tsup": "^8.0.2", 36 | "typescript": "^5.3.3", 37 | "vitest": "^1.3.1" 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | nodemailer: 9 | specifier: ^6.9.3 10 | version: 6.9.3 11 | resend: 12 | specifier: ^4.0.0 13 | version: 4.0.0(react-dom@18.2.0)(react@18.2.0) 14 | 15 | devDependencies: 16 | '@trivago/prettier-plugin-sort-imports': 17 | specifier: ^4.3.0 18 | version: 4.3.0(prettier@3.2.5) 19 | '@types/node': 20 | specifier: ^20.11.24 21 | version: 20.11.25 22 | '@types/nodemailer': 23 | specifier: ^6.4.14 24 | version: 6.4.14 25 | '@vitest/coverage-v8': 26 | specifier: ^1.3.1 27 | version: 1.3.1(vitest@1.3.1) 28 | prettier: 29 | specifier: ^3.2.5 30 | version: 3.2.5 31 | tsup: 32 | specifier: ^8.0.2 33 | version: 8.0.2(typescript@5.4.2) 34 | typescript: 35 | specifier: ^5.3.3 36 | version: 5.4.2 37 | vitest: 38 | specifier: ^1.3.1 39 | version: 1.3.1(@types/node@20.11.25) 40 | 41 | packages: 42 | 43 | /@ampproject/remapping@2.3.0: 44 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 45 | engines: {node: '>=6.0.0'} 46 | dependencies: 47 | '@jridgewell/gen-mapping': 0.3.5 48 | '@jridgewell/trace-mapping': 0.3.25 49 | dev: true 50 | 51 | /@babel/code-frame@7.23.5: 52 | resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} 53 | engines: {node: '>=6.9.0'} 54 | dependencies: 55 | '@babel/highlight': 7.23.4 56 | chalk: 2.4.2 57 | dev: true 58 | 59 | /@babel/generator@7.17.7: 60 | resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==} 61 | engines: {node: '>=6.9.0'} 62 | dependencies: 63 | '@babel/types': 7.17.0 64 | jsesc: 2.5.2 65 | source-map: 0.5.7 66 | dev: true 67 | 68 | /@babel/generator@7.23.6: 69 | resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} 70 | engines: {node: '>=6.9.0'} 71 | dependencies: 72 | '@babel/types': 7.24.0 73 | '@jridgewell/gen-mapping': 0.3.5 74 | '@jridgewell/trace-mapping': 0.3.25 75 | jsesc: 2.5.2 76 | dev: true 77 | 78 | /@babel/helper-environment-visitor@7.22.20: 79 | resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} 80 | engines: {node: '>=6.9.0'} 81 | dev: true 82 | 83 | /@babel/helper-function-name@7.23.0: 84 | resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} 85 | engines: {node: '>=6.9.0'} 86 | dependencies: 87 | '@babel/template': 7.24.0 88 | '@babel/types': 7.24.0 89 | dev: true 90 | 91 | /@babel/helper-hoist-variables@7.22.5: 92 | resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} 93 | engines: {node: '>=6.9.0'} 94 | dependencies: 95 | '@babel/types': 7.24.0 96 | dev: true 97 | 98 | /@babel/helper-split-export-declaration@7.22.6: 99 | resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} 100 | engines: {node: '>=6.9.0'} 101 | dependencies: 102 | '@babel/types': 7.24.0 103 | dev: true 104 | 105 | /@babel/helper-string-parser@7.23.4: 106 | resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} 107 | engines: {node: '>=6.9.0'} 108 | dev: true 109 | 110 | /@babel/helper-validator-identifier@7.22.20: 111 | resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} 112 | engines: {node: '>=6.9.0'} 113 | dev: true 114 | 115 | /@babel/highlight@7.23.4: 116 | resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} 117 | engines: {node: '>=6.9.0'} 118 | dependencies: 119 | '@babel/helper-validator-identifier': 7.22.20 120 | chalk: 2.4.2 121 | js-tokens: 4.0.0 122 | dev: true 123 | 124 | /@babel/parser@7.24.0: 125 | resolution: {integrity: sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==} 126 | engines: {node: '>=6.0.0'} 127 | hasBin: true 128 | dependencies: 129 | '@babel/types': 7.17.0 130 | dev: true 131 | 132 | /@babel/template@7.24.0: 133 | resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} 134 | engines: {node: '>=6.9.0'} 135 | dependencies: 136 | '@babel/code-frame': 7.23.5 137 | '@babel/parser': 7.24.0 138 | '@babel/types': 7.24.0 139 | dev: true 140 | 141 | /@babel/traverse@7.23.2: 142 | resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} 143 | engines: {node: '>=6.9.0'} 144 | dependencies: 145 | '@babel/code-frame': 7.23.5 146 | '@babel/generator': 7.23.6 147 | '@babel/helper-environment-visitor': 7.22.20 148 | '@babel/helper-function-name': 7.23.0 149 | '@babel/helper-hoist-variables': 7.22.5 150 | '@babel/helper-split-export-declaration': 7.22.6 151 | '@babel/parser': 7.24.0 152 | '@babel/types': 7.24.0 153 | debug: 4.3.4 154 | globals: 11.12.0 155 | transitivePeerDependencies: 156 | - supports-color 157 | dev: true 158 | 159 | /@babel/types@7.17.0: 160 | resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} 161 | engines: {node: '>=6.9.0'} 162 | dependencies: 163 | '@babel/helper-validator-identifier': 7.22.20 164 | to-fast-properties: 2.0.0 165 | dev: true 166 | 167 | /@babel/types@7.24.0: 168 | resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} 169 | engines: {node: '>=6.9.0'} 170 | dependencies: 171 | '@babel/helper-string-parser': 7.23.4 172 | '@babel/helper-validator-identifier': 7.22.20 173 | to-fast-properties: 2.0.0 174 | dev: true 175 | 176 | /@bcoe/v8-coverage@0.2.3: 177 | resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} 178 | dev: true 179 | 180 | /@esbuild/aix-ppc64@0.19.12: 181 | resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} 182 | engines: {node: '>=12'} 183 | cpu: [ppc64] 184 | os: [aix] 185 | requiresBuild: true 186 | dev: true 187 | optional: true 188 | 189 | /@esbuild/android-arm64@0.19.12: 190 | resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} 191 | engines: {node: '>=12'} 192 | cpu: [arm64] 193 | os: [android] 194 | requiresBuild: true 195 | dev: true 196 | optional: true 197 | 198 | /@esbuild/android-arm@0.19.12: 199 | resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} 200 | engines: {node: '>=12'} 201 | cpu: [arm] 202 | os: [android] 203 | requiresBuild: true 204 | dev: true 205 | optional: true 206 | 207 | /@esbuild/android-x64@0.19.12: 208 | resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} 209 | engines: {node: '>=12'} 210 | cpu: [x64] 211 | os: [android] 212 | requiresBuild: true 213 | dev: true 214 | optional: true 215 | 216 | /@esbuild/darwin-arm64@0.19.12: 217 | resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} 218 | engines: {node: '>=12'} 219 | cpu: [arm64] 220 | os: [darwin] 221 | requiresBuild: true 222 | dev: true 223 | optional: true 224 | 225 | /@esbuild/darwin-x64@0.19.12: 226 | resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} 227 | engines: {node: '>=12'} 228 | cpu: [x64] 229 | os: [darwin] 230 | requiresBuild: true 231 | dev: true 232 | optional: true 233 | 234 | /@esbuild/freebsd-arm64@0.19.12: 235 | resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} 236 | engines: {node: '>=12'} 237 | cpu: [arm64] 238 | os: [freebsd] 239 | requiresBuild: true 240 | dev: true 241 | optional: true 242 | 243 | /@esbuild/freebsd-x64@0.19.12: 244 | resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} 245 | engines: {node: '>=12'} 246 | cpu: [x64] 247 | os: [freebsd] 248 | requiresBuild: true 249 | dev: true 250 | optional: true 251 | 252 | /@esbuild/linux-arm64@0.19.12: 253 | resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} 254 | engines: {node: '>=12'} 255 | cpu: [arm64] 256 | os: [linux] 257 | requiresBuild: true 258 | dev: true 259 | optional: true 260 | 261 | /@esbuild/linux-arm@0.19.12: 262 | resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} 263 | engines: {node: '>=12'} 264 | cpu: [arm] 265 | os: [linux] 266 | requiresBuild: true 267 | dev: true 268 | optional: true 269 | 270 | /@esbuild/linux-ia32@0.19.12: 271 | resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} 272 | engines: {node: '>=12'} 273 | cpu: [ia32] 274 | os: [linux] 275 | requiresBuild: true 276 | dev: true 277 | optional: true 278 | 279 | /@esbuild/linux-loong64@0.19.12: 280 | resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} 281 | engines: {node: '>=12'} 282 | cpu: [loong64] 283 | os: [linux] 284 | requiresBuild: true 285 | dev: true 286 | optional: true 287 | 288 | /@esbuild/linux-mips64el@0.19.12: 289 | resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} 290 | engines: {node: '>=12'} 291 | cpu: [mips64el] 292 | os: [linux] 293 | requiresBuild: true 294 | dev: true 295 | optional: true 296 | 297 | /@esbuild/linux-ppc64@0.19.12: 298 | resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} 299 | engines: {node: '>=12'} 300 | cpu: [ppc64] 301 | os: [linux] 302 | requiresBuild: true 303 | dev: true 304 | optional: true 305 | 306 | /@esbuild/linux-riscv64@0.19.12: 307 | resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} 308 | engines: {node: '>=12'} 309 | cpu: [riscv64] 310 | os: [linux] 311 | requiresBuild: true 312 | dev: true 313 | optional: true 314 | 315 | /@esbuild/linux-s390x@0.19.12: 316 | resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} 317 | engines: {node: '>=12'} 318 | cpu: [s390x] 319 | os: [linux] 320 | requiresBuild: true 321 | dev: true 322 | optional: true 323 | 324 | /@esbuild/linux-x64@0.19.12: 325 | resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} 326 | engines: {node: '>=12'} 327 | cpu: [x64] 328 | os: [linux] 329 | requiresBuild: true 330 | dev: true 331 | optional: true 332 | 333 | /@esbuild/netbsd-x64@0.19.12: 334 | resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} 335 | engines: {node: '>=12'} 336 | cpu: [x64] 337 | os: [netbsd] 338 | requiresBuild: true 339 | dev: true 340 | optional: true 341 | 342 | /@esbuild/openbsd-x64@0.19.12: 343 | resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} 344 | engines: {node: '>=12'} 345 | cpu: [x64] 346 | os: [openbsd] 347 | requiresBuild: true 348 | dev: true 349 | optional: true 350 | 351 | /@esbuild/sunos-x64@0.19.12: 352 | resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} 353 | engines: {node: '>=12'} 354 | cpu: [x64] 355 | os: [sunos] 356 | requiresBuild: true 357 | dev: true 358 | optional: true 359 | 360 | /@esbuild/win32-arm64@0.19.12: 361 | resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} 362 | engines: {node: '>=12'} 363 | cpu: [arm64] 364 | os: [win32] 365 | requiresBuild: true 366 | dev: true 367 | optional: true 368 | 369 | /@esbuild/win32-ia32@0.19.12: 370 | resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} 371 | engines: {node: '>=12'} 372 | cpu: [ia32] 373 | os: [win32] 374 | requiresBuild: true 375 | dev: true 376 | optional: true 377 | 378 | /@esbuild/win32-x64@0.19.12: 379 | resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} 380 | engines: {node: '>=12'} 381 | cpu: [x64] 382 | os: [win32] 383 | requiresBuild: true 384 | dev: true 385 | optional: true 386 | 387 | /@isaacs/cliui@8.0.2: 388 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 389 | engines: {node: '>=12'} 390 | dependencies: 391 | string-width: 5.1.2 392 | string-width-cjs: /string-width@4.2.3 393 | strip-ansi: 7.1.0 394 | strip-ansi-cjs: /strip-ansi@6.0.1 395 | wrap-ansi: 8.1.0 396 | wrap-ansi-cjs: /wrap-ansi@7.0.0 397 | 398 | /@istanbuljs/schema@0.1.3: 399 | resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} 400 | engines: {node: '>=8'} 401 | dev: true 402 | 403 | /@jest/schemas@29.6.3: 404 | resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} 405 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 406 | dependencies: 407 | '@sinclair/typebox': 0.27.8 408 | dev: true 409 | 410 | /@jridgewell/gen-mapping@0.3.5: 411 | resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} 412 | engines: {node: '>=6.0.0'} 413 | dependencies: 414 | '@jridgewell/set-array': 1.2.1 415 | '@jridgewell/sourcemap-codec': 1.4.15 416 | '@jridgewell/trace-mapping': 0.3.25 417 | dev: true 418 | 419 | /@jridgewell/resolve-uri@3.1.2: 420 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 421 | engines: {node: '>=6.0.0'} 422 | dev: true 423 | 424 | /@jridgewell/set-array@1.2.1: 425 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 426 | engines: {node: '>=6.0.0'} 427 | dev: true 428 | 429 | /@jridgewell/sourcemap-codec@1.4.15: 430 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 431 | dev: true 432 | 433 | /@jridgewell/trace-mapping@0.3.25: 434 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 435 | dependencies: 436 | '@jridgewell/resolve-uri': 3.1.2 437 | '@jridgewell/sourcemap-codec': 1.4.15 438 | dev: true 439 | 440 | /@nodelib/fs.scandir@2.1.5: 441 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 442 | engines: {node: '>= 8'} 443 | dependencies: 444 | '@nodelib/fs.stat': 2.0.5 445 | run-parallel: 1.2.0 446 | dev: true 447 | 448 | /@nodelib/fs.stat@2.0.5: 449 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 450 | engines: {node: '>= 8'} 451 | dev: true 452 | 453 | /@nodelib/fs.walk@1.2.8: 454 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 455 | engines: {node: '>= 8'} 456 | dependencies: 457 | '@nodelib/fs.scandir': 2.1.5 458 | fastq: 1.17.1 459 | dev: true 460 | 461 | /@one-ini/wasm@0.1.1: 462 | resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} 463 | dev: false 464 | 465 | /@pkgjs/parseargs@0.11.0: 466 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 467 | engines: {node: '>=14'} 468 | requiresBuild: true 469 | optional: true 470 | 471 | /@react-email/render@0.0.17(react-dom@18.2.0)(react@18.2.0): 472 | resolution: {integrity: sha512-xBQ+/73+WsGuXKY7r1U73zMBNV28xdV0cp9cFjhNYipBReDHhV97IpA6v7Hl0dDtDzt+yS/72dY5vYXrF1v8NA==} 473 | engines: {node: '>=18.0.0'} 474 | peerDependencies: 475 | react: ^18.2.0 476 | react-dom: ^18.2.0 477 | dependencies: 478 | html-to-text: 9.0.5 479 | js-beautify: 1.15.1 480 | react: 18.2.0 481 | react-dom: 18.2.0(react@18.2.0) 482 | react-promise-suspense: 0.3.4 483 | dev: false 484 | 485 | /@rollup/rollup-android-arm-eabi@4.12.0: 486 | resolution: {integrity: sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==} 487 | cpu: [arm] 488 | os: [android] 489 | requiresBuild: true 490 | dev: true 491 | optional: true 492 | 493 | /@rollup/rollup-android-arm64@4.12.0: 494 | resolution: {integrity: sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==} 495 | cpu: [arm64] 496 | os: [android] 497 | requiresBuild: true 498 | dev: true 499 | optional: true 500 | 501 | /@rollup/rollup-darwin-arm64@4.12.0: 502 | resolution: {integrity: sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==} 503 | cpu: [arm64] 504 | os: [darwin] 505 | requiresBuild: true 506 | dev: true 507 | optional: true 508 | 509 | /@rollup/rollup-darwin-x64@4.12.0: 510 | resolution: {integrity: sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==} 511 | cpu: [x64] 512 | os: [darwin] 513 | requiresBuild: true 514 | dev: true 515 | optional: true 516 | 517 | /@rollup/rollup-linux-arm-gnueabihf@4.12.0: 518 | resolution: {integrity: sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==} 519 | cpu: [arm] 520 | os: [linux] 521 | requiresBuild: true 522 | dev: true 523 | optional: true 524 | 525 | /@rollup/rollup-linux-arm64-gnu@4.12.0: 526 | resolution: {integrity: sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==} 527 | cpu: [arm64] 528 | os: [linux] 529 | requiresBuild: true 530 | dev: true 531 | optional: true 532 | 533 | /@rollup/rollup-linux-arm64-musl@4.12.0: 534 | resolution: {integrity: sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==} 535 | cpu: [arm64] 536 | os: [linux] 537 | requiresBuild: true 538 | dev: true 539 | optional: true 540 | 541 | /@rollup/rollup-linux-riscv64-gnu@4.12.0: 542 | resolution: {integrity: sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==} 543 | cpu: [riscv64] 544 | os: [linux] 545 | requiresBuild: true 546 | dev: true 547 | optional: true 548 | 549 | /@rollup/rollup-linux-x64-gnu@4.12.0: 550 | resolution: {integrity: sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==} 551 | cpu: [x64] 552 | os: [linux] 553 | requiresBuild: true 554 | dev: true 555 | optional: true 556 | 557 | /@rollup/rollup-linux-x64-musl@4.12.0: 558 | resolution: {integrity: sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==} 559 | cpu: [x64] 560 | os: [linux] 561 | requiresBuild: true 562 | dev: true 563 | optional: true 564 | 565 | /@rollup/rollup-win32-arm64-msvc@4.12.0: 566 | resolution: {integrity: sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==} 567 | cpu: [arm64] 568 | os: [win32] 569 | requiresBuild: true 570 | dev: true 571 | optional: true 572 | 573 | /@rollup/rollup-win32-ia32-msvc@4.12.0: 574 | resolution: {integrity: sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==} 575 | cpu: [ia32] 576 | os: [win32] 577 | requiresBuild: true 578 | dev: true 579 | optional: true 580 | 581 | /@rollup/rollup-win32-x64-msvc@4.12.0: 582 | resolution: {integrity: sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==} 583 | cpu: [x64] 584 | os: [win32] 585 | requiresBuild: true 586 | dev: true 587 | optional: true 588 | 589 | /@selderee/plugin-htmlparser2@0.11.0: 590 | resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} 591 | dependencies: 592 | domhandler: 5.0.3 593 | selderee: 0.11.0 594 | dev: false 595 | 596 | /@sinclair/typebox@0.27.8: 597 | resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} 598 | dev: true 599 | 600 | /@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.2.5): 601 | resolution: {integrity: sha512-r3n0onD3BTOVUNPhR4lhVK4/pABGpbA7bW3eumZnYdKaHkf1qEC+Mag6DPbGNuuh0eG8AaYj+YqmVHSiGslaTQ==} 602 | peerDependencies: 603 | '@vue/compiler-sfc': 3.x 604 | prettier: 2.x - 3.x 605 | peerDependenciesMeta: 606 | '@vue/compiler-sfc': 607 | optional: true 608 | dependencies: 609 | '@babel/generator': 7.17.7 610 | '@babel/parser': 7.24.0 611 | '@babel/traverse': 7.23.2 612 | '@babel/types': 7.17.0 613 | javascript-natural-sort: 0.7.1 614 | lodash: 4.17.21 615 | prettier: 3.2.5 616 | transitivePeerDependencies: 617 | - supports-color 618 | dev: true 619 | 620 | /@types/estree@1.0.5: 621 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} 622 | dev: true 623 | 624 | /@types/istanbul-lib-coverage@2.0.6: 625 | resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} 626 | dev: true 627 | 628 | /@types/node@20.11.25: 629 | resolution: {integrity: sha512-TBHyJxk2b7HceLVGFcpAUjsa5zIdsPWlR6XHfyGzd0SFu+/NFgQgMAl96MSDZgQDvJAvV6BKsFOrt6zIL09JDw==} 630 | dependencies: 631 | undici-types: 5.26.5 632 | dev: true 633 | 634 | /@types/nodemailer@6.4.14: 635 | resolution: {integrity: sha512-fUWthHO9k9DSdPCSPRqcu6TWhYyxTBg382vlNIttSe9M7XfsT06y0f24KHXtbnijPGGRIcVvdKHTNikOI6qiHA==} 636 | dependencies: 637 | '@types/node': 20.11.25 638 | dev: true 639 | 640 | /@vitest/coverage-v8@1.3.1(vitest@1.3.1): 641 | resolution: {integrity: sha512-UuBnkSJUNE9rdHjDCPyJ4fYuMkoMtnghes1XohYa4At0MS3OQSAo97FrbwSLRshYsXThMZy1+ybD/byK5llyIg==} 642 | peerDependencies: 643 | vitest: 1.3.1 644 | dependencies: 645 | '@ampproject/remapping': 2.3.0 646 | '@bcoe/v8-coverage': 0.2.3 647 | debug: 4.3.4 648 | istanbul-lib-coverage: 3.2.2 649 | istanbul-lib-report: 3.0.1 650 | istanbul-lib-source-maps: 4.0.1 651 | istanbul-reports: 3.1.7 652 | magic-string: 0.30.8 653 | magicast: 0.3.3 654 | picocolors: 1.0.0 655 | std-env: 3.7.0 656 | test-exclude: 6.0.0 657 | v8-to-istanbul: 9.2.0 658 | vitest: 1.3.1(@types/node@20.11.25) 659 | transitivePeerDependencies: 660 | - supports-color 661 | dev: true 662 | 663 | /@vitest/expect@1.3.1: 664 | resolution: {integrity: sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==} 665 | dependencies: 666 | '@vitest/spy': 1.3.1 667 | '@vitest/utils': 1.3.1 668 | chai: 4.4.1 669 | dev: true 670 | 671 | /@vitest/runner@1.3.1: 672 | resolution: {integrity: sha512-5FzF9c3jG/z5bgCnjr8j9LNq/9OxV2uEBAITOXfoe3rdZJTdO7jzThth7FXv/6b+kdY65tpRQB7WaKhNZwX+Kg==} 673 | dependencies: 674 | '@vitest/utils': 1.3.1 675 | p-limit: 5.0.0 676 | pathe: 1.1.2 677 | dev: true 678 | 679 | /@vitest/snapshot@1.3.1: 680 | resolution: {integrity: sha512-EF++BZbt6RZmOlE3SuTPu/NfwBF6q4ABS37HHXzs2LUVPBLx2QoY/K0fKpRChSo8eLiuxcbCVfqKgx/dplCDuQ==} 681 | dependencies: 682 | magic-string: 0.30.8 683 | pathe: 1.1.2 684 | pretty-format: 29.7.0 685 | dev: true 686 | 687 | /@vitest/spy@1.3.1: 688 | resolution: {integrity: sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig==} 689 | dependencies: 690 | tinyspy: 2.2.1 691 | dev: true 692 | 693 | /@vitest/utils@1.3.1: 694 | resolution: {integrity: sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==} 695 | dependencies: 696 | diff-sequences: 29.6.3 697 | estree-walker: 3.0.3 698 | loupe: 2.3.7 699 | pretty-format: 29.7.0 700 | dev: true 701 | 702 | /abbrev@2.0.0: 703 | resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} 704 | engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} 705 | dev: false 706 | 707 | /acorn-walk@8.3.2: 708 | resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} 709 | engines: {node: '>=0.4.0'} 710 | dev: true 711 | 712 | /acorn@8.11.3: 713 | resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} 714 | engines: {node: '>=0.4.0'} 715 | hasBin: true 716 | dev: true 717 | 718 | /ansi-regex@5.0.1: 719 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 720 | engines: {node: '>=8'} 721 | 722 | /ansi-regex@6.0.1: 723 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} 724 | engines: {node: '>=12'} 725 | 726 | /ansi-styles@3.2.1: 727 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 728 | engines: {node: '>=4'} 729 | dependencies: 730 | color-convert: 1.9.3 731 | dev: true 732 | 733 | /ansi-styles@4.3.0: 734 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 735 | engines: {node: '>=8'} 736 | dependencies: 737 | color-convert: 2.0.1 738 | 739 | /ansi-styles@5.2.0: 740 | resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} 741 | engines: {node: '>=10'} 742 | dev: true 743 | 744 | /ansi-styles@6.2.1: 745 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 746 | engines: {node: '>=12'} 747 | 748 | /any-promise@1.3.0: 749 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 750 | dev: true 751 | 752 | /anymatch@3.1.3: 753 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 754 | engines: {node: '>= 8'} 755 | dependencies: 756 | normalize-path: 3.0.0 757 | picomatch: 2.3.1 758 | dev: true 759 | 760 | /array-union@2.1.0: 761 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 762 | engines: {node: '>=8'} 763 | dev: true 764 | 765 | /assertion-error@1.1.0: 766 | resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} 767 | dev: true 768 | 769 | /balanced-match@1.0.2: 770 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 771 | 772 | /binary-extensions@2.2.0: 773 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 774 | engines: {node: '>=8'} 775 | dev: true 776 | 777 | /brace-expansion@1.1.11: 778 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 779 | dependencies: 780 | balanced-match: 1.0.2 781 | concat-map: 0.0.1 782 | dev: true 783 | 784 | /brace-expansion@2.0.1: 785 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 786 | dependencies: 787 | balanced-match: 1.0.2 788 | 789 | /braces@3.0.2: 790 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 791 | engines: {node: '>=8'} 792 | dependencies: 793 | fill-range: 7.0.1 794 | dev: true 795 | 796 | /bundle-require@4.0.2(esbuild@0.19.12): 797 | resolution: {integrity: sha512-jwzPOChofl67PSTW2SGubV9HBQAhhR2i6nskiOThauo9dzwDUgOWQScFVaJkjEfYX+UXiD+LEx8EblQMc2wIag==} 798 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 799 | peerDependencies: 800 | esbuild: '>=0.17' 801 | dependencies: 802 | esbuild: 0.19.12 803 | load-tsconfig: 0.2.5 804 | dev: true 805 | 806 | /cac@6.7.14: 807 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 808 | engines: {node: '>=8'} 809 | dev: true 810 | 811 | /chai@4.4.1: 812 | resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} 813 | engines: {node: '>=4'} 814 | dependencies: 815 | assertion-error: 1.1.0 816 | check-error: 1.0.3 817 | deep-eql: 4.1.3 818 | get-func-name: 2.0.2 819 | loupe: 2.3.7 820 | pathval: 1.1.1 821 | type-detect: 4.0.8 822 | dev: true 823 | 824 | /chalk@2.4.2: 825 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 826 | engines: {node: '>=4'} 827 | dependencies: 828 | ansi-styles: 3.2.1 829 | escape-string-regexp: 1.0.5 830 | supports-color: 5.5.0 831 | dev: true 832 | 833 | /check-error@1.0.3: 834 | resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} 835 | dependencies: 836 | get-func-name: 2.0.2 837 | dev: true 838 | 839 | /chokidar@3.6.0: 840 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 841 | engines: {node: '>= 8.10.0'} 842 | dependencies: 843 | anymatch: 3.1.3 844 | braces: 3.0.2 845 | glob-parent: 5.1.2 846 | is-binary-path: 2.1.0 847 | is-glob: 4.0.3 848 | normalize-path: 3.0.0 849 | readdirp: 3.6.0 850 | optionalDependencies: 851 | fsevents: 2.3.3 852 | dev: true 853 | 854 | /color-convert@1.9.3: 855 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 856 | dependencies: 857 | color-name: 1.1.3 858 | dev: true 859 | 860 | /color-convert@2.0.1: 861 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 862 | engines: {node: '>=7.0.0'} 863 | dependencies: 864 | color-name: 1.1.4 865 | 866 | /color-name@1.1.3: 867 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 868 | dev: true 869 | 870 | /color-name@1.1.4: 871 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 872 | 873 | /commander@10.0.1: 874 | resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} 875 | engines: {node: '>=14'} 876 | dev: false 877 | 878 | /commander@4.1.1: 879 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 880 | engines: {node: '>= 6'} 881 | dev: true 882 | 883 | /concat-map@0.0.1: 884 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 885 | dev: true 886 | 887 | /config-chain@1.1.13: 888 | resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} 889 | dependencies: 890 | ini: 1.3.8 891 | proto-list: 1.2.4 892 | dev: false 893 | 894 | /convert-source-map@2.0.0: 895 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 896 | dev: true 897 | 898 | /cross-spawn@7.0.3: 899 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 900 | engines: {node: '>= 8'} 901 | dependencies: 902 | path-key: 3.1.1 903 | shebang-command: 2.0.0 904 | which: 2.0.2 905 | 906 | /debug@4.3.4: 907 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 908 | engines: {node: '>=6.0'} 909 | peerDependencies: 910 | supports-color: '*' 911 | peerDependenciesMeta: 912 | supports-color: 913 | optional: true 914 | dependencies: 915 | ms: 2.1.2 916 | dev: true 917 | 918 | /deep-eql@4.1.3: 919 | resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} 920 | engines: {node: '>=6'} 921 | dependencies: 922 | type-detect: 4.0.8 923 | dev: true 924 | 925 | /deepmerge@4.3.1: 926 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 927 | engines: {node: '>=0.10.0'} 928 | dev: false 929 | 930 | /diff-sequences@29.6.3: 931 | resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} 932 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 933 | dev: true 934 | 935 | /dir-glob@3.0.1: 936 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 937 | engines: {node: '>=8'} 938 | dependencies: 939 | path-type: 4.0.0 940 | dev: true 941 | 942 | /dom-serializer@2.0.0: 943 | resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} 944 | dependencies: 945 | domelementtype: 2.3.0 946 | domhandler: 5.0.3 947 | entities: 4.5.0 948 | dev: false 949 | 950 | /domelementtype@2.3.0: 951 | resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} 952 | dev: false 953 | 954 | /domhandler@5.0.3: 955 | resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} 956 | engines: {node: '>= 4'} 957 | dependencies: 958 | domelementtype: 2.3.0 959 | dev: false 960 | 961 | /domutils@3.1.0: 962 | resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} 963 | dependencies: 964 | dom-serializer: 2.0.0 965 | domelementtype: 2.3.0 966 | domhandler: 5.0.3 967 | dev: false 968 | 969 | /eastasianwidth@0.2.0: 970 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 971 | 972 | /editorconfig@1.0.4: 973 | resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} 974 | engines: {node: '>=14'} 975 | hasBin: true 976 | dependencies: 977 | '@one-ini/wasm': 0.1.1 978 | commander: 10.0.1 979 | minimatch: 9.0.1 980 | semver: 7.6.0 981 | dev: false 982 | 983 | /emoji-regex@8.0.0: 984 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 985 | 986 | /emoji-regex@9.2.2: 987 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 988 | 989 | /entities@4.5.0: 990 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 991 | engines: {node: '>=0.12'} 992 | dev: false 993 | 994 | /esbuild@0.19.12: 995 | resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} 996 | engines: {node: '>=12'} 997 | hasBin: true 998 | requiresBuild: true 999 | optionalDependencies: 1000 | '@esbuild/aix-ppc64': 0.19.12 1001 | '@esbuild/android-arm': 0.19.12 1002 | '@esbuild/android-arm64': 0.19.12 1003 | '@esbuild/android-x64': 0.19.12 1004 | '@esbuild/darwin-arm64': 0.19.12 1005 | '@esbuild/darwin-x64': 0.19.12 1006 | '@esbuild/freebsd-arm64': 0.19.12 1007 | '@esbuild/freebsd-x64': 0.19.12 1008 | '@esbuild/linux-arm': 0.19.12 1009 | '@esbuild/linux-arm64': 0.19.12 1010 | '@esbuild/linux-ia32': 0.19.12 1011 | '@esbuild/linux-loong64': 0.19.12 1012 | '@esbuild/linux-mips64el': 0.19.12 1013 | '@esbuild/linux-ppc64': 0.19.12 1014 | '@esbuild/linux-riscv64': 0.19.12 1015 | '@esbuild/linux-s390x': 0.19.12 1016 | '@esbuild/linux-x64': 0.19.12 1017 | '@esbuild/netbsd-x64': 0.19.12 1018 | '@esbuild/openbsd-x64': 0.19.12 1019 | '@esbuild/sunos-x64': 0.19.12 1020 | '@esbuild/win32-arm64': 0.19.12 1021 | '@esbuild/win32-ia32': 0.19.12 1022 | '@esbuild/win32-x64': 0.19.12 1023 | dev: true 1024 | 1025 | /escape-string-regexp@1.0.5: 1026 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 1027 | engines: {node: '>=0.8.0'} 1028 | dev: true 1029 | 1030 | /estree-walker@3.0.3: 1031 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 1032 | dependencies: 1033 | '@types/estree': 1.0.5 1034 | dev: true 1035 | 1036 | /execa@5.1.1: 1037 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 1038 | engines: {node: '>=10'} 1039 | dependencies: 1040 | cross-spawn: 7.0.3 1041 | get-stream: 6.0.1 1042 | human-signals: 2.1.0 1043 | is-stream: 2.0.1 1044 | merge-stream: 2.0.0 1045 | npm-run-path: 4.0.1 1046 | onetime: 5.1.2 1047 | signal-exit: 3.0.7 1048 | strip-final-newline: 2.0.0 1049 | dev: true 1050 | 1051 | /execa@8.0.1: 1052 | resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} 1053 | engines: {node: '>=16.17'} 1054 | dependencies: 1055 | cross-spawn: 7.0.3 1056 | get-stream: 8.0.1 1057 | human-signals: 5.0.0 1058 | is-stream: 3.0.0 1059 | merge-stream: 2.0.0 1060 | npm-run-path: 5.3.0 1061 | onetime: 6.0.0 1062 | signal-exit: 4.1.0 1063 | strip-final-newline: 3.0.0 1064 | dev: true 1065 | 1066 | /fast-deep-equal@2.0.1: 1067 | resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} 1068 | dev: false 1069 | 1070 | /fast-glob@3.3.2: 1071 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 1072 | engines: {node: '>=8.6.0'} 1073 | dependencies: 1074 | '@nodelib/fs.stat': 2.0.5 1075 | '@nodelib/fs.walk': 1.2.8 1076 | glob-parent: 5.1.2 1077 | merge2: 1.4.1 1078 | micromatch: 4.0.5 1079 | dev: true 1080 | 1081 | /fastq@1.17.1: 1082 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 1083 | dependencies: 1084 | reusify: 1.0.4 1085 | dev: true 1086 | 1087 | /fill-range@7.0.1: 1088 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1089 | engines: {node: '>=8'} 1090 | dependencies: 1091 | to-regex-range: 5.0.1 1092 | dev: true 1093 | 1094 | /foreground-child@3.1.1: 1095 | resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} 1096 | engines: {node: '>=14'} 1097 | dependencies: 1098 | cross-spawn: 7.0.3 1099 | signal-exit: 4.1.0 1100 | 1101 | /fs.realpath@1.0.0: 1102 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 1103 | dev: true 1104 | 1105 | /fsevents@2.3.3: 1106 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1107 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1108 | os: [darwin] 1109 | requiresBuild: true 1110 | dev: true 1111 | optional: true 1112 | 1113 | /get-func-name@2.0.2: 1114 | resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} 1115 | dev: true 1116 | 1117 | /get-stream@6.0.1: 1118 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 1119 | engines: {node: '>=10'} 1120 | dev: true 1121 | 1122 | /get-stream@8.0.1: 1123 | resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} 1124 | engines: {node: '>=16'} 1125 | dev: true 1126 | 1127 | /glob-parent@5.1.2: 1128 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1129 | engines: {node: '>= 6'} 1130 | dependencies: 1131 | is-glob: 4.0.3 1132 | dev: true 1133 | 1134 | /glob@10.3.10: 1135 | resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} 1136 | engines: {node: '>=16 || 14 >=14.17'} 1137 | hasBin: true 1138 | dependencies: 1139 | foreground-child: 3.1.1 1140 | jackspeak: 2.3.6 1141 | minimatch: 9.0.3 1142 | minipass: 7.0.4 1143 | path-scurry: 1.10.1 1144 | 1145 | /glob@7.2.3: 1146 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 1147 | dependencies: 1148 | fs.realpath: 1.0.0 1149 | inflight: 1.0.6 1150 | inherits: 2.0.4 1151 | minimatch: 3.1.2 1152 | once: 1.4.0 1153 | path-is-absolute: 1.0.1 1154 | dev: true 1155 | 1156 | /globals@11.12.0: 1157 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 1158 | engines: {node: '>=4'} 1159 | dev: true 1160 | 1161 | /globby@11.1.0: 1162 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 1163 | engines: {node: '>=10'} 1164 | dependencies: 1165 | array-union: 2.1.0 1166 | dir-glob: 3.0.1 1167 | fast-glob: 3.3.2 1168 | ignore: 5.3.1 1169 | merge2: 1.4.1 1170 | slash: 3.0.0 1171 | dev: true 1172 | 1173 | /has-flag@3.0.0: 1174 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 1175 | engines: {node: '>=4'} 1176 | dev: true 1177 | 1178 | /has-flag@4.0.0: 1179 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1180 | engines: {node: '>=8'} 1181 | dev: true 1182 | 1183 | /html-escaper@2.0.2: 1184 | resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} 1185 | dev: true 1186 | 1187 | /html-to-text@9.0.5: 1188 | resolution: {integrity: sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==} 1189 | engines: {node: '>=14'} 1190 | dependencies: 1191 | '@selderee/plugin-htmlparser2': 0.11.0 1192 | deepmerge: 4.3.1 1193 | dom-serializer: 2.0.0 1194 | htmlparser2: 8.0.2 1195 | selderee: 0.11.0 1196 | dev: false 1197 | 1198 | /htmlparser2@8.0.2: 1199 | resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} 1200 | dependencies: 1201 | domelementtype: 2.3.0 1202 | domhandler: 5.0.3 1203 | domutils: 3.1.0 1204 | entities: 4.5.0 1205 | dev: false 1206 | 1207 | /human-signals@2.1.0: 1208 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 1209 | engines: {node: '>=10.17.0'} 1210 | dev: true 1211 | 1212 | /human-signals@5.0.0: 1213 | resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} 1214 | engines: {node: '>=16.17.0'} 1215 | dev: true 1216 | 1217 | /ignore@5.3.1: 1218 | resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} 1219 | engines: {node: '>= 4'} 1220 | dev: true 1221 | 1222 | /inflight@1.0.6: 1223 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1224 | dependencies: 1225 | once: 1.4.0 1226 | wrappy: 1.0.2 1227 | dev: true 1228 | 1229 | /inherits@2.0.4: 1230 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1231 | dev: true 1232 | 1233 | /ini@1.3.8: 1234 | resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} 1235 | dev: false 1236 | 1237 | /is-binary-path@2.1.0: 1238 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 1239 | engines: {node: '>=8'} 1240 | dependencies: 1241 | binary-extensions: 2.2.0 1242 | dev: true 1243 | 1244 | /is-extglob@2.1.1: 1245 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1246 | engines: {node: '>=0.10.0'} 1247 | dev: true 1248 | 1249 | /is-fullwidth-code-point@3.0.0: 1250 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1251 | engines: {node: '>=8'} 1252 | 1253 | /is-glob@4.0.3: 1254 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1255 | engines: {node: '>=0.10.0'} 1256 | dependencies: 1257 | is-extglob: 2.1.1 1258 | dev: true 1259 | 1260 | /is-number@7.0.0: 1261 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1262 | engines: {node: '>=0.12.0'} 1263 | dev: true 1264 | 1265 | /is-stream@2.0.1: 1266 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 1267 | engines: {node: '>=8'} 1268 | dev: true 1269 | 1270 | /is-stream@3.0.0: 1271 | resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} 1272 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1273 | dev: true 1274 | 1275 | /isexe@2.0.0: 1276 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1277 | 1278 | /istanbul-lib-coverage@3.2.2: 1279 | resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} 1280 | engines: {node: '>=8'} 1281 | dev: true 1282 | 1283 | /istanbul-lib-report@3.0.1: 1284 | resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} 1285 | engines: {node: '>=10'} 1286 | dependencies: 1287 | istanbul-lib-coverage: 3.2.2 1288 | make-dir: 4.0.0 1289 | supports-color: 7.2.0 1290 | dev: true 1291 | 1292 | /istanbul-lib-source-maps@4.0.1: 1293 | resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} 1294 | engines: {node: '>=10'} 1295 | dependencies: 1296 | debug: 4.3.4 1297 | istanbul-lib-coverage: 3.2.2 1298 | source-map: 0.6.1 1299 | transitivePeerDependencies: 1300 | - supports-color 1301 | dev: true 1302 | 1303 | /istanbul-reports@3.1.7: 1304 | resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} 1305 | engines: {node: '>=8'} 1306 | dependencies: 1307 | html-escaper: 2.0.2 1308 | istanbul-lib-report: 3.0.1 1309 | dev: true 1310 | 1311 | /jackspeak@2.3.6: 1312 | resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} 1313 | engines: {node: '>=14'} 1314 | dependencies: 1315 | '@isaacs/cliui': 8.0.2 1316 | optionalDependencies: 1317 | '@pkgjs/parseargs': 0.11.0 1318 | 1319 | /javascript-natural-sort@0.7.1: 1320 | resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} 1321 | dev: true 1322 | 1323 | /joycon@3.1.1: 1324 | resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} 1325 | engines: {node: '>=10'} 1326 | dev: true 1327 | 1328 | /js-beautify@1.15.1: 1329 | resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} 1330 | engines: {node: '>=14'} 1331 | hasBin: true 1332 | dependencies: 1333 | config-chain: 1.1.13 1334 | editorconfig: 1.0.4 1335 | glob: 10.3.10 1336 | js-cookie: 3.0.5 1337 | nopt: 7.2.0 1338 | dev: false 1339 | 1340 | /js-cookie@3.0.5: 1341 | resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} 1342 | engines: {node: '>=14'} 1343 | dev: false 1344 | 1345 | /js-tokens@4.0.0: 1346 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1347 | 1348 | /js-tokens@8.0.3: 1349 | resolution: {integrity: sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==} 1350 | dev: true 1351 | 1352 | /jsesc@2.5.2: 1353 | resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} 1354 | engines: {node: '>=4'} 1355 | hasBin: true 1356 | dev: true 1357 | 1358 | /jsonc-parser@3.2.1: 1359 | resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} 1360 | dev: true 1361 | 1362 | /leac@0.6.0: 1363 | resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} 1364 | dev: false 1365 | 1366 | /lilconfig@3.1.1: 1367 | resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} 1368 | engines: {node: '>=14'} 1369 | dev: true 1370 | 1371 | /lines-and-columns@1.2.4: 1372 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 1373 | dev: true 1374 | 1375 | /load-tsconfig@0.2.5: 1376 | resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} 1377 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1378 | dev: true 1379 | 1380 | /local-pkg@0.5.0: 1381 | resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} 1382 | engines: {node: '>=14'} 1383 | dependencies: 1384 | mlly: 1.6.1 1385 | pkg-types: 1.0.3 1386 | dev: true 1387 | 1388 | /lodash.sortby@4.7.0: 1389 | resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} 1390 | dev: true 1391 | 1392 | /lodash@4.17.21: 1393 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 1394 | dev: true 1395 | 1396 | /loose-envify@1.4.0: 1397 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 1398 | hasBin: true 1399 | dependencies: 1400 | js-tokens: 4.0.0 1401 | dev: false 1402 | 1403 | /loupe@2.3.7: 1404 | resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} 1405 | dependencies: 1406 | get-func-name: 2.0.2 1407 | dev: true 1408 | 1409 | /lru-cache@10.2.0: 1410 | resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} 1411 | engines: {node: 14 || >=16.14} 1412 | 1413 | /lru-cache@6.0.0: 1414 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 1415 | engines: {node: '>=10'} 1416 | dependencies: 1417 | yallist: 4.0.0 1418 | 1419 | /magic-string@0.30.8: 1420 | resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} 1421 | engines: {node: '>=12'} 1422 | dependencies: 1423 | '@jridgewell/sourcemap-codec': 1.4.15 1424 | dev: true 1425 | 1426 | /magicast@0.3.3: 1427 | resolution: {integrity: sha512-ZbrP1Qxnpoes8sz47AM0z08U+jW6TyRgZzcWy3Ma3vDhJttwMwAFDMMQFobwdBxByBD46JYmxRzeF7w2+wJEuw==} 1428 | dependencies: 1429 | '@babel/parser': 7.24.0 1430 | '@babel/types': 7.24.0 1431 | source-map-js: 1.0.2 1432 | dev: true 1433 | 1434 | /make-dir@4.0.0: 1435 | resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} 1436 | engines: {node: '>=10'} 1437 | dependencies: 1438 | semver: 7.6.0 1439 | dev: true 1440 | 1441 | /merge-stream@2.0.0: 1442 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 1443 | dev: true 1444 | 1445 | /merge2@1.4.1: 1446 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1447 | engines: {node: '>= 8'} 1448 | dev: true 1449 | 1450 | /micromatch@4.0.5: 1451 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1452 | engines: {node: '>=8.6'} 1453 | dependencies: 1454 | braces: 3.0.2 1455 | picomatch: 2.3.1 1456 | dev: true 1457 | 1458 | /mimic-fn@2.1.0: 1459 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 1460 | engines: {node: '>=6'} 1461 | dev: true 1462 | 1463 | /mimic-fn@4.0.0: 1464 | resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} 1465 | engines: {node: '>=12'} 1466 | dev: true 1467 | 1468 | /minimatch@3.1.2: 1469 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1470 | dependencies: 1471 | brace-expansion: 1.1.11 1472 | dev: true 1473 | 1474 | /minimatch@9.0.1: 1475 | resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} 1476 | engines: {node: '>=16 || 14 >=14.17'} 1477 | dependencies: 1478 | brace-expansion: 2.0.1 1479 | dev: false 1480 | 1481 | /minimatch@9.0.3: 1482 | resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} 1483 | engines: {node: '>=16 || 14 >=14.17'} 1484 | dependencies: 1485 | brace-expansion: 2.0.1 1486 | 1487 | /minipass@7.0.4: 1488 | resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} 1489 | engines: {node: '>=16 || 14 >=14.17'} 1490 | 1491 | /mlly@1.6.1: 1492 | resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} 1493 | dependencies: 1494 | acorn: 8.11.3 1495 | pathe: 1.1.2 1496 | pkg-types: 1.0.3 1497 | ufo: 1.4.0 1498 | dev: true 1499 | 1500 | /ms@2.1.2: 1501 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1502 | dev: true 1503 | 1504 | /mz@2.7.0: 1505 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 1506 | dependencies: 1507 | any-promise: 1.3.0 1508 | object-assign: 4.1.1 1509 | thenify-all: 1.6.0 1510 | dev: true 1511 | 1512 | /nanoid@3.3.7: 1513 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 1514 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1515 | hasBin: true 1516 | dev: true 1517 | 1518 | /nodemailer@6.9.3: 1519 | resolution: {integrity: sha512-fy9v3NgTzBngrMFkDsKEj0r02U7jm6XfC3b52eoNV+GCrGj+s8pt5OqhiJdWKuw51zCTdiNR/IUD1z33LIIGpg==} 1520 | engines: {node: '>=6.0.0'} 1521 | dev: false 1522 | 1523 | /nopt@7.2.0: 1524 | resolution: {integrity: sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==} 1525 | engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} 1526 | hasBin: true 1527 | dependencies: 1528 | abbrev: 2.0.0 1529 | dev: false 1530 | 1531 | /normalize-path@3.0.0: 1532 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1533 | engines: {node: '>=0.10.0'} 1534 | dev: true 1535 | 1536 | /npm-run-path@4.0.1: 1537 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 1538 | engines: {node: '>=8'} 1539 | dependencies: 1540 | path-key: 3.1.1 1541 | dev: true 1542 | 1543 | /npm-run-path@5.3.0: 1544 | resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} 1545 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1546 | dependencies: 1547 | path-key: 4.0.0 1548 | dev: true 1549 | 1550 | /object-assign@4.1.1: 1551 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1552 | engines: {node: '>=0.10.0'} 1553 | dev: true 1554 | 1555 | /once@1.4.0: 1556 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1557 | dependencies: 1558 | wrappy: 1.0.2 1559 | dev: true 1560 | 1561 | /onetime@5.1.2: 1562 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 1563 | engines: {node: '>=6'} 1564 | dependencies: 1565 | mimic-fn: 2.1.0 1566 | dev: true 1567 | 1568 | /onetime@6.0.0: 1569 | resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} 1570 | engines: {node: '>=12'} 1571 | dependencies: 1572 | mimic-fn: 4.0.0 1573 | dev: true 1574 | 1575 | /p-limit@5.0.0: 1576 | resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} 1577 | engines: {node: '>=18'} 1578 | dependencies: 1579 | yocto-queue: 1.0.0 1580 | dev: true 1581 | 1582 | /parseley@0.12.1: 1583 | resolution: {integrity: sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==} 1584 | dependencies: 1585 | leac: 0.6.0 1586 | peberminta: 0.9.0 1587 | dev: false 1588 | 1589 | /path-is-absolute@1.0.1: 1590 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1591 | engines: {node: '>=0.10.0'} 1592 | dev: true 1593 | 1594 | /path-key@3.1.1: 1595 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1596 | engines: {node: '>=8'} 1597 | 1598 | /path-key@4.0.0: 1599 | resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} 1600 | engines: {node: '>=12'} 1601 | dev: true 1602 | 1603 | /path-scurry@1.10.1: 1604 | resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} 1605 | engines: {node: '>=16 || 14 >=14.17'} 1606 | dependencies: 1607 | lru-cache: 10.2.0 1608 | minipass: 7.0.4 1609 | 1610 | /path-type@4.0.0: 1611 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 1612 | engines: {node: '>=8'} 1613 | dev: true 1614 | 1615 | /pathe@1.1.2: 1616 | resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} 1617 | dev: true 1618 | 1619 | /pathval@1.1.1: 1620 | resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} 1621 | dev: true 1622 | 1623 | /peberminta@0.9.0: 1624 | resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==} 1625 | dev: false 1626 | 1627 | /picocolors@1.0.0: 1628 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 1629 | dev: true 1630 | 1631 | /picomatch@2.3.1: 1632 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1633 | engines: {node: '>=8.6'} 1634 | dev: true 1635 | 1636 | /pirates@4.0.6: 1637 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 1638 | engines: {node: '>= 6'} 1639 | dev: true 1640 | 1641 | /pkg-types@1.0.3: 1642 | resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} 1643 | dependencies: 1644 | jsonc-parser: 3.2.1 1645 | mlly: 1.6.1 1646 | pathe: 1.1.2 1647 | dev: true 1648 | 1649 | /postcss-load-config@4.0.2: 1650 | resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} 1651 | engines: {node: '>= 14'} 1652 | peerDependencies: 1653 | postcss: '>=8.0.9' 1654 | ts-node: '>=9.0.0' 1655 | peerDependenciesMeta: 1656 | postcss: 1657 | optional: true 1658 | ts-node: 1659 | optional: true 1660 | dependencies: 1661 | lilconfig: 3.1.1 1662 | yaml: 2.4.0 1663 | dev: true 1664 | 1665 | /postcss@8.4.35: 1666 | resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} 1667 | engines: {node: ^10 || ^12 || >=14} 1668 | dependencies: 1669 | nanoid: 3.3.7 1670 | picocolors: 1.0.0 1671 | source-map-js: 1.0.2 1672 | dev: true 1673 | 1674 | /prettier@3.2.5: 1675 | resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} 1676 | engines: {node: '>=14'} 1677 | hasBin: true 1678 | dev: true 1679 | 1680 | /pretty-format@29.7.0: 1681 | resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} 1682 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1683 | dependencies: 1684 | '@jest/schemas': 29.6.3 1685 | ansi-styles: 5.2.0 1686 | react-is: 18.2.0 1687 | dev: true 1688 | 1689 | /proto-list@1.2.4: 1690 | resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} 1691 | dev: false 1692 | 1693 | /punycode@2.3.1: 1694 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1695 | engines: {node: '>=6'} 1696 | dev: true 1697 | 1698 | /queue-microtask@1.2.3: 1699 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1700 | dev: true 1701 | 1702 | /react-dom@18.2.0(react@18.2.0): 1703 | resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} 1704 | peerDependencies: 1705 | react: ^18.2.0 1706 | dependencies: 1707 | loose-envify: 1.4.0 1708 | react: 18.2.0 1709 | scheduler: 0.23.0 1710 | dev: false 1711 | 1712 | /react-is@18.2.0: 1713 | resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} 1714 | dev: true 1715 | 1716 | /react-promise-suspense@0.3.4: 1717 | resolution: {integrity: sha512-I42jl7L3Ze6kZaq+7zXWSunBa3b1on5yfvUW6Eo/3fFOj6dZ5Bqmcd264nJbTK/gn1HjjILAjSwnZbV4RpSaNQ==} 1718 | dependencies: 1719 | fast-deep-equal: 2.0.1 1720 | dev: false 1721 | 1722 | /react@18.2.0: 1723 | resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} 1724 | engines: {node: '>=0.10.0'} 1725 | dependencies: 1726 | loose-envify: 1.4.0 1727 | dev: false 1728 | 1729 | /readdirp@3.6.0: 1730 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1731 | engines: {node: '>=8.10.0'} 1732 | dependencies: 1733 | picomatch: 2.3.1 1734 | dev: true 1735 | 1736 | /resend@4.0.0(react-dom@18.2.0)(react@18.2.0): 1737 | resolution: {integrity: sha512-rDX0rspl/XcmC2JV2V5obQvRX2arzxXUvNFUDMOv5ObBLR68+7kigCOysb7+dlkb0JE3erhQG0nHrbBt/ZCWIg==} 1738 | engines: {node: '>=18'} 1739 | dependencies: 1740 | '@react-email/render': 0.0.17(react-dom@18.2.0)(react@18.2.0) 1741 | transitivePeerDependencies: 1742 | - react 1743 | - react-dom 1744 | dev: false 1745 | 1746 | /resolve-from@5.0.0: 1747 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 1748 | engines: {node: '>=8'} 1749 | dev: true 1750 | 1751 | /reusify@1.0.4: 1752 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1753 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1754 | dev: true 1755 | 1756 | /rollup@4.12.0: 1757 | resolution: {integrity: sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==} 1758 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1759 | hasBin: true 1760 | dependencies: 1761 | '@types/estree': 1.0.5 1762 | optionalDependencies: 1763 | '@rollup/rollup-android-arm-eabi': 4.12.0 1764 | '@rollup/rollup-android-arm64': 4.12.0 1765 | '@rollup/rollup-darwin-arm64': 4.12.0 1766 | '@rollup/rollup-darwin-x64': 4.12.0 1767 | '@rollup/rollup-linux-arm-gnueabihf': 4.12.0 1768 | '@rollup/rollup-linux-arm64-gnu': 4.12.0 1769 | '@rollup/rollup-linux-arm64-musl': 4.12.0 1770 | '@rollup/rollup-linux-riscv64-gnu': 4.12.0 1771 | '@rollup/rollup-linux-x64-gnu': 4.12.0 1772 | '@rollup/rollup-linux-x64-musl': 4.12.0 1773 | '@rollup/rollup-win32-arm64-msvc': 4.12.0 1774 | '@rollup/rollup-win32-ia32-msvc': 4.12.0 1775 | '@rollup/rollup-win32-x64-msvc': 4.12.0 1776 | fsevents: 2.3.3 1777 | dev: true 1778 | 1779 | /run-parallel@1.2.0: 1780 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1781 | dependencies: 1782 | queue-microtask: 1.2.3 1783 | dev: true 1784 | 1785 | /scheduler@0.23.0: 1786 | resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} 1787 | dependencies: 1788 | loose-envify: 1.4.0 1789 | dev: false 1790 | 1791 | /selderee@0.11.0: 1792 | resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==} 1793 | dependencies: 1794 | parseley: 0.12.1 1795 | dev: false 1796 | 1797 | /semver@7.6.0: 1798 | resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} 1799 | engines: {node: '>=10'} 1800 | hasBin: true 1801 | dependencies: 1802 | lru-cache: 6.0.0 1803 | 1804 | /shebang-command@2.0.0: 1805 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1806 | engines: {node: '>=8'} 1807 | dependencies: 1808 | shebang-regex: 3.0.0 1809 | 1810 | /shebang-regex@3.0.0: 1811 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1812 | engines: {node: '>=8'} 1813 | 1814 | /siginfo@2.0.0: 1815 | resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 1816 | dev: true 1817 | 1818 | /signal-exit@3.0.7: 1819 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 1820 | dev: true 1821 | 1822 | /signal-exit@4.1.0: 1823 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1824 | engines: {node: '>=14'} 1825 | 1826 | /slash@3.0.0: 1827 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1828 | engines: {node: '>=8'} 1829 | dev: true 1830 | 1831 | /source-map-js@1.0.2: 1832 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 1833 | engines: {node: '>=0.10.0'} 1834 | dev: true 1835 | 1836 | /source-map@0.5.7: 1837 | resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} 1838 | engines: {node: '>=0.10.0'} 1839 | dev: true 1840 | 1841 | /source-map@0.6.1: 1842 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1843 | engines: {node: '>=0.10.0'} 1844 | dev: true 1845 | 1846 | /source-map@0.8.0-beta.0: 1847 | resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} 1848 | engines: {node: '>= 8'} 1849 | dependencies: 1850 | whatwg-url: 7.1.0 1851 | dev: true 1852 | 1853 | /stackback@0.0.2: 1854 | resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 1855 | dev: true 1856 | 1857 | /std-env@3.7.0: 1858 | resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} 1859 | dev: true 1860 | 1861 | /string-width@4.2.3: 1862 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1863 | engines: {node: '>=8'} 1864 | dependencies: 1865 | emoji-regex: 8.0.0 1866 | is-fullwidth-code-point: 3.0.0 1867 | strip-ansi: 6.0.1 1868 | 1869 | /string-width@5.1.2: 1870 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1871 | engines: {node: '>=12'} 1872 | dependencies: 1873 | eastasianwidth: 0.2.0 1874 | emoji-regex: 9.2.2 1875 | strip-ansi: 7.1.0 1876 | 1877 | /strip-ansi@6.0.1: 1878 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1879 | engines: {node: '>=8'} 1880 | dependencies: 1881 | ansi-regex: 5.0.1 1882 | 1883 | /strip-ansi@7.1.0: 1884 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1885 | engines: {node: '>=12'} 1886 | dependencies: 1887 | ansi-regex: 6.0.1 1888 | 1889 | /strip-final-newline@2.0.0: 1890 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 1891 | engines: {node: '>=6'} 1892 | dev: true 1893 | 1894 | /strip-final-newline@3.0.0: 1895 | resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} 1896 | engines: {node: '>=12'} 1897 | dev: true 1898 | 1899 | /strip-literal@2.0.0: 1900 | resolution: {integrity: sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==} 1901 | dependencies: 1902 | js-tokens: 8.0.3 1903 | dev: true 1904 | 1905 | /sucrase@3.35.0: 1906 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 1907 | engines: {node: '>=16 || 14 >=14.17'} 1908 | hasBin: true 1909 | dependencies: 1910 | '@jridgewell/gen-mapping': 0.3.5 1911 | commander: 4.1.1 1912 | glob: 10.3.10 1913 | lines-and-columns: 1.2.4 1914 | mz: 2.7.0 1915 | pirates: 4.0.6 1916 | ts-interface-checker: 0.1.13 1917 | dev: true 1918 | 1919 | /supports-color@5.5.0: 1920 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1921 | engines: {node: '>=4'} 1922 | dependencies: 1923 | has-flag: 3.0.0 1924 | dev: true 1925 | 1926 | /supports-color@7.2.0: 1927 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1928 | engines: {node: '>=8'} 1929 | dependencies: 1930 | has-flag: 4.0.0 1931 | dev: true 1932 | 1933 | /test-exclude@6.0.0: 1934 | resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} 1935 | engines: {node: '>=8'} 1936 | dependencies: 1937 | '@istanbuljs/schema': 0.1.3 1938 | glob: 7.2.3 1939 | minimatch: 3.1.2 1940 | dev: true 1941 | 1942 | /thenify-all@1.6.0: 1943 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 1944 | engines: {node: '>=0.8'} 1945 | dependencies: 1946 | thenify: 3.3.1 1947 | dev: true 1948 | 1949 | /thenify@3.3.1: 1950 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 1951 | dependencies: 1952 | any-promise: 1.3.0 1953 | dev: true 1954 | 1955 | /tinybench@2.6.0: 1956 | resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} 1957 | dev: true 1958 | 1959 | /tinypool@0.8.2: 1960 | resolution: {integrity: sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==} 1961 | engines: {node: '>=14.0.0'} 1962 | dev: true 1963 | 1964 | /tinyspy@2.2.1: 1965 | resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} 1966 | engines: {node: '>=14.0.0'} 1967 | dev: true 1968 | 1969 | /to-fast-properties@2.0.0: 1970 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 1971 | engines: {node: '>=4'} 1972 | dev: true 1973 | 1974 | /to-regex-range@5.0.1: 1975 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1976 | engines: {node: '>=8.0'} 1977 | dependencies: 1978 | is-number: 7.0.0 1979 | dev: true 1980 | 1981 | /tr46@1.0.1: 1982 | resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} 1983 | dependencies: 1984 | punycode: 2.3.1 1985 | dev: true 1986 | 1987 | /tree-kill@1.2.2: 1988 | resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} 1989 | hasBin: true 1990 | dev: true 1991 | 1992 | /ts-interface-checker@0.1.13: 1993 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 1994 | dev: true 1995 | 1996 | /tsup@8.0.2(typescript@5.4.2): 1997 | resolution: {integrity: sha512-NY8xtQXdH7hDUAZwcQdY/Vzlw9johQsaqf7iwZ6g1DOUlFYQ5/AtVAjTvihhEyeRlGo4dLRVHtrRaL35M1daqQ==} 1998 | engines: {node: '>=18'} 1999 | hasBin: true 2000 | peerDependencies: 2001 | '@microsoft/api-extractor': ^7.36.0 2002 | '@swc/core': ^1 2003 | postcss: ^8.4.12 2004 | typescript: '>=4.5.0' 2005 | peerDependenciesMeta: 2006 | '@microsoft/api-extractor': 2007 | optional: true 2008 | '@swc/core': 2009 | optional: true 2010 | postcss: 2011 | optional: true 2012 | typescript: 2013 | optional: true 2014 | dependencies: 2015 | bundle-require: 4.0.2(esbuild@0.19.12) 2016 | cac: 6.7.14 2017 | chokidar: 3.6.0 2018 | debug: 4.3.4 2019 | esbuild: 0.19.12 2020 | execa: 5.1.1 2021 | globby: 11.1.0 2022 | joycon: 3.1.1 2023 | postcss-load-config: 4.0.2 2024 | resolve-from: 5.0.0 2025 | rollup: 4.12.0 2026 | source-map: 0.8.0-beta.0 2027 | sucrase: 3.35.0 2028 | tree-kill: 1.2.2 2029 | typescript: 5.4.2 2030 | transitivePeerDependencies: 2031 | - supports-color 2032 | - ts-node 2033 | dev: true 2034 | 2035 | /type-detect@4.0.8: 2036 | resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} 2037 | engines: {node: '>=4'} 2038 | dev: true 2039 | 2040 | /typescript@5.4.2: 2041 | resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} 2042 | engines: {node: '>=14.17'} 2043 | hasBin: true 2044 | dev: true 2045 | 2046 | /ufo@1.4.0: 2047 | resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==} 2048 | dev: true 2049 | 2050 | /undici-types@5.26.5: 2051 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 2052 | dev: true 2053 | 2054 | /v8-to-istanbul@9.2.0: 2055 | resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} 2056 | engines: {node: '>=10.12.0'} 2057 | dependencies: 2058 | '@jridgewell/trace-mapping': 0.3.25 2059 | '@types/istanbul-lib-coverage': 2.0.6 2060 | convert-source-map: 2.0.0 2061 | dev: true 2062 | 2063 | /vite-node@1.3.1(@types/node@20.11.25): 2064 | resolution: {integrity: sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng==} 2065 | engines: {node: ^18.0.0 || >=20.0.0} 2066 | hasBin: true 2067 | dependencies: 2068 | cac: 6.7.14 2069 | debug: 4.3.4 2070 | pathe: 1.1.2 2071 | picocolors: 1.0.0 2072 | vite: 5.1.4(@types/node@20.11.25) 2073 | transitivePeerDependencies: 2074 | - '@types/node' 2075 | - less 2076 | - lightningcss 2077 | - sass 2078 | - stylus 2079 | - sugarss 2080 | - supports-color 2081 | - terser 2082 | dev: true 2083 | 2084 | /vite@5.1.4(@types/node@20.11.25): 2085 | resolution: {integrity: sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==} 2086 | engines: {node: ^18.0.0 || >=20.0.0} 2087 | hasBin: true 2088 | peerDependencies: 2089 | '@types/node': ^18.0.0 || >=20.0.0 2090 | less: '*' 2091 | lightningcss: ^1.21.0 2092 | sass: '*' 2093 | stylus: '*' 2094 | sugarss: '*' 2095 | terser: ^5.4.0 2096 | peerDependenciesMeta: 2097 | '@types/node': 2098 | optional: true 2099 | less: 2100 | optional: true 2101 | lightningcss: 2102 | optional: true 2103 | sass: 2104 | optional: true 2105 | stylus: 2106 | optional: true 2107 | sugarss: 2108 | optional: true 2109 | terser: 2110 | optional: true 2111 | dependencies: 2112 | '@types/node': 20.11.25 2113 | esbuild: 0.19.12 2114 | postcss: 8.4.35 2115 | rollup: 4.12.0 2116 | optionalDependencies: 2117 | fsevents: 2.3.3 2118 | dev: true 2119 | 2120 | /vitest@1.3.1(@types/node@20.11.25): 2121 | resolution: {integrity: sha512-/1QJqXs8YbCrfv/GPQ05wAZf2eakUPLPa18vkJAKE7RXOKfVHqMZZ1WlTjiwl6Gcn65M5vpNUB6EFLnEdRdEXQ==} 2122 | engines: {node: ^18.0.0 || >=20.0.0} 2123 | hasBin: true 2124 | peerDependencies: 2125 | '@edge-runtime/vm': '*' 2126 | '@types/node': ^18.0.0 || >=20.0.0 2127 | '@vitest/browser': 1.3.1 2128 | '@vitest/ui': 1.3.1 2129 | happy-dom: '*' 2130 | jsdom: '*' 2131 | peerDependenciesMeta: 2132 | '@edge-runtime/vm': 2133 | optional: true 2134 | '@types/node': 2135 | optional: true 2136 | '@vitest/browser': 2137 | optional: true 2138 | '@vitest/ui': 2139 | optional: true 2140 | happy-dom: 2141 | optional: true 2142 | jsdom: 2143 | optional: true 2144 | dependencies: 2145 | '@types/node': 20.11.25 2146 | '@vitest/expect': 1.3.1 2147 | '@vitest/runner': 1.3.1 2148 | '@vitest/snapshot': 1.3.1 2149 | '@vitest/spy': 1.3.1 2150 | '@vitest/utils': 1.3.1 2151 | acorn-walk: 8.3.2 2152 | chai: 4.4.1 2153 | debug: 4.3.4 2154 | execa: 8.0.1 2155 | local-pkg: 0.5.0 2156 | magic-string: 0.30.8 2157 | pathe: 1.1.2 2158 | picocolors: 1.0.0 2159 | std-env: 3.7.0 2160 | strip-literal: 2.0.0 2161 | tinybench: 2.6.0 2162 | tinypool: 0.8.2 2163 | vite: 5.1.4(@types/node@20.11.25) 2164 | vite-node: 1.3.1(@types/node@20.11.25) 2165 | why-is-node-running: 2.2.2 2166 | transitivePeerDependencies: 2167 | - less 2168 | - lightningcss 2169 | - sass 2170 | - stylus 2171 | - sugarss 2172 | - supports-color 2173 | - terser 2174 | dev: true 2175 | 2176 | /webidl-conversions@4.0.2: 2177 | resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} 2178 | dev: true 2179 | 2180 | /whatwg-url@7.1.0: 2181 | resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} 2182 | dependencies: 2183 | lodash.sortby: 4.7.0 2184 | tr46: 1.0.1 2185 | webidl-conversions: 4.0.2 2186 | dev: true 2187 | 2188 | /which@2.0.2: 2189 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 2190 | engines: {node: '>= 8'} 2191 | hasBin: true 2192 | dependencies: 2193 | isexe: 2.0.0 2194 | 2195 | /why-is-node-running@2.2.2: 2196 | resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} 2197 | engines: {node: '>=8'} 2198 | hasBin: true 2199 | dependencies: 2200 | siginfo: 2.0.0 2201 | stackback: 0.0.2 2202 | dev: true 2203 | 2204 | /wrap-ansi@7.0.0: 2205 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 2206 | engines: {node: '>=10'} 2207 | dependencies: 2208 | ansi-styles: 4.3.0 2209 | string-width: 4.2.3 2210 | strip-ansi: 6.0.1 2211 | 2212 | /wrap-ansi@8.1.0: 2213 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 2214 | engines: {node: '>=12'} 2215 | dependencies: 2216 | ansi-styles: 6.2.1 2217 | string-width: 5.1.2 2218 | strip-ansi: 7.1.0 2219 | 2220 | /wrappy@1.0.2: 2221 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 2222 | dev: true 2223 | 2224 | /yallist@4.0.0: 2225 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 2226 | 2227 | /yaml@2.4.0: 2228 | resolution: {integrity: sha512-j9iR8g+/t0lArF4V6NE/QCfT+CO7iLqrXAHZbJdo+LfjqP1vR8Fg5bSiaq6Q2lOD1AUEVrEVIgABvBFYojJVYQ==} 2229 | engines: {node: '>= 14'} 2230 | hasBin: true 2231 | dev: true 2232 | 2233 | /yocto-queue@1.0.0: 2234 | resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} 2235 | engines: {node: '>=12.20'} 2236 | dev: true 2237 | -------------------------------------------------------------------------------- /prettier.config.cjs: -------------------------------------------------------------------------------- 1 | /** @type {import('prettier').Config} */ 2 | module.exports = { 3 | arrowParens: 'always', 4 | printWidth: 100, 5 | semi: true, 6 | singleQuote: true, 7 | tabWidth: 2, 8 | trailingComma: 'all', 9 | 10 | importOrder: ['', '^[./]'], 11 | 12 | importOrderSeparation: true, 13 | importOrderSortSpecifiers: true, 14 | 15 | plugins: ['@trivago/prettier-plugin-sort-imports'], 16 | }; 17 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { ResendTransport } from './transport'; 2 | import { ResendResponseError, ResendTransportOptions } from './types/transport'; 3 | 4 | export type { ResendResponseError, ResendTransportOptions }; 5 | export { ResendTransport }; 6 | -------------------------------------------------------------------------------- /src/transport.spec.ts: -------------------------------------------------------------------------------- 1 | import { Stream } from 'node:stream'; 2 | import { describe, expect, it } from 'vitest'; 3 | 4 | import { ResendTransport } from './transport'; 5 | 6 | describe('ResendTransport', () => { 7 | describe('toResendAddresses', () => { 8 | it('should convert undefined to an array', () => { 9 | const transport = new ResendTransport({ apiKey: 'test-api-key' }); 10 | 11 | const addresses = undefined; 12 | 13 | const result = transport.toResendAddresses(addresses); 14 | 15 | expect(result).toEqual([]); 16 | }); 17 | 18 | it('should convert a string to an array', () => { 19 | const transport = new ResendTransport({ apiKey: 'test-api-key' }); 20 | 21 | const addresses = 'test@example.com'; 22 | 23 | const result = transport.toResendAddresses(addresses); 24 | 25 | expect(result).toEqual([addresses]); 26 | }); 27 | 28 | it('should convert a address to an array', () => { 29 | const transport = new ResendTransport({ apiKey: 'test-api-key' }); 30 | 31 | const addresses = { name: 'test', address: 'test@example.com' }; 32 | 33 | const result = transport.toResendAddresses(addresses); 34 | 35 | expect(result).toEqual([addresses.address]); 36 | }); 37 | 38 | it('should return an array as is', () => { 39 | const transport = new ResendTransport({ apiKey: 'test-api-key' }); 40 | 41 | const addresses = ['test@example.com', 'test2@example.com']; 42 | 43 | const result = transport.toResendAddresses(addresses); 44 | 45 | expect(result).toEqual(addresses); 46 | }); 47 | 48 | it('should extract addresses from an array of objects', () => { 49 | const transport = new ResendTransport({ apiKey: 'test-api-key' }); 50 | 51 | const addresses = [ 52 | { name: 'test', address: 'test@example.com' }, 53 | { name: 'test2', address: 'test2@example.com' }, 54 | ]; 55 | 56 | const result = transport.toResendAddresses(addresses); 57 | 58 | expect(result).toEqual(['test@example.com', 'test2@example.com']); 59 | }); 60 | }); 61 | 62 | describe('toResendFromAddress', () => { 63 | it('should return an empty string if no address is provided', () => { 64 | const transport = new ResendTransport({ apiKey: 'test-api-key' }); 65 | 66 | const address = undefined; 67 | 68 | const result = transport.toResendFromAddress(address); 69 | 70 | expect(result).toEqual(''); 71 | }); 72 | 73 | it('should return a string as is', () => { 74 | const transport = new ResendTransport({ apiKey: 'test-api-key' }); 75 | 76 | const address = 'test@example.com'; 77 | 78 | const result = transport.toResendFromAddress(address); 79 | 80 | expect(result).toEqual(address); 81 | }); 82 | 83 | it('should format an object as "name
"', () => { 84 | const transport = new ResendTransport({ apiKey: 'test-api-key' }); 85 | 86 | const address = { name: 'Test User', address: 'test@example.com' }; 87 | 88 | const result = transport.toResendFromAddress(address); 89 | 90 | expect(result).toEqual('Test User '); 91 | }); 92 | 93 | describe('toResendAttachments', () => { 94 | it('should return an empty array if no attachments are provided', () => { 95 | const transport = new ResendTransport({ apiKey: 'test-api-key' }); 96 | 97 | const attachments = undefined; 98 | 99 | const result = transport.toResendAttachments(attachments); 100 | 101 | expect(result).toEqual([]); 102 | }); 103 | 104 | it('should format an array of string attachments', () => { 105 | const transport = new ResendTransport({ apiKey: 'test-api-key' }); 106 | 107 | const attachments = [ 108 | { 109 | filename: 'test.txt', 110 | content: 'Test content', 111 | }, 112 | { 113 | filename: 'test2.txt', 114 | content: 'Test content 2', 115 | }, 116 | ]; 117 | 118 | const result = transport.toResendAttachments(attachments); 119 | 120 | expect(result).toEqual([ 121 | { 122 | filename: 'test.txt', 123 | content: Buffer.from('Test content'), 124 | }, 125 | { 126 | filename: 'test2.txt', 127 | content: Buffer.from('Test content 2'), 128 | }, 129 | ]); 130 | }); 131 | 132 | it('should format an array of buffer attachments', () => { 133 | const transport = new ResendTransport({ apiKey: 'test-api-key' }); 134 | 135 | const attachments = [ 136 | { 137 | filename: 'test.txt', 138 | content: Buffer.from('Test content'), 139 | }, 140 | { 141 | filename: 'test2.txt', 142 | content: Buffer.from('Test content 2'), 143 | }, 144 | ]; 145 | 146 | const result = transport.toResendAttachments(attachments); 147 | 148 | expect(result).toEqual([ 149 | { 150 | filename: 'test.txt', 151 | content: Buffer.from('Test content'), 152 | }, 153 | { 154 | filename: 'test2.txt', 155 | content: Buffer.from('Test content 2'), 156 | }, 157 | ]); 158 | }); 159 | 160 | it('should throw an error if an attachment is missing a filename', () => { 161 | const transport = new ResendTransport({ apiKey: 'test-api-key' }); 162 | 163 | const attachments = [ 164 | { 165 | content: Buffer.from('Test content'), 166 | }, 167 | ]; 168 | 169 | expect(() => transport.toResendAttachments(attachments)).toThrowError( 170 | 'Attachment is missing filename or content', 171 | ); 172 | }); 173 | 174 | it('should throw an error if an attachment is missing contents', () => { 175 | const transport = new ResendTransport({ apiKey: 'test-api-key' }); 176 | 177 | const attachments = [ 178 | { 179 | filename: 'test1.txt', 180 | }, 181 | ]; 182 | 183 | expect(() => transport.toResendAttachments(attachments)).toThrowError( 184 | 'Attachment is missing filename or content', 185 | ); 186 | }); 187 | 188 | it('should throw an error if an attachment uses a stream for contents', () => { 189 | const transport = new ResendTransport({ apiKey: 'test-api-key' }); 190 | 191 | const attachments = [ 192 | { 193 | filename: 'test1.txt', 194 | content: Stream.Readable.from('Test content'), 195 | }, 196 | ]; 197 | 198 | expect(() => transport.toResendAttachments(attachments)).toThrowError( 199 | 'Attachment content must be a string or a buffer', 200 | ); 201 | }); 202 | }); 203 | }); 204 | }); 205 | -------------------------------------------------------------------------------- /src/transport.ts: -------------------------------------------------------------------------------- 1 | // https://github.com/documenso/documenso/blob/9bdff9a61fee6e84e76fdc1bc2fb92529f6a3b79/packages/email/transports/resend.ts 2 | import { type SentMessageInfo, type Transport } from 'nodemailer'; 3 | import type Mail from 'nodemailer/lib/mailer'; 4 | import type MailMessage from 'nodemailer/lib/mailer/mail-message'; 5 | import { Resend } from 'resend'; 6 | 7 | import { version as VERSION } from '../package.json'; 8 | import { ResendTransportOptions } from './types/transport'; 9 | 10 | export const RESEND_ERROR_CODES_BY_KEY = { 11 | missing_required_field: 422, 12 | invalid_access: 422, 13 | invalid_parameter: 422, 14 | invalid_region: 422, 15 | rate_limit_exceeded: 429, 16 | missing_api_key: 401, 17 | invalid_api_Key: 403, 18 | invalid_from_address: 403, 19 | validation_error: 403, 20 | not_found: 404, 21 | method_not_allowed: 405, 22 | application_error: 500, 23 | internal_server_error: 500, 24 | } as const; 25 | 26 | /** 27 | * Transport for sending email via the Resend SDK. 28 | */ 29 | export class ResendTransport implements Transport { 30 | public name = 'ResendMailTransport'; 31 | public version = VERSION; 32 | 33 | private _client: Resend; 34 | 35 | public static makeTransport(options: Partial) { 36 | return new ResendTransport(options); 37 | } 38 | 39 | constructor(options: Partial) { 40 | const { apiKey = '' } = options; 41 | 42 | this._client = new Resend(apiKey); 43 | } 44 | 45 | public send(mail: MailMessage, callback: (_err: Error | null, _info: SentMessageInfo) => void) { 46 | if (!mail.data.to || !mail.data.from) { 47 | return callback(new Error('Missing required fields "to" or "from"'), null); 48 | } 49 | 50 | this._client.emails 51 | .send({ 52 | subject: mail.data.subject ?? '', 53 | from: this.toResendFromAddress(mail.data.from), 54 | to: this.toResendAddresses(mail.data.to), 55 | cc: this.toResendAddresses(mail.data.cc), 56 | bcc: this.toResendAddresses(mail.data.bcc), 57 | html: mail.data.html?.toString() || '', 58 | text: mail.data.text?.toString() || '', 59 | attachments: this.toResendAttachments(mail.data.attachments), 60 | }) 61 | .then((response) => { 62 | if (response.error) { 63 | const statusCode = RESEND_ERROR_CODES_BY_KEY[response.error.name] ?? 500; 64 | 65 | throw new Error(`[${statusCode}]: ${response.error.name} ${response.error.message}`); 66 | } 67 | 68 | callback(null, response.data); 69 | }) 70 | .catch((error) => { 71 | callback(error, null); 72 | }); 73 | } 74 | 75 | public toResendAddresses(addresses: Mail.Options['to']) { 76 | if (!addresses) { 77 | return []; 78 | } 79 | 80 | if (typeof addresses === 'string') { 81 | return [addresses]; 82 | } 83 | 84 | if (Array.isArray(addresses)) { 85 | return addresses.map((address) => { 86 | if (typeof address === 'string') { 87 | return address; 88 | } 89 | 90 | return address.address; 91 | }); 92 | } 93 | 94 | return [addresses.address]; 95 | } 96 | 97 | public toResendFromAddress(address: Mail.Options['from']) { 98 | if (!address) { 99 | return ''; 100 | } 101 | 102 | if (typeof address === 'string') { 103 | return address; 104 | } 105 | 106 | return `${address.name} <${address.address}>`; 107 | } 108 | 109 | public toResendAttachments(attachments: Mail.Options['attachments']) { 110 | if (!attachments) { 111 | return []; 112 | } 113 | 114 | return attachments.map((attachment) => { 115 | if (!attachment.filename || !attachment.content) { 116 | throw new Error('Attachment is missing filename or content'); 117 | } 118 | 119 | if (typeof attachment.content === 'string') { 120 | return { 121 | filename: attachment.filename, 122 | content: Buffer.from(attachment.content), 123 | }; 124 | } 125 | 126 | if (attachment.content instanceof Buffer) { 127 | return { 128 | filename: attachment.filename, 129 | content: attachment.content, 130 | }; 131 | } 132 | 133 | throw new Error('Attachment content must be a string or a buffer'); 134 | }); 135 | } 136 | } 137 | -------------------------------------------------------------------------------- /src/types/transport.ts: -------------------------------------------------------------------------------- 1 | export type ResendTransportOptions = { 2 | apiKey: string; 3 | }; 4 | 5 | export type ResendResponseError = { 6 | statusCode: number; 7 | name: string; 8 | message: string; 9 | }; 10 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "display": "Default", 4 | "compilerOptions": { 5 | "alwaysStrict": true, 6 | "composite": false, 7 | "declaration": true, 8 | "declarationMap": true, 9 | "esModuleInterop": true, 10 | "forceConsistentCasingInFileNames": true, 11 | "inlineSources": false, 12 | "isolatedModules": true, 13 | "moduleResolution": "node", 14 | "noUnusedLocals": false, 15 | "noUnusedParameters": false, 16 | "preserveWatchOutput": true, 17 | "resolveJsonModule": true, 18 | "skipLibCheck": true, 19 | "strict": true, 20 | "target": "ES2018" 21 | }, 22 | "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/.d.ts"], 23 | "exclude": ["node_modules"] 24 | } 25 | -------------------------------------------------------------------------------- /tsup.config.mjs: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'tsup'; 2 | 3 | export default defineConfig({ 4 | dts: true, 5 | treeshake: true, 6 | sourceMap: true, 7 | minify: false, 8 | format: ['esm', 'cjs'], 9 | entry: ['src/main.ts'], 10 | }); 11 | -------------------------------------------------------------------------------- /vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vitest/config'; 2 | 3 | export default defineConfig({ 4 | test: { 5 | testTimeout: 10_000, 6 | }, 7 | }); 8 | --------------------------------------------------------------------------------