├── .github └── workflows │ └── ci.yml ├── .gitignore ├── .mocharc.yml ├── LICENSE ├── README.md ├── package.json ├── pnpm-lock.yaml ├── src ├── index.spec.ts ├── index.ts ├── request │ ├── feature │ │ ├── data.ts │ │ ├── form.ts │ │ ├── headers.ts │ │ ├── index.ts │ │ ├── method.ts │ │ └── signal.ts │ └── index.ts └── v1 │ ├── audio.ts │ ├── chat.ts │ ├── completions.ts │ ├── edits.ts │ ├── embeddings.ts │ ├── files.ts │ ├── fine-tunes.ts │ ├── images.ts │ ├── index.ts │ ├── models.ts │ └── moderations.ts ├── tsconfig.base.json ├── tsconfig.json └── tsconfig.mjs.json /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: Build and Deploy 2 | 3 | on: 4 | create: 5 | push: 6 | branches: 7 | - master 8 | - main 9 | - develop 10 | - dev 11 | - feature/* 12 | - feat/* 13 | - release/* 14 | - hotfix/* 15 | paths: 16 | - '**.js' 17 | - '**.jsx' 18 | - '**.ts' 19 | - '**.tsx' 20 | - '**.json' 21 | release: 22 | types: [published] 23 | 24 | jobs: 25 | setup: 26 | if: github.run_number == 1 && github.event_name == 'create' 27 | runs-on: ubuntu-latest 28 | steps: 29 | - uses: actions/checkout@v3 30 | 31 | - name: Initialize 32 | run: | 33 | tmp=$(mktemp) 34 | jq --arg author "${{ github.repository_owner }}" '.author = $author' package.json > $tmp 35 | jq --arg url "git+${{ github.event.repository.clone_url }}" '.repository.url = $url' $tmp > package.json 36 | jq --arg name "${{ github.event.repository.name }}" '.name = $name' package.json > $tmp 37 | jq --arg description "${{ github.event.description }}" '.description = $description' $tmp > package.json 38 | jq --arg homepage "${{ github.event.repository.html_url }}#readme" '.homepage = $homepage' package.json > $tmp 39 | jq --arg bugs "${{ github.event.repository.html_url }}/issues" '.bugs.url = $bugs' $tmp > package.json 40 | echo "# ${{ github.event.repository.name }}" > README.md 41 | rm -rf LICENSE 42 | 43 | - uses: stefanzweifel/git-auto-commit-action@v4 44 | with: 45 | commit_message: "Setup project for ${{ github.event.repository.name }} [skip ci]" 46 | 47 | ci: 48 | if: github.run_number != 1 && github.event_name != 'create' && !contains(github.event.head_commit.message, '[skip ci]') 49 | runs-on: ubuntu-latest 50 | steps: 51 | - uses: actions/checkout@v3 52 | 53 | # extract `engines.node` from package.json and save it to output 54 | - name: Get Node.JS version from package.json 55 | id: get-versions 56 | run: | 57 | echo node=$(jq -r '.engines.node // "lts/*"' ./package.json) >> $GITHUB_OUTPUT 58 | if [ -f "yarn.lock" ]; then 59 | echo pkg=yarn >> $GITHUB_OUTPUT 60 | elif [ -f "pnpm-lock.yaml" ]; then 61 | echo pkg=pnpm >> $GITHUB_OUTPUT 62 | else 63 | echo pkg=npm >> $GITHUB_OUTPUT 64 | fi 65 | 66 | - name: Setup Node.JS 67 | uses: actions/setup-node@v3 68 | with: 69 | node-version: ${{steps.get-versions.outputs.node}} 70 | 71 | - name: Setup pnpm 72 | if: steps.get-versions.outputs.pkg == 'pnpm' 73 | uses: pnpm/action-setup@v2 74 | with: 75 | version: latest 76 | 77 | - name: Install dependencies 78 | run: ${{steps.get-versions.outputs.pkg}} install 79 | 80 | - name: Test 81 | run: ${{steps.get-versions.outputs.pkg}} run test 82 | 83 | - name: Build 84 | id: build 85 | env: 86 | NPM_TOKEN: ${{ secrets.NPM_TOKEN }} 87 | if: github.event_name == 'release' && env.NPM_TOKEN != null 88 | run: | 89 | ${{steps.get-versions.outputs.pkg}} run build 90 | tmp=$(mktemp) 91 | jq --arg version "${{ github.event.release.tag_name }}" '.version = $version' package.json > $tmp 92 | mv $tmp package.json 93 | echo version=$(jq -r '.version' package.json) >> $GITHUB_OUTPUT 94 | 95 | - name: Publish 96 | uses: JS-DevTools/npm-publish@v1 97 | if: steps.build.outputs.version != null 98 | with: 99 | token: ${{ secrets.NPM_TOKEN }} 100 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # TypeScript v1 declaration files 45 | typings/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | 78 | # Next.js build output 79 | .next 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | dist 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # Serverless directories 95 | .serverless/ 96 | 97 | # FuseBox cache 98 | .fusebox/ 99 | 100 | # DynamoDB Local files 101 | .dynamodb/ 102 | 103 | # TernJS port file 104 | .tern-port 105 | 106 | # Build files 107 | lib/ -------------------------------------------------------------------------------- /.mocharc.yml: -------------------------------------------------------------------------------- 1 | extension: ['ts', 'tsx'] # add tsx if you use react 2 | spec: 'src/**/*.spec.ts' 3 | require: 'ts-node/register' -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 joyqi 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 | # node-openai 2 | 3 | **An elegant Node.js library written in TypeScript for the OpenAI API. Pure JavaScript, no dependencies. Works in Node.js and the browser.** 4 | 5 | [![npm](https://img.shields.io/npm/v/node-openai.svg)](https://www.npmjs.com/package/node-openai) 6 | [![npm](https://img.shields.io/npm/dt/node-openai.svg)](https://www.npmjs.com/package/node-openai) 7 | [![GitHub](https://img.shields.io/github/license/joyqi/node-openai.svg)](https://github.com/joyqi/node-openai/blob/master/LICENSE) 8 | ![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/joyqi/node-openai/ci.yml) 9 | ![Libraries.io dependency status for GitHub repo](https://img.shields.io/librariesio/github/joyqi/node-openai) 10 | 11 | - [Installation](#installation) 12 | - [Features](#features) 13 | - [Example](#example) 14 | - [V1 API](#v1-api) 15 | - [Models](#models) 16 | - [Completions](#completions) 17 | - [Chat](#chat) 18 | - [Edits](#edits) 19 | - [Images](#images) 20 | - [Embeddings](#embeddings) 21 | - [Audio](#audio) 22 | - [Files](#files) 23 | - [Fine-tunes](#fine-tunes) 24 | - [Moderations](#moderations) 25 | 26 | ## Installation 27 | 28 | ```bash 29 | npm install node-openai 30 | ``` 31 | 32 | ### Features 33 | 34 | | API | Supported | 35 | | --- | --- | 36 | | [Models](https://platform.openai.com/docs/api-reference/models) | ✅ | 37 | | [Completions](https://platform.openai.com/docs/api-reference/completions) | ✅ | 38 | | [Chat](https://platform.openai.com/docs/api-reference/chat) | ✅ | 39 | | [Edits](https://platform.openai.com/docs/api-reference/edits) | ✅ | 40 | | [Images](https://platform.openai.com/docs/api-reference/images) | ✅ | 41 | | [Embeddings](https://platform.openai.com/docs/api-reference/embeddings) | ✅ | 42 | | [Audio](https://platform.openai.com/docs/api-reference/audio) | ✅ | 43 | | [Files](https://platform.openai.com/docs/api-reference/files) | ✅ | 44 | | [Fine-tunes](https://platform.openai.com/docs/api-reference/fine-tunes) | ✅ | 45 | | [Moderations](https://platform.openai.com/docs/api-reference/moderations) | ✅ | 46 | 47 | ## Example 48 | 49 | For Node.js (CommonJS): 50 | 51 | ```javascript 52 | const { OpenAI } = require('node-openai'); 53 | ``` 54 | 55 | For ES Modules: 56 | 57 | ```javascript 58 | import { OpenAI } from 'node-openai'; 59 | ``` 60 | 61 | For TypeScript: 62 | 63 | ```typescript 64 | import { OpenAI } from 'node-openai'; 65 | ``` 66 | 67 | Create an instance of the OpenAI class: 68 | 69 | ```javascript 70 | const openai = new OpenAI({ 71 | apiKey: 'YOUR_API_KEY', 72 | // organization: 'YOUR_ORGANIZATION_ID', 73 | // endpoint: 'https://api.openai.com', 74 | }); 75 | ``` 76 | 77 | ## V1 API 78 | 79 | To use the OpenAI V1 API, you must call the `v1()` method on the client instance: 80 | 81 | ```javascript 82 | const api = openai.v1(); 83 | ``` 84 | 85 | Check out the [OpenAI V1 API docs](https://platform.openai.com/docs/api-reference/introduction) for more information. 86 | 87 | ### Models 88 | 89 | List all available models: 90 | 91 | ```javascript 92 | const models = await api.models.list(); 93 | ``` 94 | 95 | Retrieve a model: 96 | 97 | ```javascript 98 | const model = await api.models.retrieve('davinci'); 99 | ``` 100 | 101 | Delete fine-tuned model: 102 | 103 | ```javascript 104 | const model = await api.models.delete('curie:ft-acmeco-2021-03-03-21-44-20'); 105 | ``` 106 | 107 | ### Completions 108 | 109 | Create a completion: 110 | 111 | ```javascript 112 | const completion = await api.completions.create({ 113 | model: 'davinci', 114 | prompt: 'This is a test', 115 | max_tokens: 5, 116 | temperature: 0.9, 117 | stream: false, 118 | }); 119 | ``` 120 | 121 | If the `stream` option is set to `true`, the completion will be streamed: 122 | 123 | ```javascript 124 | const stream = await api.completions.create({ 125 | model: 'davinci', 126 | prompt: 'This is a test', 127 | max_tokens: 5, 128 | temperature: 0.9, 129 | stream: true, 130 | }); 131 | 132 | const reader = stream.pipeThrough(new TextDecoderStream()).getReader(); 133 | // Read the stream 134 | ``` 135 | 136 | ### Chat 137 | 138 | Create a chat: 139 | 140 | ```javascript 141 | const chat = await api.chat.create({ 142 | model: 'gpt-3.5-turbo', 143 | messages: [ 144 | { 145 | role: 'user', 146 | content: 'Hello, how are you?' 147 | } 148 | ] 149 | }); 150 | ``` 151 | 152 | ### Edits 153 | 154 | Create an edit: 155 | 156 | ```javascript 157 | const edit = await api.edits.create({ 158 | model: 'text-davinci-edit-001', 159 | input: 'I am a test', 160 | instruction: 'Make this text funny', 161 | }); 162 | ``` 163 | 164 | ### Images 165 | 166 | Create an image: 167 | 168 | ```javascript 169 | const image = await api.images.create({ 170 | prompt: 'A cute baby sea otter', 171 | n: 1, 172 | size: '512x512', 173 | }); 174 | ``` 175 | 176 | Create image edit: 177 | 178 | ```javascript 179 | const imageEdit = await api.images.edit({ 180 | prompt: 'Make this image funny', 181 | n: 1, 182 | size: '512x512', 183 | }, '/path/to/image.png'); 184 | ``` 185 | 186 | Create image variation: 187 | 188 | ```javascript 189 | const imageVariation = await api.images.variation({ 190 | n: 1, 191 | size: '512x512', 192 | }, '/path/to/image.png'); 193 | ``` 194 | 195 | ### Embeddings 196 | 197 | Create an embedding: 198 | 199 | ```javascript 200 | const embedding = await api.embeddings.create({ 201 | model: 'text-embedding-ada-002', 202 | input: 'This is a test', 203 | }); 204 | ``` 205 | 206 | ### Audio 207 | 208 | Create transcription: 209 | 210 | ```javascript 211 | const transcription = await api.audio.createTranscription({ 212 | model: 'whisper-1', 213 | prompt: 'This is a test', 214 | }, '/path/to/audio.mp3'); 215 | ``` 216 | 217 | Create translation: 218 | 219 | ```javascript 220 | const translation = await api.audio.createTranslation({ 221 | model: 'whisper-1', 222 | prompt: 'This is a test', 223 | }, '/path/to/audio.mp3'); 224 | ``` 225 | 226 | ### Files 227 | 228 | List all available files: 229 | 230 | ```javascript 231 | const files = await api.files.list(); 232 | ``` 233 | 234 | Retrieve a file: 235 | 236 | ```javascript 237 | const file = await api.files.retrieve('file-123'); 238 | ``` 239 | 240 | Upload a file: 241 | 242 | ```javascript 243 | const file = await api.files.upload('/path/to/file.txt', 'fine-tune'); 244 | ``` 245 | 246 | Delete a file: 247 | 248 | ```javascript 249 | const file = await api.files.delete('file-123'); 250 | ``` 251 | 252 | Retrieve a file's contents: 253 | 254 | ```javascript 255 | const content = await api.files.retrieveContents('file-123'); 256 | ``` 257 | 258 | ### Fine-tunes 259 | 260 | Create fine-tune: 261 | 262 | ```javascript 263 | const fineTune = await api.fineTunes.create({ 264 | training_file: 'file-123', 265 | }); 266 | ``` 267 | 268 | List fine-tunes: 269 | 270 | ```javascript 271 | const fineTunes = await api.fineTunes.list(); 272 | ``` 273 | 274 | Retrieve fine-tune: 275 | 276 | ```javascript 277 | const fineTune = await api.fineTunes.retrieve('ft-AF1WoRqd3aJAHsqc9NY7iL8F'); 278 | ``` 279 | 280 | Cancel fine-tune: 281 | 282 | ```javascript 283 | const fineTune = await api.fineTunes.cancel('ft-AF1WoRqd3aJAHsqc9NY7iL8F'); 284 | ``` 285 | 286 | List fine-tune's events: 287 | 288 | ```javascript 289 | const events = await api.fineTunes.listEvents('ft-AF1WoRqd3aJAHsqc9NY7iL8F'); 290 | ``` 291 | 292 | ### Moderations 293 | 294 | Create moderation: 295 | 296 | ```javascript 297 | const moderation = await api.moderations.create({ 298 | model: 'text-moderation-stable', 299 | input: 'This is a test', 300 | }); 301 | ``` -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "node-openai", 3 | "keywords": [ 4 | "openai", 5 | "chatgpt", 6 | "api", 7 | "sdk" 8 | ], 9 | "author": "joyqi", 10 | "license": "", 11 | "description": "An elegant NodeJs library for openai api.", 12 | "repository": { 13 | "type": "git", 14 | "url": "git+https://github.com/joyqi/node-openai.git" 15 | }, 16 | "homepage": "https://github.com/joyqi/node-openai#readme", 17 | "bugs": { 18 | "url": "https://github.com/joyqi/node-openai/issues" 19 | }, 20 | "version": "latest", 21 | "exports": { 22 | ".": { 23 | "types": "./lib/types/index.d.ts", 24 | "import": "./lib/mjs/index.js", 25 | "require": "./lib/cjs/index.js" 26 | }, 27 | "./package.json": "./package.json" 28 | }, 29 | "main": "lib/cjs/index.js", 30 | "module": "lib/mjs/index.js", 31 | "types": "lib/types/index.d.ts", 32 | "scripts": { 33 | "clear": "rm -rf ./lib", 34 | "patch:esm-js": "npx tsc-esm-fix --tsconfig=tsconfig.mjs.json", 35 | "patch:esm-type": "echo '{ \"type\": \"module\" }' >> lib/mjs/package.json", 36 | "build:esm": "npx tsc -p tsconfig.mjs.json && npm run patch:esm-js && npm run patch:esm-type", 37 | "build:cjs": "npx tsc", 38 | "build": "npm run clear && npm run build:esm && npm run build:cjs", 39 | "test": "npx mocha" 40 | }, 41 | "devDependencies": { 42 | "@types/mocha": "latest", 43 | "@types/node": "latest", 44 | "assert": "latest", 45 | "mocha": "latest", 46 | "ts-node": "latest", 47 | "tsc-esm-fix": "latest", 48 | "typescript": "latest" 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.4 2 | 3 | specifiers: 4 | '@types/mocha': latest 5 | '@types/node': latest 6 | assert: latest 7 | mocha: latest 8 | ts-node: latest 9 | tsc-esm-fix: latest 10 | typescript: latest 11 | 12 | devDependencies: 13 | '@types/mocha': 10.0.1 14 | '@types/node': 18.15.3 15 | assert: 2.0.0 16 | mocha: 10.2.0 17 | ts-node: 10.9.1_sxidjv3cojnrggmso45tj7hldi 18 | tsc-esm-fix: 2.20.12 19 | typescript: 5.0.2 20 | 21 | packages: 22 | 23 | /@babel/code-frame/7.18.6: 24 | resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} 25 | engines: {node: '>=6.9.0'} 26 | dependencies: 27 | '@babel/highlight': 7.18.6 28 | dev: true 29 | 30 | /@babel/helper-validator-identifier/7.19.1: 31 | resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} 32 | engines: {node: '>=6.9.0'} 33 | dev: true 34 | 35 | /@babel/highlight/7.18.6: 36 | resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} 37 | engines: {node: '>=6.9.0'} 38 | dependencies: 39 | '@babel/helper-validator-identifier': 7.19.1 40 | chalk: 2.4.2 41 | js-tokens: 4.0.0 42 | dev: true 43 | 44 | /@cspotcode/source-map-support/0.8.1: 45 | resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} 46 | engines: {node: '>=12'} 47 | dependencies: 48 | '@jridgewell/trace-mapping': 0.3.9 49 | dev: true 50 | 51 | /@jridgewell/resolve-uri/3.1.0: 52 | resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} 53 | engines: {node: '>=6.0.0'} 54 | dev: true 55 | 56 | /@jridgewell/sourcemap-codec/1.4.14: 57 | resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} 58 | dev: true 59 | 60 | /@jridgewell/trace-mapping/0.3.9: 61 | resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} 62 | dependencies: 63 | '@jridgewell/resolve-uri': 3.1.0 64 | '@jridgewell/sourcemap-codec': 1.4.14 65 | dev: true 66 | 67 | /@nodelib/fs.scandir/2.1.5: 68 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 69 | engines: {node: '>= 8'} 70 | dependencies: 71 | '@nodelib/fs.stat': 2.0.5 72 | run-parallel: 1.2.0 73 | dev: true 74 | 75 | /@nodelib/fs.stat/2.0.5: 76 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 77 | engines: {node: '>= 8'} 78 | dev: true 79 | 80 | /@nodelib/fs.walk/1.2.8: 81 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 82 | engines: {node: '>= 8'} 83 | dependencies: 84 | '@nodelib/fs.scandir': 2.1.5 85 | fastq: 1.15.0 86 | dev: true 87 | 88 | /@tsconfig/node10/1.0.9: 89 | resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} 90 | dev: true 91 | 92 | /@tsconfig/node12/1.0.11: 93 | resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} 94 | dev: true 95 | 96 | /@tsconfig/node14/1.0.3: 97 | resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} 98 | dev: true 99 | 100 | /@tsconfig/node16/1.0.3: 101 | resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} 102 | dev: true 103 | 104 | /@types/minimist/1.2.2: 105 | resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} 106 | dev: true 107 | 108 | /@types/mocha/10.0.1: 109 | resolution: {integrity: sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==} 110 | dev: true 111 | 112 | /@types/node/18.15.3: 113 | resolution: {integrity: sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==} 114 | dev: true 115 | 116 | /@types/normalize-package-data/2.4.1: 117 | resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} 118 | dev: true 119 | 120 | /acorn-walk/8.2.0: 121 | resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} 122 | engines: {node: '>=0.4.0'} 123 | dev: true 124 | 125 | /acorn/8.8.2: 126 | resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} 127 | engines: {node: '>=0.4.0'} 128 | hasBin: true 129 | dev: true 130 | 131 | /ansi-colors/4.1.1: 132 | resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} 133 | engines: {node: '>=6'} 134 | dev: true 135 | 136 | /ansi-regex/5.0.1: 137 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 138 | engines: {node: '>=8'} 139 | dev: true 140 | 141 | /ansi-styles/3.2.1: 142 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 143 | engines: {node: '>=4'} 144 | dependencies: 145 | color-convert: 1.9.3 146 | dev: true 147 | 148 | /ansi-styles/4.3.0: 149 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 150 | engines: {node: '>=8'} 151 | dependencies: 152 | color-convert: 2.0.1 153 | dev: true 154 | 155 | /anymatch/3.1.3: 156 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 157 | engines: {node: '>= 8'} 158 | dependencies: 159 | normalize-path: 3.0.0 160 | picomatch: 2.3.1 161 | dev: true 162 | 163 | /arg/4.1.3: 164 | resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} 165 | dev: true 166 | 167 | /argparse/2.0.1: 168 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 169 | dev: true 170 | 171 | /arrify/1.0.1: 172 | resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} 173 | engines: {node: '>=0.10.0'} 174 | dev: true 175 | 176 | /assert/2.0.0: 177 | resolution: {integrity: sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==} 178 | dependencies: 179 | es6-object-assign: 1.1.0 180 | is-nan: 1.3.2 181 | object-is: 1.1.5 182 | util: 0.12.5 183 | dev: true 184 | 185 | /available-typed-arrays/1.0.5: 186 | resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} 187 | engines: {node: '>= 0.4'} 188 | dev: true 189 | 190 | /balanced-match/1.0.2: 191 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 192 | dev: true 193 | 194 | /binary-extensions/2.2.0: 195 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 196 | engines: {node: '>=8'} 197 | dev: true 198 | 199 | /brace-expansion/1.1.11: 200 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 201 | dependencies: 202 | balanced-match: 1.0.2 203 | concat-map: 0.0.1 204 | dev: true 205 | 206 | /brace-expansion/2.0.1: 207 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 208 | dependencies: 209 | balanced-match: 1.0.2 210 | dev: true 211 | 212 | /braces/3.0.2: 213 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 214 | engines: {node: '>=8'} 215 | dependencies: 216 | fill-range: 7.0.1 217 | dev: true 218 | 219 | /browser-stdout/1.3.1: 220 | resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} 221 | dev: true 222 | 223 | /call-bind/1.0.2: 224 | resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} 225 | dependencies: 226 | function-bind: 1.1.1 227 | get-intrinsic: 1.2.0 228 | dev: true 229 | 230 | /camelcase-keys/8.0.2: 231 | resolution: {integrity: sha512-qMKdlOfsjlezMqxkUGGMaWWs17i2HoL15tM+wtx8ld4nLrUwU58TFdvyGOz/piNP842KeO8yXvggVQSdQ828NA==} 232 | engines: {node: '>=14.16'} 233 | dependencies: 234 | camelcase: 7.0.1 235 | map-obj: 4.3.0 236 | quick-lru: 6.1.1 237 | type-fest: 2.19.0 238 | dev: true 239 | 240 | /camelcase/6.3.0: 241 | resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} 242 | engines: {node: '>=10'} 243 | dev: true 244 | 245 | /camelcase/7.0.1: 246 | resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} 247 | engines: {node: '>=14.16'} 248 | dev: true 249 | 250 | /chalk/2.4.2: 251 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 252 | engines: {node: '>=4'} 253 | dependencies: 254 | ansi-styles: 3.2.1 255 | escape-string-regexp: 1.0.5 256 | supports-color: 5.5.0 257 | dev: true 258 | 259 | /chalk/4.1.2: 260 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 261 | engines: {node: '>=10'} 262 | dependencies: 263 | ansi-styles: 4.3.0 264 | supports-color: 7.2.0 265 | dev: true 266 | 267 | /chokidar/3.5.3: 268 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 269 | engines: {node: '>= 8.10.0'} 270 | dependencies: 271 | anymatch: 3.1.3 272 | braces: 3.0.2 273 | glob-parent: 5.1.2 274 | is-binary-path: 2.1.0 275 | is-glob: 4.0.3 276 | normalize-path: 3.0.0 277 | readdirp: 3.6.0 278 | optionalDependencies: 279 | fsevents: 2.3.2 280 | dev: true 281 | 282 | /cliui/7.0.4: 283 | resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} 284 | dependencies: 285 | string-width: 4.2.3 286 | strip-ansi: 6.0.1 287 | wrap-ansi: 7.0.0 288 | dev: true 289 | 290 | /color-convert/1.9.3: 291 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 292 | dependencies: 293 | color-name: 1.1.3 294 | dev: true 295 | 296 | /color-convert/2.0.1: 297 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 298 | engines: {node: '>=7.0.0'} 299 | dependencies: 300 | color-name: 1.1.4 301 | dev: true 302 | 303 | /color-name/1.1.3: 304 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 305 | dev: true 306 | 307 | /color-name/1.1.4: 308 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 309 | dev: true 310 | 311 | /concat-map/0.0.1: 312 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 313 | dev: true 314 | 315 | /create-require/1.1.1: 316 | resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} 317 | dev: true 318 | 319 | /debug/4.3.4_supports-color@8.1.1: 320 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 321 | engines: {node: '>=6.0'} 322 | peerDependencies: 323 | supports-color: '*' 324 | peerDependenciesMeta: 325 | supports-color: 326 | optional: true 327 | dependencies: 328 | ms: 2.1.2 329 | supports-color: 8.1.1 330 | dev: true 331 | 332 | /decamelize-keys/1.1.1: 333 | resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} 334 | engines: {node: '>=0.10.0'} 335 | dependencies: 336 | decamelize: 1.2.0 337 | map-obj: 1.0.1 338 | dev: true 339 | 340 | /decamelize/1.2.0: 341 | resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} 342 | engines: {node: '>=0.10.0'} 343 | dev: true 344 | 345 | /decamelize/4.0.0: 346 | resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} 347 | engines: {node: '>=10'} 348 | dev: true 349 | 350 | /decamelize/6.0.0: 351 | resolution: {integrity: sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==} 352 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 353 | dev: true 354 | 355 | /define-properties/1.2.0: 356 | resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} 357 | engines: {node: '>= 0.4'} 358 | dependencies: 359 | has-property-descriptors: 1.0.0 360 | object-keys: 1.1.1 361 | dev: true 362 | 363 | /diff/4.0.2: 364 | resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} 365 | engines: {node: '>=0.3.1'} 366 | dev: true 367 | 368 | /diff/5.0.0: 369 | resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} 370 | engines: {node: '>=0.3.1'} 371 | dev: true 372 | 373 | /dir-glob/3.0.1: 374 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 375 | engines: {node: '>=8'} 376 | dependencies: 377 | path-type: 4.0.0 378 | dev: true 379 | 380 | /emoji-regex/8.0.0: 381 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 382 | dev: true 383 | 384 | /error-ex/1.3.2: 385 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 386 | dependencies: 387 | is-arrayish: 0.2.1 388 | dev: true 389 | 390 | /es6-object-assign/1.1.0: 391 | resolution: {integrity: sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==} 392 | dev: true 393 | 394 | /escalade/3.1.1: 395 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 396 | engines: {node: '>=6'} 397 | dev: true 398 | 399 | /escape-string-regexp/1.0.5: 400 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 401 | engines: {node: '>=0.8.0'} 402 | dev: true 403 | 404 | /escape-string-regexp/4.0.0: 405 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 406 | engines: {node: '>=10'} 407 | dev: true 408 | 409 | /fast-glob/3.2.12: 410 | resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} 411 | engines: {node: '>=8.6.0'} 412 | dependencies: 413 | '@nodelib/fs.stat': 2.0.5 414 | '@nodelib/fs.walk': 1.2.8 415 | glob-parent: 5.1.2 416 | merge2: 1.4.1 417 | micromatch: 4.0.5 418 | dev: true 419 | 420 | /fastq/1.15.0: 421 | resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} 422 | dependencies: 423 | reusify: 1.0.4 424 | dev: true 425 | 426 | /fill-range/7.0.1: 427 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 428 | engines: {node: '>=8'} 429 | dependencies: 430 | to-regex-range: 5.0.1 431 | dev: true 432 | 433 | /find-up/5.0.0: 434 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 435 | engines: {node: '>=10'} 436 | dependencies: 437 | locate-path: 6.0.0 438 | path-exists: 4.0.0 439 | dev: true 440 | 441 | /find-up/6.3.0: 442 | resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} 443 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 444 | dependencies: 445 | locate-path: 7.2.0 446 | path-exists: 5.0.0 447 | dev: true 448 | 449 | /flat/5.0.2: 450 | resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} 451 | hasBin: true 452 | dev: true 453 | 454 | /for-each/0.3.3: 455 | resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} 456 | dependencies: 457 | is-callable: 1.2.7 458 | dev: true 459 | 460 | /fs-extra/11.1.0: 461 | resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} 462 | engines: {node: '>=14.14'} 463 | dependencies: 464 | graceful-fs: 4.2.10 465 | jsonfile: 6.1.0 466 | universalify: 2.0.0 467 | dev: true 468 | 469 | /fs.realpath/1.0.0: 470 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 471 | dev: true 472 | 473 | /fsevents/2.3.2: 474 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 475 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 476 | os: [darwin] 477 | requiresBuild: true 478 | dev: true 479 | optional: true 480 | 481 | /function-bind/1.1.1: 482 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 483 | dev: true 484 | 485 | /get-caller-file/2.0.5: 486 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 487 | engines: {node: 6.* || 8.* || >= 10.*} 488 | dev: true 489 | 490 | /get-intrinsic/1.2.0: 491 | resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} 492 | dependencies: 493 | function-bind: 1.1.1 494 | has: 1.0.3 495 | has-symbols: 1.0.3 496 | dev: true 497 | 498 | /glob-parent/5.1.2: 499 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 500 | engines: {node: '>= 6'} 501 | dependencies: 502 | is-glob: 4.0.3 503 | dev: true 504 | 505 | /glob/7.2.0: 506 | resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} 507 | dependencies: 508 | fs.realpath: 1.0.0 509 | inflight: 1.0.6 510 | inherits: 2.0.4 511 | minimatch: 3.1.2 512 | once: 1.4.0 513 | path-is-absolute: 1.0.1 514 | dev: true 515 | 516 | /globby/13.1.3: 517 | resolution: {integrity: sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==} 518 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 519 | dependencies: 520 | dir-glob: 3.0.1 521 | fast-glob: 3.2.12 522 | ignore: 5.2.4 523 | merge2: 1.4.1 524 | slash: 4.0.0 525 | dev: true 526 | 527 | /gopd/1.0.1: 528 | resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} 529 | dependencies: 530 | get-intrinsic: 1.2.0 531 | dev: true 532 | 533 | /graceful-fs/4.2.10: 534 | resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} 535 | dev: true 536 | 537 | /hard-rejection/2.1.0: 538 | resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} 539 | engines: {node: '>=6'} 540 | dev: true 541 | 542 | /has-flag/3.0.0: 543 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 544 | engines: {node: '>=4'} 545 | dev: true 546 | 547 | /has-flag/4.0.0: 548 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 549 | engines: {node: '>=8'} 550 | dev: true 551 | 552 | /has-property-descriptors/1.0.0: 553 | resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} 554 | dependencies: 555 | get-intrinsic: 1.2.0 556 | dev: true 557 | 558 | /has-symbols/1.0.3: 559 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 560 | engines: {node: '>= 0.4'} 561 | dev: true 562 | 563 | /has-tostringtag/1.0.0: 564 | resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} 565 | engines: {node: '>= 0.4'} 566 | dependencies: 567 | has-symbols: 1.0.3 568 | dev: true 569 | 570 | /has/1.0.3: 571 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 572 | engines: {node: '>= 0.4.0'} 573 | dependencies: 574 | function-bind: 1.1.1 575 | dev: true 576 | 577 | /he/1.2.0: 578 | resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} 579 | hasBin: true 580 | dev: true 581 | 582 | /hosted-git-info/4.1.0: 583 | resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} 584 | engines: {node: '>=10'} 585 | dependencies: 586 | lru-cache: 6.0.0 587 | dev: true 588 | 589 | /hosted-git-info/5.2.1: 590 | resolution: {integrity: sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==} 591 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 592 | dependencies: 593 | lru-cache: 7.18.3 594 | dev: true 595 | 596 | /ignore/5.2.4: 597 | resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} 598 | engines: {node: '>= 4'} 599 | dev: true 600 | 601 | /indent-string/5.0.0: 602 | resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} 603 | engines: {node: '>=12'} 604 | dev: true 605 | 606 | /inflight/1.0.6: 607 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 608 | dependencies: 609 | once: 1.4.0 610 | wrappy: 1.0.2 611 | dev: true 612 | 613 | /inherits/2.0.4: 614 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 615 | dev: true 616 | 617 | /is-arguments/1.1.1: 618 | resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} 619 | engines: {node: '>= 0.4'} 620 | dependencies: 621 | call-bind: 1.0.2 622 | has-tostringtag: 1.0.0 623 | dev: true 624 | 625 | /is-arrayish/0.2.1: 626 | resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} 627 | dev: true 628 | 629 | /is-binary-path/2.1.0: 630 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 631 | engines: {node: '>=8'} 632 | dependencies: 633 | binary-extensions: 2.2.0 634 | dev: true 635 | 636 | /is-callable/1.2.7: 637 | resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} 638 | engines: {node: '>= 0.4'} 639 | dev: true 640 | 641 | /is-core-module/2.11.0: 642 | resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} 643 | dependencies: 644 | has: 1.0.3 645 | dev: true 646 | 647 | /is-extglob/2.1.1: 648 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 649 | engines: {node: '>=0.10.0'} 650 | dev: true 651 | 652 | /is-fullwidth-code-point/3.0.0: 653 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 654 | engines: {node: '>=8'} 655 | dev: true 656 | 657 | /is-generator-function/1.0.10: 658 | resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} 659 | engines: {node: '>= 0.4'} 660 | dependencies: 661 | has-tostringtag: 1.0.0 662 | dev: true 663 | 664 | /is-glob/4.0.3: 665 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 666 | engines: {node: '>=0.10.0'} 667 | dependencies: 668 | is-extglob: 2.1.1 669 | dev: true 670 | 671 | /is-nan/1.3.2: 672 | resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} 673 | engines: {node: '>= 0.4'} 674 | dependencies: 675 | call-bind: 1.0.2 676 | define-properties: 1.2.0 677 | dev: true 678 | 679 | /is-number/7.0.0: 680 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 681 | engines: {node: '>=0.12.0'} 682 | dev: true 683 | 684 | /is-plain-obj/1.1.0: 685 | resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} 686 | engines: {node: '>=0.10.0'} 687 | dev: true 688 | 689 | /is-plain-obj/2.1.0: 690 | resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} 691 | engines: {node: '>=8'} 692 | dev: true 693 | 694 | /is-typed-array/1.1.10: 695 | resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} 696 | engines: {node: '>= 0.4'} 697 | dependencies: 698 | available-typed-arrays: 1.0.5 699 | call-bind: 1.0.2 700 | for-each: 0.3.3 701 | gopd: 1.0.1 702 | has-tostringtag: 1.0.0 703 | dev: true 704 | 705 | /is-unicode-supported/0.1.0: 706 | resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} 707 | engines: {node: '>=10'} 708 | dev: true 709 | 710 | /js-tokens/4.0.0: 711 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 712 | dev: true 713 | 714 | /js-yaml/4.1.0: 715 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 716 | hasBin: true 717 | dependencies: 718 | argparse: 2.0.1 719 | dev: true 720 | 721 | /json-parse-even-better-errors/2.3.1: 722 | resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} 723 | dev: true 724 | 725 | /json5/2.2.3: 726 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 727 | engines: {node: '>=6'} 728 | hasBin: true 729 | dev: true 730 | 731 | /jsonfile/6.1.0: 732 | resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} 733 | dependencies: 734 | universalify: 2.0.0 735 | optionalDependencies: 736 | graceful-fs: 4.2.10 737 | dev: true 738 | 739 | /kind-of/6.0.3: 740 | resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} 741 | engines: {node: '>=0.10.0'} 742 | dev: true 743 | 744 | /lines-and-columns/1.2.4: 745 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 746 | dev: true 747 | 748 | /locate-path/6.0.0: 749 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 750 | engines: {node: '>=10'} 751 | dependencies: 752 | p-locate: 5.0.0 753 | dev: true 754 | 755 | /locate-path/7.2.0: 756 | resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} 757 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 758 | dependencies: 759 | p-locate: 6.0.0 760 | dev: true 761 | 762 | /log-symbols/4.1.0: 763 | resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} 764 | engines: {node: '>=10'} 765 | dependencies: 766 | chalk: 4.1.2 767 | is-unicode-supported: 0.1.0 768 | dev: true 769 | 770 | /lru-cache/6.0.0: 771 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 772 | engines: {node: '>=10'} 773 | dependencies: 774 | yallist: 4.0.0 775 | dev: true 776 | 777 | /lru-cache/7.18.3: 778 | resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} 779 | engines: {node: '>=12'} 780 | dev: true 781 | 782 | /make-error/1.3.6: 783 | resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} 784 | dev: true 785 | 786 | /map-obj/1.0.1: 787 | resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} 788 | engines: {node: '>=0.10.0'} 789 | dev: true 790 | 791 | /map-obj/4.3.0: 792 | resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} 793 | engines: {node: '>=8'} 794 | dev: true 795 | 796 | /meow/11.0.0: 797 | resolution: {integrity: sha512-Cl0yeeIrko6d94KpUo1M+0X1sB14ikoaqlIGuTH1fW4I+E3+YljL54/hb/BWmVfrV9tTV9zU04+xjw08Fh2WkA==} 798 | engines: {node: '>=14.16'} 799 | dependencies: 800 | '@types/minimist': 1.2.2 801 | camelcase-keys: 8.0.2 802 | decamelize: 6.0.0 803 | decamelize-keys: 1.1.1 804 | hard-rejection: 2.1.0 805 | minimist-options: 4.1.0 806 | normalize-package-data: 4.0.1 807 | read-pkg-up: 9.1.0 808 | redent: 4.0.0 809 | trim-newlines: 4.0.2 810 | type-fest: 3.6.1 811 | yargs-parser: 21.1.1 812 | dev: true 813 | 814 | /merge2/1.4.1: 815 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 816 | engines: {node: '>= 8'} 817 | dev: true 818 | 819 | /micromatch/4.0.5: 820 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 821 | engines: {node: '>=8.6'} 822 | dependencies: 823 | braces: 3.0.2 824 | picomatch: 2.3.1 825 | dev: true 826 | 827 | /min-indent/1.0.1: 828 | resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} 829 | engines: {node: '>=4'} 830 | dev: true 831 | 832 | /minimatch/3.1.2: 833 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 834 | dependencies: 835 | brace-expansion: 1.1.11 836 | dev: true 837 | 838 | /minimatch/5.0.1: 839 | resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} 840 | engines: {node: '>=10'} 841 | dependencies: 842 | brace-expansion: 2.0.1 843 | dev: true 844 | 845 | /minimist-options/4.1.0: 846 | resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} 847 | engines: {node: '>= 6'} 848 | dependencies: 849 | arrify: 1.0.1 850 | is-plain-obj: 1.1.0 851 | kind-of: 6.0.3 852 | dev: true 853 | 854 | /mocha/10.2.0: 855 | resolution: {integrity: sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==} 856 | engines: {node: '>= 14.0.0'} 857 | hasBin: true 858 | dependencies: 859 | ansi-colors: 4.1.1 860 | browser-stdout: 1.3.1 861 | chokidar: 3.5.3 862 | debug: 4.3.4_supports-color@8.1.1 863 | diff: 5.0.0 864 | escape-string-regexp: 4.0.0 865 | find-up: 5.0.0 866 | glob: 7.2.0 867 | he: 1.2.0 868 | js-yaml: 4.1.0 869 | log-symbols: 4.1.0 870 | minimatch: 5.0.1 871 | ms: 2.1.3 872 | nanoid: 3.3.3 873 | serialize-javascript: 6.0.0 874 | strip-json-comments: 3.1.1 875 | supports-color: 8.1.1 876 | workerpool: 6.2.1 877 | yargs: 16.2.0 878 | yargs-parser: 20.2.4 879 | yargs-unparser: 2.0.0 880 | dev: true 881 | 882 | /ms/2.1.2: 883 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 884 | dev: true 885 | 886 | /ms/2.1.3: 887 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 888 | dev: true 889 | 890 | /nanoid/3.3.3: 891 | resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==} 892 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 893 | hasBin: true 894 | dev: true 895 | 896 | /normalize-package-data/3.0.3: 897 | resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} 898 | engines: {node: '>=10'} 899 | dependencies: 900 | hosted-git-info: 4.1.0 901 | is-core-module: 2.11.0 902 | semver: 7.3.8 903 | validate-npm-package-license: 3.0.4 904 | dev: true 905 | 906 | /normalize-package-data/4.0.1: 907 | resolution: {integrity: sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==} 908 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 909 | dependencies: 910 | hosted-git-info: 5.2.1 911 | is-core-module: 2.11.0 912 | semver: 7.3.8 913 | validate-npm-package-license: 3.0.4 914 | dev: true 915 | 916 | /normalize-path/3.0.0: 917 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 918 | engines: {node: '>=0.10.0'} 919 | dev: true 920 | 921 | /object-is/1.1.5: 922 | resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} 923 | engines: {node: '>= 0.4'} 924 | dependencies: 925 | call-bind: 1.0.2 926 | define-properties: 1.2.0 927 | dev: true 928 | 929 | /object-keys/1.1.1: 930 | resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 931 | engines: {node: '>= 0.4'} 932 | dev: true 933 | 934 | /once/1.4.0: 935 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 936 | dependencies: 937 | wrappy: 1.0.2 938 | dev: true 939 | 940 | /p-limit/3.1.0: 941 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 942 | engines: {node: '>=10'} 943 | dependencies: 944 | yocto-queue: 0.1.0 945 | dev: true 946 | 947 | /p-limit/4.0.0: 948 | resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} 949 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 950 | dependencies: 951 | yocto-queue: 1.0.0 952 | dev: true 953 | 954 | /p-locate/5.0.0: 955 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 956 | engines: {node: '>=10'} 957 | dependencies: 958 | p-limit: 3.1.0 959 | dev: true 960 | 961 | /p-locate/6.0.0: 962 | resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} 963 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 964 | dependencies: 965 | p-limit: 4.0.0 966 | dev: true 967 | 968 | /parse-json/5.2.0: 969 | resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} 970 | engines: {node: '>=8'} 971 | dependencies: 972 | '@babel/code-frame': 7.18.6 973 | error-ex: 1.3.2 974 | json-parse-even-better-errors: 2.3.1 975 | lines-and-columns: 1.2.4 976 | dev: true 977 | 978 | /path-exists/4.0.0: 979 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 980 | engines: {node: '>=8'} 981 | dev: true 982 | 983 | /path-exists/5.0.0: 984 | resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} 985 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 986 | dev: true 987 | 988 | /path-is-absolute/1.0.1: 989 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 990 | engines: {node: '>=0.10.0'} 991 | dev: true 992 | 993 | /path-type/4.0.0: 994 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 995 | engines: {node: '>=8'} 996 | dev: true 997 | 998 | /picomatch/2.3.1: 999 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1000 | engines: {node: '>=8.6'} 1001 | dev: true 1002 | 1003 | /queue-microtask/1.2.3: 1004 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1005 | dev: true 1006 | 1007 | /quick-lru/6.1.1: 1008 | resolution: {integrity: sha512-S27GBT+F0NTRiehtbrgaSE1idUAJ5bX8dPAQTdylEyNlrdcH5X4Lz7Edz3DYzecbsCluD5zO8ZNEe04z3D3u6Q==} 1009 | engines: {node: '>=12'} 1010 | dev: true 1011 | 1012 | /randombytes/2.1.0: 1013 | resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} 1014 | dependencies: 1015 | safe-buffer: 5.2.1 1016 | dev: true 1017 | 1018 | /read-pkg-up/9.1.0: 1019 | resolution: {integrity: sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==} 1020 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1021 | dependencies: 1022 | find-up: 6.3.0 1023 | read-pkg: 7.1.0 1024 | type-fest: 2.19.0 1025 | dev: true 1026 | 1027 | /read-pkg/7.1.0: 1028 | resolution: {integrity: sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==} 1029 | engines: {node: '>=12.20'} 1030 | dependencies: 1031 | '@types/normalize-package-data': 2.4.1 1032 | normalize-package-data: 3.0.3 1033 | parse-json: 5.2.0 1034 | type-fest: 2.19.0 1035 | dev: true 1036 | 1037 | /readdirp/3.6.0: 1038 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1039 | engines: {node: '>=8.10.0'} 1040 | dependencies: 1041 | picomatch: 2.3.1 1042 | dev: true 1043 | 1044 | /redent/4.0.0: 1045 | resolution: {integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==} 1046 | engines: {node: '>=12'} 1047 | dependencies: 1048 | indent-string: 5.0.0 1049 | strip-indent: 4.0.0 1050 | dev: true 1051 | 1052 | /require-directory/2.1.1: 1053 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 1054 | engines: {node: '>=0.10.0'} 1055 | dev: true 1056 | 1057 | /reusify/1.0.4: 1058 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1059 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1060 | dev: true 1061 | 1062 | /run-parallel/1.2.0: 1063 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1064 | dependencies: 1065 | queue-microtask: 1.2.3 1066 | dev: true 1067 | 1068 | /safe-buffer/5.2.1: 1069 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1070 | dev: true 1071 | 1072 | /semver/7.3.8: 1073 | resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} 1074 | engines: {node: '>=10'} 1075 | hasBin: true 1076 | dependencies: 1077 | lru-cache: 6.0.0 1078 | dev: true 1079 | 1080 | /serialize-javascript/6.0.0: 1081 | resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} 1082 | dependencies: 1083 | randombytes: 2.1.0 1084 | dev: true 1085 | 1086 | /slash/4.0.0: 1087 | resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} 1088 | engines: {node: '>=12'} 1089 | dev: true 1090 | 1091 | /spdx-correct/3.2.0: 1092 | resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} 1093 | dependencies: 1094 | spdx-expression-parse: 3.0.1 1095 | spdx-license-ids: 3.0.12 1096 | dev: true 1097 | 1098 | /spdx-exceptions/2.3.0: 1099 | resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} 1100 | dev: true 1101 | 1102 | /spdx-expression-parse/3.0.1: 1103 | resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} 1104 | dependencies: 1105 | spdx-exceptions: 2.3.0 1106 | spdx-license-ids: 3.0.12 1107 | dev: true 1108 | 1109 | /spdx-license-ids/3.0.12: 1110 | resolution: {integrity: sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==} 1111 | dev: true 1112 | 1113 | /string-width/4.2.3: 1114 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1115 | engines: {node: '>=8'} 1116 | dependencies: 1117 | emoji-regex: 8.0.0 1118 | is-fullwidth-code-point: 3.0.0 1119 | strip-ansi: 6.0.1 1120 | dev: true 1121 | 1122 | /strip-ansi/6.0.1: 1123 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1124 | engines: {node: '>=8'} 1125 | dependencies: 1126 | ansi-regex: 5.0.1 1127 | dev: true 1128 | 1129 | /strip-indent/4.0.0: 1130 | resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} 1131 | engines: {node: '>=12'} 1132 | dependencies: 1133 | min-indent: 1.0.1 1134 | dev: true 1135 | 1136 | /strip-json-comments/3.1.1: 1137 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1138 | engines: {node: '>=8'} 1139 | dev: true 1140 | 1141 | /supports-color/5.5.0: 1142 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1143 | engines: {node: '>=4'} 1144 | dependencies: 1145 | has-flag: 3.0.0 1146 | dev: true 1147 | 1148 | /supports-color/7.2.0: 1149 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1150 | engines: {node: '>=8'} 1151 | dependencies: 1152 | has-flag: 4.0.0 1153 | dev: true 1154 | 1155 | /supports-color/8.1.1: 1156 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 1157 | engines: {node: '>=10'} 1158 | dependencies: 1159 | has-flag: 4.0.0 1160 | dev: true 1161 | 1162 | /to-regex-range/5.0.1: 1163 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1164 | engines: {node: '>=8.0'} 1165 | dependencies: 1166 | is-number: 7.0.0 1167 | dev: true 1168 | 1169 | /trim-newlines/4.0.2: 1170 | resolution: {integrity: sha512-GJtWyq9InR/2HRiLZgpIKv+ufIKrVrvjQWEj7PxAXNc5dwbNJkqhAUoAGgzRmULAnoOM5EIpveYd3J2VeSAIew==} 1171 | engines: {node: '>=12'} 1172 | dev: true 1173 | 1174 | /ts-node/10.9.1_sxidjv3cojnrggmso45tj7hldi: 1175 | resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} 1176 | hasBin: true 1177 | peerDependencies: 1178 | '@swc/core': '>=1.2.50' 1179 | '@swc/wasm': '>=1.2.50' 1180 | '@types/node': '*' 1181 | typescript: '>=2.7' 1182 | peerDependenciesMeta: 1183 | '@swc/core': 1184 | optional: true 1185 | '@swc/wasm': 1186 | optional: true 1187 | dependencies: 1188 | '@cspotcode/source-map-support': 0.8.1 1189 | '@tsconfig/node10': 1.0.9 1190 | '@tsconfig/node12': 1.0.11 1191 | '@tsconfig/node14': 1.0.3 1192 | '@tsconfig/node16': 1.0.3 1193 | '@types/node': 18.15.3 1194 | acorn: 8.8.2 1195 | acorn-walk: 8.2.0 1196 | arg: 4.1.3 1197 | create-require: 1.1.1 1198 | diff: 4.0.2 1199 | make-error: 1.3.6 1200 | typescript: 5.0.2 1201 | v8-compile-cache-lib: 3.0.1 1202 | yn: 3.1.1 1203 | dev: true 1204 | 1205 | /tsc-esm-fix/2.20.12: 1206 | resolution: {integrity: sha512-NZMLIqFwr1P7+ILeFmYK06TbI07I+3p/bACYtLPNM6VfuJRV0Y1M0YKLCse7dwCzlOXFz8FCtE7efiMJcAEfDw==} 1207 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1208 | hasBin: true 1209 | dependencies: 1210 | fs-extra: 11.1.0 1211 | globby: 13.1.3 1212 | json5: 2.2.3 1213 | meow: 11.0.0 1214 | tslib: 2.5.0 1215 | dev: true 1216 | 1217 | /tslib/2.5.0: 1218 | resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} 1219 | dev: true 1220 | 1221 | /type-fest/2.19.0: 1222 | resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} 1223 | engines: {node: '>=12.20'} 1224 | dev: true 1225 | 1226 | /type-fest/3.6.1: 1227 | resolution: {integrity: sha512-htXWckxlT6U4+ilVgweNliPqlsVSSucbxVexRYllyMVJDtf5rTjv6kF/s+qAd4QSL1BZcnJPEJavYBPQiWuZDA==} 1228 | engines: {node: '>=14.16'} 1229 | dev: true 1230 | 1231 | /typescript/5.0.2: 1232 | resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} 1233 | engines: {node: '>=12.20'} 1234 | hasBin: true 1235 | dev: true 1236 | 1237 | /universalify/2.0.0: 1238 | resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} 1239 | engines: {node: '>= 10.0.0'} 1240 | dev: true 1241 | 1242 | /util/0.12.5: 1243 | resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} 1244 | dependencies: 1245 | inherits: 2.0.4 1246 | is-arguments: 1.1.1 1247 | is-generator-function: 1.0.10 1248 | is-typed-array: 1.1.10 1249 | which-typed-array: 1.1.9 1250 | dev: true 1251 | 1252 | /v8-compile-cache-lib/3.0.1: 1253 | resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} 1254 | dev: true 1255 | 1256 | /validate-npm-package-license/3.0.4: 1257 | resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} 1258 | dependencies: 1259 | spdx-correct: 3.2.0 1260 | spdx-expression-parse: 3.0.1 1261 | dev: true 1262 | 1263 | /which-typed-array/1.1.9: 1264 | resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} 1265 | engines: {node: '>= 0.4'} 1266 | dependencies: 1267 | available-typed-arrays: 1.0.5 1268 | call-bind: 1.0.2 1269 | for-each: 0.3.3 1270 | gopd: 1.0.1 1271 | has-tostringtag: 1.0.0 1272 | is-typed-array: 1.1.10 1273 | dev: true 1274 | 1275 | /workerpool/6.2.1: 1276 | resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} 1277 | dev: true 1278 | 1279 | /wrap-ansi/7.0.0: 1280 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1281 | engines: {node: '>=10'} 1282 | dependencies: 1283 | ansi-styles: 4.3.0 1284 | string-width: 4.2.3 1285 | strip-ansi: 6.0.1 1286 | dev: true 1287 | 1288 | /wrappy/1.0.2: 1289 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1290 | dev: true 1291 | 1292 | /y18n/5.0.8: 1293 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 1294 | engines: {node: '>=10'} 1295 | dev: true 1296 | 1297 | /yallist/4.0.0: 1298 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 1299 | dev: true 1300 | 1301 | /yargs-parser/20.2.4: 1302 | resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} 1303 | engines: {node: '>=10'} 1304 | dev: true 1305 | 1306 | /yargs-parser/21.1.1: 1307 | resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 1308 | engines: {node: '>=12'} 1309 | dev: true 1310 | 1311 | /yargs-unparser/2.0.0: 1312 | resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} 1313 | engines: {node: '>=10'} 1314 | dependencies: 1315 | camelcase: 6.3.0 1316 | decamelize: 4.0.0 1317 | flat: 5.0.2 1318 | is-plain-obj: 2.1.0 1319 | dev: true 1320 | 1321 | /yargs/16.2.0: 1322 | resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} 1323 | engines: {node: '>=10'} 1324 | dependencies: 1325 | cliui: 7.0.4 1326 | escalade: 3.1.1 1327 | get-caller-file: 2.0.5 1328 | require-directory: 2.1.1 1329 | string-width: 4.2.3 1330 | y18n: 5.0.8 1331 | yargs-parser: 20.2.4 1332 | dev: true 1333 | 1334 | /yn/3.1.1: 1335 | resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} 1336 | engines: {node: '>=6'} 1337 | dev: true 1338 | 1339 | /yocto-queue/0.1.0: 1340 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1341 | engines: {node: '>=10'} 1342 | dev: true 1343 | 1344 | /yocto-queue/1.0.0: 1345 | resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} 1346 | engines: {node: '>=12.20'} 1347 | dev: true 1348 | -------------------------------------------------------------------------------- /src/index.spec.ts: -------------------------------------------------------------------------------- 1 | // TODO: add tests -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import * as v1 from "./v1"; 2 | import { Init, request } from "./request"; 3 | 4 | // ApiConfig defines the configuration options for the OpenAI API 5 | export type ApiConfig = { 6 | apiKey: string; 7 | organization?: string; 8 | endpoint?: string; 9 | options?: ApiInit; 10 | }; 11 | 12 | export type ApiInit = Omit; 13 | 14 | // ApiVersion defines the version of the OpenAI API 15 | export type ApiVersion = "v1" | "v2"; 16 | 17 | export type ApiClient = (path: string, options: Init, direct?: boolean) => Promise; 18 | 19 | // OpenAI is the main class for the OpenAI API 20 | export class OpenAI { 21 | 22 | constructor(private config: ApiConfig) {} 23 | 24 | v1() { 25 | const client = this.makeClient("v1"); 26 | 27 | return { 28 | models: { 29 | list: v1.listModels(client), 30 | retrieve: v1.retrieveModel(client), 31 | delete: v1.deleteModel(client), 32 | }, 33 | completions: { 34 | create: v1.createCompletion(client) 35 | }, 36 | chat: { 37 | create: v1.createChat(client) 38 | }, 39 | edits: { 40 | create: v1.createEdit(client) 41 | }, 42 | images: { 43 | create: v1.createImage(client), 44 | edit: v1.editImage(client), 45 | createVariation: v1.createImageVariation(client) 46 | }, 47 | embeddings: { 48 | create: v1.createEmbedding(client) 49 | }, 50 | audio: { 51 | createTranscription: v1.createAudioTranscription(client), 52 | createTranslation: v1.createAudioTranslation(client) 53 | }, 54 | files: { 55 | list: v1.listFiles(client), 56 | retrieve: v1.retrieveFile(client), 57 | upload: v1.uploadFile(client), 58 | delete: v1.deleteFile(client), 59 | retrieveContent: v1.retrieveFileContent(client) 60 | }, 61 | fineTunes: { 62 | create: v1.createFineTune(client), 63 | list: v1.listFineTunes(client), 64 | retrieve: v1.retrieveFineTune(client), 65 | cancel: v1.cancelFineTune(client), 66 | listEvents: v1.listFineTuneEvents(client), 67 | }, 68 | moderations: { 69 | create: v1.createModeration(client) 70 | }, 71 | }; 72 | } 73 | 74 | // Generate a client for the given version of the OpenAI API 75 | private makeClient(version: ApiVersion): ApiClient { 76 | return async (path: string, options: Init, direct = false) => { 77 | if (this.config.options) { 78 | options = Object.assign(this.config.options, options); 79 | } 80 | 81 | const headers: Record = { 82 | Authorization: `Bearer ${this.config.apiKey}`, 83 | }; 84 | 85 | if (this.config.organization) { 86 | headers["OpenAI-Organization"] = this.config.organization; 87 | } 88 | 89 | options.headers = Object.assign(headers, options.headers || {}); 90 | 91 | const endpoint = this.config.endpoint || "https://api.openai.com"; 92 | const url = `${endpoint}/${version}/${path}`; 93 | const response = await request(url, options, direct ? "original" : "json"); 94 | 95 | if (response.status !== 200) { 96 | throw new Error(direct ? response.statusText : response.body.error.message); 97 | } 98 | 99 | return response.body; 100 | } 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /src/request/feature/data.ts: -------------------------------------------------------------------------------- 1 | import { ClientRequest } from "http"; 2 | import { Feature, Options, Init, FetchOptions } from ".."; 3 | 4 | declare module ".." { 5 | interface Init { 6 | data?: any; 7 | } 8 | } 9 | 10 | export class DataFeature implements Feature { 11 | forRequest(init: Init, options: Options) { 12 | if (init.data) { 13 | options.headers = { 14 | ...options.headers, 15 | "Content-Type": "application/json", 16 | }; 17 | } 18 | } 19 | 20 | async forRequestClient(init: Init, client: ClientRequest) { 21 | if (init.data) { 22 | client.write(JSON.stringify(init.data)); 23 | } 24 | } 25 | 26 | forFetch(init: Init, options: FetchOptions) { 27 | if (init.data) { 28 | options.headers = { 29 | ...options.headers, 30 | "Content-Type": "application/json", 31 | }; 32 | 33 | options.body = JSON.stringify(init.data); 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /src/request/feature/form.ts: -------------------------------------------------------------------------------- 1 | import { ClientRequest } from "http"; 2 | import { Feature, Options, Init, StreamFile, FetchOptions } from ".."; 3 | import { ReadStream } from "fs"; 4 | 5 | declare module ".." { 6 | interface Init { 7 | form?: Form; 8 | } 9 | } 10 | 11 | type Form = { 12 | [key: string]: string | StreamFile; 13 | }; 14 | 15 | async function uploadFile(file: StreamFile, client: ClientRequest): Promise { 16 | return new Promise((resolve, reject) => { 17 | const stream = file.stream as ReadStream; 18 | 19 | stream.on("error", reject); 20 | stream.on("end", () => { 21 | client.write("\r\n"); 22 | resolve(); 23 | }); 24 | stream.pipe(client, { end: false }); 25 | }); 26 | } 27 | 28 | export class FormFeature implements Feature { 29 | forRequest(init: Init, options: Options) {} 30 | 31 | async forRequestClient(init: Init, client: ClientRequest) { 32 | if (init.form) { 33 | const boundary = "--------------------------" + Date.now().toString(16); 34 | client.setHeader("Content-Type", `multipart/form-data; boundary=${boundary}`); 35 | 36 | for (const key in init.form) { 37 | const value = init.form[key]; 38 | client.write(`--${boundary}\r\n`); 39 | client.write(`Content-Disposition: form-data; name="${key}"`); 40 | 41 | if (typeof value === "string") { 42 | client.write(`\r\n\r\n${value}\r\n`); 43 | } else { 44 | client.write(`; filename="${value.name}"\r\n`); 45 | client.write(`Content-Type: application/octet-stream\r\n\r\n`); 46 | await uploadFile(value, client); 47 | } 48 | } 49 | 50 | client.write(`--${boundary}--\r\n`); 51 | } 52 | } 53 | 54 | forFetch(init: Init, options: FetchOptions) { 55 | if (init.form) { 56 | options.headers = { 57 | ...options.headers, 58 | "Content-Type": "multipart/form-data", 59 | }; 60 | 61 | const formData = new FormData(); 62 | 63 | for (const key in init.form) { 64 | const value = init.form[key]; 65 | 66 | if (typeof value === "string") { 67 | formData.append(key, value); 68 | } else { 69 | formData.append(key, value.stream as Blob, value.name); 70 | } 71 | } 72 | 73 | options.body = formData; 74 | } 75 | } 76 | } -------------------------------------------------------------------------------- /src/request/feature/headers.ts: -------------------------------------------------------------------------------- 1 | import { ClientRequest } from "http"; 2 | import { Feature, Options, Init, FetchOptions } from ".."; 3 | 4 | declare module ".." { 5 | interface Init { 6 | headers?: Record; 7 | } 8 | } 9 | 10 | export class HeadersFeature implements Feature { 11 | forRequest(init: Init, options: Options) { 12 | if (init.headers) { 13 | options.headers = { 14 | ...options.headers, 15 | ...init.headers, 16 | } 17 | } 18 | } 19 | 20 | async forRequestClient(init: Init, client: ClientRequest) {} 21 | 22 | forFetch(init: Init, options: FetchOptions) { 23 | if (init.headers) { 24 | options.headers = { 25 | ...options.headers, 26 | ...init.headers, 27 | } 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /src/request/feature/index.ts: -------------------------------------------------------------------------------- 1 | import { HeadersFeature } from './headers'; 2 | import { DataFeature } from './data'; 3 | import { FormFeature } from './form'; 4 | import { MethodFeature } from './method'; 5 | import { SignalFeature } from './signal'; 6 | import { Feature } from '..'; 7 | 8 | const features = [ 9 | new HeadersFeature(), 10 | new DataFeature(), 11 | new FormFeature(), 12 | new MethodFeature(), 13 | new SignalFeature(), 14 | ]; 15 | 16 | export default async function requestFeature(fn: (feature: Feature) => Promise) { 17 | for (const feature of features) { 18 | await fn(feature); 19 | } 20 | } -------------------------------------------------------------------------------- /src/request/feature/method.ts: -------------------------------------------------------------------------------- 1 | import { ClientRequest } from "http"; 2 | import { Feature, Options, Init, FetchOptions } from ".."; 3 | 4 | declare module ".." { 5 | interface Init { 6 | method?: string; 7 | } 8 | } 9 | 10 | export class MethodFeature implements Feature { 11 | forRequest(init: Init, options: Options) { 12 | options.method = init.method || "GET"; 13 | } 14 | 15 | async forRequestClient(init: Init, client: ClientRequest) {} 16 | 17 | forFetch(init: Init, options: FetchOptions) { 18 | options.method = init.method || "GET"; 19 | } 20 | } -------------------------------------------------------------------------------- /src/request/feature/signal.ts: -------------------------------------------------------------------------------- 1 | import { ClientRequest } from "http"; 2 | import { Feature, Options, Init, FetchOptions } from ".."; 3 | 4 | declare module ".." { 5 | interface Init { 6 | signal?: AbortSignal; 7 | } 8 | } 9 | 10 | export class SignalFeature implements Feature { 11 | forRequest(init: Init, options: Options) { 12 | if (init.signal) { 13 | options.signal = init.signal; 14 | } 15 | } 16 | 17 | async forRequestClient(init: Init, client: ClientRequest) {} 18 | 19 | forFetch(init: Init, options: FetchOptions) { 20 | if (init.signal) { 21 | options.signal = init.signal; 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /src/request/index.ts: -------------------------------------------------------------------------------- 1 | import { RequestOptions as HttpsRequestOptions } from "https"; 2 | import { RequestOptions as HttpRequestOptions, ClientRequest, IncomingMessage } from "http"; 3 | import requestFeature from "./feature"; 4 | import { ReadStream } from "fs"; 5 | 6 | export type Options = HttpsRequestOptions | HttpRequestOptions; 7 | 8 | export interface Init { 9 | } 10 | 11 | export type Format = 'json' | 'text' | 'original'; 12 | 13 | export interface Feature { 14 | forRequest: (init: Init, options: Options) => void; 15 | forRequestClient: (init: Init, client: ClientRequest) => Promise; 16 | forFetch: (init: Init, options: FetchOptions) => void; 17 | } 18 | 19 | export type FetchOptions = { 20 | method?: string; 21 | headers?: Record; 22 | body?: any; 23 | signal?: AbortSignal; 24 | }; 25 | 26 | export type Response = { 27 | status: number; 28 | statusText: string; 29 | headers: Record; 30 | body: any; 31 | }; 32 | 33 | export class StreamFile { 34 | public name: string; 35 | 36 | public stream: Blob | ReadStream; 37 | 38 | constructor(file: string | Blob) { 39 | if (typeof file === "string") { 40 | const { createReadStream } = require("fs"); 41 | this.stream = createReadStream(file); 42 | this.name = this.basename(file); 43 | } else { 44 | this.stream = file; 45 | this.name = this.basename(file.name); 46 | } 47 | } 48 | 49 | private basename(path: string): string { 50 | return path.split(/[\\/]/).pop() || ""; 51 | } 52 | } 53 | 54 | export function readFile(file: string | Blob) { 55 | return new StreamFile(file); 56 | } 57 | 58 | export async function request(url: string, init: Init, format: Format): Promise { 59 | const response: Response = { 60 | status: 200, 61 | statusText: "OK", 62 | headers: {}, 63 | body: null, 64 | }; 65 | 66 | if (typeof fetch === "function") { 67 | const options: FetchOptions = {}; 68 | await requestFeature(async (feature) => feature.forFetch(init, options)); 69 | 70 | const resp = await fetch(url, options); 71 | response.status = resp.status; 72 | response.statusText = resp.statusText; 73 | resp.headers.forEach((value, key) => { 74 | response.headers[key.toLocaleLowerCase()] = value; 75 | }); 76 | 77 | if (format === "json") { 78 | if (!resp.headers.get("content-type")?.match(/^application\/json/)) { 79 | throw new Error(`Unexpected Content-Type: ${resp.headers.get("content-type")}`); 80 | } 81 | 82 | response.body = await resp.json(); 83 | } else if (format === "text") { 84 | if (!resp.headers.get("content-type")?.match(/^text\//)) { 85 | throw new Error(`Unexpected Content-Type: ${resp.headers.get("content-type")}`); 86 | } 87 | 88 | response.body = await resp.text(); 89 | } else { 90 | response.body = resp; 91 | } 92 | 93 | return response; 94 | } else { 95 | const { request: requestClient } = await import("https"); 96 | const { request: httpRequestClient } = await import("http"); 97 | 98 | const isHttps = url.startsWith("https://"); 99 | const client = isHttps ? requestClient : httpRequestClient; 100 | 101 | const options: Options = {}; 102 | await requestFeature(async (feature) => feature.forRequest(init, options)); 103 | const req = client(url, options); 104 | await requestFeature(async (feature) => feature.forRequestClient(init, req)); 105 | 106 | return new Promise((resolve, reject) => { 107 | req.on("response", (res: IncomingMessage) => { 108 | response.status = res.statusCode || 200; 109 | response.statusText = res.statusMessage || "OK"; 110 | response.headers = res.headers; 111 | 112 | if (format === "original") { 113 | response.body = res; 114 | resolve(response); 115 | } else { 116 | const chunks: Uint8Array[] = []; 117 | res.on("data", (chunk: Uint8Array) => chunks.push(chunk)); 118 | res.on("end", () => { 119 | const data = Buffer.concat(chunks).toString(); 120 | if (format === "json") { 121 | if (!res.headers["content-type"]?.match(/^application\/json/)) { 122 | return reject(new Error(`Unexpected Content-Type: ${res.headers["content-type"]}`)); 123 | } 124 | 125 | response.body = JSON.parse(data); 126 | } else { 127 | if (!res.headers["content-type"]?.match(/^text\//)) { 128 | return reject(new Error(`Unexpected Content-Type: ${res.headers["content-type"]}`)); 129 | } 130 | 131 | response.body = data; 132 | } 133 | 134 | resolve(response); 135 | }); 136 | } 137 | }); 138 | 139 | req.on("error", reject); 140 | req.end(); 141 | }); 142 | } 143 | } -------------------------------------------------------------------------------- /src/v1/audio.ts: -------------------------------------------------------------------------------- 1 | import { ApiClient } from ".."; 2 | import { readFile } from "../request"; 3 | 4 | type AudioResponseFormat = 'json' | 'text' | 'srt' | 'verbose_json' | 'vtt'; 5 | 6 | type CreateAudioTranscriptionRequest = { 7 | model: string; 8 | prompt?: string; 9 | response_format?: AudioResponseFormat; 10 | temperature?: number; 11 | language?: string; 12 | }; 13 | 14 | type CreateAudioTranslationRequest = { 15 | model: string; 16 | prompt?: string; 17 | response_format?: AudioResponseFormat; 18 | temperature?: number; 19 | }; 20 | 21 | type Audio = Partial<{ 22 | [key in AudioResponseFormat]: string; 23 | }>; 24 | 25 | export function createAudioTranscription(client: ApiClient) { 26 | return async (request: CreateAudioTranscriptionRequest, file: string | Blob): Promise