diff --git a/.babelrc.js b/.babelrc.js deleted file mode 100644 index d33036193..000000000 --- a/.babelrc.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - presets: [ - '@babel/preset-env', - '@babel/preset-typescript' - ] -}; diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 000000000..fe53ab1f2 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,32 @@ +version: 2 +jobs: + build: + docker: + - image: cimg/node:lts-browsers + resource_class: large + working_directory: ~/repo + steps: + - checkout + - restore_cache: + keys: + - v1-dependencies-{{ checksum "package-lock.json" }} + - v1-dependencies- + - run: + name: Install dependencies + command: npm install + - save_cache: + key: v1-dependencies-{{ checksum "package-lock.json" }} + paths: + - node_modules + - run: + name: Build library + command: npm run release + - run: + name: Run unit tests + command: npm run test +# - run: +# name: Run e2e tests +# command: npm run test:e2e + - run: + name: Submit to Codecov + command: npm run codecov diff --git a/.editorconfig b/.editorconfig index d741e40b1..14a33bdea 100755 --- a/.editorconfig +++ b/.editorconfig @@ -7,3 +7,6 @@ trim_trailing_whitespace = true insert_final_newline = true indent_style = space indent_size = 4 + +[*.hbs] +indent_style = tab diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 000000000..9c1a3bc45 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,5 @@ +dist +samples +test/generated +test/e2e/generated +node_modules diff --git a/.eslintrc.json b/.eslintrc.json index 61304779b..6b6165178 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,29 +1,25 @@ { "parser": "@typescript-eslint/parser", - "extends": [ - "plugin:@typescript-eslint/recommended", - "prettier/@typescript-eslint", - "plugin:prettier/recommended" - ], + "extends": ["plugin:@typescript-eslint/recommended", "plugin:prettier/recommended", "prettier"], "env": { "es6": true, "node": true, "jest": true }, - "plugins": [ - "sort-imports-es6-autofix" - ], + "plugins": ["simple-import-sort"], "rules": { "@typescript-eslint/no-explicit-any": 0, "@typescript-eslint/no-inferrable-types": 0, "@typescript-eslint/no-non-null-assertion": 0, + "@typescript-eslint/no-var-requires": 0, "@typescript-eslint/ban-ts-ignore": 0, + "@typescript-eslint/ban-ts-comment": 0, "@typescript-eslint/explicit-function-return-type": 0, - "sort-imports-es6-autofix/sort-imports-es6": [2, { - "ignoreCase": false, - "ignoreMemberSort": false, - "memberSyntaxSortOrder": ["none", "all", "multiple", "single"] - }], + "@typescript-eslint/explicit-module-boundary-types": 0, + "sort-imports": "off", + "import/order": "off", + "simple-import-sort/imports": "error", + "simple-import-sort/exports": "error", "prettier/prettier": ["error"] } } diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000..bcb4d5fa3 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +github: [ferdikoomen] diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000..456d1d9ed --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,11 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: ferdikoomen + +--- + +**Describe the bug** +A clear and concise description of what the bug is. Ideally with a screenshot of the result or a link to a small example. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 000000000..902bbe4b2 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,11 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. Ideally with a small example of the proposed changes. diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..77d50f37b --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,22 @@ +version: 2 +updates: +- package-ecosystem: npm + directory: "/" + schedule: + interval: "daily" + ignore: + - dependency-name: "@types/node-fetch" + - dependency-name: "node-fetch" + - dependency-name: "camelcase" + - dependency-name: "@angular-devkit/build-angular" + - dependency-name: "@angular/animations" + - dependency-name: "@angular/cli" + - dependency-name: "@angular/common" + - dependency-name: "@angular/compiler" + - dependency-name: "@angular/compiler-cli" + - dependency-name: "@angular/core" + - dependency-name: "@angular/forms" + - dependency-name: "@angular/platform-browser" + - dependency-name: "@angular/platform-browser-dynamic" + - dependency-name: "@angular/router" + - dependency-name: "typescript" \ No newline at end of file diff --git a/.github/workflows/auto-merge.yml b/.github/workflows/auto-merge.yml new file mode 100644 index 000000000..5d5d5301d --- /dev/null +++ b/.github/workflows/auto-merge.yml @@ -0,0 +1,29 @@ +name: auto-merge + +on: pull_request_target + +permissions: + pull-requests: write + contents: write + +jobs: + dependabot: + runs-on: ubuntu-latest + if: ${{ github.actor == 'dependabot[bot]' }} + steps: + - name: Fetch Dependabot metadata + id: dependabot-metadata + uses: dependabot/fetch-metadata@v1 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + - name: Approve PR + run: gh pr review --approve "$PR_URL" + env: + PR_URL: ${{ github.event.pull_request.html_url }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Merge PR + if: ${{ steps.dependabot-metadata.outputs.update-type != 'version-update:semver-major' }} + run: gh pr merge --auto --squash "$PR_URL" + env: + PR_URL: ${{ github.event.pull_request.html_url }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 000000000..57cfed82c --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,41 @@ +name: "CodeQL" + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + schedule: + - cron: "44 20 * * 3" + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ javascript ] + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: ${{ matrix.language }} + queries: +security-and-quality + + - name: Autobuild + uses: github/codeql-action/autobuild@v2 + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 + with: + category: "/language:${{ matrix.language }}" diff --git a/.gitignore b/.gitignore index 945397b5d..2b7422568 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,8 @@ junit.xml *.iml dist coverage -test/result +test/generated +test/e2e/generated +samples/generated +samples/swagger-codegen-cli-v2.jar +samples/swagger-codegen-cli-v3.jar diff --git a/.licrc b/.licrc new file mode 100644 index 000000000..7dad857d8 --- /dev/null +++ b/.licrc @@ -0,0 +1,20 @@ +[licenses] +accepted = [ + "MIT", + "BSD", + "0BSD", + "BSD-2-Clause", + "BSD-3-Clause", + "Apache-2.0", + "CC-BY-3.0", + "CC-BY-4.0", + "CC0-1.0", + "ISC" +] + +[dependencies] +ignored = [] + +[behavior] +run_only_on_dependency_modification = true +do_not_block_pr = true \ No newline at end of file diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index c24b7182d..000000000 --- a/.prettierignore +++ /dev/null @@ -1 +0,0 @@ -src/templates diff --git a/.prettierrc.json b/.prettierrc.json index 681dbab37..d7d68f56b 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -2,6 +2,7 @@ "semi": true, "singleQuote": true, "trailingComma": "es5", - "printWidth": 500, + "arrowParens": "avoid", + "printWidth": 120, "tabWidth": 4 } diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index c11c12763..000000000 --- a/.travis.yml +++ /dev/null @@ -1,6 +0,0 @@ -language: node_js -node_js: - - node -script: - - npm run build - - npm run test diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..08dca43b1 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,138 @@ +# Changelog +All notable changes to this project will be documented in this file. + +## [0.29.0] - 2024-04-05 +> Please migrate your projects to use [@hey-api/openapi-ts](https://github.com/hey-api/openapi-ts) + +The `@hey-api/openapi-ts` +project started as a fork with the goal to resolve the most pressing issues. going forward they are planning to +maintain the OpenAPI generator and give it the love it deserves. Please support them with their work and make +sure to migrate your projects: https://heyapi.vercel.app/openapi-ts/migrating.html + +### Fixed +- Upgraded dependencies + + +## [0.28.0] - 2024-03-19 +### Fixed +- Upgraded dependencies +- Windows issue when resolving external spec files +- Media-type for falsy bodies except 'undefined' +- Updated typo in generated header +### Added +- Enabled `withXSRFToken` for Axios + +## [0.27.0] - 2024-01-15 +### Fixed +- Reverted `@apidevtools/json-schema-ref-parser` to version 10.1.0 + +## [0.26.0] - 2024-01-07 +### Fixed +- Upgraded dependencies + +## [0.25.0] - 2023-07-05 +### Fixed +- Upgraded dependencies +### Added +- Allow usage of a custom axios instance +- Added message in generated files + +## [0.24.0] - 2023-04-10 +### Fixed +- Upgraded dependencies +- Fixed issue with Cancelable promise +- Fixed issue with escaping reserved keywords in schema names +### Added +- Added `--postfixModels` option + +## [0.23.0] - 2022-06-02 +### Fixed +- Upgraded dependencies +- Added blank line at the end of generated files +- Added support for Node.js v12 +### Added +- Added `request` property inside `ApiError` +- Added support for `@depricated` inside models and operations + +## [0.22.0] - 2022-04-26 +### Fixed +- Upgraded dependencies +- Fixed issue with `null` value inside comments for OpenAPI v2 enums +- Fixed issue with compatibility for latest version of Axios (0.27.x) +### Removed +- Removed deprecated enum model generation + +## [0.21.0] - 2022-04-06 +### Fixed +- Return `undefined` to match `noImplicitReturns` rule +- Made `BaseHttpRequest` class abstract +- Removed private fields using `#` inside `CancelablePromise` +- Removed unneeded import `AbortController` from `node-fetch` client +- Filter out wrong enum values + +## [0.20.1] - 2022-02-25 +### Fixed +- Support enums with single quotes in names for V2 + +## [0.20.0] - 2022-02-25 +### Fixed +- Updated dependencies +- Support enums with single quotes in names for V3 +- Generating better names when `operationId` is not given (breaking change) +- Fixed issue where `x-enum` flags where breaking due to non-string values + +## [0.19.0] - 2022-02-02 +### Added +- Support for Angular client with `--name` option +- Added test cases for Angular client + +## [0.18.2] - 2022-02-02 +### Fixed +- Updated dependencies +- Fixed type definition +### Added +- Added test cases for CLI commands +- Added test cases for query parsing + +## [0.18.1] - 2022-01-31 +### Fixed +- Escaping error description +- Made `Client.request` and `BaseHttpRequest.config` props public + +_## [0.18.0] - 2022-01-28 +### Added +- Angular client generation! +- Updated documentation with more examples and better descriptions + +## [0.17.0] - 2022-01-26 +### Fixed +- Shorthand notation for properties passed through constructor +- Simplified creation of headers +- Prepare codebase for Angular client + +## [0.16.2] - 2022-01-26 +### Fixed +- Removed dependency on `URLSearchParams` to support browser and node without any additional imports + +## [0.16.1] - 2022-01-26 +### Fixed +- Correct export inside `index.ts` when giving a custom name + +## [0.16.0] - 2022-01-25 +### Added +- Added option to set the indentation (spaces and tabs) +- Added option to export separate client file that allows usage for multiple backends +### Fixed +- Decoupled OpenAPI object from requests +- Updated dependencies + +## [0.15.0] - 2022-01-24 +### Added +- Added change log and releases on GitHub + +## [0.14.0] - 2022-01-24 +### Fixed +- Added missing `postfix` options to typedef +- Updated escaping of comments and descriptions +- Better handling of services without tags +- Updated dependencies diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..1fb77fa97 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at info@madebyferdi.com. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..6458ae721 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,31 @@ +# Contributing to Webpack Typings for JSON + +Thanks for your interest in contributing to this project. + +## Pull Request guidelines + +Before working on a Pull Request, create an issue explaining what you want to contribute. +This ensures that your pull request won't go unnoticed, and that you are not contributing +something that is not suitable for the project. + +If you are unfamiliar with GitHub Pull Requests, please read the following documentation: +https://help.github.com/articles/using-pull-requests + +**Your Pull Request must:** + +* Address a single issue or add a single item of functionality. +* Contain a clean history of small, incremental, logically separate commits, with no merge commits. +* Use clear commit messages. +* Be possible to merge automatically. + +## Submitting a Pull Request + +1. Make your changes in a new git branch: `git checkout -b my-fix-branch main` +2. Create your patch or feature +3. Ensure the builds work by running: `npm run build` +4. Ensure the tests will pass by running: `npm run test` +5. Ensure the code is formatted by running: `npm run eslint:fix` +6. Commit your changes using a descriptive commit message + +After your Pull Request is created, it will automatically be build using Circle CI. +When the build is successful then the Pull Request is ready for review. diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..32f7eb32c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,7 @@ +FROM node:alpine +WORKDIR /usr/src/openapi +COPY . /usr/src/openapi +RUN npm install +RUN npm run release +ENTRYPOINT [ "node", "/usr/src/openapi/bin/index.js" ] +CMD "--help" diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..9811f4b07 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) Ferdi Koomen + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 2232ef71f..b4de6b4a4 100644 --- a/README.md +++ b/README.md @@ -1,63 +1,100 @@ -# OpenAPI Typescript Codegen +# Important announcement + +> [!IMPORTANT] +> Please migrate your projects to use [@hey-api/openapi-ts](https://github.com/hey-api/openapi-ts) + +Due to time limitations on my end, this project has been unmaintained for a while now. The `@hey-api/openapi-ts` +project started as a fork with the goal to resolve the most pressing issues. going forward they are planning to +maintain the OpenAPI generator and give it the love it deserves. Please support them with their work and make +sure to migrate your projects: https://heyapi.dev/openapi-ts/migrating.html#openapi-typescript-codegen -[![NPM](https://badgen.net/npm/v/openapi-typescript-codegen)](https://www.npmjs.com/package/openapi-typescript-codegen) -[![License](https://badgen.net/npm/license/openapi-typescript-codegen)](https://www.npmjs.com/package/openapi-typescript-codegen) -[![Build Status](https://badgen.net/travis/ferdikoomen/openapi-typescript-codegen/master)](https://travis-ci.org/ferdikoomen/openapi-typescript-codegen) -[![Quality](https://badgen.net/lgtm/grade/javascript/g/ferdikoomen/openapi-typescript-codegen)](https://lgtm.com/projects/g/ferdikoomen/openapi-typescript-codegen) +- All open PR's and issues will be archived on the 1st of May 2024 +- All versions of this package will be deprecated in NPM -> NodeJS library that generates Typescript or Javascript clients based on the OpenAPI specification. +👋 Thanks for all the support, downloads and love! Cheers Ferdi. -#### Why? -- Frontend ❤️ OpenAPI, but we do not want to use JAVA codegen in our builds. -- Quick, lightweight, robust and framework agnostic. -- Supports generation of Typescript and Javascript clients. -- Supports generations of fetch and XHR http clients. -- Supports OpenAPI specification v2.0 and v3.0. -- Supports JSON and YAML files for input. +--- + +# OpenAPI Typescript Codegen +[![NPM][npm-image]][npm-url] +[![License][license-image]][license-url] +[![Downloads][downloads-image]][downloads-url] +[![Build][build-image]][build-url] -## Known issues: -- If you use enums inside your models / definitions then those enums are now - inside a namespace with the same name as your model. This is called declaration - merging. However Babel 7 now support compiling of Typescript and right now they - do not support namespaces. +> Node.js library that generates Typescript clients based on the OpenAPI specification. +## Why? +- Frontend ❤️ OpenAPI, but we do not want to use JAVA codegen in our builds +- Quick, lightweight, robust and framework-agnostic 🚀 +- Supports generation of TypeScript clients +- Supports generations of Fetch, Node-Fetch, Axios, Angular and XHR http clients +- Supports OpenAPI specification v2.0 and v3.0 +- Supports JSON and YAML files for input +- Supports generation through CLI, Node.js and NPX +- Supports tsc and @babel/plugin-transform-typescript +- Supports aborting of requests (cancelable promise pattern) +- Supports external references using [json-schema-ref-parser](https://github.com/APIDevTools/json-schema-ref-parser/) -## Installation +## Install ``` npm install openapi-typescript-codegen --save-dev ``` -## Example +## Usage -**package.json** -```json -{ - "scripts": { - "generate": "openapi ./api/openapi.json ./dist" - } - ... -} +``` +$ openapi --help + + Usage: openapi [options] + + Options: + -V, --version output the version number + -i, --input OpenAPI specification, can be a path, url or string content (required) + -o, --output Output directory (required) + -c, --client HTTP client to generate [fetch, xhr, node, axios, angular] (default: "fetch") + --name Custom client class name + --useOptions Use options instead of arguments + --useUnionTypes Use union types instead of enums + --exportCore Write core files to disk (default: true) + --exportServices Write services to disk (default: true) + --exportModels Write models to disk (default: true) + --exportSchemas Write schemas to disk (default: false) + --indent Indentation options [4, 2, tab] (default: "4") + --postfixServices Service name postfix (default: "Service") + --postfixModels Model name postfix + --request Path to custom request file + -h, --help display help for command + + Examples + $ openapi --input ./spec.json --output ./generated + $ openapi --input ./spec.json --output ./generated --client xhr ``` -Command line +Documentation +=== -``` -npm install openapi-typescript-codegen -g +The main documentation can be found in the [openapi-typescript-codegen/wiki](https://github.com/ferdikoomen/openapi-typescript-codegen/wiki) -openapi ./api/openapi.json ./dist -``` +Sponsors +=== -NodeJS API: +If you or your company use the OpenAPI Typescript Codegen, please consider supporting me. By sponsoring I can free up time to give this project some love! Details can be found here: https://github.com/sponsors/ferdikoomen -``` -const OpenAPI = require('openapi-typescript-codegen'); +If you're from an enterprise looking for a fully managed SDK generation, please consider our sponsor: -const result = OpenAPI.generate( - './api/openapi.json', - './dist' -); + + speakeasy + -console.log(result); -``` +[npm-url]: https://npmjs.org/package/openapi-typescript-codegen +[npm-image]: https://img.shields.io/npm/v/openapi-typescript-codegen.svg +[license-url]: LICENSE +[license-image]: http://img.shields.io/npm/l/openapi-typescript-codegen.svg +[coverage-url]: https://codecov.io/gh/ferdikoomen/openapi-typescript-codegen +[coverage-image]: https://img.shields.io/codecov/c/github/ferdikoomen/openapi-typescript-codegen.svg +[downloads-url]: http://npm-stat.com/charts.html?package=openapi-typescript-codegen +[downloads-image]: http://img.shields.io/npm/dm/openapi-typescript-codegen.svg +[build-url]: https://circleci.com/gh/ferdikoomen/openapi-typescript-codegen/tree/main +[build-image]: https://circleci.com/gh/ferdikoomen/openapi-typescript-codegen/tree/main.svg?style=svg diff --git a/babel.config.json b/babel.config.json new file mode 100644 index 000000000..d452c89bd --- /dev/null +++ b/babel.config.json @@ -0,0 +1,18 @@ +{ + "presets": [ + [ + "@babel/preset-env", + { + "targets": { + "node": "12" + } + } + ], + [ + "@babel/preset-typescript", + { + "onlyRemoveTypeImports": true + } + ] + ] +} diff --git a/bin/index.js b/bin/index.js index 77a913eed..32f2fecbc 100755 --- a/bin/index.js +++ b/bin/index.js @@ -3,24 +3,54 @@ 'use strict'; const path = require('path'); -const program = require('commander'); +const { program } = require('commander'); const pkg = require('../package.json'); -program +const params = program + .name('openapi') + .usage('[options]') .version(pkg.version) - .option('--input [value]', 'Path to swagger specification', './spec.json') - .option('--output [value]', 'Output directory', './generated') - .option('--language', 'Language to generate [typescript, javascript]', 'typescript') - .option('--http-client', 'HTTP client to generate [fetch, xhr]', 'fetch') - .parse(process.argv); + .requiredOption('-i, --input ', 'OpenAPI specification, can be a path, url or string content (required)') + .requiredOption('-o, --output ', 'Output directory (required)') + .option('-c, --client ', 'HTTP client to generate [fetch, xhr, node, axios, angular]', 'fetch') + .option('--name ', 'Custom client class name') + .option('--useOptions', 'Use options instead of arguments') + .option('--useUnionTypes', 'Use union types instead of enums') + .option('--exportCore ', 'Write core files to disk', true) + .option('--exportServices ', 'Write services to disk', true) + .option('--exportModels ', 'Write models to disk', true) + .option('--exportSchemas ', 'Write schemas to disk', false) + .option('--indent ', 'Indentation options [4, 2, tabs]', '4') + .option('--postfixServices ', 'Service name postfix', 'Service') + .option('--postfixModels ', 'Model name postfix') + .option('--request ', 'Path to custom request file') + .parse(process.argv) + .opts(); -const SwaggerCodegen = require(path.resolve(__dirname, '../dist/index.js')); +const OpenAPI = require(path.resolve(__dirname, '../dist/index.js')); -if (SwaggerCodegen) { - SwaggerCodegen.generate( - program.input, - program.output, - program.language, - program.httpClient - ); +if (OpenAPI) { + OpenAPI.generate({ + input: params.input, + output: params.output, + httpClient: params.client, + clientName: params.name, + useOptions: params.useOptions, + useUnionTypes: params.useUnionTypes, + exportCore: JSON.parse(params.exportCore) === true, + exportServices: JSON.parse(params.exportServices) === true, + exportModels: JSON.parse(params.exportModels) === true, + exportSchemas: JSON.parse(params.exportSchemas) === true, + indent: params.indent, + postfixServices: params.postfixServices, + postfixModels: params.postfixModels, + request: params.request, + }) + .then(() => { + process.exit(0); + }) + .catch(error => { + console.error(error); + process.exit(1); + }); } diff --git a/bin/index.spec.js b/bin/index.spec.js new file mode 100755 index 000000000..6030c07c8 --- /dev/null +++ b/bin/index.spec.js @@ -0,0 +1,72 @@ +const crossSpawn = require('cross-spawn'); + +describe('bin', () => { + it('it should support minimal params', async () => { + const result = crossSpawn.sync('node', [ + './bin/index.js', + '--input', + './test/spec/v3.json', + '--output', + './test/generated/bin', + ]); + expect(result.stdout.toString()).toBe(''); + expect(result.stderr.toString()).toBe(''); + }); + + it('it should support all params', async () => { + const result = crossSpawn.sync('node', [ + './bin/index.js', + '--input', + './test/spec/v3.json', + '--output', + './test/generated/bin', + '--client', + 'fetch', + '--useOptions', + '--useUnionTypes', + '--exportCore', + 'true', + '--exportServices', + 'true', + '--exportModels', + 'true', + '--exportSchemas', + 'true', + '--indent', + '4', + '--postfixServices', + 'Service', + '--postfixModels', + 'Dto', + ]); + expect(result.stdout.toString()).toBe(''); + expect(result.stderr.toString()).toBe(''); + }); + + it('it should throw error without params', async () => { + const result = crossSpawn.sync('node', ['./bin/index.js']); + expect(result.stdout.toString()).toBe(''); + expect(result.stderr.toString()).toContain(`error: required option '-i, --input ' not specified`); + }); + + it('it should throw error with wrong params', async () => { + const result = crossSpawn.sync('node', [ + './bin/index.js', + '--input', + './test/spec/v3.json', + '--output', + './test/generated/bin', + '--unknown', + ]); + expect(result.stdout.toString()).toBe(''); + expect(result.stderr.toString()).toContain(`error: unknown option '--unknown'`); + }); + + it('it should display help', async () => { + const result = crossSpawn.sync('node', ['./bin/index.js', '--help']); + expect(result.stdout.toString()).toContain(`Usage: openapi [options]`); + expect(result.stdout.toString()).toContain(`-i, --input `); + expect(result.stdout.toString()).toContain(`-o, --output `); + expect(result.stderr.toString()).toBe(''); + }); +}); diff --git a/jest.config.js b/jest.config.js deleted file mode 100644 index 2e06763f4..000000000 --- a/jest.config.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - testRegex: '\\.spec\\.(ts|js)$', - testEnvironment: 'node' -}; diff --git a/jest.config.ts b/jest.config.ts new file mode 100644 index 000000000..af04ee15d --- /dev/null +++ b/jest.config.ts @@ -0,0 +1,43 @@ +import type { Config } from '@jest/types'; + +const config: Config.InitialOptions = { + projects: [ + { + displayName: 'UNIT', + testEnvironment: 'node', + testMatch: ['/src/**/*.spec.ts', '/test/index.spec.ts', '/bin/index.spec.js'], + moduleFileExtensions: ['js', 'ts', 'd.ts'], + moduleNameMapper: { + '\\.hbs$': '/src/templates/__mocks__/index.ts', + }, + }, + { + displayName: 'E2E', + testEnvironment: 'node', + testMatch: [ + '/test/e2e/v2.fetch.spec.ts', + '/test/e2e/v2.xhr.spec.ts', + '/test/e2e/v2.node.spec.ts', + '/test/e2e/v2.axios.spec.ts', + '/test/e2e/v2.babel.spec.ts', + '/test/e2e/v2.angular.spec.ts', + '/test/e2e/v3.fetch.spec.ts', + '/test/e2e/v3.xhr.spec.ts', + '/test/e2e/v3.node.spec.ts', + '/test/e2e/v3.axios.spec.ts', + '/test/e2e/v3.babel.spec.ts', + '/test/e2e/v3.angular.spec.ts', + '/test/e2e/client.fetch.spec.ts', + '/test/e2e/client.xhr.spec.ts', + '/test/e2e/client.node.spec.ts', + '/test/e2e/client.axios.spec.ts', + '/test/e2e/client.babel.spec.ts', + '/test/e2e/client.angular.spec.ts', + ], + modulePathIgnorePatterns: ['/test/e2e/generated'], + }, + ], + collectCoverageFrom: ['/src/**/*.ts', '!/src/**/*.d.ts', '!/bin', '!/dist'], +}; + +export default config; diff --git a/logo.png b/logo.png deleted file mode 100644 index c63a3eea9..000000000 Binary files a/logo.png and /dev/null differ diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..46322e56f --- /dev/null +++ b/package-lock.json @@ -0,0 +1,19721 @@ +{ + "name": "openapi-typescript-codegen", + "version": "0.29.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "openapi-typescript-codegen", + "version": "0.29.0", + "license": "MIT", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^11.5.4", + "camelcase": "^6.3.0", + "commander": "^12.0.0", + "fs-extra": "^11.2.0", + "handlebars": "^4.7.8" + }, + "bin": { + "openapi": "bin/index.js" + }, + "devDependencies": { + "@angular-devkit/build-angular": "20.0.1", + "@angular/animations": "17.3.3", + "@angular/cli": "17.3.3", + "@angular/common": "17.3.3", + "@angular/compiler": "17.3.3", + "@angular/compiler-cli": "17.3.3", + "@angular/core": "17.3.3", + "@angular/forms": "17.3.3", + "@angular/platform-browser": "17.3.3", + "@angular/platform-browser-dynamic": "17.3.3", + "@angular/router": "17.3.3", + "@babel/cli": "7.24.8", + "@babel/core": "7.26.7", + "@babel/preset-env": "7.26.0", + "@babel/preset-typescript": "7.24.7", + "@rollup/plugin-commonjs": "25.0.8", + "@rollup/plugin-node-resolve": "15.2.3", + "@rollup/plugin-terser": "^0.4.4", + "@rollup/plugin-typescript": "11.1.6", + "@types/cross-spawn": "6.0.6", + "@types/express": "4.17.21", + "@types/fs-extra": "^11.0.4", + "@types/glob": "8.1.0", + "@types/jest": "29.5.12", + "@types/node": "20.14.10", + "@types/node-fetch": "2.6.11", + "@types/qs": "6.9.15", + "@typescript-eslint/eslint-plugin": "7.16.0", + "@typescript-eslint/parser": "7.18.0", + "abort-controller": "3.0.0", + "axios": "1.8.2", + "codecov": "3.8.3", + "cross-spawn": "7.0.3", + "eslint": "8.57.0", + "eslint-config-prettier": "9.1.0", + "eslint-plugin-prettier": "5.1.3", + "eslint-plugin-simple-import-sort": "12.1.1", + "express": "4.21.1", + "form-data": "4.0.4", + "glob": "10.4.3", + "jest": "29.7.0", + "jest-cli": "29.7.0", + "node-fetch": "2.7.0", + "prettier": "3.4.1", + "puppeteer": "22.14.0", + "qs": "6.12.3", + "rimraf": "5.0.8", + "rollup": "4.14.0", + "rxjs": "7.8.1", + "ts-node": "10.9.2", + "tslib": "2.6.3", + "typescript": "5.4.4", + "zone.js": "0.15.0" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@angular-devkit/architect": { + "version": "0.1703.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1703.3.tgz", + "integrity": "sha512-BKbdigCjmspqxOxSIQuWgPZzpyuKqZoTBDh0jDeLcAmvPsuxCgIWbsExI4OQ0CyusnQ+XT0IT39q8B9rvF56cg==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "17.3.3", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-angular": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-20.0.1.tgz", + "integrity": "sha512-rUrGwdqUNOy6AlisBjOaQncZOanwqgHIa6HDw9a0nrbQxDpLzwJAiNLGcmIivfvAXxSq60+YFHHM48VV42oxyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.2000.1", + "@angular-devkit/build-webpack": "0.2000.1", + "@angular-devkit/core": "20.0.1", + "@angular/build": "20.0.1", + "@babel/core": "7.27.1", + "@babel/generator": "7.27.1", + "@babel/helper-annotate-as-pure": "7.27.1", + "@babel/helper-split-export-declaration": "7.24.7", + "@babel/plugin-transform-async-generator-functions": "7.27.1", + "@babel/plugin-transform-async-to-generator": "7.27.1", + "@babel/plugin-transform-runtime": "7.27.1", + "@babel/preset-env": "7.27.2", + "@babel/runtime": "7.27.1", + "@discoveryjs/json-ext": "0.6.3", + "@ngtools/webpack": "20.0.1", + "@vitejs/plugin-basic-ssl": "2.0.0", + "ansi-colors": "4.1.3", + "autoprefixer": "10.4.21", + "babel-loader": "10.0.0", + "browserslist": "^4.21.5", + "copy-webpack-plugin": "13.0.0", + "css-loader": "7.1.2", + "esbuild-wasm": "0.25.5", + "fast-glob": "3.3.3", + "http-proxy-middleware": "3.0.5", + "istanbul-lib-instrument": "6.0.3", + "jsonc-parser": "3.3.1", + "karma-source-map-support": "1.4.0", + "less": "4.3.0", + "less-loader": "12.3.0", + "license-webpack-plugin": "4.0.2", + "loader-utils": "3.3.1", + "mini-css-extract-plugin": "2.9.2", + "open": "10.1.2", + "ora": "8.2.0", + "picomatch": "4.0.2", + "piscina": "5.0.0", + "postcss": "8.5.3", + "postcss-loader": "8.1.1", + "resolve-url-loader": "5.0.0", + "rxjs": "7.8.2", + "sass": "1.88.0", + "sass-loader": "16.0.5", + "semver": "7.7.2", + "source-map-loader": "5.0.0", + "source-map-support": "0.5.21", + "terser": "5.39.1", + "tree-kill": "1.2.2", + "tslib": "2.8.1", + "webpack": "5.99.8", + "webpack-dev-middleware": "7.4.2", + "webpack-dev-server": "5.2.1", + "webpack-merge": "6.0.1", + "webpack-subresource-integrity": "5.1.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "esbuild": "0.25.5" + }, + "peerDependencies": { + "@angular/compiler-cli": "^20.0.0", + "@angular/core": "^20.0.0", + "@angular/localize": "^20.0.0", + "@angular/platform-browser": "^20.0.0", + "@angular/platform-server": "^20.0.0", + "@angular/service-worker": "^20.0.0", + "@angular/ssr": "^20.0.1", + "@web/test-runner": "^0.20.0", + "browser-sync": "^3.0.2", + "jest": "^29.5.0", + "jest-environment-jsdom": "^29.5.0", + "karma": "^6.3.0", + "ng-packagr": "^20.0.0", + "protractor": "^7.0.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "typescript": ">=5.8 <5.9" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true + }, + "@angular/localize": { + "optional": true + }, + "@angular/platform-browser": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "@angular/ssr": { + "optional": true + }, + "@web/test-runner": { + "optional": true + }, + "browser-sync": { + "optional": true + }, + "jest": { + "optional": true + }, + "jest-environment-jsdom": { + "optional": true + }, + "karma": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "protractor": { + "optional": true + }, + "tailwindcss": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/architect": { + "version": "0.2000.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2000.1.tgz", + "integrity": "sha512-EcOGU1xEhARYpDF391VaeUg/+YRym9OxzJMcc0rSHl3YLK8/m+24ap2YAQY5N7n9+mmEqHVu/q31ldFpOoMCTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "20.0.1", + "rxjs": "7.8.2" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.0.1.tgz", + "integrity": "sha512-Ilafyj8JVwq3NZsaiGw5UDkP4EAkGKiEvZ4TC3WVidZbM4EpKt9/Jd7ZpsTRGDLG429U+fGhay+ZQeCFGqy5rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", + "rxjs": "7.8.2", + "source-map": "0.7.4" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@angular/build": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.0.1.tgz", + "integrity": "sha512-m/0jtXIeOaoU/WXtMLRuvq7UaGRxNHpoRKVVoJrifvZuNBYGM4e2lzxlIlo8kiQhPpZQc0zcAMoosbmzKKdkUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.2000.1", + "@babel/core": "7.27.1", + "@babel/helper-annotate-as-pure": "7.27.1", + "@babel/helper-split-export-declaration": "7.24.7", + "@inquirer/confirm": "5.1.10", + "@vitejs/plugin-basic-ssl": "2.0.0", + "beasties": "0.3.4", + "browserslist": "^4.23.0", + "esbuild": "0.25.5", + "https-proxy-agent": "7.0.6", + "istanbul-lib-instrument": "6.0.3", + "jsonc-parser": "3.3.1", + "listr2": "8.3.3", + "magic-string": "0.30.17", + "mrmime": "2.0.1", + "parse5-html-rewriting-stream": "7.1.0", + "picomatch": "4.0.2", + "piscina": "5.0.0", + "rollup": "4.40.2", + "sass": "1.88.0", + "semver": "7.7.2", + "source-map-support": "0.5.21", + "tinyglobby": "0.2.13", + "vite": "6.3.5", + "watchpack": "2.4.2" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "lmdb": "3.3.0" + }, + "peerDependencies": { + "@angular/compiler": "^20.0.0", + "@angular/compiler-cli": "^20.0.0", + "@angular/core": "^20.0.0", + "@angular/localize": "^20.0.0", + "@angular/platform-browser": "^20.0.0", + "@angular/platform-server": "^20.0.0", + "@angular/service-worker": "^20.0.0", + "@angular/ssr": "^20.0.1", + "karma": "^6.4.0", + "less": "^4.2.0", + "ng-packagr": "^20.0.0", + "postcss": "^8.4.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "tslib": "^2.3.0", + "typescript": ">=5.8 <5.9", + "vitest": "^3.1.1" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true + }, + "@angular/localize": { + "optional": true + }, + "@angular/platform-browser": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "@angular/ssr": { + "optional": true + }, + "karma": { + "optional": true + }, + "less": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tailwindcss": { + "optional": true + }, + "vitest": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@angular/compiler": { + "version": "20.0.2", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.0.2.tgz", + "integrity": "sha512-BJYXGUZaY9awYvgt0w9TDq73A1+m8W5eMRn/krWeQcfWakwTgs27BSxmhfJhD45KrMrky5yxAvGgqSfMKrLeng==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@babel/core": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz", + "integrity": "sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.1", + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helpers": "^7.27.1", + "@babel/parser": "^7.27.1", + "@babel/template": "^7.27.1", + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@babel/preset-env": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.2.tgz", + "integrity": "sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.27.1", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.27.1", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.27.1", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.27.1", + "@babel/plugin-transform-classes": "^7.27.1", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.27.1", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.27.2", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.1", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.27.1", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.40.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@ngtools/webpack": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-20.0.1.tgz", + "integrity": "sha512-uTLeN/k+CWHMbgc7XLp0Kfs9ozNoFdsgMi+no9ygegrakGgt/CzCU1JL0VbdnFQwqPc/mDYe7S/+aDWsce8TuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^20.0.0", + "typescript": ">=5.8 <5.9", + "webpack": "^5.54.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular-devkit/build-angular/node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular-devkit/build-angular/node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular-devkit/build-angular/node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/open": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.2.tgz", + "integrity": "sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/tinyglobby": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", + "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@angular-devkit/build-webpack": { + "version": "0.2000.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.2000.1.tgz", + "integrity": "sha512-v+A08zOUC3wrP9msN2+qrAaKnDEKi9H1o5bYOe/yH9S8ZXZ56R/r5EsY58Vcf6yQSywRDip2HJnPDtIGkQYnew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/architect": "0.2000.1", + "rxjs": "7.8.2" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "webpack": "^5.30.0", + "webpack-dev-server": "^5.0.2" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/architect": { + "version": "0.2000.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2000.1.tgz", + "integrity": "sha512-EcOGU1xEhARYpDF391VaeUg/+YRym9OxzJMcc0rSHl3YLK8/m+24ap2YAQY5N7n9+mmEqHVu/q31ldFpOoMCTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "20.0.1", + "rxjs": "7.8.2" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/core": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.0.1.tgz", + "integrity": "sha512-Ilafyj8JVwq3NZsaiGw5UDkP4EAkGKiEvZ4TC3WVidZbM4EpKt9/Jd7ZpsTRGDLG429U+fGhay+ZQeCFGqy5rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", + "rxjs": "7.8.2", + "source-map": "0.7.4" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular-devkit/build-webpack/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@angular-devkit/core": { + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.3.tgz", + "integrity": "sha512-J22Sh3M7rj8Ar3iEs20ko5wgC3DE7vWfYZNdimt2IJiS4J7BEX8R3Awf+TRt+6AN3NFm3/xe1Sz4yvDh3FvNFg==", + "dev": true, + "dependencies": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.1", + "picomatch": "4.0.1", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/schematics": { + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.3.3.tgz", + "integrity": "sha512-SABqTtj2im4PJhQjNaAsSypbNkpZFW8YozJ3P748tlh5a9XoHpgiqXv5JhRbyKElLDAyk5i9fe2++JmSudPG/Q==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "17.3.3", + "jsonc-parser": "3.2.1", + "magic-string": "0.30.8", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/animations": { + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.3.3.tgz", + "integrity": "sha512-poLW3FHe5wkxmTIsQ3em2vq4obgQHyZJz6biF+4hCqQSNMbMBS0e5ZycAiJLkUD/WLc88lQZ20muRO7qjVuMLA==", + "dev": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/core": "17.3.3" + } + }, + "node_modules/@angular/cli": { + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.3.3.tgz", + "integrity": "sha512-veIGK2sRm0SfiLHeftx0W0xC3N8uxoqxXiSG57V6W2wIFN/fKm3aRq3sa8phz7vxUzoKGqyZh6hsT7ybkjgkGA==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1703.3", + "@angular-devkit/core": "17.3.3", + "@angular-devkit/schematics": "17.3.3", + "@schematics/angular": "17.3.3", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.3", + "ini": "4.1.2", + "inquirer": "9.2.15", + "jsonc-parser": "3.2.1", + "npm-package-arg": "11.0.1", + "npm-pick-manifest": "9.0.0", + "open": "8.4.2", + "ora": "5.4.1", + "pacote": "17.0.6", + "resolve": "1.22.8", + "semver": "7.6.0", + "symbol-observable": "4.0.0", + "yargs": "17.7.2" + }, + "bin": { + "ng": "bin/ng.js" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/common": { + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.3.3.tgz", + "integrity": "sha512-GwlKetNpfWKiG2j4S6bYTi6PA2iT4+eln7o8owo44xZWdQnWQjfxnH39vQuCyhi6OOQL1dozmae+fVXgQsV6jQ==", + "dev": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/core": "17.3.3", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/compiler": { + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.3.3.tgz", + "integrity": "sha512-ZNMRfagMxMjk1KW5H3ssCg5QL0J6ZW1JAZ1mrTXixqS7gbdwl60bTGE+EfuEwbjvovEYaj4l9cga47eMaxZTbQ==", + "dev": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/core": "17.3.3" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true + } + } + }, + "node_modules/@angular/compiler-cli": { + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.3.3.tgz", + "integrity": "sha512-vM0lqwuXQZ912HbLnIuvUblvIz2WEUsU7a5Z2ieNey6famH4zxPH12vCbVwXgicB6GLHorhOfcWC5443wD2mJw==", + "dev": true, + "dependencies": { + "@babel/core": "7.23.9", + "@jridgewell/sourcemap-codec": "^1.4.14", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "reflect-metadata": "^0.2.0", + "semver": "^7.0.0", + "tslib": "^2.3.0", + "yargs": "^17.2.1" + }, + "bin": { + "ng-xi18n": "bundles/src/bin/ng_xi18n.js", + "ngc": "bundles/src/bin/ngc.js", + "ngcc": "bundles/ngcc/index.js" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/compiler": "17.3.3", + "typescript": ">=5.2 <5.5" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", + "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@angular/core": { + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.3.3.tgz", + "integrity": "sha512-O/jr3aFJMCxF6Jmymjx4jIigRHJfqM/ALIi60y2LVznBVFkk9xyMTsAjgWQIEHX+2muEIzgfKuXzpL0y30y+wA==", + "dev": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.14.0" + } + }, + "node_modules/@angular/forms": { + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.3.3.tgz", + "integrity": "sha512-wqn+eAggbOZY91hr7oDjv5qdflszVOC9SZMcWJUoZTGn+8eoV6v6728GDFuDDwYkKQ9G9eQbX4IZmYoVw3TVjQ==", + "dev": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/common": "17.3.3", + "@angular/core": "17.3.3", + "@angular/platform-browser": "17.3.3", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/platform-browser": { + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.3.3.tgz", + "integrity": "sha512-XFWjquD+Pr9VszRzrDlT6uaf57TsY9XhL9iHCNok6Op5DpVQpIAuw1vFt2t5ZoQ0gv+lY8mVWnxgqe3CgTdYxw==", + "dev": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/animations": "17.3.3", + "@angular/common": "17.3.3", + "@angular/core": "17.3.3" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } + } + }, + "node_modules/@angular/platform-browser-dynamic": { + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.3.3.tgz", + "integrity": "sha512-jSgSNHRTXCIat20I+4tLm/e8qOvrIE3Zv7S/DtYZEiAth84uoznvo1kXnN+KREse2vP/WoNgSDKQ2JLzkwYXSQ==", + "dev": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/common": "17.3.3", + "@angular/compiler": "17.3.3", + "@angular/core": "17.3.3", + "@angular/platform-browser": "17.3.3" + } + }, + "node_modules/@angular/router": { + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.3.3.tgz", + "integrity": "sha512-kj42+TtwvET7MFqxB3pkKyob0VNmspASlv8Y29vSpzzaOHn8J1fDf6H+8opoIC+Gmvo5NqXUDwq7nxI5aQ0mUQ==", + "dev": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/common": "17.3.3", + "@angular/core": "17.3.3", + "@angular/platform-browser": "17.3.3", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "11.6.4", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.6.4.tgz", + "integrity": "sha512-9K6xOqeevacvweLGik6LnZCb1fBtCOSIWQs8d096XGeqoLKC33UVMGz9+77Gw44KvbH4pKcQPWo4ZpxkXYj05w==", + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.15", + "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" + } + }, + "node_modules/@babel/cli": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.24.8.tgz", + "integrity": "sha512-isdp+G6DpRyKc+3Gqxy2rjzgF7Zj9K0mzLNnxz+E/fgeag8qT3vVulX4gY9dGO1q0y+0lUv6V3a+uhUzMzrwXg==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "commander": "^6.2.0", + "convert-source-map": "^2.0.0", + "fs-readdir-recursive": "^1.1.0", + "glob": "^7.2.0", + "make-dir": "^2.1.0", + "slash": "^2.0.0" + }, + "bin": { + "babel": "bin/babel.js", + "babel-external-helpers": "bin/babel-external-helpers.js" + }, + "engines": { + "node": ">=6.9.0" + }, + "optionalDependencies": { + "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", + "chokidar": "^3.4.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/cli/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@babel/cli/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@babel/cli/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@babel/cli/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@babel/cli/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz", + "integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.7.tgz", + "integrity": "sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.7", + "@babel/parser": "^7.26.7", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.26.7", + "@babel/types": "^7.26.7", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz", + "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.27.1", + "@babel/types": "^7.27.1", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz", + "integrity": "sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", + "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.27.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", + "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz", + "integrity": "sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz", + "integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.1", + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", + "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", + "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz", + "integrity": "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", + "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.27.1.tgz", + "integrity": "sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.5.tgz", + "integrity": "sha512-JF6uE2s67f0y2RZcm2kpAUEbD50vH62TyWVebxwHAlbSdM49VqPz8t4a1uIjp4NIOIZ4xzLfjY5emt/RCyC7TQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz", + "integrity": "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz", + "integrity": "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.27.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.3.tgz", + "integrity": "sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", + "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", + "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", + "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.3.tgz", + "integrity": "sha512-7ZZtznF9g4l2JCImCo5LNKFHB5eXnN39lLtLY5Tg+VkR0jwOt7TBciMckuiQIOIW7L5tkQOCh3bVGYeXgMx52Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.27.3", + "@babel/plugin-transform-parameters": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", + "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.1.tgz", + "integrity": "sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.5.tgz", + "integrity": "sha512-uhB8yHerfe3MWnuLAhEbeQ4afVoqv8BQsPqrTv7e/jZ9y00kJL6l9a/f4OWaKxotmjzewfEyXE1vgDJenkQ2/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.27.1.tgz", + "integrity": "sha512-TqGF3desVsTcp3WrJGj4HfKokfCXCLcHpt4PJF0D8/iT6LPd9RS82Upw3KPeyr6B22Lfd3DO8MVrmp0oRkUDdw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.7.tgz", + "integrity": "sha512-iLD3UNkgx2n/HrjBesVbYX6j0yqn/sJktvbtKKgcaLIQ4bTTQ8obAypc1VpyHPD2y4Phh9zHOaAt8e/L14wCpw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-typescript": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", + "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.25.9", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.25.9", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.25.9", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.25.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.25.9", + "@babel/plugin-transform-typeof-symbol": "^7.25.9", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.38.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz", + "integrity": "sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.7", + "@babel/plugin-transform-typescript": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz", + "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", + "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.3", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/generator": { + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", + "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.27.5", + "@babel/types": "^7.27.3", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", + "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", + "integrity": "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.17.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", + "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", + "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", + "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", + "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", + "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", + "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", + "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", + "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", + "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", + "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", + "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", + "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", + "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", + "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", + "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", + "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", + "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", + "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", + "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", + "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", + "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", + "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", + "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", + "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", + "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "dev": true + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.10", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.10.tgz", + "integrity": "sha512-FxbQ9giWxUWKUk2O5XZ6PduVnH2CZ/fmMKMBkH71MHJvWr7WL5AHKevhzF1L5uYWB2P548o1RzVxrNd3dpmk6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.11", + "@inquirer/type": "^3.0.6" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.1.13", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.13.tgz", + "integrity": "sha512-1viSxebkYN2nJULlzCxES6G9/stgHSepZ9LqqfdIGPHj5OHhiBUXVS0a6R0bEC2A+VL4D9w6QB66ebCr6HGllA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/figures": "^1.0.12", + "@inquirer/type": "^3.0.7", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core/node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.12.tgz", + "integrity": "sha512-MJttijd8rMFcKJC8NYmprWr6hD3r9Gd9qUC0XwPNwoEPWSMVJwA2MlXxF+nhZZNMY+HXsWa+o7KY2emWYIn0jQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.7.tgz", + "integrity": "sha512-PfunHQcjwnju84L+ycmcMKB/pTPIngjUJvfnRhKY6FKPuYXlM4aQCb/nIdTFR6BEhMjFvngzvng/vBAJMZpLSA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/console/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/console/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/console/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/core/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/core/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/reporters/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", + "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/reporters/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@jest/reporters/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/transform/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/transform/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@jest/transform/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/types/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/types/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" + }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.2.0.tgz", + "integrity": "sha512-io1zEbbYcElht3tdlqEOFxZ0dMTYrHz9iMf0gqn1pPjZFTCgM5R4R5IMA20Chb2UPYYsxjzs8CgZ7Nb5n2K2rA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "^1.1.1", + "@jsonjoy.com/util": "^1.1.2", + "hyperdyperid": "^1.2.0", + "thingies": "^1.20.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.6.0.tgz", + "integrity": "sha512-sw/RMbehRhN68WRtcKCpQOPfnH6lLP4GJfqzi3iYej8tnzpZUDr6UkZYJjcjjC0FWEJOJbyM3PTIwxucUmDG2A==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@ljharb/through": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz", + "integrity": "sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/@lmdb/lmdb-darwin-arm64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.3.0.tgz", + "integrity": "sha512-LipbQobyEfQtu8WixasaFUZZ+JCGlho4OWwWIQ5ol0rB1RKkcZvypu7sS1CBvofBGVAa3vbOh8IOGQMrbmL5dg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-darwin-x64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.3.0.tgz", + "integrity": "sha512-yA+9P+ZeA3vg76BLXWeUomIAjxfmSmR2eg8fueHXDg5Xe1Xmkl9JCKuHXUhtJ+mMVcH12d5k4kJBLbyXTadfGQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.3.0.tgz", + "integrity": "sha512-EDYrW9kle+8wI19JCj/PhRnGoCN9bked5cdOPdo1wdgH/HzjgoLPFTn9DHlZccgTEVhp3O+bpWXdN/rWySVvjw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.3.0.tgz", + "integrity": "sha512-OeWvSgjXXZ/zmtLqqL78I3910F6UYpUubmsUU+iBHo6nTtjkpXms95rJtGrjkWQqwswKBD7xSMplbYC4LEsiPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-x64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.3.0.tgz", + "integrity": "sha512-wDd02mt5ScX4+xd6g78zKBr6ojpgCJCTrllCAabjgap5FzuETqOqaQfKhO+tJuGWv/J5q+GIds6uY7rNFueOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-win32-arm64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-arm64/-/lmdb-win32-arm64-3.3.0.tgz", + "integrity": "sha512-COotWhHJgzXULLiEjOgWQwqig6PoA+6ji6W+sDl6M1HhMXWIymEVHGs0edsVSNtsNSCAWMxJgR3asv6FNX/2EA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@lmdb/lmdb-win32-x64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.3.0.tgz", + "integrity": "sha512-kqUgQH+l8HDbkAapx+aoko7Ez4X4DqkIraOqY/k0QY5EN/iialVlFpBUXh4wFXzirdmEVjbIUMrceUh0Kh8LeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", + "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", + "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", + "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", + "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", + "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", + "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@napi-rs/nice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.0.1.tgz", + "integrity": "sha512-zM0mVWSXE0a0h9aKACLwKmD6nHcRiKrPpCfvaKqG1CqDEyjEawId0ocXxVzPMCAm6kkWr2P025msfxXEnt8UGQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@napi-rs/nice-android-arm-eabi": "1.0.1", + "@napi-rs/nice-android-arm64": "1.0.1", + "@napi-rs/nice-darwin-arm64": "1.0.1", + "@napi-rs/nice-darwin-x64": "1.0.1", + "@napi-rs/nice-freebsd-x64": "1.0.1", + "@napi-rs/nice-linux-arm-gnueabihf": "1.0.1", + "@napi-rs/nice-linux-arm64-gnu": "1.0.1", + "@napi-rs/nice-linux-arm64-musl": "1.0.1", + "@napi-rs/nice-linux-ppc64-gnu": "1.0.1", + "@napi-rs/nice-linux-riscv64-gnu": "1.0.1", + "@napi-rs/nice-linux-s390x-gnu": "1.0.1", + "@napi-rs/nice-linux-x64-gnu": "1.0.1", + "@napi-rs/nice-linux-x64-musl": "1.0.1", + "@napi-rs/nice-win32-arm64-msvc": "1.0.1", + "@napi-rs/nice-win32-ia32-msvc": "1.0.1", + "@napi-rs/nice-win32-x64-msvc": "1.0.1" + } + }, + "node_modules/@napi-rs/nice-android-arm-eabi": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.0.1.tgz", + "integrity": "sha512-5qpvOu5IGwDo7MEKVqqyAxF90I6aLj4n07OzpARdgDRfz8UbBztTByBp0RC59r3J1Ij8uzYi6jI7r5Lws7nn6w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-android-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.0.1.tgz", + "integrity": "sha512-GqvXL0P8fZ+mQqG1g0o4AO9hJjQaeYG84FRfZaYjyJtZZZcMjXW5TwkL8Y8UApheJgyE13TQ4YNUssQaTgTyvA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-darwin-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.0.1.tgz", + "integrity": "sha512-91k3HEqUl2fsrz/sKkuEkscj6EAj3/eZNCLqzD2AA0TtVbkQi8nqxZCZDMkfklULmxLkMxuUdKe7RvG/T6s2AA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-darwin-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.0.1.tgz", + "integrity": "sha512-jXnMleYSIR/+TAN/p5u+NkCA7yidgswx5ftqzXdD5wgy/hNR92oerTXHc0jrlBisbd7DpzoaGY4cFD7Sm5GlgQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-freebsd-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.0.1.tgz", + "integrity": "sha512-j+iJ/ezONXRQsVIB/FJfwjeQXX7A2tf3gEXs4WUGFrJjpe/z2KB7sOv6zpkm08PofF36C9S7wTNuzHZ/Iiccfw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm-gnueabihf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.0.1.tgz", + "integrity": "sha512-G8RgJ8FYXYkkSGQwywAUh84m946UTn6l03/vmEXBYNJxQJcD+I3B3k5jmjFG/OPiU8DfvxutOP8bi+F89MCV7Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.0.1.tgz", + "integrity": "sha512-IMDak59/W5JSab1oZvmNbrms3mHqcreaCeClUjwlwDr0m3BoR09ZiN8cKFBzuSlXgRdZ4PNqCYNeGQv7YMTjuA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm64-musl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.0.1.tgz", + "integrity": "sha512-wG8fa2VKuWM4CfjOjjRX9YLIbysSVV1S3Kgm2Fnc67ap/soHBeYZa6AGMeR5BJAylYRjnoVOzV19Cmkco3QEPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-ppc64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.0.1.tgz", + "integrity": "sha512-lxQ9WrBf0IlNTCA9oS2jg/iAjQyTI6JHzABV664LLrLA/SIdD+I1i3Mjf7TsnoUbgopBcCuDztVLfJ0q9ubf6Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-riscv64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.0.1.tgz", + "integrity": "sha512-3xs69dO8WSWBb13KBVex+yvxmUeEsdWexxibqskzoKaWx9AIqkMbWmE2npkazJoopPKX2ULKd8Fm9veEn0g4Ig==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-s390x-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.0.1.tgz", + "integrity": "sha512-lMFI3i9rlW7hgToyAzTaEybQYGbQHDrpRkg+1gJWEpH0PLAQoZ8jiY0IzakLfNWnVda1eTYYlxxFYzW8Rqczkg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-x64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.0.1.tgz", + "integrity": "sha512-XQAJs7DRN2GpLN6Fb+ZdGFeYZDdGl2Fn3TmFlqEL5JorgWKrQGRUrpGKbgZ25UeZPILuTKJ+OowG2avN8mThBA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-x64-musl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.0.1.tgz", + "integrity": "sha512-/rodHpRSgiI9o1faq9SZOp/o2QkKQg7T+DK0R5AkbnI/YxvAIEHf2cngjYzLMQSQgUhxym+LFr+UGZx4vK4QdQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-arm64-msvc": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.0.1.tgz", + "integrity": "sha512-rEcz9vZymaCB3OqEXoHnp9YViLct8ugF+6uO5McifTedjq4QMQs3DHz35xBEGhH3gJWEsXMUbzazkz5KNM5YUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-ia32-msvc": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.0.1.tgz", + "integrity": "sha512-t7eBAyPUrWL8su3gDxw9xxxqNwZzAqKo0Szv3IjVQd1GpXXVkb6vBBQUuxfIYaXMzZLwlxRQ7uzM2vdUE9ULGw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-x64-msvc": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.0.1.tgz", + "integrity": "sha512-JlF+uDcatt3St2ntBG8H02F1mM45i5SF9W+bIKiReVE6wiy3o16oBP/yxt+RZ+N6LbCImJXJ6bXNO2kn9AXicg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nicolo-ribaudo/chokidar-2": { + "version": "2.1.8-no-fsevents.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", + "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", + "dev": true, + "optional": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/agent": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz", + "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/agent/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/@npmcli/fs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.4.tgz", + "integrity": "sha512-nr6/WezNzuYUppzXRaYu/W4aT5rLxdXqEFupbh6e/ovlYFQ8hpu1UUPV3Ir/YTl+74iXl2ZOMlGzudh9ZPUchQ==", + "dev": true, + "dependencies": { + "@npmcli/promise-spawn": "^7.0.0", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^9.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", + "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", + "dev": true, + "dependencies": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "lib/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.0.0.tgz", + "integrity": "sha512-OI2zdYBLhQ7kpNPaJxiflofYIpkNLi+lnGdzqUOfRmCF3r2l1nadcjtCYMJKv/Utm/ZtlffaUuTiAktPHbc17g==", + "dev": true, + "dependencies": { + "@npmcli/git": "^5.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^7.0.0", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.1.tgz", + "integrity": "sha512-P4KkF9jX3y+7yFUxgcUdDtLy+t4OlDGuEBLNs57AZsfSfg+uV6MLndqGpnl4831ggaEdXwR50XFoZP4VFtHolg==", + "dev": true, + "dependencies": { + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/redact": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-1.1.0.tgz", + "integrity": "sha512-PfnWuOkQgu7gCbnSsAisaX7hKOdZ4wSAhAzH3/ph5dSGau52kCRrMMGbiSQLwyTZpgldkZ49b0brkOr1AzGBHQ==", + "dev": true, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-7.0.4.tgz", + "integrity": "sha512-9ApYM/3+rBt9V80aYg6tZfzj3UWdiYyCt7gJUD1VJKvWF5nwKDSICXbYIQbspFTq6TOpbsEtIC0LArB8d9PFmg==", + "dev": true, + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "node-gyp": "^10.0.0", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@puppeteer/browsers": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.3.0.tgz", + "integrity": "sha512-ioXoq9gPxkss4MYhD+SFaU9p1IHFUX0ILAWFPyjGaBdjLsYAlZw6j1iLA0N/m12uVHLFDfSYNF7EQccjinIMDA==", + "dev": true, + "dependencies": { + "debug": "^4.3.5", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.4.0", + "semver": "^7.6.3", + "tar-fs": "^3.0.6", + "unbzip2-stream": "^1.4.3", + "yargs": "^17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@puppeteer/browsers/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "25.0.8", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.8.tgz", + "integrity": "sha512-ZEZWTK5n6Qde0to4vS9Mr5x/0UZoqCxPVR9KRUjU4kA2sO7GEUn1fop0DAwpO6z0Nw/kJON9bDmSxdWxO/TT1A==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "glob": "^8.0.3", + "is-reference": "1.2.1", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", + "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-builtin-module": "^3.2.1", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-terser": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", + "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", + "dev": true, + "dependencies": { + "serialize-javascript": "^6.0.1", + "smob": "^1.0.0", + "terser": "^5.17.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-typescript": { + "version": "11.1.6", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-11.1.6.tgz", + "integrity": "sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.1.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.14.0||^3.0.0||^4.0.0", + "tslib": "*", + "typescript": ">=3.7.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + }, + "tslib": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.0.tgz", + "integrity": "sha512-jwXtxYbRt1V+CdQSy6Z+uZti7JF5irRKF8hlKfEnF/xJpcNGuuiZMBvuoYM+x9sr9iWGnzrlM0+9hvQ1kgkf1w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.0.tgz", + "integrity": "sha512-fI9nduZhCccjzlsA/OuAwtFGWocxA4gqXGTLvOyiF8d+8o0fZUeSztixkYjcGq1fGZY3Tkq4yRvHPFxU+jdZ9Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.0.tgz", + "integrity": "sha512-BcnSPRM76/cD2gQC+rQNGBN6GStBs2pl/FpweW8JYuz5J/IEa0Fr4AtrPv766DB/6b2MZ/AfSIOSGw3nEIP8SA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.0.tgz", + "integrity": "sha512-LDyFB9GRolGN7XI6955aFeI3wCdCUszFWumWU0deHA8VpR3nWRrjG6GtGjBrQxQKFevnUTHKCfPR4IvrW3kCgQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.0.tgz", + "integrity": "sha512-ygrGVhQP47mRh0AAD0zl6QqCbNsf0eTo+vgwkY6LunBcg0f2Jv365GXlDUECIyoXp1kKwL5WW6rsO429DBY/bA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.0.tgz", + "integrity": "sha512-x+uJ6MAYRlHGe9wi4HQjxpaKHPM3d3JjqqCkeC5gpnnI6OWovLdXTpfa8trjxPLnWKyBsSi5kne+146GAxFt4A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.0.tgz", + "integrity": "sha512-nrRw8ZTQKg6+Lttwqo6a2VxR9tOroa2m91XbdQ2sUUzHoedXlsyvY1fN4xWdqz8PKmf4orDwejxXHjh7YBGUCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.0.tgz", + "integrity": "sha512-xV0d5jDb4aFu84XKr+lcUJ9y3qpIWhttO3Qev97z8DKLXR62LC3cXT/bMZXrjLF9X+P5oSmJTzAhqwUbY96PnA==", + "cpu": [ + "ppc64le" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.0.tgz", + "integrity": "sha512-SDDhBQwZX6LPRoPYjAZWyL27LbcBo7WdBFWJi5PI9RPCzU8ijzkQn7tt8NXiXRiFMJCVpkuMkBf4OxSxVMizAw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.0.tgz", + "integrity": "sha512-RxB/qez8zIDshNJDufYlTT0ZTVut5eCpAZ3bdXDU9yTxBzui3KhbGjROK2OYTTor7alM7XBhssgoO3CZ0XD3qA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.0.tgz", + "integrity": "sha512-C6y6z2eCNCfhZxT9u+jAM2Fup89ZjiG5pIzZIDycs1IwESviLxwkQcFRGLjnDrP+PT+v5i4YFvlcfAs+LnreXg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.0.tgz", + "integrity": "sha512-i0QwbHYfnOMYsBEyjxcwGu5SMIi9sImDVjDg087hpzXqhBSosxkE7gyIYFHgfFl4mr7RrXksIBZ4DoLoP4FhJg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.0.tgz", + "integrity": "sha512-Fq52EYb0riNHLBTAcL0cun+rRwyZ10S9vKzhGKKgeD+XbwunszSY0rVMco5KbOsTlwovP2rTOkiII/fQ4ih/zQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.0.tgz", + "integrity": "sha512-e/PBHxPdJ00O9p5Ui43+vixSgVf4NlLsmV6QneGERJ3lnjIua/kim6PRFe3iDueT1rQcgSkYP8ZBBXa/h4iPvw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.0.tgz", + "integrity": "sha512-aGg7iToJjdklmxlUlJh/PaPNa4PmqHfyRMLunbL3eaMO0gp656+q1zOKkpJ/CVe9CryJv6tAN1HDoR8cNGzkag==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@schematics/angular": { + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.3.3.tgz", + "integrity": "sha512-kNlyjIKTBhfi8Jab3MCkxNRbbpErbzdu0lZNSL8Nidmqs6Tk23Dc1bZe4t/gPNOCkCvQlwYa6X88SjC/ntyVng==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "17.3.3", + "@angular-devkit/schematics": "17.3.3", + "jsonc-parser": "3.2.1" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@sigstore/bundle": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.3.1.tgz", + "integrity": "sha512-eqV17lO3EIFqCWK3969Rz+J8MYrRZKw9IBHpSo6DEcEX2c+uzDFOgHE9f2MnyDpfs48LFO4hXmk9KhQ74JzU1g==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/core": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-1.1.0.tgz", + "integrity": "sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==", + "dev": true, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.1.tgz", + "integrity": "sha512-aIL8Z9NsMr3C64jyQzE0XlkEyBLpgEJJFDHLVVStkFV5Q3Il/r/YtY6NJWKQ4cy4AE7spP1IX5Jq7VCAxHHMfQ==", + "dev": true, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/sign": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.3.0.tgz", + "integrity": "sha512-tsAyV6FC3R3pHmKS880IXcDJuiFJiKITO1jxR1qbplcsBkZLBmjrEw5GbC7ikD6f5RU1hr7WnmxB/2kKc1qUWQ==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^2.3.0", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.1", + "make-fetch-happen": "^13.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/tuf": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.2.tgz", + "integrity": "sha512-mwbY1VrEGU4CO55t+Kl6I7WZzIl+ysSzEYdA1Nv/FTrl2bkeaPXo5PnWZAVfcY2zSdhOpsUTJW67/M2zHXGn5w==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.0", + "tuf-js": "^2.2.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/verify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.2.0.tgz", + "integrity": "sha512-hQF60nc9yab+Csi4AyoAmilGNfpXT+EXdBgFkP9OgPwIBPwyqVf7JAWPtmqrrrneTmAT6ojv7OlH1f6Ix5BG4Q==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^2.3.1", + "@sigstore/core": "^1.1.0", + "@sigstore/protobuf-specs": "^0.3.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "dev": true + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", + "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", + "dev": true, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.0.tgz", + "integrity": "sha512-c8nj8BaOExmZKO2DXhDfegyhSGcG9E/mPN3U13L+/PsoWm1uaGiHHjxqSHQiasDBQwDA3aHuw9+9spYAP1qvvg==", + "dev": true, + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.7", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.7.tgz", + "integrity": "sha512-SjDvI/x3zsZnOkYZ3lCt9lOZWZLB2jIlNKz+LBgCtDurK0JZcwucxYHn1w2BJkD34dgX9Tjnak0txtq4WTggEA==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz", + "integrity": "sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/fs-extra": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", + "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", + "dev": true, + "dependencies": { + "@types/jsonfile": "*", + "@types/node": "*" + } + }, + "node_modules/@types/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==", + "dev": true, + "dependencies": { + "@types/minimatch": "^5.1.2", + "@types/node": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.16", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", + "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.12", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", + "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + }, + "node_modules/@types/jsonfile": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz", + "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.14.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", + "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", + "dev": true, + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/qs": { + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true + }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true + }, + "node_modules/@types/retry": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.0.tgz", + "integrity": "sha512-py1miT6iQpJcs1BiJjm54AMzeuMPBSPuKPlnT8HlfudbcS5rYeX5jajpLf3mrdRh9dA/Ec2FVUY0ifeVNDIhZw==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.16.0", + "@typescript-eslint/type-utils": "7.16.0", + "@typescript-eslint/utils": "7.16.0", + "@typescript-eslint/visitor-keys": "7.16.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", + "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", + "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", + "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", + "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.16.0.tgz", + "integrity": "sha512-8gVv3kW6n01Q6TrI1cmTZ9YMFi3ucDT7i7aI5lEikk2ebk1AEjrwX8MDTdaX5D7fPXMBLvnsaa0IFTAu+jcfOw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.16.0", + "@typescript-eslint/visitor-keys": "7.16.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.16.0.tgz", + "integrity": "sha512-j0fuUswUjDHfqV/UdW6mLtOQQseORqfdmoBNDFOqs9rvNVR2e+cmu6zJu/Ku4SDuqiJko6YnhwcL8x45r8Oqxg==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "7.16.0", + "@typescript-eslint/utils": "7.16.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.0.tgz", + "integrity": "sha512-fecuH15Y+TzlUutvUl9Cc2XJxqdLr7+93SQIbcZfd4XRGGKoxyljK27b+kxKamjRkU7FYC6RrbSCg0ALcZn/xw==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.0.tgz", + "integrity": "sha512-a5NTvk51ZndFuOLCh5OaJBELYc2O3Zqxfl3Js78VFE1zE46J2AaVuW+rEbVkQznjkmlzWsUI15BG5tQMixzZLw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.16.0", + "@typescript-eslint/visitor-keys": "7.16.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.16.0.tgz", + "integrity": "sha512-PqP4kP3hb4r7Jav+NiRCntlVzhxBNWq6ZQ+zQwII1y/G/1gdIPeYDCKr2+dH6049yJQsWZiHU6RlwvIFBXXGNA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.16.0", + "@typescript-eslint/types": "7.16.0", + "@typescript-eslint/typescript-estree": "7.16.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.0.tgz", + "integrity": "sha512-rMo01uPy9C7XxG7AFsxa8zLnWXTF8N3PYclekWSrurvhwiw1eW88mrKiAYe6s53AUY57nTRz8dJsuuXdkAhzCg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.16.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.0.0.tgz", + "integrity": "sha512-gc9Tjg8bUxBVSTzeWT3Njc0Cl3PakHFKdNfABnZWiUgbxqmHDEn7uECv3fHVylxoYgNzAcmU7ZrILz+BwSo3sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "peerDependencies": { + "vite": "^6.0.0" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/argv": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", + "integrity": "sha512-dEamhpPEwRUBpLNHeuCm/v+g0anFByHahxodVO/BbAarHVBBg2MccCwf9K+o1Pof+2btdnkJelYVUWjW/VrATw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "engines": { + "node": ">=0.6.10" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.2.tgz", + "integrity": "sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/b4a": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", + "dev": true + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/babel-jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/babel-jest/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-loader": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-10.0.0.tgz", + "integrity": "sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": "^18.20.0 || ^20.10.0 || >=22.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5.61.0" + } + }, + "node_modules/babel-loader/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-loader/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-loader/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", + "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.1", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/bare-events": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", + "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "dev": true, + "license": "Apache-2.0", + "optional": true + }, + "node_modules/bare-fs": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.0.2.tgz", + "integrity": "sha512-S5mmkMesiduMqnz51Bfh0Et9EX0aTCJxhsI4bvzFFLs8Z1AV8RDHadfY5CyLwdoLHgXbNBEN1gQcbEtGwuvixw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-os": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz", + "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-os": "^3.0.1" + } + }, + "node_modules/bare-stream": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz", + "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "streamx": "^2.21.0" + }, + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/beasties": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.3.4.tgz", + "integrity": "sha512-NmzN1zN1cvGccXFyZ73335+ASXwBlVWcUPssiUDIlFdfyatHPRRufjCd5w8oPaQPvVnf9ELklaCGb1gi9FBwIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "htmlparser2": "^10.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.49", + "postcss-media-query-parser": "^0.2.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/bonjour-service": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "18.0.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.2.tgz", + "integrity": "sha512-r3NU8h/P+4lVUHfeRw1dtgQYar3DZMm4/cm2bZgOvrFC/su7budSOeqh52VJIC4U4iG1WWwV6vRW0znqBvxNuw==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001707", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001707.tgz", + "integrity": "sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/chromium-bidi": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.6.2.tgz", + "integrity": "sha512-4WVBa6ijmUTVr9cZD4eicQD8Mdy/HCX3bzEIYYpmk0glqYLoWH+LqQEvV9RpDRzoQSbY1KJHloYXbDMXMbDPhg==", + "dev": true, + "dependencies": { + "mitt": "3.0.1", + "urlpattern-polyfill": "10.0.0", + "zod": "3.23.8" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/cliui/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/codecov": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.8.3.tgz", + "integrity": "sha512-Y8Hw+V3HgR7V71xWH2vQ9lyS358CbGCldWlJFR0JirqoGtOoas3R3/OclRTvgUYFK29mmJICDPauVKmpqbwhOA==", + "deprecated": "https://about.codecov.io/blog/codecov-uploader-deprecation-plan/", + "dev": true, + "dependencies": { + "argv": "0.0.2", + "ignore-walk": "3.0.4", + "js-yaml": "3.14.1", + "teeny-request": "7.1.1", + "urlgrey": "1.0.0" + }, + "bin": { + "codecov": "bin/codecov" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/codecov/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/codecov/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/codecov/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "engines": { + "node": ">=18" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/compression/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-what": "^3.14.1" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-13.0.0.tgz", + "integrity": "sha512-FgR/h5a6hzJqATDGd9YG41SeDViH+0bkHn6WNXCi5zKAZkeESeSxLySSsFLHqLEVCh0E+rITmCf0dusXWYukeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-parent": "^6.0.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.2", + "tinyglobby": "^0.2.12" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/core-js-compat": { + "version": "3.41.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.41.0.tgz", + "integrity": "sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/create-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/create-jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/create-jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/create-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-loader": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", + "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", + "dev": true, + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.27.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dev": true, + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT" + }, + "node_modules/devtools-protocol": { + "version": "0.0.1312386", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1312386.tgz", + "integrity": "sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA==", + "dev": true + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.5.123", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.123.tgz", + "integrity": "sha512-refir3NlutEZqlKaBLK0tzlVLe5P2wDKS7UQt/3SpibizgsRAPOsqQC3ffw1nlv3ze5gjRQZYHoPymgVZkplFA==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.0.tgz", + "integrity": "sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==", + "dev": true + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", + "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.5", + "@esbuild/android-arm": "0.25.5", + "@esbuild/android-arm64": "0.25.5", + "@esbuild/android-x64": "0.25.5", + "@esbuild/darwin-arm64": "0.25.5", + "@esbuild/darwin-x64": "0.25.5", + "@esbuild/freebsd-arm64": "0.25.5", + "@esbuild/freebsd-x64": "0.25.5", + "@esbuild/linux-arm": "0.25.5", + "@esbuild/linux-arm64": "0.25.5", + "@esbuild/linux-ia32": "0.25.5", + "@esbuild/linux-loong64": "0.25.5", + "@esbuild/linux-mips64el": "0.25.5", + "@esbuild/linux-ppc64": "0.25.5", + "@esbuild/linux-riscv64": "0.25.5", + "@esbuild/linux-s390x": "0.25.5", + "@esbuild/linux-x64": "0.25.5", + "@esbuild/netbsd-arm64": "0.25.5", + "@esbuild/netbsd-x64": "0.25.5", + "@esbuild/openbsd-arm64": "0.25.5", + "@esbuild/openbsd-x64": "0.25.5", + "@esbuild/sunos-x64": "0.25.5", + "@esbuild/win32-arm64": "0.25.5", + "@esbuild/win32-ia32": "0.25.5", + "@esbuild/win32-x64": "0.25.5" + } + }, + "node_modules/esbuild-wasm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.25.5.tgz", + "integrity": "sha512-V/rbdOws2gDcnCAECfPrajhuafI0WY4WumUgc8ZHwOLnvmM0doLQ+dqvVFI2qkVxQsvo6880aC9IjpyDqcwwTw==", + "dev": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", + "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.6" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-simple-import-sort": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-12.1.1.tgz", + "integrity": "sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==", + "dev": true, + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true + }, + "node_modules/express": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.10", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/express/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fast-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", + "dev": true, + "dependencies": { + "punycode": "^1.3.2" + } + }, + "node_modules/fast-url-parser/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fdir": { + "version": "6.4.5", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.5.tgz", + "integrity": "sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/flat-cache/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flat-cache/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-uri": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", + "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", + "dev": true, + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4", + "fs-extra": "^11.2.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/glob": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.3.tgz", + "integrity": "sha512-Q38SGlYRpVtDBPSWEylRyctn7uDeTp4NQERTLiCT1FqA9JXPYWqAVmQU6qh4r/zMM5ehxTcbaO8EjhWnvEhmyg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true, + "license": "MIT" + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/handlebars/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", + "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/htmlparser2": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", + "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.1", + "entities": "^6.0.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz", + "integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-proxy-middleware": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.5.tgz", + "integrity": "sha512-GLZZm1X38BPY4lkXA01jhwxvDoOkkXqjgVyUzVxiEK4iuRu03PZoYHhHRwxnfhQMDuaxi3vVri0YgSro/1oWqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.15", + "debug": "^4.3.6", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.3", + "is-plain-object": "^5.0.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.18" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", + "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.4" + } + }, + "node_modules/ignore-walk/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", + "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", + "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/inquirer": { + "version": "9.2.15", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.15.tgz", + "integrity": "sha512-vI2w4zl/mDluHt9YEQ/543VTCwPKWiHzKtm9dM2V0NdFcqEexDAjUHzO1oA60HRNaVifGXXM1tRRNluLVHa0Kg==", + "dev": true, + "dependencies": { + "@ljharb/through": "^2.3.12", + "ansi-escapes": "^4.3.2", + "chalk": "^5.3.0", + "cli-cursor": "^3.1.0", + "cli-width": "^4.1.0", + "external-editor": "^3.1.0", + "figures": "^3.2.0", + "lodash": "^4.17.21", + "mute-stream": "1.0.0", + "ora": "^5.4.1", + "run-async": "^3.0.0", + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-builtin-module": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "dev": true, + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true + }, + "node_modules/is-network-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", + "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.1.2.tgz", + "integrity": "sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-circus/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-circus/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-circus/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-cli/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-config/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-config/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-config/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jest-config/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-diff/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-diff/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-each/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-each/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-matcher-utils/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-message-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-message-util/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-resolve/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-resolve/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runner/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-runner/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-runner/node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/jest-runner/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runtime/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-runtime/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-runtime/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jest-runtime/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-snapshot/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-validate/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-validate/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-watcher/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-watcher/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", + "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dev": true, + "dependencies": { + "source-map-support": "^0.5.5" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/launch-editor": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.10.0.tgz", + "integrity": "sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/less": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/less/-/less-4.3.0.tgz", + "integrity": "sha512-X9RyH9fvemArzfdP8Pi3irr7lor2Ok4rOttDXBhlwDg+wKQsXOXgHWduAJE1EsF7JJx0w0bcO6BC6tCKKYnXKA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=14" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } + }, + "node_modules/less-loader": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-12.3.0.tgz", + "integrity": "sha512-0M6+uYulvYIWs52y0LqN4+QM9TqWAohYSNTo4htE8Z7Cn3G/qQMEmktfHmyJT23k+20kU9zHH2wrfFXkxNLtVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "less": "^3.5.0 || ^4.0.0", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/less/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/license-webpack-plugin": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", + "dev": true, + "dependencies": { + "webpack-sources": "^3.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-sources": { + "optional": true + } + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/listr2": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.3.3.tgz", + "integrity": "sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/listr2/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/listr2/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true, + "license": "MIT" + }, + "node_modules/listr2/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/lmdb": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.3.0.tgz", + "integrity": "sha512-MgJocUI6QEiSXQBFWLeyo1R7eQj8Rke5dlPxX0KFwli8/bsCxpM/KbXO5y0qmV/5llQ3wpneDWcTYxa+4vn8iQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "msgpackr": "^1.11.2", + "node-addon-api": "^6.1.0", + "node-gyp-build-optional-packages": "5.2.2", + "ordered-binary": "^1.5.3", + "weak-lru-cache": "^1.2.2" + }, + "bin": { + "download-lmdb-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@lmdb/lmdb-darwin-arm64": "3.3.0", + "@lmdb/lmdb-darwin-x64": "3.3.0", + "@lmdb/lmdb-linux-arm": "3.3.0", + "@lmdb/lmdb-linux-arm64": "3.3.0", + "@lmdb/lmdb-linux-x64": "3.3.0", + "@lmdb/lmdb-win32-arm64": "3.3.0", + "@lmdb/lmdb-win32-x64": "3.3.0" + } + }, + "node_modules/lmdb/node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/make-fetch-happen": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz", + "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==", + "dev": true, + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.17.2.tgz", + "integrity": "sha512-NgYhCOWgovOXSzvYgUW0LQ7Qy72rWQMGGFJDoWg4G30RHd3z77VbYdtJ4fembJXBy8pMIUA31XNAupobOQlwdg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/json-pack": "^1.0.3", + "@jsonjoy.com/util": "^1.3.0", + "tree-dump": "^1.0.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">= 4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", + "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-fetch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-json-stream/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/msgpackr": { + "version": "1.11.4", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.4.tgz", + "integrity": "sha512-uaff7RG9VIC4jacFW9xzL3jc0iM32DNHe4jYVycBcjUePT/Klnfj7pqtWJt9khvDFizmjN2TlYniYmSS2LIaZg==", + "dev": true, + "license": "MIT", + "optional": true, + "optionalDependencies": { + "msgpackr-extract": "^3.0.2" + } + }, + "node_modules/msgpackr-extract": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", + "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.2.2" + }, + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" + } + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/needle": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-gyp": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.1.0.tgz", + "integrity": "sha512-B4J5M1cABxPc5PwfjhbV5hoy2DP9p8lFXASnEN6hugXOa61416tnTZ29x9sSwAd0o99XNIcpvDDy1swAExsVKA==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^4.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/node-gyp-build-optional-packages": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", + "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, + "node_modules/node-gyp-build-optional-packages/node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", + "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", + "dev": true, + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/normalize-package-data": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", + "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", + "dev": true, + "dependencies": { + "hosted-git-info": "^7.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-bundled": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", + "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", + "dev": true, + "dependencies": { + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-install-checks": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", + "dev": true, + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", + "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", + "dev": true, + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-packlist": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.2.tgz", + "integrity": "sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==", + "dev": true, + "dependencies": { + "ignore-walk": "^6.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-packlist/node_modules/ignore-walk": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.4.tgz", + "integrity": "sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==", + "dev": true, + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.0.0.tgz", + "integrity": "sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg==", + "dev": true, + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^11.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-16.2.0.tgz", + "integrity": "sha512-zVH+G0q1O2hqgQBUvQ2LWp6ujr6VJAeDnmWxqiMlCguvLexEzBnuQIwC70r04vcvCMAcYEIpA/rO9YyVi+fmJQ==", + "dev": true, + "dependencies": { + "@npmcli/redact": "^1.1.0", + "make-fetch-happen": "^13.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^11.0.0", + "proc-log": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ora/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/ora/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ordered-binary": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.3.tgz", + "integrity": "sha512-oGFr3T+pYdTGJ+YFEILMpS3es+GiIbs9h/XQrclBXUtd44ey7XwfsMzM31f64I1SQOawDoDr/D823kNCADI8TA==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pac-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.2.tgz", + "integrity": "sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==", + "dev": true, + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.5", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "dev": true, + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, + "node_modules/pacote": { + "version": "17.0.6", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-17.0.6.tgz", + "integrity": "sha512-cJKrW21VRE8vVTRskJo78c/RCvwJCn1f4qgfxL4w77SOWrTCRcmfkYHlHtS0gqpgjv3zhXflRtgsrUCX5xwNnQ==", + "dev": true, + "dependencies": { + "@npmcli/git": "^5.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/run-script": "^7.0.0", + "cacache": "^18.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^11.0.0", + "npm-packlist": "^8.0.0", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^16.0.0", + "proc-log": "^3.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^7.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^2.2.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-json/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-html-rewriting-stream": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.1.0.tgz", + "integrity": "sha512-2ifK6Jb+ONoqOy5f+cYHsqvx1obHQdvIk13Jmt/5ezxP0U9p+fqd+R6O73KblGswyuzBYfetmsfK9ThMgnuPPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0", + "parse5": "^7.0.0", + "parse5-sax-parser": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-html-rewriting-stream/node_modules/entities": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz", + "integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parse5-sax-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", + "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz", + "integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.1.tgz", + "integrity": "sha512-xUXwsxNjwTQ8K3GnT4pCJm+xq3RUPQbmkYJTP5aFIfNIvbcc/4MUxgBaaRSZJ6yGJZiGSyYlM6MzwTsRk8SYCg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/piscina": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-5.0.0.tgz", + "integrity": "sha512-R+arufwL7sZvGjAhSMK3TfH55YdGOqhpKXkcwQJr432AAnJX/xxX19PA4QisrmJ+BTTfZVggaz6HexbkQq1l1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.x" + }, + "optionalDependencies": { + "@napi-rs/nice": "^1.0.1" + } + }, + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-loader": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", + "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==", + "dev": true, + "dependencies": { + "cosmiconfig": "^9.0.0", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.1.tgz", + "integrity": "sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-agent": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", + "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.3", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/puppeteer": { + "version": "22.14.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-22.14.0.tgz", + "integrity": "sha512-MGTR6/pM8zmWbTdazb6FKnwIihzsSEXBPH49mFFU96DNZpQOevCAZMnjBZGlZRGRzRK6aADCavR6SQtrbv5dQw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@puppeteer/browsers": "2.3.0", + "cosmiconfig": "^9.0.0", + "devtools-protocol": "0.0.1312386", + "puppeteer-core": "22.14.0" + }, + "bin": { + "puppeteer": "lib/esm/puppeteer/node/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-core": { + "version": "22.14.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-22.14.0.tgz", + "integrity": "sha512-rl4tOY5LcA3e374GAlsGGHc05HL3eGNf5rZ+uxkl6id9zVZKcwcp1Z+Nd6byb6WPiPeecT/dwz8f/iUm+AZQSw==", + "dev": true, + "dependencies": { + "@puppeteer/browsers": "2.3.0", + "chromium-bidi": "0.6.2", + "debug": "^4.3.5", + "devtools-protocol": "0.0.1312386", + "ws": "^8.18.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/qs": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.3.tgz", + "integrity": "sha512-AWJm14H1vVaO/iNZ4/hO+HyaTehuy9nRqVdkTqlJt0HWvBiBIEXFmb4C0DGeYo3Xes9rrEW+TxHsaigCbN5ICQ==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/read-package-json": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-7.0.0.tgz", + "integrity": "sha512-uL4Z10OKV4p6vbdvIXB+OzhInYtIozl/VxUBPgNkBuUi2DeRonnuspmaVAMcrkmfjKGNmRndyQAbE7/AmzGwFg==", + "dev": true, + "dependencies": { + "glob": "^10.2.2", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", + "dev": true, + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "dev": true + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regex-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", + "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==", + "dev": true + }, + "node_modules/regexpu-core": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-url-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", + "dev": true, + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/resolve-url-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.8.tgz", + "integrity": "sha512-XSh0V2/yNhDEi8HwdIefD8MLgs4LQXPag/nEJWs3YUc3Upn+UHa1GyIkEg9xSSNt7HnkO5FjTvmcRzgf+8UZuw==", + "dev": true, + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.0.tgz", + "integrity": "sha512-Qe7w62TyawbDzB4yt32R0+AbIo6m1/sqO7UPzFS8Z/ksL5mrfhA0v4CavfdmFav3D+ub4QeAgsGEe84DoWe/nQ==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.14.0", + "@rollup/rollup-android-arm64": "4.14.0", + "@rollup/rollup-darwin-arm64": "4.14.0", + "@rollup/rollup-darwin-x64": "4.14.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.14.0", + "@rollup/rollup-linux-arm64-gnu": "4.14.0", + "@rollup/rollup-linux-arm64-musl": "4.14.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.14.0", + "@rollup/rollup-linux-riscv64-gnu": "4.14.0", + "@rollup/rollup-linux-s390x-gnu": "4.14.0", + "@rollup/rollup-linux-x64-gnu": "4.14.0", + "@rollup/rollup-linux-x64-musl": "4.14.0", + "@rollup/rollup-win32-arm64-msvc": "4.14.0", + "@rollup/rollup-win32-ia32-msvc": "4.14.0", + "@rollup/rollup-win32-x64-msvc": "4.14.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-applescript": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sass": { + "version": "1.88.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.88.0.tgz", + "integrity": "sha512-sF6TWQqjFvr4JILXzG4ucGOLELkESHL+I5QJhh7CNaE+Yge0SI+ehCatsXhJ7ymU1hAFcIS3/PBpjdIbXoyVbg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/sass-loader": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.5.tgz", + "integrity": "sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/sass/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sass/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/schema-utils": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true, + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dev": true, + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sigstore": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.3.0.tgz", + "integrity": "sha512-q+o8L2ebiWD1AxD17eglf1pFrl9jtW7FHa0ygqY6EKvibK8JHyq9Z26v9MZXeDiw+RbfOJ9j2v70M10Hd6E06A==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^2.3.1", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.1", + "@sigstore/sign": "^2.3.0", + "@sigstore/tuf": "^2.3.1", + "@sigstore/verify": "^1.2.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/smob": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", + "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", + "dev": true + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "dev": true, + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", + "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.1", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-5.0.0.tgz", + "integrity": "sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==", + "dev": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.72.1" + } + }, + "node_modules/source-map-loader/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", + "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", + "dev": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true + }, + "node_modules/ssri": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", + "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stream-events": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", + "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", + "dev": true, + "dependencies": { + "stubs": "^3.0.0" + } + }, + "node_modules/streamx": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", + "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stubs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", + "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", + "dev": true + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/synckit": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", + "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", + "dev": true, + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-fs": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.9.tgz", + "integrity": "sha512-XF4w9Xp+ZQgifKakjZYmFdkLoSWd34VGKcsTCwlNWM7QG3ZbaxnTsaBwnjFZqHRf/rROxaR8rXnbtwdvaDI+lA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/teeny-request": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-7.1.1.tgz", + "integrity": "sha512-iwY6rkW5DDGq8hE2YgNQlKbptYpY5Nn2xecjQiNjOXWbKzPGUfmeUBCSQbbr306d7Z7U2N0TPl+/SwYRfua1Dg==", + "dev": true, + "dependencies": { + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.1", + "stream-events": "^1.0.5", + "uuid": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/teeny-request/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/teeny-request/node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/teeny-request/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/terser": { + "version": "5.39.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.1.tgz", + "integrity": "sha512-Mm6+uad0ZuDtcV8/4uOZQDQ8RuiC5Pu+iZRedJtF7yA/27sPL7d++In/AJKpWZlU3SYMPPkVfwetn6sgZ66pUA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/text-decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.1.tgz", + "integrity": "sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==", + "dev": true, + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thingies": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", + "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", + "dev": true, + "license": "Unlicense", + "engines": { + "node": ">=10.18" + }, + "peerDependencies": { + "tslib": "^2" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/tree-dump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.3.tgz", + "integrity": "sha512-il+Cv80yVHFBwokQSfd4bldvr1Md951DpgAGfmhydt04L+YzHgubm2tQ7zueWDcGENKHq0ZvGFR/hjvNXilHEg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true + }, + "node_modules/tuf-js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.0.tgz", + "integrity": "sha512-ZSDngmP1z6zw+FIkIBjvOp/II/mIub/O7Pp12j1WNsiCpg5R5wAc//i555bBQsE44O94btLt0xM/Zr2LQjwdCg==", + "dev": true, + "dependencies": { + "@tufjs/models": "2.0.0", + "debug": "^4.3.4", + "make-fetch-happen": "^13.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-assert": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", + "dev": true + }, + "node_modules/typescript": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.4.tgz", + "integrity": "sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dev": true, + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urlgrey": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-1.0.0.tgz", + "integrity": "sha512-hJfIzMPJmI9IlLkby8QrsCykQ+SXDeO2W5Q9QTW3QpqZVTx4a/K7p8/5q+/isD8vsbVaFgql/gvAoQCRQ2Cb5w==", + "dev": true, + "dependencies": { + "fast-url-parser": "^1.1.3" + } + }, + "node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", + "dev": true + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", + "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "dev": true, + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", + "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/weak-lru-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", + "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/webpack": { + "version": "5.99.8", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.8.tgz", + "integrity": "sha512-lQ3CPiSTpfOnrEGeXDwoq5hIGzSjmwD72GdfVzF7CQAI7t47rJG9eDWvcEkEn3CUQymAElVvDg3YNTlCYj+qUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", + "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^4.6.0", + "mime-types": "^2.1.31", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.1.tgz", + "integrity": "sha512-ml/0HIj9NLpVKOMq+SuBPLHcmbG+TGIjXRHsYfZwocUBIqEvws8NnS/V9AFQ5FKP+tgn5adwVwRrTEpGL33QFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@types/express-serve-static-core": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "express": "^4.21.2", + "graceful-fs": "^4.2.6", + "http-proxy-middleware": "^2.0.7", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "schema-utils": "^4.2.0", + "selfsigned": "^2.4.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/webpack-dev-server/node_modules/http-proxy-middleware": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-server/node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack-dev-server/node_modules/open": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.2.tgz", + "integrity": "sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack-dev-server/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/webpack-merge": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-subresource-integrity": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", + "dev": true, + "dependencies": { + "typed-assert": "^1.0.8" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "html-webpack-plugin": ">= 5.0.0-beta.1 < 6", + "webpack": "^5.12.0" + }, + "peerDependenciesMeta": { + "html-webpack-plugin": { + "optional": true + } + } + }, + "node_modules/webpack/node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/webpack/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zone.js": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.0.tgz", + "integrity": "sha512-9oxn0IIjbCZkJ67L+LkhYWRyAy7axphb3VgE2MBDlOqnmHMPWGYMxJxBYFueFq/JGY2GMwS0rU+UCLunEmy5UA==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/package.json b/package.json index ea0dae114..5b50cda0b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "openapi-typescript-codegen", - "version": "0.0.2", - "description": "NodeJS library that generates Typescript or Javascript clients based on the OpenAPI specification.", + "version": "0.29.0", + "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Ferdi Koomen", "homepage": "https://github.com/ferdikoomen/openapi-typescript-codegen", "repository": { @@ -15,15 +15,14 @@ "keywords": [ "openapi", "swagger", - "codegen", "generator", - "client", "typescript", - "javascript", "yaml", "json", "fetch", "xhr", + "axios", + "angular", "node" ], "maintainers": [ @@ -33,63 +32,97 @@ } ], "main": "dist/index.js", - "module": "dist/index.js", + "types": "types/index.d.ts", "bin": { "openapi": "bin/index.js" }, "files": [ "bin/index.js", "dist/index.js", - "dist/index.d.ts", - "dist/**/*.js", - "dist/**/*.d.ts", - "src/templates/javascript/**/*.hbs", - "src/templates/javascript/**/*.js", - "src/templates/typescript/**/*.hbs", - "src/templates/typescript/**/*.ts" + "types/index.d.ts" ], "scripts": { - "clean": "rimraf \"./dist\" \"./coverage\" \"./test/result\"", - "build": "tsc", - "run": "tsc && node ./test/index.js", - "test": "tsc && jest", - "test:update": "tsc && jest --updateSnapshot", - "test:watch": "tsc && jest --watch", - "test:coverage": "tsc && jest --coverage", - "eslint": "eslint \"./src/**/*.ts\"", - "eslint:fix": "eslint \"./src/**/*.ts\" --fix", - "prettier": "prettier \"./src/**/*.ts\" --check", - "prettier:fix": "prettier \"./src/**/*.ts\" --write" + "clean": "rimraf ./dist ./test/generated ./test/e2e/generated ./samples/generated ./coverage ./node_modules/.cache", + "build": "rollup --config --environment NODE_ENV:development", + "build:watch": "rollup --config --environment NODE_ENV:development --watch", + "release": "rollup --config --environment NODE_ENV:production", + "validate": "tsc --project tsconfig.json --noEmit", + "run": "node ./test/index.js", + "test": "jest --selectProjects UNIT", + "test:update": "jest --selectProjects UNIT --updateSnapshot", + "test:watch": "jest --selectProjects UNIT --watch", + "test:coverage": "jest --selectProjects UNIT --coverage", + "test:e2e": "jest --selectProjects E2E --runInBand --verbose", + "eslint": "eslint .", + "eslint:fix": "eslint . --fix", + "prepare": "npm run clean && npm run release", + "codecov": "codecov --token=66c30c23-8954-4892-bef9-fbaed0a2e42b", + "docker": "docker build -t eeelenbaas/openapi-typescript-codegen ." + }, + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^11.5.4", + "camelcase": "^6.3.0", + "commander": "^12.0.0", + "fs-extra": "^11.2.0", + "handlebars": "^4.7.8" }, "devDependencies": { - "@babel/core": "7.7.2", - "@babel/preset-env": "7.7.1", - "@babel/preset-typescript": "7.7.2", - "@types/jest": "24.0.23", - "@types/js-yaml": "3.12.1", - "@types/mkdirp": "0.5.2", - "@types/node": "12.12.11", - "@types/rimraf": "2.0.3", - "@types/yup": "0.26.24", - "@typescript-eslint/eslint-plugin": "2.8.0", - "@typescript-eslint/parser": "2.8.0", - "camelcase": "5.3.1", - "chalk": "3.0.0", - "commander": "4.0.1", - "eslint": "6.6.0", - "eslint-config-prettier": "6.7.0", - "eslint-plugin-prettier": "3.1.1", - "eslint-plugin-sort-imports-es6-autofix": "0.5.0", - "glob": "7.1.6", - "handlebars": "4.5.3", - "jest": "24.9.0", - "jest-cli": "24.9.0", - "js-yaml": "3.13.1", - "mkdirp": "0.5.1", - "path": "0.12.7", - "prettier": "1.19.1", - "rimraf": "3.0.0", - "typescript": "3.7.2", - "yup": "0.27.0" + "@angular-devkit/build-angular": "20.0.1", + "@angular/animations": "17.3.3", + "@angular/cli": "17.3.3", + "@angular/common": "17.3.3", + "@angular/compiler": "17.3.3", + "@angular/compiler-cli": "17.3.3", + "@angular/core": "17.3.3", + "@angular/forms": "17.3.3", + "@angular/platform-browser": "17.3.3", + "@angular/platform-browser-dynamic": "17.3.3", + "@angular/router": "17.3.3", + "@babel/cli": "7.24.8", + "@babel/core": "7.26.7", + "@babel/preset-env": "7.26.0", + "@babel/preset-typescript": "7.24.7", + "@rollup/plugin-commonjs": "25.0.8", + "@rollup/plugin-node-resolve": "15.2.3", + "@rollup/plugin-terser": "^0.4.4", + "@rollup/plugin-typescript": "11.1.6", + "@types/cross-spawn": "6.0.6", + "@types/express": "4.17.21", + "@types/fs-extra": "^11.0.4", + "@types/glob": "8.1.0", + "@types/jest": "29.5.12", + "@types/node": "20.14.10", + "@types/node-fetch": "2.6.11", + "@types/qs": "6.9.15", + "@typescript-eslint/eslint-plugin": "7.16.0", + "@typescript-eslint/parser": "7.18.0", + "abort-controller": "3.0.0", + "axios": "1.8.2", + "codecov": "3.8.3", + "cross-spawn": "7.0.3", + "eslint": "8.57.0", + "eslint-config-prettier": "9.1.0", + "eslint-plugin-prettier": "5.1.3", + "eslint-plugin-simple-import-sort": "12.1.1", + "express": "4.21.1", + "form-data": "4.0.4", + "glob": "10.4.3", + "jest": "29.7.0", + "jest-cli": "29.7.0", + "node-fetch": "2.7.0", + "prettier": "3.4.1", + "puppeteer": "22.14.0", + "qs": "6.12.3", + "rimraf": "5.0.8", + "rollup": "4.14.0", + "rxjs": "7.8.1", + "ts-node": "10.9.2", + "tslib": "2.6.3", + "typescript": "5.4.4", + "zone.js": "0.15.0" + }, + "overrides": { + "node-fetch": "2.7.0", + "rollup": "4.14.0" } } diff --git a/rollup.config.mjs b/rollup.config.mjs new file mode 100644 index 000000000..b25ca8442 --- /dev/null +++ b/rollup.config.mjs @@ -0,0 +1,76 @@ +import commonjs from '@rollup/plugin-commonjs'; +import { nodeResolve } from '@rollup/plugin-node-resolve'; +import terser from '@rollup/plugin-terser'; +import typescript from '@rollup/plugin-typescript'; +import { readFileSync } from 'fs'; +import handlebars from 'handlebars'; +import { dirname, extname, resolve } from 'path'; + +const { precompile } = handlebars; + +/** + * Custom plugin to parse handlebar imports and precompile + * the template on the fly. This reduces runtime by about + * half on large projects. + */ +const handlebarsPlugin = () => ({ + resolveId: (file, importer) => { + if (extname(file) === '.hbs') { + return resolve(dirname(importer), file); + } + return null; + }, + load: file => { + if (extname(file) === '.hbs') { + const template = readFileSync(file, 'utf8').toString().trim(); + const templateSpec = precompile(template, { + strict: true, + noEscape: true, + preventIndent: true, + knownHelpersOnly: true, + knownHelpers: { + ifdef: true, + equals: true, + notEquals: true, + containsSpaces: true, + union: true, + intersection: true, + enumerator: true, + escapeComment: true, + escapeDescription: true, + camelCase: true, + }, + }); + return `export default ${templateSpec};`; + } + return null; + }, +}); + +const getPlugins = () => { + const plugins = [ + nodeResolve(), + commonjs({ + sourceMap: false, + }), + handlebarsPlugin(), + typescript({ + module: 'esnext', + }), + ]; + if (process.env.NODE_ENV === 'development') { + return plugins; + } + return [...plugins, terser()]; +}; + +export default { + input: './src/index.ts', + output: { + exports: 'named', + file: './dist/index.js', + format: 'cjs', + }, + external: ['camelcase', 'commander', 'fs-extra', 'handlebars', '@apidevtools/json-schema-ref-parser'], + plugins: getPlugins(), +}; diff --git a/samples/codegen.sh b/samples/codegen.sh new file mode 100755 index 000000000..89cf5e54d --- /dev/null +++ b/samples/codegen.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +rm -rf dist +rm swagger-codegen-cli-v2.jar +rm swagger-codegen-cli-v3.jar + +curl https://repo1.maven.org/maven2/io/swagger/swagger-codegen-cli/2.4.15/swagger-codegen-cli-2.4.15.jar -o swagger-codegen-cli-v2.jar +curl https://repo1.maven.org/maven2/io/swagger/codegen/v3/swagger-codegen-cli/3.0.21/swagger-codegen-cli-3.0.21.jar -o swagger-codegen-cli-v3.jar + +java -jar ./swagger-codegen-cli-v2.jar generate -i spec/v2.json -l typescript-aurelia -o generated/v2/typescript-aurelia/ +java -jar ./swagger-codegen-cli-v2.jar generate -i spec/v2.json -l typescript-angular -o generated/v2/typescript-angular/ +java -jar ./swagger-codegen-cli-v2.jar generate -i spec/v2.json -l typescript-inversify -o generated/v2/typescript-inversify/ +java -jar ./swagger-codegen-cli-v2.jar generate -i spec/v2.json -l typescript-fetch -o generated/v2/typescript-fetch/ +java -jar ./swagger-codegen-cli-v2.jar generate -i spec/v2.json -l typescript-jquery -o generated/v2/typescript-jquery/ +java -jar ./swagger-codegen-cli-v2.jar generate -i spec/v2.json -l typescript-node -o generated/v2/typescript-node/ + +java -jar ./swagger-codegen-cli-v3.jar generate -i spec/v3.json -l typescript-angular -o generated/v3/typescript-angular/ +java -jar ./swagger-codegen-cli-v3.jar generate -i spec/v3.json -l typescript-fetch -o generated/v3/typescript-fetch/ + +node ../bin/index.js --input spec/v2.json --output generated/v2/openapi-typescript-codegen/ +node ../bin/index.js --input spec/v3.json --output generated/v3/openapi-typescript-codegen/ diff --git a/samples/spec/v2.json b/samples/spec/v2.json new file mode 100644 index 000000000..46b4183ac --- /dev/null +++ b/samples/spec/v2.json @@ -0,0 +1,1061 @@ +{ + "swagger": "2.0", + "info": { + "description": "This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters.", + "version": "1.0.5", + "title": "Swagger Petstore", + "termsOfService": "http://swagger.io/terms/", + "contact": { + "email": "apiteam@swagger.io" + }, + "license": { + "name": "Apache 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + } + }, + "host": "petstore.swagger.io", + "basePath": "/v2", + "tags": [ + { + "name": "pet", + "description": "Everything about your Pets", + "externalDocs": { + "description": "Find out more", + "url": "http://swagger.io" + } + }, + { + "name": "store", + "description": "Access to Petstore orders" + }, + { + "name": "user", + "description": "Operations about user", + "externalDocs": { + "description": "Find out more about our store", + "url": "http://swagger.io" + } + } + ], + "schemes": [ + "https", + "http" + ], + "paths": { + "/pet/{petId}/uploadImage": { + "post": { + "tags": [ + "pet" + ], + "summary": "uploads an image", + "description": "", + "operationId": "uploadFile", + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "petId", + "in": "path", + "description": "ID of pet to update", + "required": true, + "type": "integer", + "format": "int64" + }, + { + "name": "additionalMetadata", + "in": "formData", + "description": "Additional data to pass to server", + "required": false, + "type": "string" + }, + { + "name": "file", + "in": "formData", + "description": "file to upload", + "required": false, + "type": "file" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/ApiResponse" + } + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/pet": { + "post": { + "tags": [ + "pet" + ], + "summary": "Add a new pet to the store", + "description": "", + "operationId": "addPet", + "consumes": [ + "application/json", + "application/xml" + ], + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "Pet object that needs to be added to the store", + "required": true, + "schema": { + "$ref": "#/definitions/Pet" + } + } + ], + "responses": { + "405": { + "description": "Invalid input" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + }, + "put": { + "tags": [ + "pet" + ], + "summary": "Update an existing pet", + "description": "", + "operationId": "updatePet", + "consumes": [ + "application/json", + "application/xml" + ], + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "Pet object that needs to be added to the store", + "required": true, + "schema": { + "$ref": "#/definitions/Pet" + } + } + ], + "responses": { + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Pet not found" + }, + "405": { + "description": "Validation exception" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/pet/findByStatus": { + "get": { + "tags": [ + "pet" + ], + "summary": "Finds Pets by status", + "description": "Multiple status values can be provided with comma separated strings", + "operationId": "findPetsByStatus", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "name": "status", + "in": "query", + "description": "Status values that need to be considered for filter", + "required": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "available", + "pending", + "sold" + ], + "default": "available" + }, + "collectionFormat": "multi" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Pet" + } + } + }, + "400": { + "description": "Invalid status value" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/pet/findByTags": { + "get": { + "tags": [ + "pet" + ], + "summary": "Finds Pets by tags", + "description": "Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.", + "operationId": "findPetsByTags", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "name": "tags", + "in": "query", + "description": "Tags to filter by", + "required": true, + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "multi" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Pet" + } + } + }, + "400": { + "description": "Invalid tag value" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ], + "deprecated": true + } + }, + "/pet/{petId}": { + "get": { + "tags": [ + "pet" + ], + "summary": "Find pet by ID", + "description": "Returns a single pet", + "operationId": "getPetById", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "name": "petId", + "in": "path", + "description": "ID of pet to return", + "required": true, + "type": "integer", + "format": "int64" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/Pet" + } + }, + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Pet not found" + } + }, + "security": [ + { + "api_key": [] + } + ] + }, + "post": { + "tags": [ + "pet" + ], + "summary": "Updates a pet in the store with form data", + "description": "", + "operationId": "updatePetWithForm", + "consumes": [ + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "name": "petId", + "in": "path", + "description": "ID of pet that needs to be updated", + "required": true, + "type": "integer", + "format": "int64" + }, + { + "name": "name", + "in": "formData", + "description": "Updated name of the pet", + "required": false, + "type": "string" + }, + { + "name": "status", + "in": "formData", + "description": "Updated status of the pet", + "required": false, + "type": "string" + } + ], + "responses": { + "405": { + "description": "Invalid input" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + }, + "delete": { + "tags": [ + "pet" + ], + "summary": "Deletes a pet", + "description": "", + "operationId": "deletePet", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "name": "api_key", + "in": "header", + "required": false, + "type": "string" + }, + { + "name": "petId", + "in": "path", + "description": "Pet id to delete", + "required": true, + "type": "integer", + "format": "int64" + } + ], + "responses": { + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Pet not found" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/store/order": { + "post": { + "tags": [ + "store" + ], + "summary": "Place an order for a pet", + "description": "", + "operationId": "placeOrder", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "order placed for purchasing the pet", + "required": true, + "schema": { + "$ref": "#/definitions/Order" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/Order" + } + }, + "400": { + "description": "Invalid Order" + } + } + } + }, + "/store/order/{orderId}": { + "get": { + "tags": [ + "store" + ], + "summary": "Find purchase order by ID", + "description": "For valid response try integer IDs with value >= 1 and <= 10. Other values will generated exceptions", + "operationId": "getOrderById", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "name": "orderId", + "in": "path", + "description": "ID of pet that needs to be fetched", + "required": true, + "type": "integer", + "maximum": 10, + "minimum": 1, + "format": "int64" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/Order" + } + }, + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Order not found" + } + } + }, + "delete": { + "tags": [ + "store" + ], + "summary": "Delete purchase order by ID", + "description": "For valid response try integer IDs with positive integer value. Negative or non-integer values will generate API errors", + "operationId": "deleteOrder", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "name": "orderId", + "in": "path", + "description": "ID of the order that needs to be deleted", + "required": true, + "type": "integer", + "minimum": 1, + "format": "int64" + } + ], + "responses": { + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Order not found" + } + } + } + }, + "/store/inventory": { + "get": { + "tags": [ + "store" + ], + "summary": "Returns pet inventories by status", + "description": "Returns a map of status codes to quantities", + "operationId": "getInventory", + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "object", + "additionalProperties": { + "type": "integer", + "format": "int32" + } + } + } + }, + "security": [ + { + "api_key": [] + } + ] + } + }, + "/user/createWithArray": { + "post": { + "tags": [ + "user" + ], + "summary": "Creates list of users with given input array", + "description": "", + "operationId": "createUsersWithArrayInput", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "List of user object", + "required": true, + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/User" + } + } + } + ], + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/user/createWithList": { + "post": { + "tags": [ + "user" + ], + "summary": "Creates list of users with given input array", + "description": "", + "operationId": "createUsersWithListInput", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "List of user object", + "required": true, + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/User" + } + } + } + ], + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/user/{username}": { + "get": { + "tags": [ + "user" + ], + "summary": "Get user by user name", + "description": "", + "operationId": "getUserByName", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "name": "username", + "in": "path", + "description": "The name that needs to be fetched. Use user1 for testing. ", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/User" + } + }, + "400": { + "description": "Invalid username supplied" + }, + "404": { + "description": "User not found" + } + } + }, + "put": { + "tags": [ + "user" + ], + "summary": "Updated user", + "description": "This can only be done by the logged in user.", + "operationId": "updateUser", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "name": "username", + "in": "path", + "description": "name that need to be updated", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "body", + "description": "Updated user object", + "required": true, + "schema": { + "$ref": "#/definitions/User" + } + } + ], + "responses": { + "400": { + "description": "Invalid user supplied" + }, + "404": { + "description": "User not found" + } + } + }, + "delete": { + "tags": [ + "user" + ], + "summary": "Delete user", + "description": "This can only be done by the logged in user.", + "operationId": "deleteUser", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "name": "username", + "in": "path", + "description": "The name that needs to be deleted", + "required": true, + "type": "string" + } + ], + "responses": { + "400": { + "description": "Invalid username supplied" + }, + "404": { + "description": "User not found" + } + } + } + }, + "/user/login": { + "get": { + "tags": [ + "user" + ], + "summary": "Logs user into the system", + "description": "", + "operationId": "loginUser", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "name": "username", + "in": "query", + "description": "The user name for login", + "required": true, + "type": "string" + }, + { + "name": "password", + "in": "query", + "description": "The password for login in clear text", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "headers": { + "X-Expires-After": { + "type": "string", + "format": "date-time", + "description": "date in UTC when token expires" + }, + "X-Rate-Limit": { + "type": "integer", + "format": "int32", + "description": "calls per hour allowed by the user" + } + }, + "schema": { + "type": "string" + } + }, + "400": { + "description": "Invalid username/password supplied" + } + } + } + }, + "/user/logout": { + "get": { + "tags": [ + "user" + ], + "summary": "Logs out current logged in user session", + "description": "", + "operationId": "logoutUser", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [], + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/user": { + "post": { + "tags": [ + "user" + ], + "summary": "Create user", + "description": "This can only be done by the logged in user.", + "operationId": "createUser", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "Created user object", + "required": true, + "schema": { + "$ref": "#/definitions/User" + } + } + ], + "responses": { + "default": { + "description": "successful operation" + } + } + } + } + }, + "securityDefinitions": { + "api_key": { + "type": "apiKey", + "name": "api_key", + "in": "header" + }, + "petstore_auth": { + "type": "oauth2", + "authorizationUrl": "https://petstore.swagger.io/oauth/authorize", + "flow": "implicit", + "scopes": { + "read:pets": "read your pets", + "write:pets": "modify pets in your account" + } + } + }, + "definitions": { + "ApiResponse": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "format": "int32" + }, + "type": { + "type": "string" + }, + "message": { + "type": "string" + } + } + }, + "Category": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + } + }, + "xml": { + "name": "Category" + } + }, + "Pet": { + "type": "object", + "required": [ + "name", + "photoUrls" + ], + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "category": { + "$ref": "#/definitions/Category" + }, + "name": { + "type": "string", + "example": "doggie" + }, + "photoUrls": { + "type": "array", + "xml": { + "wrapped": true + }, + "items": { + "type": "string", + "xml": { + "name": "photoUrl" + } + } + }, + "tags": { + "type": "array", + "xml": { + "wrapped": true + }, + "items": { + "xml": { + "name": "tag" + }, + "$ref": "#/definitions/Tag" + } + }, + "status": { + "type": "string", + "description": "pet status in the store", + "enum": [ + "available", + "pending", + "sold" + ] + } + }, + "xml": { + "name": "Pet" + } + }, + "Tag": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + } + }, + "xml": { + "name": "Tag" + } + }, + "Order": { + "type": "object", + "properties": { + "bool": { + "description": "Simple boolean enum", + "type": "boolean", + "enum": [ + true + ] + }, + "id": { + "type": "integer", + "format": "int64" + }, + "petId": { + "type": "integer", + "format": "int64" + }, + "quantity": { + "type": "integer", + "format": "int32" + }, + "shipDate": { + "type": "string", + "format": "date-time" + }, + "status": { + "type": "string", + "description": "Order Status", + "enum": [ + "placed", + "approved", + "delivered" + ] + }, + "complete": { + "type": "boolean" + } + }, + "xml": { + "name": "Order" + } + }, + "User": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "username": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "email": { + "type": "string" + }, + "password": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "userStatus": { + "type": "integer", + "format": "int32", + "description": "User Status" + } + }, + "xml": { + "name": "User" + } + } + }, + "externalDocs": { + "description": "Find out more about Swagger", + "url": "http://swagger.io" + } +} diff --git a/samples/spec/v3.json b/samples/spec/v3.json new file mode 100644 index 000000000..120239692 --- /dev/null +++ b/samples/spec/v3.json @@ -0,0 +1,1225 @@ +{ + "openapi": "3.0.2", + "info": { + "title": "Swagger Petstore - OpenAPI 3.0", + "description": "This is a sample Pet Store Server based on the OpenAPI 3.0 specification. You can find out more about\nSwagger at [http://swagger.io](http://swagger.io). In the third iteration of the pet store, we've switched to the design first approach!\nYou can now help us improve the API whether it's by making changes to the definition itself or to the code.\nThat way, with time, we can improve the API in general, and expose some of the new features in OAS3.\n\nSome useful links:\n- [The Pet Store repository](https://github.com/swagger-api/swagger-petstore)\n- [The source API definition for the Pet Store](https://github.com/swagger-api/swagger-petstore/blob/main/src/main/resources/openapi.yaml) ", + "termsOfService": "http://swagger.io/terms/", + "contact": { + "email": "apiteam@swagger.io" + }, + "license": { + "name": "Apache 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + }, + "version": "1.0.4" + }, + "externalDocs": { + "description": "Find out more about Swagger", + "url": "http://swagger.io" + }, + "servers": [ + { + "url": "/api/v3" + } + ], + "tags": [ + { + "name": "pet", + "description": "Everything about your Pets", + "externalDocs": { + "description": "Find out more", + "url": "http://swagger.io" + } + }, + { + "name": "store", + "description": "Operations about user" + }, + { + "name": "user", + "description": "Access to Petstore orders", + "externalDocs": { + "description": "Find out more about our store", + "url": "http://swagger.io" + } + } + ], + "paths": { + "/pet": { + "put": { + "tags": [ + "pet" + ], + "summary": "Update an existing pet", + "description": "Update an existing pet by Id", + "operationId": "updatePet", + "requestBody": { + "description": "Update an existent pet in the store", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + }, + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + } + } + }, + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Pet not found" + }, + "405": { + "description": "Validation exception" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + }, + "post": { + "tags": [ + "pet" + ], + "summary": "Add a new pet to the store", + "description": "Add a new pet to the store", + "operationId": "addPet", + "requestBody": { + "description": "Create a new pet in the store", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + }, + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + } + } + }, + "405": { + "description": "Invalid input" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/pet/findByStatus": { + "get": { + "tags": [ + "pet" + ], + "summary": "Finds Pets by status", + "description": "Multiple status values can be provided with comma separated strings", + "operationId": "findPetsByStatus", + "parameters": [ + { + "name": "status", + "in": "query", + "description": "Status values that need to be considered for filter", + "required": false, + "explode": true, + "schema": { + "type": "string", + "default": "available", + "enum": [ + "available", + "pending", + "sold" + ] + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/xml": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Pet" + } + } + }, + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Pet" + } + } + } + } + }, + "400": { + "description": "Invalid status value" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/pet/findByTags": { + "get": { + "tags": [ + "pet" + ], + "summary": "Finds Pets by tags", + "description": "Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.", + "operationId": "findPetsByTags", + "parameters": [ + { + "name": "tags", + "in": "query", + "description": "Tags to filter by", + "required": false, + "explode": true, + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/xml": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Pet" + } + } + }, + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Pet" + } + } + } + } + }, + "400": { + "description": "Invalid tag value" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/pet/{petId}": { + "get": { + "tags": [ + "pet" + ], + "summary": "Find pet by ID", + "description": "Returns a single pet", + "operationId": "getPetById", + "parameters": [ + { + "name": "petId", + "in": "path", + "description": "ID of pet to return", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + } + } + }, + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Pet not found" + } + }, + "security": [ + { + "api_key": [] + }, + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + }, + "post": { + "tags": [ + "pet" + ], + "summary": "Updates a pet in the store with form data", + "description": "", + "operationId": "updatePetWithForm", + "parameters": [ + { + "name": "petId", + "in": "path", + "description": "ID of pet that needs to be updated", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + }, + { + "name": "name", + "in": "query", + "description": "Name of pet that needs to be updated", + "schema": { + "type": "string" + } + }, + { + "name": "status", + "in": "query", + "description": "Status of pet that needs to be updated", + "schema": { + "type": "string" + } + } + ], + "responses": { + "405": { + "description": "Invalid input" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + }, + "delete": { + "tags": [ + "pet" + ], + "summary": "Deletes a pet", + "description": "", + "operationId": "deletePet", + "parameters": [ + { + "name": "api_key", + "in": "header", + "description": "", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "petId", + "in": "path", + "description": "Pet id to delete", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "400": { + "description": "Invalid pet value" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/pet/{petId}/uploadImage": { + "post": { + "tags": [ + "pet" + ], + "summary": "uploads an image", + "description": "", + "operationId": "uploadFile", + "parameters": [ + { + "name": "petId", + "in": "path", + "description": "ID of pet to update", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + }, + { + "name": "additionalMetadata", + "in": "query", + "description": "Additional Metadata", + "required": false, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiResponse" + } + } + } + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/store/inventory": { + "get": { + "tags": [ + "store" + ], + "summary": "Returns pet inventories by status", + "description": "Returns a map of status codes to quantities", + "operationId": "getInventory", + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": { + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "security": [ + { + "api_key": [] + } + ] + } + }, + "/store/order": { + "post": { + "tags": [ + "store" + ], + "summary": "Place an order for a pet", + "description": "Place a new order in the store", + "operationId": "placeOrder", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Order" + } + }, + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Order" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/Order" + } + } + } + }, + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Order" + } + } + } + }, + "405": { + "description": "Invalid input" + } + } + } + }, + "/store/order/{orderId}": { + "get": { + "tags": [ + "store" + ], + "summary": "Find purchase order by ID", + "description": "For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions", + "operationId": "getOrderById", + "parameters": [ + { + "name": "orderId", + "in": "path", + "description": "ID of order that needs to be fetched", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Order" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/Order" + } + } + } + }, + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Order not found" + } + } + }, + "delete": { + "tags": [ + "store" + ], + "summary": "Delete purchase order by ID", + "description": "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors", + "operationId": "deleteOrder", + "parameters": [ + { + "name": "orderId", + "in": "path", + "description": "ID of the order that needs to be deleted", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Order not found" + } + } + } + }, + "/user": { + "post": { + "tags": [ + "user" + ], + "summary": "Create user", + "description": "This can only be done by the logged in user.", + "operationId": "createUser", + "requestBody": { + "description": "Created user object", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + }, + "application/xml": { + "schema": { + "$ref": "#/components/schemas/User" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "responses": { + "default": { + "description": "successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + }, + "application/xml": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + } + } + } + }, + "/user/createWithList": { + "post": { + "tags": [ + "user" + ], + "summary": "Creates list of users with given input array", + "description": "Creates list of users with given input array", + "operationId": "createUsersWithListInput", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/User" + } + } + } + } + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/xml": { + "schema": { + "$ref": "#/components/schemas/User" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "default": { + "description": "successful operation" + } + } + } + }, + "/user/login": { + "get": { + "tags": [ + "user" + ], + "summary": "Logs user into the system", + "description": "", + "operationId": "loginUser", + "parameters": [ + { + "name": "username", + "in": "query", + "description": "The user name for login", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "password", + "in": "query", + "description": "The password for login in clear text", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "headers": { + "X-Rate-Limit": { + "description": "calls per hour allowed by the user", + "schema": { + "type": "integer", + "format": "int32" + } + }, + "X-Expires-After": { + "description": "date in UTC when toekn expires", + "schema": { + "type": "string", + "format": "date-time" + } + } + }, + "content": { + "application/xml": { + "schema": { + "type": "string" + } + }, + "application/json": { + "schema": { + "type": "string" + } + } + } + }, + "400": { + "description": "Invalid username/password supplied" + } + } + } + }, + "/user/logout": { + "get": { + "tags": [ + "user" + ], + "summary": "Logs out current logged in user session", + "description": "", + "operationId": "logoutUser", + "parameters": [], + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/user/{username}": { + "get": { + "tags": [ + "user" + ], + "summary": "Get user by user name", + "description": "", + "operationId": "getUserByName", + "parameters": [ + { + "name": "username", + "in": "path", + "description": "The name that needs to be fetched. Use user1 for testing. ", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/xml": { + "schema": { + "$ref": "#/components/schemas/User" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "400": { + "description": "Invalid username supplied" + }, + "404": { + "description": "User not found" + } + } + }, + "put": { + "tags": [ + "user" + ], + "summary": "Update user", + "description": "This can only be done by the logged in user.", + "operationId": "updateUser", + "parameters": [ + { + "name": "username", + "in": "path", + "description": "name that need to be deleted", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "description": "Update an existent user in the store", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + }, + "application/xml": { + "schema": { + "$ref": "#/components/schemas/User" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "responses": { + "default": { + "description": "successful operation" + } + } + }, + "delete": { + "tags": [ + "user" + ], + "summary": "Delete user", + "description": "This can only be done by the logged in user.", + "operationId": "deleteUser", + "parameters": [ + { + "name": "username", + "in": "path", + "description": "The name that needs to be deleted", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "400": { + "description": "Invalid username supplied" + }, + "404": { + "description": "User not found" + } + } + } + } + }, + "components": { + "schemas": { + "Order": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64", + "example": 10 + }, + "petId": { + "type": "integer", + "format": "int64", + "example": 198772 + }, + "quantity": { + "type": "integer", + "format": "int32", + "example": 7 + }, + "shipDate": { + "type": "string", + "format": "date-time" + }, + "status": { + "type": "string", + "description": "Order Status", + "example": "approved", + "enum": [ + "placed", + "approved", + "delivered" + ] + }, + "complete": { + "type": "boolean" + } + }, + "xml": { + "name": "order" + } + }, + "Customer": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64", + "example": 100000 + }, + "username": { + "type": "string", + "example": "fehguy" + }, + "address": { + "type": "array", + "xml": { + "name": "addresses", + "wrapped": true + }, + "items": { + "$ref": "#/components/schemas/Address" + } + } + }, + "xml": { + "name": "customer" + } + }, + "Address": { + "type": "object", + "properties": { + "street": { + "type": "string", + "example": "437 Lytton" + }, + "city": { + "type": "string", + "example": "Palo Alto" + }, + "state": { + "type": "string", + "example": "CA" + }, + "zip": { + "type": "string", + "example": "94301" + } + }, + "xml": { + "name": "address" + } + }, + "Category": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64", + "example": 1 + }, + "name": { + "type": "string", + "example": "Dogs" + } + }, + "xml": { + "name": "category" + } + }, + "User": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64", + "example": 10 + }, + "username": { + "type": "string", + "example": "theUser" + }, + "firstName": { + "type": "string", + "example": "John" + }, + "lastName": { + "type": "string", + "example": "James" + }, + "email": { + "type": "string", + "example": "john@email.com" + }, + "password": { + "type": "string", + "example": "12345" + }, + "phone": { + "type": "string", + "example": "12345" + }, + "userStatus": { + "type": "integer", + "description": "User Status", + "format": "int32", + "example": 1 + } + }, + "xml": { + "name": "user" + } + }, + "Tag": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + } + }, + "xml": { + "name": "tag" + } + }, + "Pet": { + "required": [ + "name", + "photoUrls" + ], + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64", + "example": 10 + }, + "name": { + "type": "string", + "example": "doggie" + }, + "category": { + "$ref": "#/components/schemas/Category" + }, + "photoUrls": { + "type": "array", + "xml": { + "wrapped": true + }, + "items": { + "type": "string", + "xml": { + "name": "photoUrl" + } + } + }, + "tags": { + "type": "array", + "xml": { + "wrapped": true + }, + "items": { + "$ref": "#/components/schemas/Tag" + } + }, + "status": { + "type": "string", + "description": "pet status in the store", + "enum": [ + "available", + "pending", + "sold" + ] + } + }, + "xml": { + "name": "pet" + } + }, + "ApiResponse": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "format": "int32" + }, + "type": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "xml": { + "name": "##default" + } + } + }, + "requestBodies": { + "Pet": { + "description": "Pet object that needs to be added to the store", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + }, + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + } + } + }, + "UserArray": { + "description": "List of user object", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/User" + } + } + } + } + } + }, + "securitySchemes": { + "petstore_auth": { + "type": "oauth2", + "flows": { + "implicit": { + "authorizationUrl": "https://petstore3.swagger.io/oauth/authorize", + "scopes": { + "write:pets": "modify pets in your account", + "read:pets": "read your pets" + } + } + } + }, + "api_key": { + "type": "apiKey", + "name": "api_key", + "in": "header" + } + } + } +} diff --git a/src/HttpClient.ts b/src/HttpClient.ts new file mode 100644 index 000000000..40c77c7c9 --- /dev/null +++ b/src/HttpClient.ts @@ -0,0 +1,7 @@ +export enum HttpClient { + FETCH = 'fetch', + XHR = 'xhr', + NODE = 'node', + AXIOS = 'axios', + ANGULAR = 'angular', +} diff --git a/src/Indent.ts b/src/Indent.ts new file mode 100644 index 000000000..4203f34c5 --- /dev/null +++ b/src/Indent.ts @@ -0,0 +1,5 @@ +export enum Indent { + SPACE_4 = '4', + SPACE_2 = '2', + TAB = 'tab', +} diff --git a/src/client/interfaces/Client.d.ts b/src/client/interfaces/Client.d.ts index f761f87c5..844e2c6f1 100644 --- a/src/client/interfaces/Client.d.ts +++ b/src/client/interfaces/Client.d.ts @@ -1,9 +1,9 @@ -import { Model } from './Model'; -import { Service } from './Service'; +import type { Model } from './Model'; +import type { Service } from './Service'; export interface Client { version: string; server: string; - models: Map; - services: Map; + models: Model[]; + services: Service[]; } diff --git a/src/client/interfaces/Enum.d.ts b/src/client/interfaces/Enum.d.ts index a67c575ef..fd41e95aa 100644 --- a/src/client/interfaces/Enum.d.ts +++ b/src/client/interfaces/Enum.d.ts @@ -2,4 +2,5 @@ export interface Enum { name: string; value: string; type: string; + description: string | null; } diff --git a/src/client/interfaces/Model.d.ts b/src/client/interfaces/Model.d.ts index 3ef186007..5f0318942 100644 --- a/src/client/interfaces/Model.d.ts +++ b/src/client/interfaces/Model.d.ts @@ -1,20 +1,17 @@ -import { Enum } from './Enum'; -import { Schema } from './Schema'; +import type { Enum } from './Enum'; +import type { Schema } from './Schema'; export interface Model extends Schema { name: string; - export: 'reference' | 'generic' | 'enum' | 'array' | 'dictionary' | 'interface'; + export: 'reference' | 'generic' | 'enum' | 'array' | 'dictionary' | 'interface' | 'one-of' | 'any-of' | 'all-of'; type: string; base: string; template: string | null; link: Model | null; description: string | null; - isProperty: boolean; - isReadOnly: boolean; - isRequired: boolean; - isNullable: boolean; + deprecated?: boolean; + default?: string; imports: string[]; - extends: string[]; enum: Enum[]; enums: Model[]; properties: Model[]; diff --git a/src/client/interfaces/ModelComposition.d.ts b/src/client/interfaces/ModelComposition.d.ts new file mode 100644 index 000000000..f17fc5e64 --- /dev/null +++ b/src/client/interfaces/ModelComposition.d.ts @@ -0,0 +1,8 @@ +import type { Model } from './Model'; + +export interface ModelComposition { + type: 'one-of' | 'any-of' | 'all-of'; + imports: string[]; + enums: Model[]; + properties: Model[]; +} diff --git a/src/client/interfaces/Operation.d.ts b/src/client/interfaces/Operation.d.ts index b27f1abba..779144325 100644 --- a/src/client/interfaces/Operation.d.ts +++ b/src/client/interfaces/Operation.d.ts @@ -1,6 +1,6 @@ -import { OperationError } from './OperationError'; -import { OperationParameters } from './OperationParameters'; -import { OperationResponse } from './OperationResponse'; +import type { OperationError } from './OperationError'; +import type { OperationParameters } from './OperationParameters'; +import type { OperationResponse } from './OperationResponse'; export interface Operation extends OperationParameters { service: string; @@ -12,4 +12,5 @@ export interface Operation extends OperationParameters { path: string; errors: OperationError[]; results: OperationResponse[]; + responseHeader: string | null; } diff --git a/src/client/interfaces/OperationParameter.d.ts b/src/client/interfaces/OperationParameter.d.ts index 9d31776e5..77c0da771 100644 --- a/src/client/interfaces/OperationParameter.d.ts +++ b/src/client/interfaces/OperationParameter.d.ts @@ -1,7 +1,7 @@ -import { Model } from './Model'; +import type { Model } from './Model'; export interface OperationParameter extends Model { in: 'path' | 'query' | 'header' | 'formData' | 'body' | 'cookie'; prop: string; - default?: any; + mediaType: string | null; } diff --git a/src/client/interfaces/OperationParameters.d.ts b/src/client/interfaces/OperationParameters.d.ts index b2e0240f5..43419438c 100644 --- a/src/client/interfaces/OperationParameters.d.ts +++ b/src/client/interfaces/OperationParameters.d.ts @@ -1,4 +1,4 @@ -import { OperationParameter } from './OperationParameter'; +import type { OperationParameter } from './OperationParameter'; export interface OperationParameters { imports: string[]; diff --git a/src/client/interfaces/OperationResponse.d.ts b/src/client/interfaces/OperationResponse.d.ts index fd359c13e..0eed91537 100644 --- a/src/client/interfaces/OperationResponse.d.ts +++ b/src/client/interfaces/OperationResponse.d.ts @@ -1,5 +1,6 @@ -import { Model } from './Model'; +import type { Model } from './Model'; export interface OperationResponse extends Model { + in: 'response' | 'header'; code: number; } diff --git a/src/client/interfaces/OperationResult.d.ts b/src/client/interfaces/OperationResult.d.ts deleted file mode 100644 index 62748e96a..000000000 --- a/src/client/interfaces/OperationResult.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface OperationResult { - type: string; - imports: string[]; -} diff --git a/src/client/interfaces/Schema.d.ts b/src/client/interfaces/Schema.d.ts new file mode 100644 index 000000000..26a116dbf --- /dev/null +++ b/src/client/interfaces/Schema.d.ts @@ -0,0 +1,31 @@ +export interface Schema { + isDefinition: boolean; + isReadOnly: boolean; + isRequired: boolean; + isNullable: boolean; + format?: + | 'int32' + | 'int64' + | 'float' + | 'double' + | 'string' + | 'boolean' + | 'byte' + | 'binary' + | 'date' + | 'date-time' + | 'password'; + maximum?: number; + exclusiveMaximum?: boolean; + minimum?: number; + exclusiveMinimum?: boolean; + multipleOf?: number; + maxLength?: number; + minLength?: number; + pattern?: string; + maxItems?: number; + minItems?: number; + uniqueItems?: boolean; + maxProperties?: number; + minProperties?: number; +} diff --git a/src/client/interfaces/Service.d.ts b/src/client/interfaces/Service.d.ts index f7861cd2c..9ab21ebee 100644 --- a/src/client/interfaces/Service.d.ts +++ b/src/client/interfaces/Service.d.ts @@ -1,4 +1,4 @@ -import { Operation } from './Operation'; +import type { Operation } from './Operation'; export interface Service { name: string; diff --git a/src/client/interfaces/Type.d.ts b/src/client/interfaces/Type.d.ts index 5445eea5f..114c68b63 100644 --- a/src/client/interfaces/Type.d.ts +++ b/src/client/interfaces/Type.d.ts @@ -3,4 +3,5 @@ export interface Type { base: string; template: string | null; imports: string[]; + isNullable: boolean; } diff --git a/src/index.spec.ts b/src/index.spec.ts new file mode 100644 index 000000000..ff7bd155a --- /dev/null +++ b/src/index.spec.ts @@ -0,0 +1,35 @@ +import OpenAPI from './index'; + +describe('index', () => { + it('parses v2 without issues', async () => { + await OpenAPI.generate({ + input: './test/spec/v2.json', + output: './generated/v2/', + write: false, + }); + }); + + it('parses v3 without issues', async () => { + await OpenAPI.generate({ + input: './test/spec/v3.json', + output: './generated/v3/', + write: false, + }); + }); + + it('downloads and parses v2 without issues', async () => { + await OpenAPI.generate({ + input: 'https://raw.githubusercontent.com/ferdikoomen/openapi-typescript-codegen/main/test/spec/v2.json', + output: './generated/v2-downloaded/', + write: false, + }); + }); + + it('downloads and parses v3 without issues', async () => { + await OpenAPI.generate({ + input: 'https://raw.githubusercontent.com/ferdikoomen/openapi-typescript-codegen/main/test/spec/v3.json', + output: './generated/v3-downloaded/', + write: false, + }); + }); +}); diff --git a/src/index.ts b/src/index.ts index 392d1227c..e63919085 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,75 +1,132 @@ -import * as path from 'path'; -import * as ts from 'typescript'; -import { OpenApiVersion, getOpenApiVersion } from './utils/getOpenApiVersion'; -import { getOpenApiSpec } from './utils/getOpenApiSpec'; +import { HttpClient } from './HttpClient'; +import { Indent } from './Indent'; import { parse as parseV2 } from './openApi/v2'; import { parse as parseV3 } from './openApi/v3'; -import { readHandlebarsTemplates } from './utils/readHandlebarsTemplates'; +import { getOpenApiSpec } from './utils/getOpenApiSpec'; +import { getOpenApiVersion, OpenApiVersion } from './utils/getOpenApiVersion'; +import { isString } from './utils/isString'; +import { postProcessClient } from './utils/postProcessClient'; +import { registerHandlebarTemplates } from './utils/registerHandlebarTemplates'; import { writeClient } from './utils/writeClient'; -export enum Language { - TYPESCRIPT = 'typescript', - JAVASCRIPT = 'javascript', -} +export { HttpClient } from './HttpClient'; +export { Indent } from './Indent'; -export enum HttpClient { - FETCH = 'fetch', - XHR = 'xhr', -} +export type Options = { + input: string | Record; + output: string; + httpClient?: HttpClient; + clientName?: string; + useOptions?: boolean; + useUnionTypes?: boolean; + exportCore?: boolean; + exportServices?: boolean; + exportModels?: boolean; + exportSchemas?: boolean; + indent?: Indent; + postfixServices?: string; + postfixModels?: string; + request?: string; + write?: boolean; +}; /** * Generate the OpenAPI client. This method will read the OpenAPI specification and based on the * given language it will generate the client, including the typed models, validation schemas, * service layer, etc. - * @param input The relative location of the OpenAPI spec. - * @param output The relative location of the output directory. - * @param language: The language that should be generated (Typescript or Javascript). - * @param httpClient: The selected httpClient (fetch or XHR). + * @param input The relative location of the OpenAPI spec + * @param output The relative location of the output directory + * @param httpClient The selected httpClient (fetch, xhr, node or axios) + * @param clientName Custom client class name + * @param useOptions Use options or arguments functions + * @param useUnionTypes Use union types instead of enums + * @param exportCore Generate core client classes + * @param exportServices Generate services + * @param exportModels Generate models + * @param exportSchemas Generate schemas + * @param indent Indentation options (4, 2 or tab) + * @param postfixServices Service name postfix + * @param postfixModels Model name postfix + * @param request Path to custom request file + * @param write Write the files to disk (true or false) */ -export function generate(input: string, output: string, language: Language = Language.TYPESCRIPT, httpClient: HttpClient = HttpClient.FETCH): void { - const inputPath = path.resolve(process.cwd(), input); - const outputPath = path.resolve(process.cwd(), output); +export const generate = async ({ + input, + output, + httpClient = HttpClient.FETCH, + clientName, + useOptions = false, + useUnionTypes = false, + exportCore = true, + exportServices = true, + exportModels = true, + exportSchemas = false, + indent = Indent.SPACE_4, + postfixServices = 'Service', + postfixModels = '', + request, + write = true, +}: Options): Promise => { + const openApi = isString(input) ? await getOpenApiSpec(input) : input; + const openApiVersion = getOpenApiVersion(openApi); + const templates = registerHandlebarTemplates({ + httpClient, + useUnionTypes, + useOptions, + }); - try { - // Load the specification, read the OpenAPI version and load the - // handlebar templates for the given language - const openApi = getOpenApiSpec(inputPath); - const openApiVersion = getOpenApiVersion(openApi); - const templates = readHandlebarsTemplates(language); - - switch (language) { - case Language.JAVASCRIPT: - case Language.TYPESCRIPT: - // Generate and write version 2 client - if (openApiVersion === OpenApiVersion.V2) { - const clientV2 = parseV2(openApi); - writeClient(clientV2, language, httpClient, templates, outputPath); - } + switch (openApiVersion) { + case OpenApiVersion.V2: { + const client = parseV2(openApi); + const clientFinal = postProcessClient(client); + if (!write) break; + await writeClient( + clientFinal, + templates, + output, + httpClient, + useOptions, + useUnionTypes, + exportCore, + exportServices, + exportModels, + exportSchemas, + indent, + postfixServices, + postfixModels, + clientName, + request + ); + break; + } - // Generate and write version 3 client - if (openApiVersion === OpenApiVersion.V3) { - const clientV3 = parseV3(openApi); - writeClient(clientV3, language, httpClient, templates, outputPath); - } + case OpenApiVersion.V3: { + const client = parseV3(openApi); + const clientFinal = postProcessClient(client); + if (!write) break; + await writeClient( + clientFinal, + templates, + output, + httpClient, + useOptions, + useUnionTypes, + exportCore, + exportServices, + exportModels, + exportSchemas, + indent, + postfixServices, + postfixModels, + clientName, + request + ); + break; } - } catch (e) { - console.error(e); - process.exit(1); } -} +}; -export function compile(dir: string): void { - const config = { - compilerOptions: { - target: 'esnext', - module: 'commonjs', - moduleResolution: 'node', - }, - include: ['./index.ts'], - }; - const configFile = ts.parseConfigFileTextToJson('tsconfig.json', JSON.stringify(config)); - const configFileResult = ts.parseJsonConfigFileContent(configFile.config, ts.sys, path.resolve(process.cwd(), dir), undefined, 'tsconfig.json'); - const compilerHost = ts.createCompilerHost(configFileResult.options); - const compiler = ts.createProgram(configFileResult.fileNames, configFileResult.options, compilerHost); - compiler.emit(); -} +export default { + HttpClient, + generate, +}; diff --git a/src/openApi/v2/index.ts b/src/openApi/v2/index.ts index 734b80d48..9dbdadb34 100644 --- a/src/openApi/v2/index.ts +++ b/src/openApi/v2/index.ts @@ -1,20 +1,20 @@ -import { Client } from '../../client/interfaces/Client'; -import { OpenApi } from './interfaces/OpenApi'; +import type { Client } from '../../client/interfaces/Client'; +import type { OpenApi } from './interfaces/OpenApi'; import { getModels } from './parser/getModels'; import { getServer } from './parser/getServer'; -import { getServiceVersion } from './parser/getServiceVersion'; import { getServices } from './parser/getServices'; +import { getServiceVersion } from './parser/getServiceVersion'; /** * Parse the OpenAPI specification to a Client model that contains * all the models, services and schema's we should output. * @param openApi The OpenAPI spec that we have loaded from disk. */ -export function parse(openApi: OpenApi): Client { - return { - version: getServiceVersion(openApi.info.version), - server: getServer(openApi), - models: getModels(openApi), - services: getServices(openApi), - }; -} +export const parse = (openApi: OpenApi): Client => { + const version = getServiceVersion(openApi.info.version); + const server = getServer(openApi); + const models = getModels(openApi); + const services = getServices(openApi); + + return { version, server, models, services }; +}; diff --git a/src/openApi/v2/interfaces/Extensions/WithEnumExtension.d.ts b/src/openApi/v2/interfaces/Extensions/WithEnumExtension.d.ts new file mode 100644 index 000000000..0d6ead780 --- /dev/null +++ b/src/openApi/v2/interfaces/Extensions/WithEnumExtension.d.ts @@ -0,0 +1,4 @@ +export interface WithEnumExtension { + 'x-enum-varnames'?: string[]; + 'x-enum-descriptions'?: string[]; +} diff --git a/src/openApi/v2/interfaces/Extensions/WithNullableExtension.d.ts b/src/openApi/v2/interfaces/Extensions/WithNullableExtension.d.ts new file mode 100644 index 000000000..ed2632ff5 --- /dev/null +++ b/src/openApi/v2/interfaces/Extensions/WithNullableExtension.d.ts @@ -0,0 +1,3 @@ +export interface WithNullableExtension { + 'x-nullable'?: boolean; +} diff --git a/src/openApi/v2/interfaces/OpenApi.d.ts b/src/openApi/v2/interfaces/OpenApi.d.ts index 04629930c..7ed8cf36d 100644 --- a/src/openApi/v2/interfaces/OpenApi.d.ts +++ b/src/openApi/v2/interfaces/OpenApi.d.ts @@ -1,16 +1,16 @@ -import { Dictionary } from '../../../utils/types'; -import { OpenApiExternalDocs } from './OpenApiExternalDocs'; -import { OpenApiInfo } from './OpenApiInfo'; -import { OpenApiParameter } from './OpenApiParameter'; -import { OpenApiPath } from './OpenApiPath'; -import { OpenApiResponse } from './OpenApiResponse'; -import { OpenApiSchema } from './OpenApiSchema'; -import { OpenApiSecurityRequirement } from './OpenApiSecurityRequirement'; -import { OpenApiSecurityScheme } from './OpenApiSecurityScheme'; -import { OpenApiTag } from './OpenApiTag'; +import type { Dictionary } from '../../../utils/types'; +import type { OpenApiExternalDocs } from './OpenApiExternalDocs'; +import type { OpenApiInfo } from './OpenApiInfo'; +import type { OpenApiParameter } from './OpenApiParameter'; +import type { OpenApiPath } from './OpenApiPath'; +import type { OpenApiResponse } from './OpenApiResponse'; +import type { OpenApiSchema } from './OpenApiSchema'; +import type { OpenApiSecurityRequirement } from './OpenApiSecurityRequirement'; +import type { OpenApiSecurityScheme } from './OpenApiSecurityScheme'; +import type { OpenApiTag } from './OpenApiTag'; /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md */ export interface OpenApi { swagger: string; diff --git a/src/openApi/v2/interfaces/OpenApiContact.d.ts b/src/openApi/v2/interfaces/OpenApiContact.d.ts index 485e97a5e..7399d905f 100644 --- a/src/openApi/v2/interfaces/OpenApiContact.d.ts +++ b/src/openApi/v2/interfaces/OpenApiContact.d.ts @@ -1,5 +1,5 @@ /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#contactObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md#contactObject */ export interface OpenApiContact { name?: string; diff --git a/src/openApi/v2/interfaces/OpenApiExample.d.ts b/src/openApi/v2/interfaces/OpenApiExample.d.ts index 692752f5c..7a5be38c6 100644 --- a/src/openApi/v2/interfaces/OpenApiExample.d.ts +++ b/src/openApi/v2/interfaces/OpenApiExample.d.ts @@ -1,5 +1,5 @@ /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#exampleObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md#exampleObject */ export interface OpenApiExample { [mimetype: string]: any; diff --git a/src/openApi/v2/interfaces/OpenApiExternalDocs.d.ts b/src/openApi/v2/interfaces/OpenApiExternalDocs.d.ts index dfcc9bb5c..e844fef7b 100644 --- a/src/openApi/v2/interfaces/OpenApiExternalDocs.d.ts +++ b/src/openApi/v2/interfaces/OpenApiExternalDocs.d.ts @@ -1,5 +1,5 @@ /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#externalDocumentationObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md#externalDocumentationObject */ export interface OpenApiExternalDocs { description?: string; diff --git a/src/openApi/v2/interfaces/OpenApiHeader.d.ts b/src/openApi/v2/interfaces/OpenApiHeader.d.ts index bd0c6087e..fcb191df0 100644 --- a/src/openApi/v2/interfaces/OpenApiHeader.d.ts +++ b/src/openApi/v2/interfaces/OpenApiHeader.d.ts @@ -1,13 +1,24 @@ -import { Dictionary } from '../../../utils/types'; -import { OpenApiItems } from './OpenApiItems'; +import type { Dictionary } from '../../../utils/types'; +import type { OpenApiItems } from './OpenApiItems'; /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#headerObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md#headerObject */ export interface OpenApiHeader { description?: string; type: 'string' | 'number' | 'integer' | 'boolean' | 'array'; - format?: 'int32' | 'int64' | 'float' | 'double' | 'string' | 'boolean' | 'byte' | 'binary' | 'date' | 'date-time' | 'password'; + format?: + | 'int32' + | 'int64' + | 'float' + | 'double' + | 'string' + | 'boolean' + | 'byte' + | 'binary' + | 'date' + | 'date-time' + | 'password'; items?: Dictionary; collectionFormat?: 'csv' | 'ssv' | 'tsv' | 'pipes'; default?: any; @@ -21,6 +32,6 @@ export interface OpenApiHeader { maxItems?: number; minItems?: number; uniqueItems?: boolean; - enum?: string[]; + enum?: (string | number)[]; multipleOf?: number; } diff --git a/src/openApi/v2/interfaces/OpenApiInfo.d.ts b/src/openApi/v2/interfaces/OpenApiInfo.d.ts index efa6d8ba5..7d98fd174 100644 --- a/src/openApi/v2/interfaces/OpenApiInfo.d.ts +++ b/src/openApi/v2/interfaces/OpenApiInfo.d.ts @@ -1,8 +1,8 @@ -import { OpenApiContact } from './OpenApiContact'; -import { OpenApiLicense } from './OpenApiLicense'; +import type { OpenApiContact } from './OpenApiContact'; +import type { OpenApiLicense } from './OpenApiLicense'; /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#infoObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md#infoObject */ export interface OpenApiInfo { title: string; diff --git a/src/openApi/v2/interfaces/OpenApiItems.d.ts b/src/openApi/v2/interfaces/OpenApiItems.d.ts index 826f7f890..70a67d598 100644 --- a/src/openApi/v2/interfaces/OpenApiItems.d.ts +++ b/src/openApi/v2/interfaces/OpenApiItems.d.ts @@ -1,9 +1,22 @@ +import type { WithEnumExtension } from './Extensions/WithEnumExtension'; + /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#itemsObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md#itemsObject */ -export interface OpenApiItems { +export interface OpenApiItems extends WithEnumExtension { type?: string; - format?: 'int32' | 'int64' | 'float' | 'double' | 'string' | 'boolean' | 'byte' | 'binary' | 'date' | 'date-time' | 'password'; + format?: + | 'int32' + | 'int64' + | 'float' + | 'double' + | 'string' + | 'boolean' + | 'byte' + | 'binary' + | 'date' + | 'date-time' + | 'password'; items?: OpenApiItems; collectionFormat?: 'csv' | 'ssv' | 'tsv' | 'pipes'; default?: any; @@ -17,6 +30,6 @@ export interface OpenApiItems { maxItems?: number; minItems?: number; uniqueItems?: boolean; - enum?: string[]; + enum?: (string | number)[]; multipleOf?: number; } diff --git a/src/openApi/v2/interfaces/OpenApiLicense.d.ts b/src/openApi/v2/interfaces/OpenApiLicense.d.ts index 44fc2f4a3..190c83775 100644 --- a/src/openApi/v2/interfaces/OpenApiLicense.d.ts +++ b/src/openApi/v2/interfaces/OpenApiLicense.d.ts @@ -1,5 +1,5 @@ /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#licenseObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md#licenseObject */ export interface OpenApiLicense { name: string; diff --git a/src/openApi/v2/interfaces/OpenApiOperation.d.ts b/src/openApi/v2/interfaces/OpenApiOperation.d.ts index d3881e88d..69240057d 100644 --- a/src/openApi/v2/interfaces/OpenApiOperation.d.ts +++ b/src/openApi/v2/interfaces/OpenApiOperation.d.ts @@ -1,10 +1,10 @@ -import { OpenApiExternalDocs } from './OpenApiExternalDocs'; -import { OpenApiParameter } from './OpenApiParameter'; -import { OpenApiResponses } from './OpenApiResponses'; -import { OpenApiSecurityRequirement } from './OpenApiSecurityRequirement'; +import type { OpenApiExternalDocs } from './OpenApiExternalDocs'; +import type { OpenApiParameter } from './OpenApiParameter'; +import type { OpenApiResponses } from './OpenApiResponses'; +import type { OpenApiSecurityRequirement } from './OpenApiSecurityRequirement'; /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#operationObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md#operationObject */ export interface OpenApiOperation { tags?: string[]; @@ -16,7 +16,7 @@ export interface OpenApiOperation { produces?: string[]; parameters?: OpenApiParameter[]; responses: OpenApiResponses; - schemes: ('http' | 'https' | 'ws' | 'wss')[]; + schemes?: ('http' | 'https' | 'ws' | 'wss')[]; deprecated?: boolean; security?: OpenApiSecurityRequirement[]; } diff --git a/src/openApi/v2/interfaces/OpenApiParameter.d.ts b/src/openApi/v2/interfaces/OpenApiParameter.d.ts index d6b56960b..6517ea7bb 100644 --- a/src/openApi/v2/interfaces/OpenApiParameter.d.ts +++ b/src/openApi/v2/interfaces/OpenApiParameter.d.ts @@ -1,18 +1,31 @@ -import { OpenApiItems } from './OpenApiItems'; -import { OpenApiReference } from './OpenApiReference'; -import { OpenApiSchema } from './OpenApiSchema'; +import type { WithEnumExtension } from './Extensions/WithEnumExtension'; +import type { WithNullableExtension } from './Extensions/WithNullableExtension'; +import type { OpenApiItems } from './OpenApiItems'; +import type { OpenApiReference } from './OpenApiReference'; +import type { OpenApiSchema } from './OpenApiSchema'; /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#parameterObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md#parameterObject */ -export interface OpenApiParameter extends OpenApiReference { +export interface OpenApiParameter extends OpenApiReference, WithEnumExtension, WithNullableExtension { name: string; in: 'path' | 'query' | 'header' | 'formData' | 'body'; description?: string; required?: boolean; schema?: OpenApiSchema; type?: string; - format?: 'int32' | 'int64' | 'float' | 'double' | 'string' | 'boolean' | 'byte' | 'binary' | 'date' | 'date-time' | 'password'; + format?: + | 'int32' + | 'int64' + | 'float' + | 'double' + | 'string' + | 'boolean' + | 'byte' + | 'binary' + | 'date' + | 'date-time' + | 'password'; allowEmptyValue?: boolean; items?: OpenApiItems; collectionFormat?: 'csv' | 'ssv' | 'tsv' | 'pipes' | 'multi'; diff --git a/src/openApi/v2/interfaces/OpenApiPath.d.ts b/src/openApi/v2/interfaces/OpenApiPath.d.ts index 4e9fcd790..14a0fbc65 100644 --- a/src/openApi/v2/interfaces/OpenApiPath.d.ts +++ b/src/openApi/v2/interfaces/OpenApiPath.d.ts @@ -1,9 +1,9 @@ -import { OpenApiOperation } from './OpenApiOperation'; -import { OpenApiParameter } from './OpenApiParameter'; -import { OpenApiReference } from './OpenApiReference'; +import type { OpenApiOperation } from './OpenApiOperation'; +import type { OpenApiParameter } from './OpenApiParameter'; +import type { OpenApiReference } from './OpenApiReference'; /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#pathItemObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md#pathItemObject */ export interface OpenApiPath extends OpenApiReference { get?: OpenApiOperation; diff --git a/src/openApi/v2/interfaces/OpenApiReference.d.ts b/src/openApi/v2/interfaces/OpenApiReference.d.ts index cbf3253db..aea0db42a 100644 --- a/src/openApi/v2/interfaces/OpenApiReference.d.ts +++ b/src/openApi/v2/interfaces/OpenApiReference.d.ts @@ -1,5 +1,5 @@ /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#referenceObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md#referenceObject */ export interface OpenApiReference { $ref?: string; diff --git a/src/openApi/v2/interfaces/OpenApiResponse.d.ts b/src/openApi/v2/interfaces/OpenApiResponse.d.ts index 6b42777ca..b463a4b69 100644 --- a/src/openApi/v2/interfaces/OpenApiResponse.d.ts +++ b/src/openApi/v2/interfaces/OpenApiResponse.d.ts @@ -1,11 +1,11 @@ -import { Dictionary } from '../../../utils/types'; -import { OpenApiExample } from './OpenApiExample'; -import { OpenApiHeader } from './OpenApiHeader'; -import { OpenApiReference } from './OpenApiReference'; -import { OpenApiSchema } from './OpenApiSchema'; +import type { Dictionary } from '../../../utils/types'; +import type { OpenApiExample } from './OpenApiExample'; +import type { OpenApiHeader } from './OpenApiHeader'; +import type { OpenApiReference } from './OpenApiReference'; +import type { OpenApiSchema } from './OpenApiSchema'; /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#responseObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md#responseObject */ export interface OpenApiResponse extends OpenApiReference { description: string; diff --git a/src/openApi/v2/interfaces/OpenApiResponses.d.ts b/src/openApi/v2/interfaces/OpenApiResponses.d.ts index 5d35b9442..a57731cb9 100644 --- a/src/openApi/v2/interfaces/OpenApiResponses.d.ts +++ b/src/openApi/v2/interfaces/OpenApiResponses.d.ts @@ -1,7 +1,7 @@ -import { OpenApiResponse } from './OpenApiResponse'; +import type { OpenApiResponse } from './OpenApiResponse'; /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#responsesObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md#responsesObject */ export interface OpenApiResponses { default?: OpenApiResponse; diff --git a/src/openApi/v2/interfaces/OpenApiSchema.d.ts b/src/openApi/v2/interfaces/OpenApiSchema.d.ts index 7f36b6fac..aa7662d94 100644 --- a/src/openApi/v2/interfaces/OpenApiSchema.d.ts +++ b/src/openApi/v2/interfaces/OpenApiSchema.d.ts @@ -1,12 +1,14 @@ -import { Dictionary } from '../../../utils/types'; -import { OpenApiExternalDocs } from './OpenApiExternalDocs'; -import { OpenApiReference } from './OpenApiReference'; -import { OpenApiXml } from './OpenApiXml'; +import type { Dictionary } from '../../../utils/types'; +import type { WithEnumExtension } from './Extensions/WithEnumExtension'; +import type { WithNullableExtension } from './Extensions/WithNullableExtension'; +import type { OpenApiExternalDocs } from './OpenApiExternalDocs'; +import type { OpenApiReference } from './OpenApiReference'; +import type { OpenApiXml } from './OpenApiXml'; /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#schemaObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md#schemaObject */ -export interface OpenApiSchema extends OpenApiReference { +export interface OpenApiSchema extends OpenApiReference, WithEnumExtension, WithNullableExtension { title?: string; description?: string; default?: any; @@ -26,7 +28,18 @@ export interface OpenApiSchema extends OpenApiReference { required?: string[]; enum?: (string | number)[]; type?: string; - format?: 'int32' | 'int64' | 'float' | 'double' | 'string' | 'boolean' | 'byte' | 'binary' | 'date' | 'date-time' | 'password'; + format?: + | 'int32' + | 'int64' + | 'float' + | 'double' + | 'string' + | 'boolean' + | 'byte' + | 'binary' + | 'date' + | 'date-time' + | 'password'; items?: OpenApiSchema; allOf?: OpenApiSchema[]; properties?: Dictionary; diff --git a/src/openApi/v2/interfaces/OpenApiSecurityRequirement.d.ts b/src/openApi/v2/interfaces/OpenApiSecurityRequirement.d.ts index 3c1ce9af6..782a4eebc 100644 --- a/src/openApi/v2/interfaces/OpenApiSecurityRequirement.d.ts +++ b/src/openApi/v2/interfaces/OpenApiSecurityRequirement.d.ts @@ -1,5 +1,5 @@ /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#securityRequirementObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md#securityRequirementObject */ export interface OpenApiSecurityRequirement { [key: string]: string; diff --git a/src/openApi/v2/interfaces/OpenApiSecurityScheme.d.ts b/src/openApi/v2/interfaces/OpenApiSecurityScheme.d.ts index 0e94a7ef4..d0d78e7a5 100644 --- a/src/openApi/v2/interfaces/OpenApiSecurityScheme.d.ts +++ b/src/openApi/v2/interfaces/OpenApiSecurityScheme.d.ts @@ -1,7 +1,7 @@ -import { Dictionary } from '../../../utils/types'; +import type { Dictionary } from '../../../utils/types'; /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#securitySchemeObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md#securitySchemeObject */ export interface OpenApiSecurityScheme { type: 'basic' | 'apiKey' | 'oauth2'; diff --git a/src/openApi/v2/interfaces/OpenApiTag.d.ts b/src/openApi/v2/interfaces/OpenApiTag.d.ts index 7b935e782..8e41c02ca 100644 --- a/src/openApi/v2/interfaces/OpenApiTag.d.ts +++ b/src/openApi/v2/interfaces/OpenApiTag.d.ts @@ -1,7 +1,7 @@ -import { OpenApiExternalDocs } from './OpenApiExternalDocs'; +import type { OpenApiExternalDocs } from './OpenApiExternalDocs'; /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#tagObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md#tagObject */ export interface OpenApiTag { name: string; diff --git a/src/openApi/v2/interfaces/OpenApiXml.d.ts b/src/openApi/v2/interfaces/OpenApiXml.d.ts index 6bd8a1bcc..a8b87af0d 100644 --- a/src/openApi/v2/interfaces/OpenApiXml.d.ts +++ b/src/openApi/v2/interfaces/OpenApiXml.d.ts @@ -1,5 +1,5 @@ /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#xmlObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md#xmlObject */ export interface OpenApiXml { name?: string; diff --git a/src/openApi/v2/parser/constants.ts b/src/openApi/v2/parser/constants.ts deleted file mode 100644 index 04041dd7a..000000000 --- a/src/openApi/v2/parser/constants.ts +++ /dev/null @@ -1,44 +0,0 @@ -export enum PrimaryType { - FILE = 'File', - OBJECT = 'any', - BOOLEAN = 'boolean', - NUMBER = 'number', - STRING = 'string', - VOID = 'void', - NULL = 'null', -} - -export const TYPE_MAPPINGS = new Map([ - ['file', PrimaryType.FILE], - ['binary', PrimaryType.FILE], - ['any', PrimaryType.OBJECT], - ['object', PrimaryType.OBJECT], - ['boolean', PrimaryType.BOOLEAN], - ['byte', PrimaryType.NUMBER], - ['int', PrimaryType.NUMBER], - ['int32', PrimaryType.NUMBER], - ['int64', PrimaryType.NUMBER], - ['integer', PrimaryType.NUMBER], - ['float', PrimaryType.NUMBER], - ['double', PrimaryType.NUMBER], - ['short', PrimaryType.NUMBER], - ['long', PrimaryType.NUMBER], - ['number', PrimaryType.NUMBER], - ['char', PrimaryType.STRING], - ['date', PrimaryType.STRING], - ['date-time', PrimaryType.STRING], - ['password', PrimaryType.STRING], - ['string', PrimaryType.STRING], - ['void', PrimaryType.VOID], - ['null', PrimaryType.NULL], -]); - -export enum Method { - GET = 'get', - PUT = 'put', - POST = 'post', - DELETE = 'delete', - OPTIONS = 'options', - HEAD = 'head', - PATCH = 'patch', -} diff --git a/src/openApi/v2/parser/escapeName.spec.ts b/src/openApi/v2/parser/escapeName.spec.ts new file mode 100644 index 000000000..8e343d4f9 --- /dev/null +++ b/src/openApi/v2/parser/escapeName.spec.ts @@ -0,0 +1,21 @@ +import { escapeName } from './escapeName'; + +describe('escapeName', () => { + it('should escape', () => { + expect(escapeName('')).toEqual("''"); + expect(escapeName('fooBar')).toEqual('fooBar'); + expect(escapeName('Foo Bar')).toEqual(`'Foo Bar'`); + expect(escapeName('foo bar')).toEqual(`'foo bar'`); + expect(escapeName('foo-bar')).toEqual(`'foo-bar'`); + expect(escapeName('foo.bar')).toEqual(`'foo.bar'`); + expect(escapeName('foo_bar')).toEqual('foo_bar'); + expect(escapeName('123foo.bar')).toEqual(`'123foo.bar'`); + expect(escapeName('@foo.bar')).toEqual(`'@foo.bar'`); + expect(escapeName('$foo.bar')).toEqual(`'$foo.bar'`); + expect(escapeName('_foo.bar')).toEqual(`'_foo.bar'`); + expect(escapeName('123foobar')).toEqual(`'123foobar'`); + expect(escapeName('@foobar')).toEqual(`'@foobar'`); + expect(escapeName('$foobar')).toEqual('$foobar'); + expect(escapeName('_foobar')).toEqual('_foobar'); + }); +}); diff --git a/src/openApi/v2/parser/escapeName.ts b/src/openApi/v2/parser/escapeName.ts new file mode 100644 index 000000000..9d6816c10 --- /dev/null +++ b/src/openApi/v2/parser/escapeName.ts @@ -0,0 +1,9 @@ +export const escapeName = (value: string): string => { + if (value || value === '') { + const validName = /^[a-zA-Z_$][\w$]+$/g.test(value); + if (!validName) { + return `'${value}'`; + } + } + return value; +}; diff --git a/src/openApi/v2/parser/extendEnum.ts b/src/openApi/v2/parser/extendEnum.ts new file mode 100644 index 000000000..a7fa865cb --- /dev/null +++ b/src/openApi/v2/parser/extendEnum.ts @@ -0,0 +1,21 @@ +import type { Enum } from '../../../client/interfaces/Enum'; +import { isString } from '../../../utils/isString'; +import type { WithEnumExtension } from '../interfaces/Extensions/WithEnumExtension'; + +/** + * Extend the enum with the x-enum properties. This adds the capability + * to use names and descriptions inside the generated enums. + * @param enumerators + * @param definition + */ +export const extendEnum = (enumerators: Enum[], definition: WithEnumExtension): Enum[] => { + const names = definition['x-enum-varnames']?.filter(isString); + const descriptions = definition['x-enum-descriptions']?.filter(isString); + + return enumerators.map((enumerator, index) => ({ + name: names?.[index] || enumerator.name, + description: descriptions?.[index] || enumerator.description, + value: enumerator.value, + type: enumerator.type, + })); +}; diff --git a/src/openApi/v2/parser/getComment.ts b/src/openApi/v2/parser/getComment.ts deleted file mode 100644 index d9af7afa2..000000000 --- a/src/openApi/v2/parser/getComment.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { EOL } from 'os'; - -export function getComment(comment?: string): string | null { - if (comment) { - return comment - .split(/(\r\n|\n|\r)+/g) - .filter(line => line) - .map(line => line.trim()) - .join(EOL) - .replace(/(\r\n|\n|\r)+/g, '$1 * '); - } - return null; -} diff --git a/src/openApi/v2/parser/getEnum.ts b/src/openApi/v2/parser/getEnum.ts index 094a552dc..64c7ca8b5 100644 --- a/src/openApi/v2/parser/getEnum.ts +++ b/src/openApi/v2/parser/getEnum.ts @@ -1,26 +1,34 @@ -import { Enum } from '../../../client/interfaces/Enum'; -import { PrimaryType } from './constants'; +import type { Enum } from '../../../client/interfaces/Enum'; -export function getEnum(values?: (string | number)[]): Enum[] { +export const getEnum = (values?: (string | number)[]): Enum[] => { if (Array.isArray(values)) { return values .filter((value, index, arr) => { return arr.indexOf(value) === index; }) + .filter((value: any) => { + return typeof value === 'number' || typeof value === 'string'; + }) .map(value => { if (typeof value === 'number') { return { - name: `NUM_${value}`, + name: `'_${value}'`, value: String(value), - type: PrimaryType.NUMBER, + type: 'number', + description: null, }; } return { - name: value.replace(/([a-z])([A-Z]+)/g, '$1_$2').toUpperCase(), - value: `'${value}'`, - type: PrimaryType.STRING, + name: String(value) + .replace(/\W+/g, '_') + .replace(/^(\d+)/g, '_$1') + .replace(/([a-z])([A-Z]+)/g, '$1_$2') + .toUpperCase(), + value: `'${value.replace(/'/g, "\\'")}'`, + type: 'string', + description: null, }; }); } return []; -} +}; diff --git a/src/openApi/v2/parser/getEnumFromDescription.ts b/src/openApi/v2/parser/getEnumFromDescription.ts deleted file mode 100644 index 60696e7eb..000000000 --- a/src/openApi/v2/parser/getEnumFromDescription.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Enum } from '../../../client/interfaces/Enum'; -import { PrimaryType } from './constants'; - -export function getEnumFromDescription(description: string): Enum[] { - // Check if we can find this special format string: - // None=0,Something=1,AnotherThing=2 - if (/^(\w+=[0-9]+,?)+$/g.test(description)) { - const matches = description.match(/(\w+=[0-9]+,?)/g); - if (matches) { - // Grab the values from the description - const symbols: Enum[] = []; - matches.forEach(match => { - const name = match.split('=')[0]; - const value = parseInt(match.split('=')[1].replace(/[^0-9]/g, '')); - if (name && Number.isInteger(value)) { - symbols.push({ - name: name.replace(/([a-z])([A-Z]+)/g, '$1_$2').toUpperCase(), - value: String(value), - type: PrimaryType.NUMBER, - }); - } - }); - - // Filter out any duplicate names - return symbols.filter((symbol, index, arr) => { - return arr.map(item => item.name).indexOf(symbol.name) === index; - }); - } - } - - return []; -} diff --git a/src/openApi/v2/parser/getEnumValues.ts b/src/openApi/v2/parser/getEnumValues.ts deleted file mode 100644 index 348208fe2..000000000 --- a/src/openApi/v2/parser/getEnumValues.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Enum } from '../../../client/interfaces/Enum'; - -export function getEnumValues(enumerators: Enum[]): string[] { - // Fetch values from the symbols, just to be sure we filter out - // any double values and finally we sort them to make them easier - // to read when we use them in our generated code. - return enumerators - .map(enumerator => enumerator.value) - .filter((enumerator, index, arr) => { - return arr.indexOf(enumerator) === index; - }) - .sort(); -} diff --git a/src/openApi/v2/parser/getMappedType.spec.ts b/src/openApi/v2/parser/getMappedType.spec.ts index b437f85d9..8dd847c91 100644 --- a/src/openApi/v2/parser/getMappedType.spec.ts +++ b/src/openApi/v2/parser/getMappedType.spec.ts @@ -2,8 +2,8 @@ import { getMappedType } from './getMappedType'; describe('getMappedType', () => { it('should map types to the basics', () => { - expect(getMappedType('File')).toEqual('File'); - expect(getMappedType('String')).toEqual('string'); + expect(getMappedType('file')).toEqual('binary'); + expect(getMappedType('string')).toEqual('string'); expect(getMappedType('date')).toEqual('string'); expect(getMappedType('date-time')).toEqual('string'); expect(getMappedType('float')).toEqual('number'); @@ -15,7 +15,7 @@ describe('getMappedType', () => { expect(getMappedType('object')).toEqual('any'); expect(getMappedType('void')).toEqual('void'); expect(getMappedType('null')).toEqual('null'); - expect(getMappedType('unknown')).toEqual('unknown'); - expect(getMappedType('')).toEqual(''); + expect(getMappedType('unknown')).toEqual(undefined); + expect(getMappedType('')).toEqual(undefined); }); }); diff --git a/src/openApi/v2/parser/getMappedType.ts b/src/openApi/v2/parser/getMappedType.ts index ca11fa7e4..a7c32fd84 100644 --- a/src/openApi/v2/parser/getMappedType.ts +++ b/src/openApi/v2/parser/getMappedType.ts @@ -1,16 +1,32 @@ -import { PrimaryType, TYPE_MAPPINGS } from './constants'; +const TYPE_MAPPINGS = new Map([ + ['file', 'binary'], + ['any', 'any'], + ['object', 'any'], + ['array', 'any[]'], + ['boolean', 'boolean'], + ['byte', 'number'], + ['int', 'number'], + ['integer', 'number'], + ['float', 'number'], + ['double', 'number'], + ['short', 'number'], + ['long', 'number'], + ['number', 'number'], + ['char', 'string'], + ['date', 'string'], + ['date-time', 'string'], + ['password', 'string'], + ['string', 'string'], + ['void', 'void'], + ['null', 'null'], +]); /** * Get mapped type for given type to any basic Typescript/Javascript type. */ -export function getMappedType(type: string): PrimaryType | string { - const mapped = TYPE_MAPPINGS.get(type.toLowerCase()); - if (mapped) { - return mapped; +export const getMappedType = (type: string, format?: string): string | undefined => { + if (format === 'binary') { + return 'binary'; } - return type; -} - -export function hasMappedType(type: string): boolean { - return TYPE_MAPPINGS.has(type.toLowerCase()); -} + return TYPE_MAPPINGS.get(type); +}; diff --git a/src/openApi/v2/parser/getModel.ts b/src/openApi/v2/parser/getModel.ts index e69546a00..22f3528aa 100644 --- a/src/openApi/v2/parser/getModel.ts +++ b/src/openApi/v2/parser/getModel.ts @@ -1,28 +1,46 @@ -import { Model } from '../../../client/interfaces/Model'; -import { OpenApi } from '../interfaces/OpenApi'; -import { OpenApiSchema } from '../interfaces/OpenApiSchema'; -import { PrimaryType } from './constants'; -import { getComment } from './getComment'; +import type { Model } from '../../../client/interfaces/Model'; +import { getPattern } from '../../../utils/getPattern'; +import type { OpenApi } from '../interfaces/OpenApi'; +import type { OpenApiSchema } from '../interfaces/OpenApiSchema'; +import { extendEnum } from './extendEnum'; import { getEnum } from './getEnum'; -import { getEnumFromDescription } from './getEnumFromDescription'; +import { getModelComposition } from './getModelComposition'; import { getModelProperties } from './getModelProperties'; import { getType } from './getType'; -export function getModel(openApi: OpenApi, definition: OpenApiSchema, isProperty: boolean = false, name: string = ''): Model { +export const getModel = ( + openApi: OpenApi, + definition: OpenApiSchema, + isDefinition: boolean = false, + name: string = '' +): Model => { const model: Model = { - name: name, + name, export: 'interface', - type: PrimaryType.OBJECT, - base: PrimaryType.OBJECT, + type: 'any', + base: 'any', template: null, link: null, - description: getComment(definition.description), - isProperty: isProperty, + description: definition.description || null, + isDefinition, isReadOnly: definition.readOnly === true, - isNullable: false, + isNullable: definition['x-nullable'] === true, isRequired: false, + format: definition.format, + maximum: definition.maximum, + exclusiveMaximum: definition.exclusiveMaximum, + minimum: definition.minimum, + exclusiveMinimum: definition.exclusiveMinimum, + multipleOf: definition.multipleOf, + maxLength: definition.maxLength, + minLength: definition.minLength, + maxItems: definition.maxItems, + minItems: definition.minItems, + uniqueItems: definition.uniqueItems, + maxProperties: definition.maxProperties, + minProperties: definition.minProperties, + pattern: getPattern(definition.pattern), imports: [], - extends: [], enum: [], enums: [], properties: [], @@ -38,24 +56,14 @@ export function getModel(openApi: OpenApi, definition: OpenApiSchema, isProperty return model; } - if (definition.enum) { + if (definition.enum && definition.type !== 'boolean') { const enumerators = getEnum(definition.enum); - if (enumerators.length) { + const extendedEnumerators = extendEnum(enumerators, definition); + if (extendedEnumerators.length) { model.export = 'enum'; - model.type = PrimaryType.STRING; - model.base = PrimaryType.STRING; - model.enum.push(...enumerators); - return model; - } - } - - if ((definition.type === 'int' || definition.type === 'integer') && definition.description) { - const enumerators = getEnumFromDescription(definition.description); - if (enumerators.length) { - model.export = 'enum'; - model.type = PrimaryType.NUMBER; - model.base = PrimaryType.NUMBER; - model.enum.push(...enumerators); + model.type = 'string'; + model.base = 'string'; + model.enum.push(...extendedEnumerators); return model; } } @@ -70,7 +78,7 @@ export function getModel(openApi: OpenApi, definition: OpenApiSchema, isProperty model.imports.push(...arrayItems.imports); return model; } else { - const arrayItems = getModel(openApi, definition.items, true); + const arrayItems = getModel(openApi, definition.items); model.export = 'array'; model.type = arrayItems.type; model.base = arrayItems.base; @@ -81,7 +89,7 @@ export function getModel(openApi: OpenApi, definition: OpenApiSchema, isProperty } } - if (definition.type === 'object' && definition.additionalProperties && typeof definition.additionalProperties === 'object') { + if (definition.type === 'object' && typeof definition.additionalProperties === 'object') { if (definition.additionalProperties.$ref) { const additionalProperties = getType(definition.additionalProperties.$ref); model.export = 'dictionary'; @@ -89,7 +97,6 @@ export function getModel(openApi: OpenApi, definition: OpenApiSchema, isProperty model.base = additionalProperties.base; model.template = additionalProperties.template; model.imports.push(...additionalProperties.imports); - model.imports.push('Dictionary'); return model; } else { const additionalProperties = getModel(openApi, definition.additionalProperties); @@ -99,53 +106,41 @@ export function getModel(openApi: OpenApi, definition: OpenApiSchema, isProperty model.template = additionalProperties.template; model.link = additionalProperties; model.imports.push(...additionalProperties.imports); - model.imports.push('Dictionary'); return model; } } + if (definition.allOf?.length) { + const composition = getModelComposition(openApi, definition, definition.allOf, 'all-of', getModel); + model.export = composition.type; + model.imports.push(...composition.imports); + model.properties.push(...composition.properties); + model.enums.push(...composition.enums); + return model; + } + if (definition.type === 'object') { model.export = 'interface'; - model.type = PrimaryType.OBJECT; - model.base = PrimaryType.OBJECT; - - if (definition.allOf) { - definition.allOf.forEach(parent => { - if (parent.$ref) { - const parentRef = getType(parent.$ref); - model.extends.push(parentRef.type); - model.imports.push(parentRef.base); - } - if (parent.type === 'object' && parent.properties) { - const properties = getModelProperties(openApi, parent); - properties.forEach(property => { - model.properties.push(property); - model.imports.push(...property.imports); - if (property.export === 'enum') { - model.enums.push(property); - } - }); - } - }); - } + model.type = 'any'; + model.base = 'any'; if (definition.properties) { - const properties = getModelProperties(openApi, definition); - properties.forEach(property => { - model.properties.push(property); - model.imports.push(...property.imports); - if (property.export === 'enum') { - model.enums.push(property); + const modelProperties = getModelProperties(openApi, definition, getModel); + modelProperties.forEach(modelProperty => { + model.imports.push(...modelProperty.imports); + model.enums.push(...modelProperty.enums); + model.properties.push(modelProperty); + if (modelProperty.export === 'enum') { + model.enums.push(modelProperty); } }); } - return model; } // If the schema has a type than it can be a basic or generic type. if (definition.type) { - const definitionType = getType(definition.type); + const definitionType = getType(definition.type, definition.format); model.export = 'generic'; model.type = definitionType.type; model.base = definitionType.base; @@ -155,4 +150,4 @@ export function getModel(openApi: OpenApi, definition: OpenApiSchema, isProperty } return model; -} +}; diff --git a/src/openApi/v2/parser/getModelComposition.ts b/src/openApi/v2/parser/getModelComposition.ts new file mode 100644 index 000000000..6b5e4c305 --- /dev/null +++ b/src/openApi/v2/parser/getModelComposition.ts @@ -0,0 +1,90 @@ +import type { Model } from '../../../client/interfaces/Model'; +import type { ModelComposition } from '../../../client/interfaces/ModelComposition'; +import type { OpenApi } from '../interfaces/OpenApi'; +import type { OpenApiSchema } from '../interfaces/OpenApiSchema'; +import type { getModel } from './getModel'; +import { getModelProperties } from './getModelProperties'; +import { getRequiredPropertiesFromComposition } from './getRequiredPropertiesFromComposition'; + +// Fix for circular dependency +export type GetModelFn = typeof getModel; + +export const getModelComposition = ( + openApi: OpenApi, + definition: OpenApiSchema, + definitions: OpenApiSchema[], + type: 'one-of' | 'any-of' | 'all-of', + getModel: GetModelFn +): ModelComposition => { + const composition: ModelComposition = { + type, + imports: [], + enums: [], + properties: [], + }; + + const properties: Model[] = []; + + definitions + .map(definition => getModel(openApi, definition)) + .filter(model => { + const hasProperties = model.properties.length; + const hasEnums = model.enums.length; + const isObject = model.type === 'any'; + const isEmpty = isObject && !hasProperties && !hasEnums; + return !isEmpty; + }) + .forEach(model => { + composition.imports.push(...model.imports); + composition.enums.push(...model.enums); + composition.properties.push(model); + }); + + if (definition.required) { + const requiredProperties = getRequiredPropertiesFromComposition( + openApi, + definition.required, + definitions, + getModel + ); + requiredProperties.forEach(requiredProperty => { + composition.imports.push(...requiredProperty.imports); + composition.enums.push(...requiredProperty.enums); + }); + properties.push(...requiredProperties); + } + + if (definition.properties) { + const modelProperties = getModelProperties(openApi, definition, getModel); + modelProperties.forEach(modelProperty => { + composition.imports.push(...modelProperty.imports); + composition.enums.push(...modelProperty.enums); + if (modelProperty.export === 'enum') { + composition.enums.push(modelProperty); + } + }); + properties.push(...modelProperties); + } + + if (properties.length) { + composition.properties.push({ + name: 'properties', + export: 'interface', + type: 'any', + base: 'any', + template: null, + link: null, + description: '', + isDefinition: false, + isReadOnly: false, + isNullable: false, + isRequired: false, + imports: [], + enum: [], + enums: [], + properties, + }); + } + + return composition; +}; diff --git a/src/openApi/v2/parser/getModelProperties.ts b/src/openApi/v2/parser/getModelProperties.ts index 4378a527b..7560be765 100644 --- a/src/openApi/v2/parser/getModelProperties.ts +++ b/src/openApi/v2/parser/getModelProperties.ts @@ -1,32 +1,49 @@ -import { Model } from '../../../client/interfaces/Model'; -import { OpenApi } from '../interfaces/OpenApi'; -import { OpenApiSchema } from '../interfaces/OpenApiSchema'; -import { getComment } from './getComment'; -import { getModel } from './getModel'; +import type { Model } from '../../../client/interfaces/Model'; +import { getPattern } from '../../../utils/getPattern'; +import type { OpenApi } from '../interfaces/OpenApi'; +import type { OpenApiSchema } from '../interfaces/OpenApiSchema'; +import { escapeName } from './escapeName'; +import type { getModel } from './getModel'; import { getType } from './getType'; -export function getModelProperties(openApi: OpenApi, definition: OpenApiSchema): Model[] { +// Fix for circular dependency +export type GetModelFn = typeof getModel; + +export const getModelProperties = (openApi: OpenApi, definition: OpenApiSchema, getModel: GetModelFn): Model[] => { const models: Model[] = []; for (const propertyName in definition.properties) { if (definition.properties.hasOwnProperty(propertyName)) { const property = definition.properties[propertyName]; - const propertyRequired = definition.required && definition.required.includes(propertyName); + const propertyRequired = !!definition.required?.includes(propertyName); if (property.$ref) { const model = getType(property.$ref); models.push({ - name: propertyName, + name: escapeName(propertyName), export: 'reference', type: model.type, base: model.base, template: model.template, link: null, - description: getComment(property.description), - isProperty: true, + description: property.description || null, + isDefinition: false, isReadOnly: property.readOnly === true, - isRequired: propertyRequired === true, - isNullable: false, + isRequired: propertyRequired, + isNullable: property['x-nullable'] === true, + format: property.format, + maximum: property.maximum, + exclusiveMaximum: property.exclusiveMaximum, + minimum: property.minimum, + exclusiveMinimum: property.exclusiveMinimum, + multipleOf: property.multipleOf, + maxLength: property.maxLength, + minLength: property.minLength, + maxItems: property.maxItems, + minItems: property.minItems, + uniqueItems: property.uniqueItems, + maxProperties: property.maxProperties, + minProperties: property.minProperties, + pattern: getPattern(property.pattern), imports: model.imports, - extends: [], enum: [], enums: [], properties: [], @@ -34,19 +51,32 @@ export function getModelProperties(openApi: OpenApi, definition: OpenApiSchema): } else { const model = getModel(openApi, property); models.push({ - name: propertyName, + name: escapeName(propertyName), export: model.export, type: model.type, base: model.base, template: model.template, link: model.link, - description: getComment(property.description), - isProperty: true, + description: property.description || null, + isDefinition: false, isReadOnly: property.readOnly === true, - isRequired: propertyRequired === true, - isNullable: false, + isRequired: propertyRequired, + isNullable: property['x-nullable'] === true, + format: property.format, + maximum: property.maximum, + exclusiveMaximum: property.exclusiveMaximum, + minimum: property.minimum, + exclusiveMinimum: property.exclusiveMinimum, + multipleOf: property.multipleOf, + maxLength: property.maxLength, + minLength: property.minLength, + maxItems: property.maxItems, + minItems: property.minItems, + uniqueItems: property.uniqueItems, + maxProperties: property.maxProperties, + minProperties: property.minProperties, + pattern: getPattern(property.pattern), imports: model.imports, - extends: model.extends, enum: model.enum, enums: model.enums, properties: model.properties, @@ -54,6 +84,5 @@ export function getModelProperties(openApi: OpenApi, definition: OpenApiSchema): } } } - return models; -} +}; diff --git a/src/openApi/v2/parser/getModelTemplate.spec.ts b/src/openApi/v2/parser/getModelTemplate.spec.ts index 67e46f54e..09c920a4d 100644 --- a/src/openApi/v2/parser/getModelTemplate.spec.ts +++ b/src/openApi/v2/parser/getModelTemplate.spec.ts @@ -7,6 +7,7 @@ describe('getModelTemplate', () => { base: 'Link', template: 'Model', imports: ['Model'], + isNullable: false, }); expect(template).toEqual(''); }); @@ -17,6 +18,7 @@ describe('getModelTemplate', () => { base: 'string', template: null, imports: [], + isNullable: false, }); expect(template).toEqual(''); }); diff --git a/src/openApi/v2/parser/getModelTemplate.ts b/src/openApi/v2/parser/getModelTemplate.ts index f472e7842..b2aa0b33a 100644 --- a/src/openApi/v2/parser/getModelTemplate.ts +++ b/src/openApi/v2/parser/getModelTemplate.ts @@ -1,4 +1,4 @@ -import { Type } from '../../../client/interfaces/Type'; +import type { Type } from '../../../client/interfaces/Type'; /** * If our model has a template type, then we want to generalize that! @@ -6,6 +6,6 @@ import { Type } from '../../../client/interfaces/Type'; * @param modelClass The parsed model class type. * @returns The model template type ( or empty). */ -export function getModelTemplate(modelClass: Type): string { +export const getModelTemplate = (modelClass: Type): string => { return modelClass.template ? '' : ''; -} +}; diff --git a/src/openApi/v2/parser/getModels.ts b/src/openApi/v2/parser/getModels.ts index 7aeadb01f..4ea4728cc 100644 --- a/src/openApi/v2/parser/getModels.ts +++ b/src/openApi/v2/parser/getModels.ts @@ -1,17 +1,18 @@ -import { Model } from '../../../client/interfaces/Model'; -import { OpenApi } from '../interfaces/OpenApi'; +import type { Model } from '../../../client/interfaces/Model'; +import { reservedWords } from '../../../utils/reservedWords'; +import type { OpenApi } from '../interfaces/OpenApi'; import { getModel } from './getModel'; import { getType } from './getType'; -export function getModels(openApi: OpenApi): Map { - const models = new Map(); +export const getModels = (openApi: OpenApi): Model[] => { + const models: Model[] = []; for (const definitionName in openApi.definitions) { if (openApi.definitions.hasOwnProperty(definitionName)) { const definition = openApi.definitions[definitionName]; const definitionType = getType(definitionName); - const model = getModel(openApi, definition, false, definitionType.base); - models.set(definitionType.base, model); + const model = getModel(openApi, definition, true, definitionType.base.replace(reservedWords, '_$1')); + models.push(model); } } return models; -} +}; diff --git a/src/openApi/v2/parser/getOperation.ts b/src/openApi/v2/parser/getOperation.ts index 558523d72..9aa157460 100644 --- a/src/openApi/v2/parser/getOperation.ts +++ b/src/openApi/v2/parser/getOperation.ts @@ -1,41 +1,47 @@ -import { OpenApi } from '../interfaces/OpenApi'; -import { OpenApiOperation } from '../interfaces/OpenApiOperation'; -import { Operation } from '../../../client/interfaces/Operation'; -import { getComment } from './getComment'; +import type { Operation } from '../../../client/interfaces/Operation'; +import type { OperationParameters } from '../../../client/interfaces/OperationParameters'; +import type { OpenApi } from '../interfaces/OpenApi'; +import type { OpenApiOperation } from '../interfaces/OpenApiOperation'; import { getOperationErrors } from './getOperationErrors'; import { getOperationName } from './getOperationName'; import { getOperationParameters } from './getOperationParameters'; -import { getOperationPath } from './getOperationPath'; +import { getOperationResponseHeader } from './getOperationResponseHeader'; import { getOperationResponses } from './getOperationResponses'; import { getOperationResults } from './getOperationResults'; -import { getServiceClassName } from './getServiceClassName'; +import { getServiceName } from './getServiceName'; +import { sortByRequired } from './sortByRequired'; -export function getOperation(openApi: OpenApi, url: string, method: string, op: OpenApiOperation): Operation { - const serviceName = (op.tags && op.tags[0]) || 'Service'; - const serviceClassName = getServiceClassName(serviceName); - const operationNameFallback = `${method}${serviceClassName}`; - const operationName = getOperationName(op.operationId || operationNameFallback); - const operationPath = getOperationPath(url); +export const getOperation = ( + openApi: OpenApi, + url: string, + method: string, + tag: string, + op: OpenApiOperation, + pathParams: OperationParameters +): Operation => { + const serviceName = getServiceName(tag); + const operationName = getOperationName(url, method, op.operationId); // Create a new operation object for this method. const operation: Operation = { - service: serviceClassName, + service: serviceName, name: operationName, - summary: getComment(op.summary), - description: getComment(op.description), + summary: op.summary || null, + description: op.description || null, deprecated: op.deprecated === true, - method: method, - path: operationPath, - parameters: [], - parametersPath: [], - parametersQuery: [], - parametersForm: [], - parametersHeader: [], - parametersCookie: [], - parametersBody: null, + method: method.toUpperCase(), + path: url, + parameters: [...pathParams.parameters], + parametersPath: [...pathParams.parametersPath], + parametersQuery: [...pathParams.parametersQuery], + parametersForm: [...pathParams.parametersForm], + parametersHeader: [...pathParams.parametersHeader], + parametersCookie: [...pathParams.parametersCookie], + parametersBody: pathParams.parametersBody, imports: [], errors: [], results: [], + responseHeader: null, }; // Parse the operation parameters (path, query, body, etc). @@ -56,11 +62,15 @@ export function getOperation(openApi: OpenApi, url: string, method: string, op: const operationResponses = getOperationResponses(openApi, op.responses); const operationResults = getOperationResults(operationResponses); operation.errors = getOperationErrors(operationResponses); + operation.responseHeader = getOperationResponseHeader(operationResults); + operationResults.forEach(operationResult => { operation.results.push(operationResult); operation.imports.push(...operationResult.imports); }); } + operation.parameters = operation.parameters.sort(sortByRequired); + return operation; -} +}; diff --git a/src/openApi/v2/parser/getOperationErrors.ts b/src/openApi/v2/parser/getOperationErrors.ts index ab6edbb6a..ef4c12e54 100644 --- a/src/openApi/v2/parser/getOperationErrors.ts +++ b/src/openApi/v2/parser/getOperationErrors.ts @@ -1,7 +1,11 @@ -import { OperationError } from '../../../client/interfaces/OperationError'; -import { OperationResponse } from '../../../client/interfaces/OperationResponse'; +import type { OperationError } from '../../../client/interfaces/OperationError'; +import type { OperationResponse } from '../../../client/interfaces/OperationResponse'; -export function getOperationErrors(operationResponses: OperationResponse[]): OperationError[] { +/** + * + * @param operationResponses + */ +export const getOperationErrors = (operationResponses: OperationResponse[]): OperationError[] => { return operationResponses .filter(operationResponse => { return operationResponse.code >= 300 && operationResponse.description; @@ -10,4 +14,4 @@ export function getOperationErrors(operationResponses: OperationResponse[]): Ope code: response.code, description: response.description!, })); -} +}; diff --git a/src/openApi/v2/parser/getOperationName.spec.ts b/src/openApi/v2/parser/getOperationName.spec.ts index ba8a5d3d1..bdaecb8f8 100644 --- a/src/openApi/v2/parser/getOperationName.spec.ts +++ b/src/openApi/v2/parser/getOperationName.spec.ts @@ -2,9 +2,26 @@ import { getOperationName } from './getOperationName'; describe('getOperationName', () => { it('should produce correct result', () => { - expect(getOperationName('')).toEqual(''); - expect(getOperationName('FooBar')).toEqual('fooBar'); - expect(getOperationName('Foo Bar')).toEqual('fooBar'); - expect(getOperationName('foo bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', 'GetAllUsers')).toEqual('getAllUsers'); + expect(getOperationName('/api/v{api-version}/users', 'GET', undefined)).toEqual('getApiUsers'); + expect(getOperationName('/api/v{api-version}/users', 'POST', undefined)).toEqual('postApiUsers'); + expect(getOperationName('/api/v1/users', 'GET', 'GetAllUsers')).toEqual('getAllUsers'); + expect(getOperationName('/api/v1/users', 'GET', undefined)).toEqual('getApiV1Users'); + expect(getOperationName('/api/v1/users', 'POST', undefined)).toEqual('postApiV1Users'); + expect(getOperationName('/api/v1/users/{id}', 'GET', undefined)).toEqual('getApiV1Users'); + expect(getOperationName('/api/v1/users/{id}', 'POST', undefined)).toEqual('postApiV1Users'); + + expect(getOperationName('/api/v{api-version}/users', 'GET', 'fooBar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', 'FooBar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', 'Foo Bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', 'foo bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', 'foo-bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', 'foo_bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', 'foo.bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', '@foo.bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', '$foo.bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', '_foo.bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', '-foo.bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', '123.foo.bar')).toEqual('fooBar'); }); }); diff --git a/src/openApi/v2/parser/getOperationName.ts b/src/openApi/v2/parser/getOperationName.ts index 83a9abcb7..124bf66bd 100644 --- a/src/openApi/v2/parser/getOperationName.ts +++ b/src/openApi/v2/parser/getOperationName.ts @@ -2,10 +2,23 @@ import camelCase from 'camelcase'; /** * Convert the input value to a correct operation (method) classname. - * This converts the input string to camelCase, so the method name follows - * the most popular Javascript and Typescript writing style. + * This will use the operation ID - if available - and otherwise fallback + * on a generated name from the URL */ -export function getOperationName(value: string): string { - const clean = value.replace(/[^\w\s\-]+/g, '_').trim(); - return camelCase(clean); -} +export const getOperationName = (url: string, method: string, operationId?: string): string => { + if (operationId) { + return camelCase( + operationId + .replace(/^[^a-zA-Z]+/g, '') + .replace(/[^\w\-]+/g, '-') + .trim() + ); + } + + const urlWithoutPlaceholders = url + .replace(/[^/]*?{api-version}.*?\//g, '') + .replace(/{(.*?)}/g, '') + .replace(/\//g, '-'); + + return camelCase(`${method}-${urlWithoutPlaceholders}`); +}; diff --git a/src/openApi/v2/parser/getOperationParameter.ts b/src/openApi/v2/parser/getOperationParameter.ts index db750b824..6b68c9d5a 100644 --- a/src/openApi/v2/parser/getOperationParameter.ts +++ b/src/openApi/v2/parser/getOperationParameter.ts @@ -1,36 +1,48 @@ -import { OpenApi } from '../interfaces/OpenApi'; -import { OpenApiParameter } from '../interfaces/OpenApiParameter'; -import { OperationParameter } from '../../../client/interfaces/OperationParameter'; -import { PrimaryType } from './constants'; -import { getComment } from './getComment'; +import type { OperationParameter } from '../../../client/interfaces/OperationParameter'; +import { getPattern } from '../../../utils/getPattern'; +import type { OpenApi } from '../interfaces/OpenApi'; +import type { OpenApiParameter } from '../interfaces/OpenApiParameter'; +import type { OpenApiSchema } from '../interfaces/OpenApiSchema'; +import { extendEnum } from './extendEnum'; import { getEnum } from './getEnum'; -import { getEnumFromDescription } from './getEnumFromDescription'; import { getModel } from './getModel'; import { getOperationParameterDefault } from './getOperationParameterDefault'; import { getOperationParameterName } from './getOperationParameterName'; +import { getRef } from './getRef'; import { getType } from './getType'; -export function getOperationParameter(openApi: OpenApi, parameter: OpenApiParameter): OperationParameter { +export const getOperationParameter = (openApi: OpenApi, parameter: OpenApiParameter): OperationParameter => { const operationParameter: OperationParameter = { in: parameter.in, prop: parameter.name, export: 'interface', name: getOperationParameterName(parameter.name), - type: PrimaryType.OBJECT, - base: PrimaryType.OBJECT, + type: 'any', + base: 'any', template: null, link: null, - description: getComment(parameter.description), - default: getOperationParameterDefault(parameter.default), - isProperty: false, + description: parameter.description || null, + isDefinition: false, isReadOnly: false, isRequired: parameter.required === true, - isNullable: false, + isNullable: parameter['x-nullable'] === true, + format: parameter.format, + maximum: parameter.maximum, + exclusiveMaximum: parameter.exclusiveMaximum, + minimum: parameter.minimum, + exclusiveMinimum: parameter.exclusiveMinimum, + multipleOf: parameter.multipleOf, + maxLength: parameter.maxLength, + minLength: parameter.minLength, + maxItems: parameter.maxItems, + minItems: parameter.minItems, + uniqueItems: parameter.uniqueItems, + pattern: getPattern(parameter.pattern), imports: [], - extends: [], enum: [], enums: [], properties: [], + mediaType: null, }; if (parameter.$ref) { @@ -40,87 +52,86 @@ export function getOperationParameter(openApi: OpenApi, parameter: OpenApiParame operationParameter.base = definitionRef.base; operationParameter.template = definitionRef.template; operationParameter.imports.push(...definitionRef.imports); + operationParameter.default = getOperationParameterDefault(parameter, operationParameter); return operationParameter; } if (parameter.enum) { const enumerators = getEnum(parameter.enum); - if (enumerators.length) { + const extendedEnumerators = extendEnum(enumerators, parameter); + if (extendedEnumerators.length) { operationParameter.export = 'enum'; - operationParameter.type = PrimaryType.STRING; - operationParameter.base = PrimaryType.STRING; - operationParameter.enum.push(...enumerators); - return operationParameter; - } - } - - if ((parameter.type === 'int' || parameter.type === 'integer') && parameter.description) { - const enumerators = getEnumFromDescription(parameter.description); - if (enumerators.length) { - operationParameter.export = 'enum'; - operationParameter.type = PrimaryType.NUMBER; - operationParameter.base = PrimaryType.NUMBER; - operationParameter.enum.push(...enumerators); + operationParameter.type = 'string'; + operationParameter.base = 'string'; + operationParameter.enum.push(...extendedEnumerators); + operationParameter.default = getOperationParameterDefault(parameter, operationParameter); return operationParameter; } } if (parameter.type === 'array' && parameter.items) { - const items = getType(parameter.items.type); + const items = getType(parameter.items.type, parameter.items.format); operationParameter.export = 'array'; operationParameter.type = items.type; operationParameter.base = items.base; operationParameter.template = items.template; operationParameter.imports.push(...items.imports); + operationParameter.default = getOperationParameterDefault(parameter, operationParameter); return operationParameter; } if (parameter.type === 'object' && parameter.items) { - const items = getType(parameter.items.type); + const items = getType(parameter.items.type, parameter.items.format); operationParameter.export = 'dictionary'; operationParameter.type = items.type; operationParameter.base = items.base; operationParameter.template = items.template; operationParameter.imports.push(...items.imports); - operationParameter.imports.push('Dictionary'); + operationParameter.default = getOperationParameterDefault(parameter, operationParameter); return operationParameter; } - if (parameter.schema) { - if (parameter.schema.$ref) { - const model = getType(parameter.schema.$ref); + let schema = parameter.schema; + if (schema) { + if (schema.$ref?.startsWith('#/parameters/')) { + schema = getRef(openApi, schema); + } + if (schema.$ref) { + const model = getType(schema.$ref); operationParameter.export = 'reference'; operationParameter.type = model.type; operationParameter.base = model.base; operationParameter.template = model.template; operationParameter.imports.push(...model.imports); + operationParameter.default = getOperationParameterDefault(parameter, operationParameter); return operationParameter; } else { - const model = getModel(openApi, parameter.schema); + const model = getModel(openApi, schema); operationParameter.export = model.export; operationParameter.type = model.type; operationParameter.base = model.base; operationParameter.template = model.template; operationParameter.link = model.link; operationParameter.imports.push(...model.imports); - operationParameter.extends.push(...model.extends); operationParameter.enum.push(...model.enum); operationParameter.enums.push(...model.enums); operationParameter.properties.push(...model.properties); + operationParameter.default = getOperationParameterDefault(parameter, operationParameter); return operationParameter; } } // If the parameter has a type than it can be a basic or generic type. if (parameter.type) { - const definitionType = getType(parameter.type); + const definitionType = getType(parameter.type, parameter.format); operationParameter.export = 'generic'; operationParameter.type = definitionType.type; operationParameter.base = definitionType.base; operationParameter.template = definitionType.template; operationParameter.imports.push(...definitionType.imports); + operationParameter.default = getOperationParameterDefault(parameter, operationParameter); return operationParameter; } return operationParameter; -} +}; diff --git a/src/openApi/v2/parser/getOperationParameterDefault.ts b/src/openApi/v2/parser/getOperationParameterDefault.ts index 5685a7dba..291b3adbb 100644 --- a/src/openApi/v2/parser/getOperationParameterDefault.ts +++ b/src/openApi/v2/parser/getOperationParameterDefault.ts @@ -1,15 +1,42 @@ -export function getOperationParameterDefault(value: any): string | null { - if (value === null) { +import type { OperationParameter } from '../../../client/interfaces/OperationParameter'; +import type { OpenApiParameter } from '../interfaces/OpenApiParameter'; + +export const getOperationParameterDefault = ( + parameter: OpenApiParameter, + operationParameter: OperationParameter +): string | undefined => { + if (parameter.default === undefined) { + return undefined; + } + + if (parameter.default === null) { return 'null'; } - switch (typeof value) { + const type = parameter.type || typeof parameter.default; + + switch (type) { + case 'int': + case 'integer': case 'number': + if (operationParameter.export === 'enum' && operationParameter.enum?.[parameter.default]) { + return operationParameter.enum[parameter.default].value; + } + return parameter.default; + case 'boolean': - return JSON.stringify(value); + return JSON.stringify(parameter.default); + case 'string': - return `'${value}'`; + return `'${parameter.default}'`; + + case 'object': + try { + return JSON.stringify(parameter.default, null, 4); + } catch (e) { + // Ignore + } } - return null; -} + return undefined; +}; diff --git a/src/openApi/v2/parser/getOperationParameterName.spec.ts b/src/openApi/v2/parser/getOperationParameterName.spec.ts new file mode 100644 index 000000000..725011531 --- /dev/null +++ b/src/openApi/v2/parser/getOperationParameterName.spec.ts @@ -0,0 +1,17 @@ +import { getOperationParameterName } from './getOperationParameterName'; + +describe('getOperationParameterName', () => { + it('should produce correct result', () => { + expect(getOperationParameterName('')).toEqual(''); + expect(getOperationParameterName('foobar')).toEqual('foobar'); + expect(getOperationParameterName('fooBar')).toEqual('fooBar'); + expect(getOperationParameterName('foo_bar')).toEqual('fooBar'); + expect(getOperationParameterName('foo-bar')).toEqual('fooBar'); + expect(getOperationParameterName('foo.bar')).toEqual('fooBar'); + expect(getOperationParameterName('@foo.bar')).toEqual('fooBar'); + expect(getOperationParameterName('$foo.bar')).toEqual('fooBar'); + expect(getOperationParameterName('123.foo.bar')).toEqual('fooBar'); + expect(getOperationParameterName('Foo-Bar')).toEqual('fooBar'); + expect(getOperationParameterName('FOO-BAR')).toEqual('fooBar'); + }); +}); diff --git a/src/openApi/v2/parser/getOperationParameterName.ts b/src/openApi/v2/parser/getOperationParameterName.ts index 54d80d9f6..3a7fb408b 100644 --- a/src/openApi/v2/parser/getOperationParameterName.ts +++ b/src/openApi/v2/parser/getOperationParameterName.ts @@ -1,10 +1,15 @@ import camelCase from 'camelcase'; +import { reservedWords } from '../../../utils/reservedWords'; + /** * Replaces any invalid characters from a parameter name. * For example: 'filter.someProperty' becomes 'filterSomeProperty'. */ -export function getOperationParameterName(value: string): string { - const clean = value.replace(/[^\w\s\-]+/g, '_').trim(); - return camelCase(clean); -} +export const getOperationParameterName = (value: string): string => { + const clean = value + .replace(/^[^a-zA-Z]+/g, '') + .replace(/[^\w\-]+/g, '-') + .trim(); + return camelCase(clean).replace(reservedWords, '_$1'); +}; diff --git a/src/openApi/v2/parser/getOperationParameters.ts b/src/openApi/v2/parser/getOperationParameters.ts index 63346fbaf..f265d1ccc 100644 --- a/src/openApi/v2/parser/getOperationParameters.ts +++ b/src/openApi/v2/parser/getOperationParameters.ts @@ -1,15 +1,10 @@ -import { OpenApi } from '../interfaces/OpenApi'; -import { OpenApiParameter } from '../interfaces/OpenApiParameter'; -import { OperationParameter } from '../../../client/interfaces/OperationParameter'; -import { OperationParameters } from '../../../client/interfaces/OperationParameters'; +import type { OperationParameters } from '../../../client/interfaces/OperationParameters'; +import type { OpenApi } from '../interfaces/OpenApi'; +import type { OpenApiParameter } from '../interfaces/OpenApiParameter'; import { getOperationParameter } from './getOperationParameter'; import { getRef } from './getRef'; -function sortByRequired(a: OperationParameter, b: OperationParameter): number { - return a.isRequired && !b.isRequired ? -1 : !a.isRequired && b.isRequired ? 1 : 0; -} - -export function getOperationParameters(openApi: OpenApi, parameters: OpenApiParameter[]): OperationParameters { +export const getOperationParameters = (openApi: OpenApi, parameters: OpenApiParameter[]): OperationParameters => { const operationParameters: OperationParameters = { imports: [], parameters: [], @@ -23,51 +18,44 @@ export function getOperationParameters(openApi: OpenApi, parameters: OpenApiPara // Iterate over the parameters parameters.forEach(parameterOrReference => { - const parameter = getRef(openApi, parameterOrReference); - const param = getOperationParameter(openApi, parameter); + const parameterDef = getRef(openApi, parameterOrReference); + const parameter = getOperationParameter(openApi, parameterDef); // We ignore the "api-version" param, since we do not want to add this // as the first / default parameter for each of the service calls. - if (param.prop !== 'api-version') { + if (parameter.prop !== 'api-version') { switch (parameter.in) { case 'path': - operationParameters.parametersPath.push(param); - operationParameters.parameters.push(param); - operationParameters.imports.push(...param.imports); + operationParameters.parametersPath.push(parameter); + operationParameters.parameters.push(parameter); + operationParameters.imports.push(...parameter.imports); break; case 'query': - operationParameters.parametersQuery.push(param); - operationParameters.parameters.push(param); - operationParameters.imports.push(...param.imports); + operationParameters.parametersQuery.push(parameter); + operationParameters.parameters.push(parameter); + operationParameters.imports.push(...parameter.imports); break; case 'header': - operationParameters.parametersHeader.push(param); - operationParameters.parameters.push(param); - operationParameters.imports.push(...param.imports); + operationParameters.parametersHeader.push(parameter); + operationParameters.parameters.push(parameter); + operationParameters.imports.push(...parameter.imports); break; case 'formData': - operationParameters.parametersForm.push(param); - operationParameters.parameters.push(param); - operationParameters.imports.push(...param.imports); + operationParameters.parametersForm.push(parameter); + operationParameters.parameters.push(parameter); + operationParameters.imports.push(...parameter.imports); break; case 'body': - operationParameters.parametersBody = param; - operationParameters.parameters.push(param); - operationParameters.imports.push(...param.imports); + operationParameters.parametersBody = parameter; + operationParameters.parameters.push(parameter); + operationParameters.imports.push(...parameter.imports); break; } } }); - - operationParameters.parameters = operationParameters.parameters.sort(sortByRequired); - operationParameters.parametersPath = operationParameters.parametersPath.sort(sortByRequired); - operationParameters.parametersQuery = operationParameters.parametersQuery.sort(sortByRequired); - operationParameters.parametersForm = operationParameters.parametersForm.sort(sortByRequired); - operationParameters.parametersCookie = operationParameters.parametersCookie.sort(sortByRequired); - operationParameters.parametersHeader = operationParameters.parametersHeader.sort(sortByRequired); return operationParameters; -} +}; diff --git a/src/openApi/v2/parser/getOperationPath.spec.ts b/src/openApi/v2/parser/getOperationPath.spec.ts deleted file mode 100644 index 4ede28f43..000000000 --- a/src/openApi/v2/parser/getOperationPath.spec.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { getOperationPath } from './getOperationPath'; - -describe('getOperationPath', () => { - it('should produce correct result', () => { - expect(getOperationPath('/api/v{api-version}/list/{id}/{type}')).toEqual('/api/v${OpenAPI.VERSION}/list/${id}/${type}'); - expect(getOperationPath('/api/v{api-version}/list/{id}')).toEqual('/api/v${OpenAPI.VERSION}/list/${id}'); - expect(getOperationPath('/api/v1/list/{id}')).toEqual('/api/v1/list/${id}'); - expect(getOperationPath('/api/v1/list')).toEqual('/api/v1/list'); - }); -}); diff --git a/src/openApi/v2/parser/getOperationPath.ts b/src/openApi/v2/parser/getOperationPath.ts deleted file mode 100644 index 04b6fd4e4..000000000 --- a/src/openApi/v2/parser/getOperationPath.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Get the final service path, this replaces the "{api-version}" placeholder - * with a new template string placeholder so we can dynamically inject the - * OpenAPI version without the need to hardcode this in the URL. - * @param path - */ -export function getOperationPath(path: string): string { - return path.replace(/{api-version}/g, '{OpenAPI.VERSION}').replace(/\{(.*?)\}/g, '${$1}'); -} diff --git a/src/openApi/v2/parser/getOperationResponse.ts b/src/openApi/v2/parser/getOperationResponse.ts index 200e5700b..8f6c3ca56 100644 --- a/src/openApi/v2/parser/getOperationResponse.ts +++ b/src/openApi/v2/parser/getOperationResponse.ts @@ -1,27 +1,32 @@ -import { OpenApi } from '../interfaces/OpenApi'; -import { OpenApiResponse } from '../interfaces/OpenApiResponse'; -import { OperationResponse } from '../../../client/interfaces/OperationResponse'; -import { PrimaryType } from './constants'; -import { getComment } from './getComment'; +import type { OperationResponse } from '../../../client/interfaces/OperationResponse'; +import { getPattern } from '../../../utils/getPattern'; +import type { OpenApi } from '../interfaces/OpenApi'; +import type { OpenApiResponse } from '../interfaces/OpenApiResponse'; +import type { OpenApiSchema } from '../interfaces/OpenApiSchema'; import { getModel } from './getModel'; +import { getRef } from './getRef'; import { getType } from './getType'; -export function getOperationResponse(openApi: OpenApi, response: OpenApiResponse, responseCode: number): OperationResponse { +export const getOperationResponse = ( + openApi: OpenApi, + response: OpenApiResponse, + responseCode: number +): OperationResponse => { const operationResponse: OperationResponse = { + in: 'response', name: '', code: responseCode, - description: getComment(response.description)!, + description: response.description || null, export: 'generic', - type: PrimaryType.OBJECT, - base: PrimaryType.OBJECT, + type: 'any', + base: 'any', template: null, link: null, - isProperty: false, + isDefinition: false, isReadOnly: false, isRequired: false, isNullable: false, imports: [], - extends: [], enum: [], enums: [], properties: [], @@ -29,30 +34,66 @@ export function getOperationResponse(openApi: OpenApi, response: OpenApiResponse // If this response has a schema, then we need to check two things: // if this is a reference then the parameter is just the 'name' of - // this reference type. Otherwise it might be a complex schema and - // then we need to parse the schema! - if (response.schema) { - if (response.schema.$ref) { - const model = getType(response.schema.$ref); + // this reference type. Otherwise, it might be a complex schema, + // and then we need to parse the schema! + let schema = response.schema; + if (schema) { + if (schema.$ref?.startsWith('#/responses/')) { + schema = getRef(openApi, schema); + } + if (schema.$ref) { + const model = getType(schema.$ref); operationResponse.export = 'reference'; operationResponse.type = model.type; operationResponse.base = model.base; operationResponse.template = model.template; operationResponse.imports.push(...model.imports); + return operationResponse; } else { - const model = getModel(openApi, response.schema); + const model = getModel(openApi, schema); operationResponse.export = model.export; operationResponse.type = model.type; operationResponse.base = model.base; operationResponse.template = model.template; operationResponse.link = model.link; + operationResponse.isReadOnly = model.isReadOnly; + operationResponse.isRequired = model.isRequired; + operationResponse.isNullable = model.isNullable; + operationResponse.format = model.format; + operationResponse.maximum = model.maximum; + operationResponse.exclusiveMaximum = model.exclusiveMaximum; + operationResponse.minimum = model.minimum; + operationResponse.exclusiveMinimum = model.exclusiveMinimum; + operationResponse.multipleOf = model.multipleOf; + operationResponse.maxLength = model.maxLength; + operationResponse.minLength = model.minLength; + operationResponse.maxItems = model.maxItems; + operationResponse.minItems = model.minItems; + operationResponse.uniqueItems = model.uniqueItems; + operationResponse.maxProperties = model.maxProperties; + operationResponse.minProperties = model.minProperties; + operationResponse.pattern = getPattern(model.pattern); operationResponse.imports.push(...model.imports); - operationResponse.extends.push(...model.extends); operationResponse.enum.push(...model.enum); operationResponse.enums.push(...model.enums); operationResponse.properties.push(...model.properties); + return operationResponse; + } + } + + // We support basic properties from response headers, since both + // fetch and XHR client just support string types. + if (response.headers) { + for (const name in response.headers) { + if (response.headers.hasOwnProperty(name)) { + operationResponse.in = 'header'; + operationResponse.name = name; + operationResponse.type = 'string'; + operationResponse.base = 'string'; + return operationResponse; + } } } return operationResponse; -} +}; diff --git a/src/openApi/v2/parser/getOperationResponseCode.spec.ts b/src/openApi/v2/parser/getOperationResponseCode.spec.ts new file mode 100644 index 000000000..393907090 --- /dev/null +++ b/src/openApi/v2/parser/getOperationResponseCode.spec.ts @@ -0,0 +1,13 @@ +import { getOperationResponseCode } from './getOperationResponseCode'; + +describe('getOperationResponseCode', () => { + it('should produce correct result', () => { + expect(getOperationResponseCode('')).toEqual(null); + expect(getOperationResponseCode('default')).toEqual(200); + expect(getOperationResponseCode('200')).toEqual(200); + expect(getOperationResponseCode('300')).toEqual(300); + expect(getOperationResponseCode('400')).toEqual(400); + expect(getOperationResponseCode('abc')).toEqual(null); + expect(getOperationResponseCode('-100')).toEqual(100); + }); +}); diff --git a/src/openApi/v2/parser/getOperationResponseCode.ts b/src/openApi/v2/parser/getOperationResponseCode.ts index 080cdc02d..f34c99b75 100644 --- a/src/openApi/v2/parser/getOperationResponseCode.ts +++ b/src/openApi/v2/parser/getOperationResponseCode.ts @@ -1,4 +1,4 @@ -export function getOperationResponseCode(value: string | 'default'): number | null { +export const getOperationResponseCode = (value: string | 'default'): number | null => { // You can specify a "default" response, this is treated as HTTP code 200 if (value === 'default') { return 200; @@ -8,9 +8,9 @@ export function getOperationResponseCode(value: string | 'default'): number | nu if (/[0-9]+/g.test(value)) { const code = parseInt(value); if (Number.isInteger(code)) { - return code; + return Math.abs(code); } } return null; -} +}; diff --git a/src/openApi/v2/parser/getOperationResponseHeader.ts b/src/openApi/v2/parser/getOperationResponseHeader.ts new file mode 100644 index 000000000..09a810916 --- /dev/null +++ b/src/openApi/v2/parser/getOperationResponseHeader.ts @@ -0,0 +1,11 @@ +import type { OperationResponse } from '../../../client/interfaces/OperationResponse'; + +export const getOperationResponseHeader = (operationResponses: OperationResponse[]): string | null => { + const header = operationResponses.find(operationResponses => { + return operationResponses.in === 'header'; + }); + if (header) { + return header.name; + } + return null; +}; diff --git a/src/openApi/v2/parser/getOperationResponses.ts b/src/openApi/v2/parser/getOperationResponses.ts index 876212915..ed628e857 100644 --- a/src/openApi/v2/parser/getOperationResponses.ts +++ b/src/openApi/v2/parser/getOperationResponses.ts @@ -1,12 +1,12 @@ -import { OpenApi } from '../interfaces/OpenApi'; -import { OpenApiResponse } from '../interfaces/OpenApiResponse'; -import { OpenApiResponses } from '../interfaces/OpenApiResponses'; -import { OperationResponse } from '../../../client/interfaces/OperationResponse'; +import type { OperationResponse } from '../../../client/interfaces/OperationResponse'; +import type { OpenApi } from '../interfaces/OpenApi'; +import type { OpenApiResponse } from '../interfaces/OpenApiResponse'; +import type { OpenApiResponses } from '../interfaces/OpenApiResponses'; import { getOperationResponse } from './getOperationResponse'; import { getOperationResponseCode } from './getOperationResponseCode'; import { getRef } from './getRef'; -export function getOperationResponses(openApi: OpenApi, responses: OpenApiResponses): OperationResponse[] { +export const getOperationResponses = (openApi: OpenApi, responses: OpenApiResponses): OperationResponse[] => { const operationResponses: OperationResponse[] = []; // Iterate over each response code and get the @@ -18,7 +18,8 @@ export function getOperationResponses(openApi: OpenApi, responses: OpenApiRespon const responseCode = getOperationResponseCode(code); if (responseCode) { - operationResponses.push(getOperationResponse(openApi, response, responseCode)); + const operationResponse = getOperationResponse(openApi, response, responseCode); + operationResponses.push(operationResponse); } } } @@ -27,4 +28,4 @@ export function getOperationResponses(openApi: OpenApi, responses: OpenApiRespon return operationResponses.sort((a, b): number => { return a.code < b.code ? -1 : a.code > b.code ? 1 : 0; }); -} +}; diff --git a/src/openApi/v2/parser/getOperationResults.ts b/src/openApi/v2/parser/getOperationResults.ts index fdb76359e..9d8111fe8 100644 --- a/src/openApi/v2/parser/getOperationResults.ts +++ b/src/openApi/v2/parser/getOperationResults.ts @@ -1,40 +1,41 @@ -import { Model } from '../../../client/interfaces/Model'; -import { OperationResponse } from '../../../client/interfaces/OperationResponse'; -import { PrimaryType } from './constants'; +import type { Model } from '../../../client/interfaces/Model'; +import type { OperationResponse } from '../../../client/interfaces/OperationResponse'; -function areEqual(a: Model, b: Model): boolean { +const areEqual = (a: Model, b: Model): boolean => { const equal = a.type === b.type && a.base === b.base && a.template === b.template; if (equal && a.link && b.link) { return areEqual(a.link, b.link); } return equal; -} +}; -export function getOperationResults(operationResponses: OperationResponse[]): OperationResponse[] { +export const getOperationResults = (operationResponses: OperationResponse[]): OperationResponse[] => { const operationResults: OperationResponse[] = []; + // Filter out success response codes, but skip "204 No Content" operationResponses.forEach(operationResponse => { - if (operationResponse.code && operationResponse.code >= 200 && operationResponse.code < 300) { + const { code } = operationResponse; + if (code && code !== 204 && code >= 200 && code < 300) { operationResults.push(operationResponse); } }); if (!operationResults.length) { operationResults.push({ + in: 'response', name: '', code: 200, description: '', - export: 'interface', - type: PrimaryType.OBJECT, - base: PrimaryType.OBJECT, + export: 'generic', + type: 'void', + base: 'void', template: null, link: null, - isProperty: false, + isDefinition: false, isReadOnly: false, isRequired: false, isNullable: false, imports: [], - extends: [], enum: [], enums: [], properties: [], @@ -48,4 +49,4 @@ export function getOperationResults(operationResponses: OperationResponse[]): Op }) === index ); }); -} +}; diff --git a/src/openApi/v2/parser/getRef.spec.ts b/src/openApi/v2/parser/getRef.spec.ts new file mode 100644 index 000000000..c475208b2 --- /dev/null +++ b/src/openApi/v2/parser/getRef.spec.ts @@ -0,0 +1,33 @@ +import { getRef } from './getRef'; + +describe('getRef', () => { + it('should produce correct result', () => { + expect( + getRef( + { + swagger: '2.0', + info: { + title: 'dummy', + version: '1.0', + }, + host: 'localhost:8080', + basePath: '/api', + schemes: ['http', 'https'], + paths: {}, + definitions: { + Example: { + description: 'This is an Example model ', + type: 'integer', + }, + }, + }, + { + $ref: '#/definitions/Example', + } + ) + ).toEqual({ + description: 'This is an Example model ', + type: 'integer', + }); + }); +}); diff --git a/src/openApi/v2/parser/getRef.ts b/src/openApi/v2/parser/getRef.ts index 303382ba2..f92dfcf67 100644 --- a/src/openApi/v2/parser/getRef.ts +++ b/src/openApi/v2/parser/getRef.ts @@ -1,7 +1,10 @@ -import { OpenApi } from '../interfaces/OpenApi'; -import { OpenApiReference } from '../interfaces/OpenApiReference'; +import type { OpenApi } from '../interfaces/OpenApi'; +import type { OpenApiReference } from '../interfaces/OpenApiReference'; -export function getRef(openApi: OpenApi, item: T & OpenApiReference): T { +const ESCAPED_REF_SLASH = /~1/g; +const ESCAPED_REF_TILDE = /~0/g; + +export const getRef = (openApi: OpenApi, item: T & OpenApiReference): T => { if (item.$ref) { // Fetch the paths to the definitions, this converts: // "#/definitions/Form" to ["definitions", "Form"] @@ -13,9 +16,12 @@ export function getRef(openApi: OpenApi, item: T & OpenApiReference): T { // Try to find the reference by walking down the path, // if we cannot find it, then we throw an error. let result: any = openApi; - paths.forEach((path: string): void => { - if (result.hasOwnProperty(path)) { - result = result[path]; + paths.forEach(path => { + const decodedPath = decodeURIComponent( + path.replace(ESCAPED_REF_SLASH, '/').replace(ESCAPED_REF_TILDE, '~') + ); + if (result.hasOwnProperty(decodedPath)) { + result = result[decodedPath]; } else { throw new Error(`Could not find reference: "${item.$ref}"`); } @@ -23,4 +29,4 @@ export function getRef(openApi: OpenApi, item: T & OpenApiReference): T { return result as T; } return item as T; -} +}; diff --git a/src/openApi/v2/parser/getRequiredPropertiesFromComposition.ts b/src/openApi/v2/parser/getRequiredPropertiesFromComposition.ts new file mode 100644 index 000000000..0b1f1859f --- /dev/null +++ b/src/openApi/v2/parser/getRequiredPropertiesFromComposition.ts @@ -0,0 +1,33 @@ +import type { Model } from '../../../client/interfaces/Model'; +import type { OpenApi } from '../interfaces/OpenApi'; +import type { OpenApiSchema } from '../interfaces/OpenApiSchema'; +import type { getModel } from './getModel'; +import { getRef } from './getRef'; + +// Fix for circular dependency +export type GetModelFn = typeof getModel; + +export const getRequiredPropertiesFromComposition = ( + openApi: OpenApi, + required: string[], + definitions: OpenApiSchema[], + getModel: GetModelFn +): Model[] => { + return definitions + .reduce((properties, definition) => { + if (definition.$ref) { + const schema = getRef(openApi, definition); + return [...properties, ...getModel(openApi, schema).properties]; + } + return [...properties, ...getModel(openApi, definition).properties]; + }, [] as Model[]) + .filter(property => { + return !property.isRequired && required.includes(property.name); + }) + .map(property => { + return { + ...property, + isRequired: true, + }; + }); +}; diff --git a/src/openApi/v2/parser/getServer.ts b/src/openApi/v2/parser/getServer.ts index 6037e0c57..0b1913883 100644 --- a/src/openApi/v2/parser/getServer.ts +++ b/src/openApi/v2/parser/getServer.ts @@ -1,12 +1,13 @@ -import { OpenApi } from '../interfaces/OpenApi'; +import type { OpenApi } from '../interfaces/OpenApi'; /** * Get the base server url. * @param openApi */ -export function getServer(openApi: OpenApi): string { - const scheme = (openApi.schemes && openApi.schemes[0]) || 'http'; +export const getServer = (openApi: OpenApi): string => { + const scheme = openApi.schemes?.[0] || 'http'; const host = openApi.host; const basePath = openApi.basePath || ''; - return host ? `${scheme}://${host}${basePath}` : basePath; -} + const url = host ? `${scheme}://${host}${basePath}` : basePath; + return url.replace(/\/$/g, ''); +}; diff --git a/src/openApi/v2/parser/getServiceClassName.spec.ts b/src/openApi/v2/parser/getServiceClassName.spec.ts deleted file mode 100644 index 9bcf6e152..000000000 --- a/src/openApi/v2/parser/getServiceClassName.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { getServiceClassName } from './getServiceClassName'; - -describe('getServiceClassName', () => { - it('should produce correct result', () => { - expect(getServiceClassName('')).toEqual(''); - expect(getServiceClassName('FooBar')).toEqual('FooBarService'); - expect(getServiceClassName('Foo Bar')).toEqual('FooBarService'); - expect(getServiceClassName('foo bar')).toEqual('FooBarService'); - expect(getServiceClassName('FooBarService')).toEqual('FooBarService'); - expect(getServiceClassName('Foo Bar Service')).toEqual('FooBarService'); - expect(getServiceClassName('foo bar service')).toEqual('FooBarService'); - }); -}); diff --git a/src/openApi/v2/parser/getServiceClassName.ts b/src/openApi/v2/parser/getServiceClassName.ts deleted file mode 100644 index 94131a3d9..000000000 --- a/src/openApi/v2/parser/getServiceClassName.ts +++ /dev/null @@ -1,14 +0,0 @@ -import camelCase from 'camelcase'; - -/** - * Convert the input value to a correct service classname. This converts - * the input string to PascalCase and appends the "Service" prefix if needed. - */ -export function getServiceClassName(value: string): string { - const clean = value.replace(/[^\w\s\-]+/g, '_').trim(); - const name = camelCase(clean, { pascalCase: true }); - if (name && !name.endsWith('Service')) { - return `${name}Service`; - } - return name; -} diff --git a/src/openApi/v2/parser/getServiceName.spec.ts b/src/openApi/v2/parser/getServiceName.spec.ts new file mode 100644 index 000000000..77c420d3b --- /dev/null +++ b/src/openApi/v2/parser/getServiceName.spec.ts @@ -0,0 +1,13 @@ +import { getServiceName } from './getServiceName'; + +describe('getServiceName', () => { + it('should produce correct result', () => { + expect(getServiceName('')).toEqual(''); + expect(getServiceName('FooBar')).toEqual('FooBar'); + expect(getServiceName('Foo Bar')).toEqual('FooBar'); + expect(getServiceName('foo bar')).toEqual('FooBar'); + expect(getServiceName('@fooBar')).toEqual('FooBar'); + expect(getServiceName('$fooBar')).toEqual('FooBar'); + expect(getServiceName('123fooBar')).toEqual('FooBar'); + }); +}); diff --git a/src/openApi/v2/parser/getServiceName.ts b/src/openApi/v2/parser/getServiceName.ts new file mode 100644 index 000000000..b5b1718f2 --- /dev/null +++ b/src/openApi/v2/parser/getServiceName.ts @@ -0,0 +1,13 @@ +import camelCase from 'camelcase'; + +/** + * Convert the input value to a correct service name. This converts + * the input string to PascalCase. + */ +export const getServiceName = (value: string): string => { + const clean = value + .replace(/^[^a-zA-Z]+/g, '') + .replace(/[^\w\-]+/g, '-') + .trim(); + return camelCase(clean, { pascalCase: true }); +}; diff --git a/src/openApi/v2/parser/getServiceVersion.ts b/src/openApi/v2/parser/getServiceVersion.ts index 9986f1afa..9c7a8a04b 100644 --- a/src/openApi/v2/parser/getServiceVersion.ts +++ b/src/openApi/v2/parser/getServiceVersion.ts @@ -3,6 +3,6 @@ * This basically removes any "v" prefix from the version string. * @param version */ -export function getServiceVersion(version = '1.0'): string { - return version.replace(/^v/gi, ''); -} +export const getServiceVersion = (version = '1.0'): string => { + return String(version).replace(/^v/gi, ''); +}; diff --git a/src/openApi/v2/parser/getServices.spec.ts b/src/openApi/v2/parser/getServices.spec.ts new file mode 100644 index 000000000..915ee6b09 --- /dev/null +++ b/src/openApi/v2/parser/getServices.spec.ts @@ -0,0 +1,31 @@ +import { getServices } from './getServices'; + +describe('getServices', () => { + it('should create a unnamed service if tags are empty', () => { + const services = getServices({ + swagger: '2.0', + info: { + title: 'x', + version: '1', + }, + paths: { + '/api/trips': { + get: { + tags: [], + responses: { + 200: { + description: 'x', + }, + default: { + description: 'default', + }, + }, + }, + }, + }, + }); + + expect(services).toHaveLength(1); + expect(services[0].name).toEqual('Default'); + }); +}); diff --git a/src/openApi/v2/parser/getServices.ts b/src/openApi/v2/parser/getServices.ts index ed18b28ba..d8fe411bb 100644 --- a/src/openApi/v2/parser/getServices.ts +++ b/src/openApi/v2/parser/getServices.ts @@ -1,49 +1,55 @@ -import { Method } from './constants'; -import { OpenApi } from '../interfaces/OpenApi'; -import { Service } from '../../../client/interfaces/Service'; +import type { Service } from '../../../client/interfaces/Service'; +import { unique } from '../../../utils/unique'; +import type { OpenApi } from '../interfaces/OpenApi'; import { getOperation } from './getOperation'; +import { getOperationParameters } from './getOperationParameters'; /** * Get the OpenAPI services */ -export function getServices(openApi: OpenApi): Map { +export const getServices = (openApi: OpenApi): Service[] => { const services = new Map(); for (const url in openApi.paths) { if (openApi.paths.hasOwnProperty(url)) { + // Grab path and parse any global path parameters const path = openApi.paths[url]; + const pathParams = getOperationParameters(openApi, path.parameters || []); + + // Parse all the methods for this path for (const method in path) { if (path.hasOwnProperty(method)) { switch (method) { - case Method.GET: - case Method.PUT: - case Method.POST: - case Method.DELETE: - case Method.OPTIONS: - case Method.HEAD: - case Method.PATCH: + case 'get': + case 'put': + case 'post': + case 'delete': + case 'options': + case 'head': + case 'patch': // Each method contains an OpenAPI operation, we parse the operation const op = path[method]!; - const operation = getOperation(openApi, url, method, op); + const tags = op.tags?.length ? op.tags.filter(unique) : ['Default']; + tags.forEach(tag => { + const operation = getOperation(openApi, url, method, tag, op, pathParams); - // If we have already declared a service, then we should fetch that and - // append the new method to it. Otherwise we should create a new service object. - const service = - services.get(operation.service) || - ({ + // If we have already declared a service, then we should fetch that and + // append the new method to it. Otherwise we should create a new service object. + const service: Service = services.get(operation.service) || { name: operation.service, operations: [], imports: [], - } as Service); + }; - // Push the operation in the service - service.operations.push(operation); - service.imports.push(...operation.imports); - services.set(operation.service, service); + // Push the operation in the service + service.operations.push(operation); + service.imports.push(...operation.imports); + services.set(operation.service, service); + }); break; } } } } } - return services; -} + return Array.from(services.values()); +}; diff --git a/src/openApi/v2/parser/getType.spec.ts b/src/openApi/v2/parser/getType.spec.ts index a3e7e4221..575d2d46c 100644 --- a/src/openApi/v2/parser/getType.spec.ts +++ b/src/openApi/v2/parser/getType.spec.ts @@ -10,7 +10,7 @@ describe('getType', () => { }); it('should convert string', () => { - const type = getType('String'); + const type = getType('string'); expect(type.type).toEqual('string'); expect(type.base).toEqual('string'); expect(type.template).toEqual(null); @@ -18,15 +18,15 @@ describe('getType', () => { }); it('should convert string array', () => { - const type = getType('Array[String]'); - expect(type.type).toEqual('Array'); - expect(type.base).toEqual('Array'); - expect(type.template).toEqual('string'); - expect(type.imports).toEqual(['Array']); + const type = getType('array[string]'); + expect(type.type).toEqual('string[]'); + expect(type.base).toEqual('string'); + expect(type.template).toEqual(null); + expect(type.imports).toEqual([]); }); it('should convert template with primary', () => { - const type = getType('#/definitions/Link[String]'); + const type = getType('#/definitions/Link[string]'); expect(type.type).toEqual('Link'); expect(type.base).toEqual('Link'); expect(type.template).toEqual('string'); @@ -49,11 +49,27 @@ describe('getType', () => { expect(type.imports).toEqual(['Link', 'Link']); }); - it('should convert generic', () => { - const type = getType('#/definitions/Link', 'Link'); - expect(type.type).toEqual('T'); - expect(type.base).toEqual('T'); + it('should support dot', () => { + const type = getType('#/definitions/model.000'); + expect(type.type).toEqual('model_000'); + expect(type.base).toEqual('model_000'); expect(type.template).toEqual(null); - expect(type.imports).toEqual([]); + expect(type.imports).toEqual(['model_000']); + }); + + it('should support dashes', () => { + const type = getType('#/definitions/some_special-schema'); + expect(type.type).toEqual('some_special_schema'); + expect(type.base).toEqual('some_special_schema'); + expect(type.template).toEqual(null); + expect(type.imports).toEqual(['some_special_schema']); + }); + + it('should support dollar sign', () => { + const type = getType('#/definitions/$some+special+schema'); + expect(type.type).toEqual('$some_special_schema'); + expect(type.base).toEqual('$some_special_schema'); + expect(type.template).toEqual(null); + expect(type.imports).toEqual(['$some_special_schema']); }); }); diff --git a/src/openApi/v2/parser/getType.ts b/src/openApi/v2/parser/getType.ts index 3c12cc67e..6caa1e015 100644 --- a/src/openApi/v2/parser/getType.ts +++ b/src/openApi/v2/parser/getType.ts @@ -1,30 +1,45 @@ -import { PrimaryType } from './constants'; -import { Type } from '../../../client/interfaces/Type'; -import { getMappedType, hasMappedType } from './getMappedType'; +import type { Type } from '../../../client/interfaces/Type'; +import { getMappedType } from './getMappedType'; import { stripNamespace } from './stripNamespace'; +const encode = (value: string): string => { + return value.replace(/^[^a-zA-Z_$]+/g, '').replace(/[^\w$]+/g, '_'); +}; + /** * Parse any string value into a type object. - * @param value String value like "integer" or "Link[Model]". - * @param template Optional template class from parent (needed to process generics) + * @param type String value like "integer" or "Link[Model]". + * @param format String value like "binary" or "date". */ -export function getType(value?: string, template?: string): Type { +export const getType = (type: string = 'any', format?: string): Type => { const result: Type = { - type: PrimaryType.OBJECT, - base: PrimaryType.OBJECT, + type: 'any', + base: 'any', template: null, imports: [], + isNullable: false, }; - const valueClean = stripNamespace(value || ''); + const mapped = getMappedType(type, format); + if (mapped) { + result.type = mapped; + result.base = mapped; + return result; + } - if (/\[.*\]$/g.test(valueClean)) { - const matches = valueClean.match(/(.*?)\[(.*)\]$/); - if (matches && matches.length) { - const match1 = getType(matches[1]); - const match2 = getType(matches[2]); + const typeWithoutNamespace = decodeURIComponent(stripNamespace(type)); - if (match2.type) { + if (/\[.*\]$/g.test(typeWithoutNamespace)) { + const matches = typeWithoutNamespace.match(/(.*?)\[(.*)\]$/); + if (matches?.length) { + const match1 = getType(encode(matches[1])); + const match2 = getType(encode(matches[2])); + + if (match1.type === 'any[]') { + result.type = `${match2.type}[]`; + result.base = match2.type; + match1.imports = []; + } else if (match2.type) { result.type = `${match1.type}<${match2.type}>`; result.base = match1.type; result.template = match2.type; @@ -36,24 +51,17 @@ export function getType(value?: string, template?: string): Type { result.imports.push(...match1.imports); result.imports.push(...match2.imports); + return result; } - } else if (hasMappedType(valueClean)) { - const mapped = getMappedType(valueClean); - result.type = mapped; - result.base = mapped; - } else if (valueClean) { - result.type = valueClean; - result.base = valueClean; - result.imports.push(valueClean); } - // If the property that we found matched the parent template class - // Then ignore this whole property and return it as a "T" template property. - if (result.type === template) { - result.type = 'T'; // Template; - result.base = 'T'; // Template; - result.imports = []; + if (typeWithoutNamespace) { + const type = encode(typeWithoutNamespace); + result.type = type; + result.base = type; + result.imports.push(type); + return result; } return result; -} +}; diff --git a/src/openApi/v2/parser/isPrimaryType.spec.ts b/src/openApi/v2/parser/isPrimaryType.spec.ts deleted file mode 100644 index ed3e17749..000000000 --- a/src/openApi/v2/parser/isPrimaryType.spec.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { isPrimaryType } from './isPrimaryType'; - -describe('isPrimaryType', () => { - it('should return true for primary types', () => { - expect(isPrimaryType('number')).toBeTruthy(); - expect(isPrimaryType('boolean')).toBeTruthy(); - expect(isPrimaryType('string')).toBeTruthy(); - expect(isPrimaryType('any')).toBeTruthy(); - expect(isPrimaryType('void')).toBeTruthy(); - expect(isPrimaryType('null')).toBeTruthy(); - expect(isPrimaryType('Array')).toBeFalsy(); - expect(isPrimaryType('MyModel')).toBeFalsy(); - }); -}); diff --git a/src/openApi/v2/parser/isPrimaryType.ts b/src/openApi/v2/parser/isPrimaryType.ts deleted file mode 100644 index dfb9e778a..000000000 --- a/src/openApi/v2/parser/isPrimaryType.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { PrimaryType } from './constants'; - -/** - * Check if given type is a primary type. - * @param type - */ -export function isPrimaryType(type: string): type is PrimaryType { - switch (type.toLowerCase()) { - case PrimaryType.FILE: - case PrimaryType.OBJECT: - case PrimaryType.BOOLEAN: - case PrimaryType.NUMBER: - case PrimaryType.STRING: - case PrimaryType.VOID: - case PrimaryType.NULL: - return true; - } - return false; -} diff --git a/src/openApi/v2/parser/sortByRequired.ts b/src/openApi/v2/parser/sortByRequired.ts new file mode 100644 index 000000000..6519bb17e --- /dev/null +++ b/src/openApi/v2/parser/sortByRequired.ts @@ -0,0 +1,9 @@ +import type { OperationParameter } from '../../../client/interfaces/OperationParameter'; + +export const sortByRequired = (a: OperationParameter, b: OperationParameter): number => { + const aNeedsValue = a.isRequired && a.default === undefined; + const bNeedsValue = b.isRequired && b.default === undefined; + if (aNeedsValue && !bNeedsValue) return -1; + if (bNeedsValue && !aNeedsValue) return 1; + return 0; +}; diff --git a/src/openApi/v2/parser/stripNamespace.spec.ts b/src/openApi/v2/parser/stripNamespace.spec.ts index 796386e2d..103f08682 100644 --- a/src/openApi/v2/parser/stripNamespace.spec.ts +++ b/src/openApi/v2/parser/stripNamespace.spec.ts @@ -6,9 +6,5 @@ describe('stripNamespace', () => { expect(stripNamespace('#/parameters/Item')).toEqual('Item'); expect(stripNamespace('#/responses/Item')).toEqual('Item'); expect(stripNamespace('#/securityDefinitions/Item')).toEqual('Item'); - expect(stripNamespace('Template[Model]')).toEqual('Template[Model]'); - expect(stripNamespace('namespace.Template[Model]')).toEqual('Template[Model]'); - expect(stripNamespace('namespace.Template[namespace.Model]')).toEqual('Template[Model]'); - expect(stripNamespace('Item')).toEqual('Item'); }); }); diff --git a/src/openApi/v2/parser/stripNamespace.ts b/src/openApi/v2/parser/stripNamespace.ts index b188ab2d3..ff543b3c9 100644 --- a/src/openApi/v2/parser/stripNamespace.ts +++ b/src/openApi/v2/parser/stripNamespace.ts @@ -2,30 +2,11 @@ * Strip (OpenAPI) namespaces fom values. * @param value */ -export function stripNamespace(value: string): string { - return ( - value - .trim() - .replace(/^#\/definitions\//, '') - .replace(/^#\/parameters\//, '') - .replace(/^#\/responses\//, '') - .replace(/^#\/securityDefinitions\//, '') - - // First we remove the namespace from template notation: - // Example: namespace.Template[namespace.Model] -> namespace.Template[Model] - .replace(/(\[.*\]$)/, (s: string): string => { - const v = s - .replace('[', '') - .replace(']', '') - .split('.') - .pop()!; - return `[${v}]`; - }) - - // Then we remove the namespace from the complete result: - // Example: namespace.Template[Model] -> Template[Model] - .replace(/.*/, (s: string): string => { - return s.split('.').pop()!; - }) - ); -} +export const stripNamespace = (value: string): string => { + return value + .trim() + .replace(/^#\/definitions\//, '') + .replace(/^#\/parameters\//, '') + .replace(/^#\/responses\//, '') + .replace(/^#\/securityDefinitions\//, ''); +}; diff --git a/src/openApi/v3/index.ts b/src/openApi/v3/index.ts index 734b80d48..9dbdadb34 100644 --- a/src/openApi/v3/index.ts +++ b/src/openApi/v3/index.ts @@ -1,20 +1,20 @@ -import { Client } from '../../client/interfaces/Client'; -import { OpenApi } from './interfaces/OpenApi'; +import type { Client } from '../../client/interfaces/Client'; +import type { OpenApi } from './interfaces/OpenApi'; import { getModels } from './parser/getModels'; import { getServer } from './parser/getServer'; -import { getServiceVersion } from './parser/getServiceVersion'; import { getServices } from './parser/getServices'; +import { getServiceVersion } from './parser/getServiceVersion'; /** * Parse the OpenAPI specification to a Client model that contains * all the models, services and schema's we should output. * @param openApi The OpenAPI spec that we have loaded from disk. */ -export function parse(openApi: OpenApi): Client { - return { - version: getServiceVersion(openApi.info.version), - server: getServer(openApi), - models: getModels(openApi), - services: getServices(openApi), - }; -} +export const parse = (openApi: OpenApi): Client => { + const version = getServiceVersion(openApi.info.version); + const server = getServer(openApi); + const models = getModels(openApi); + const services = getServices(openApi); + + return { version, server, models, services }; +}; diff --git a/src/openApi/v3/interfaces/Extensions/WithEnumExtension.d.ts b/src/openApi/v3/interfaces/Extensions/WithEnumExtension.d.ts new file mode 100644 index 000000000..0d6ead780 --- /dev/null +++ b/src/openApi/v3/interfaces/Extensions/WithEnumExtension.d.ts @@ -0,0 +1,4 @@ +export interface WithEnumExtension { + 'x-enum-varnames'?: string[]; + 'x-enum-descriptions'?: string[]; +} diff --git a/src/openApi/v3/interfaces/OpenApi.d.ts b/src/openApi/v3/interfaces/OpenApi.d.ts index 2d598349b..caace87e1 100644 --- a/src/openApi/v3/interfaces/OpenApi.d.ts +++ b/src/openApi/v3/interfaces/OpenApi.d.ts @@ -1,13 +1,13 @@ -import { OpenApiComponents } from './OpenApiComponents'; -import { OpenApiExternalDocs } from './OpenApiExternalDocs'; -import { OpenApiInfo } from './OpenApiInfo'; -import { OpenApiPaths } from './OpenApiPaths'; -import { OpenApiSecurityRequirement } from './OpenApiSecurityRequirement'; -import { OpenApiServer } from './OpenApiServer'; -import { OpenApiTag } from './OpenApiTag'; +import type { OpenApiComponents } from './OpenApiComponents'; +import type { OpenApiExternalDocs } from './OpenApiExternalDocs'; +import type { OpenApiInfo } from './OpenApiInfo'; +import type { OpenApiPaths } from './OpenApiPaths'; +import type { OpenApiSecurityRequirement } from './OpenApiSecurityRequirement'; +import type { OpenApiServer } from './OpenApiServer'; +import type { OpenApiTag } from './OpenApiTag'; /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md */ export interface OpenApi { openapi: string; diff --git a/src/openApi/v3/interfaces/OpenApiCallback.d.ts b/src/openApi/v3/interfaces/OpenApiCallback.d.ts index 897ce3a42..716adf47d 100644 --- a/src/openApi/v3/interfaces/OpenApiCallback.d.ts +++ b/src/openApi/v3/interfaces/OpenApiCallback.d.ts @@ -1,8 +1,8 @@ -import { OpenApiPath } from './OpenApiPath'; -import { OpenApiReference } from './OpenApiReference'; +import type { OpenApiPath } from './OpenApiPath'; +import type { OpenApiReference } from './OpenApiReference'; /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#callbackObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#callbackObject */ export interface OpenApiCallback extends OpenApiReference { [key: string]: OpenApiPath; diff --git a/src/openApi/v3/interfaces/OpenApiComponents.d.ts b/src/openApi/v3/interfaces/OpenApiComponents.d.ts index d740bebb5..27a57c8cf 100644 --- a/src/openApi/v3/interfaces/OpenApiComponents.d.ts +++ b/src/openApi/v3/interfaces/OpenApiComponents.d.ts @@ -1,16 +1,16 @@ -import { Dictionary } from '../../../utils/types'; -import { OpenApiCallback } from './OpenApiCallback'; -import { OpenApiExample } from './OpenApiExample'; -import { OpenApiHeader } from './OpenApiHeader'; -import { OpenApiLink } from './OpenApiLink'; -import { OpenApiParameter } from './OpenApiParameter'; -import { OpenApiRequestBody } from './OpenApiRequestBody'; -import { OpenApiResponses } from './OpenApiResponses'; -import { OpenApiSchema } from './OpenApiSchema'; -import { OpenApiSecurityScheme } from './OpenApiSecurityScheme'; +import type { Dictionary } from '../../../utils/types'; +import type { OpenApiCallback } from './OpenApiCallback'; +import type { OpenApiExample } from './OpenApiExample'; +import type { OpenApiHeader } from './OpenApiHeader'; +import type { OpenApiLink } from './OpenApiLink'; +import type { OpenApiParameter } from './OpenApiParameter'; +import type { OpenApiRequestBody } from './OpenApiRequestBody'; +import type { OpenApiResponses } from './OpenApiResponses'; +import type { OpenApiSchema } from './OpenApiSchema'; +import type { OpenApiSecurityScheme } from './OpenApiSecurityScheme'; /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#componentsObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#componentsObject */ export interface OpenApiComponents { schemas?: Dictionary; @@ -19,7 +19,7 @@ export interface OpenApiComponents { examples?: Dictionary; requestBodies?: Dictionary; headers?: Dictionary; - securitySchemes: Dictionary; + securitySchemes?: Dictionary; links?: Dictionary; callbacks?: Dictionary; } diff --git a/src/openApi/v3/interfaces/OpenApiContact.d.ts b/src/openApi/v3/interfaces/OpenApiContact.d.ts index a291268f9..42f6546e3 100644 --- a/src/openApi/v3/interfaces/OpenApiContact.d.ts +++ b/src/openApi/v3/interfaces/OpenApiContact.d.ts @@ -1,5 +1,5 @@ /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#contactObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#contactObject */ export interface OpenApiContact { name?: string; diff --git a/src/openApi/v3/interfaces/OpenApiDiscriminator.d.ts b/src/openApi/v3/interfaces/OpenApiDiscriminator.d.ts index 0655f90d4..31d78f761 100644 --- a/src/openApi/v3/interfaces/OpenApiDiscriminator.d.ts +++ b/src/openApi/v3/interfaces/OpenApiDiscriminator.d.ts @@ -1,7 +1,7 @@ -import { Dictionary } from '../../../utils/types'; +import type { Dictionary } from '../../../utils/types'; /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#discriminatorObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#discriminatorObject */ export interface OpenApiDiscriminator { propertyName: string; diff --git a/src/openApi/v3/interfaces/OpenApiEncoding.d.ts b/src/openApi/v3/interfaces/OpenApiEncoding.d.ts index 5a60ccf31..e18429552 100644 --- a/src/openApi/v3/interfaces/OpenApiEncoding.d.ts +++ b/src/openApi/v3/interfaces/OpenApiEncoding.d.ts @@ -1,8 +1,8 @@ -import { Dictionary } from '../../../utils/types'; -import { OpenApiHeader } from './OpenApiHeader'; +import type { Dictionary } from '../../../utils/types'; +import type { OpenApiHeader } from './OpenApiHeader'; /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#encodingObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#encodingObject */ export interface OpenApiEncoding { contentType?: string; diff --git a/src/openApi/v3/interfaces/OpenApiExample.d.ts b/src/openApi/v3/interfaces/OpenApiExample.d.ts index 48f441d2d..5e35419ce 100644 --- a/src/openApi/v3/interfaces/OpenApiExample.d.ts +++ b/src/openApi/v3/interfaces/OpenApiExample.d.ts @@ -1,7 +1,7 @@ -import { OpenApiReference } from './OpenApiReference'; +import type { OpenApiReference } from './OpenApiReference'; /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#exampleObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#exampleObject */ export interface OpenApiExample extends OpenApiReference { summary?: string; diff --git a/src/openApi/v3/interfaces/OpenApiExternalDocs.d.ts b/src/openApi/v3/interfaces/OpenApiExternalDocs.d.ts index 3aaf18772..4687f6648 100644 --- a/src/openApi/v3/interfaces/OpenApiExternalDocs.d.ts +++ b/src/openApi/v3/interfaces/OpenApiExternalDocs.d.ts @@ -1,5 +1,5 @@ /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#externalDocumentationObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#externalDocumentationObject */ export interface OpenApiExternalDocs { description?: string; diff --git a/src/openApi/v3/interfaces/OpenApiHeader.d.ts b/src/openApi/v3/interfaces/OpenApiHeader.d.ts index 9fb75b1aa..4da5d2ea8 100644 --- a/src/openApi/v3/interfaces/OpenApiHeader.d.ts +++ b/src/openApi/v3/interfaces/OpenApiHeader.d.ts @@ -1,10 +1,10 @@ -import { Dictionary } from '../../../utils/types'; -import { OpenApiExample } from './OpenApiExample'; -import { OpenApiReference } from './OpenApiReference'; -import { OpenApiSchema } from './OpenApiSchema'; +import type { Dictionary } from '../../../utils/types'; +import type { OpenApiExample } from './OpenApiExample'; +import type { OpenApiReference } from './OpenApiReference'; +import type { OpenApiSchema } from './OpenApiSchema'; /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#headerObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#headerObject */ export interface OpenApiHeader extends OpenApiReference { description?: string; diff --git a/src/openApi/v3/interfaces/OpenApiInfo.d.ts b/src/openApi/v3/interfaces/OpenApiInfo.d.ts index d5b2985df..933d1a67a 100644 --- a/src/openApi/v3/interfaces/OpenApiInfo.d.ts +++ b/src/openApi/v3/interfaces/OpenApiInfo.d.ts @@ -1,8 +1,8 @@ -import { OpenApiContact } from './OpenApiContact'; -import { OpenApiLicense } from './OpenApiLicense'; +import type { OpenApiContact } from './OpenApiContact'; +import type { OpenApiLicense } from './OpenApiLicense'; /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#infoObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#infoObject */ export interface OpenApiInfo { title: string; diff --git a/src/openApi/v3/interfaces/OpenApiLicense.d.ts b/src/openApi/v3/interfaces/OpenApiLicense.d.ts index 9982f95c9..96f2e73fd 100644 --- a/src/openApi/v3/interfaces/OpenApiLicense.d.ts +++ b/src/openApi/v3/interfaces/OpenApiLicense.d.ts @@ -1,5 +1,5 @@ /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#licenseObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#licenseObject */ export interface OpenApiLicense { name: string; diff --git a/src/openApi/v3/interfaces/OpenApiLink.d.ts b/src/openApi/v3/interfaces/OpenApiLink.d.ts index 9797217ec..736bcc679 100644 --- a/src/openApi/v3/interfaces/OpenApiLink.d.ts +++ b/src/openApi/v3/interfaces/OpenApiLink.d.ts @@ -1,9 +1,9 @@ -import { Dictionary } from '../../../utils/types'; -import { OpenApiReference } from './OpenApiReference'; -import { OpenApiServer } from './OpenApiServer'; +import type { Dictionary } from '../../../utils/types'; +import type { OpenApiReference } from './OpenApiReference'; +import type { OpenApiServer } from './OpenApiServer'; /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#linkObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#linkObject */ export interface OpenApiLink extends OpenApiReference { operationRef?: string; diff --git a/src/openApi/v3/interfaces/OpenApiMediaType.d.ts b/src/openApi/v3/interfaces/OpenApiMediaType.d.ts index fb11a7da1..3ce9e5708 100644 --- a/src/openApi/v3/interfaces/OpenApiMediaType.d.ts +++ b/src/openApi/v3/interfaces/OpenApiMediaType.d.ts @@ -1,11 +1,11 @@ -import { Dictionary } from '../../../utils/types'; -import { OpenApiEncoding } from './OpenApiEncoding'; -import { OpenApiExample } from './OpenApiExample'; -import { OpenApiReference } from './OpenApiReference'; -import { OpenApiSchema } from './OpenApiSchema'; +import type { Dictionary } from '../../../utils/types'; +import type { OpenApiEncoding } from './OpenApiEncoding'; +import type { OpenApiExample } from './OpenApiExample'; +import type { OpenApiReference } from './OpenApiReference'; +import type { OpenApiSchema } from './OpenApiSchema'; /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#mediaTypeObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#mediaTypeObject */ export interface OpenApiMediaType extends OpenApiReference { schema?: OpenApiSchema; diff --git a/src/openApi/v3/interfaces/OpenApiOAuthFlow.d.ts b/src/openApi/v3/interfaces/OpenApiOAuthFlow.d.ts index 6f1827aa7..c8bab9f8b 100644 --- a/src/openApi/v3/interfaces/OpenApiOAuthFlow.d.ts +++ b/src/openApi/v3/interfaces/OpenApiOAuthFlow.d.ts @@ -1,7 +1,7 @@ -import { Dictionary } from '../../../utils/types'; +import type { Dictionary } from '../../../utils/types'; /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#oauthFlowObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#oauthFlowObject */ export interface OpenApiOAuthFlow { authorizationUrl: string; diff --git a/src/openApi/v3/interfaces/OpenApiOAuthFlows.d.ts b/src/openApi/v3/interfaces/OpenApiOAuthFlows.d.ts index a03a6d3d8..4fd639d75 100644 --- a/src/openApi/v3/interfaces/OpenApiOAuthFlows.d.ts +++ b/src/openApi/v3/interfaces/OpenApiOAuthFlows.d.ts @@ -1,7 +1,7 @@ -import { OpenApiOAuthFlow } from './OpenApiOAuthFlow'; +import type { OpenApiOAuthFlow } from './OpenApiOAuthFlow'; /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#oauthFlowsObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#oauthFlowsObject */ export interface OpenApiOAuthFlows { implicit?: OpenApiOAuthFlow; diff --git a/src/openApi/v3/interfaces/OpenApiOperation.d.ts b/src/openApi/v3/interfaces/OpenApiOperation.d.ts index b21760491..3e97c4fa9 100644 --- a/src/openApi/v3/interfaces/OpenApiOperation.d.ts +++ b/src/openApi/v3/interfaces/OpenApiOperation.d.ts @@ -1,14 +1,14 @@ -import { Dictionary } from '../../../utils/types'; -import { OpenApiCallback } from './OpenApiCallback'; -import { OpenApiExternalDocs } from './OpenApiExternalDocs'; -import { OpenApiParameter } from './OpenApiParameter'; -import { OpenApiRequestBody } from './OpenApiRequestBody'; -import { OpenApiResponses } from './OpenApiResponses'; -import { OpenApiSecurityRequirement } from './OpenApiSecurityRequirement'; -import { OpenApiServer } from './OpenApiServer'; +import type { Dictionary } from '../../../utils/types'; +import type { OpenApiCallback } from './OpenApiCallback'; +import type { OpenApiExternalDocs } from './OpenApiExternalDocs'; +import type { OpenApiParameter } from './OpenApiParameter'; +import type { OpenApiRequestBody } from './OpenApiRequestBody'; +import type { OpenApiResponses } from './OpenApiResponses'; +import type { OpenApiSecurityRequirement } from './OpenApiSecurityRequirement'; +import type { OpenApiServer } from './OpenApiServer'; /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#operationObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#operationObject */ export interface OpenApiOperation { tags?: string[]; diff --git a/src/openApi/v3/interfaces/OpenApiParameter.d.ts b/src/openApi/v3/interfaces/OpenApiParameter.d.ts index bb646a70f..5229cb9d3 100644 --- a/src/openApi/v3/interfaces/OpenApiParameter.d.ts +++ b/src/openApi/v3/interfaces/OpenApiParameter.d.ts @@ -1,10 +1,10 @@ -import { Dictionary } from '../../../utils/types'; -import { OpenApiExample } from './OpenApiExample'; -import { OpenApiReference } from './OpenApiReference'; -import { OpenApiSchema } from './OpenApiSchema'; +import type { Dictionary } from '../../../utils/types'; +import type { OpenApiExample } from './OpenApiExample'; +import type { OpenApiReference } from './OpenApiReference'; +import type { OpenApiSchema } from './OpenApiSchema'; /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#parameterObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#parameterObject */ export interface OpenApiParameter extends OpenApiReference { name: string; diff --git a/src/openApi/v3/interfaces/OpenApiPath.d.ts b/src/openApi/v3/interfaces/OpenApiPath.d.ts index 047798c93..a374ed835 100644 --- a/src/openApi/v3/interfaces/OpenApiPath.d.ts +++ b/src/openApi/v3/interfaces/OpenApiPath.d.ts @@ -1,9 +1,9 @@ -import { OpenApiOperation } from './OpenApiOperation'; -import { OpenApiParameter } from './OpenApiParameter'; -import { OpenApiServer } from './OpenApiServer'; +import type { OpenApiOperation } from './OpenApiOperation'; +import type { OpenApiParameter } from './OpenApiParameter'; +import type { OpenApiServer } from './OpenApiServer'; /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#pathItemObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#pathItemObject */ export interface OpenApiPath { summary?: string; diff --git a/src/openApi/v3/interfaces/OpenApiPaths.d.ts b/src/openApi/v3/interfaces/OpenApiPaths.d.ts index 1ad406c79..2b4e4bbe1 100644 --- a/src/openApi/v3/interfaces/OpenApiPaths.d.ts +++ b/src/openApi/v3/interfaces/OpenApiPaths.d.ts @@ -1,7 +1,7 @@ -import { OpenApiPath } from './OpenApiPath'; +import type { OpenApiPath } from './OpenApiPath'; /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#pathsObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#pathsObject */ export interface OpenApiPaths { [path: string]: OpenApiPath; diff --git a/src/openApi/v3/interfaces/OpenApiReference.d.ts b/src/openApi/v3/interfaces/OpenApiReference.d.ts index e3a1c07ba..af68be0da 100644 --- a/src/openApi/v3/interfaces/OpenApiReference.d.ts +++ b/src/openApi/v3/interfaces/OpenApiReference.d.ts @@ -1,5 +1,5 @@ /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#referenceObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#referenceObject */ export interface OpenApiReference { $ref?: string; diff --git a/src/openApi/v3/interfaces/OpenApiRequestBody.d.ts b/src/openApi/v3/interfaces/OpenApiRequestBody.d.ts index f4215ec44..903a5c175 100644 --- a/src/openApi/v3/interfaces/OpenApiRequestBody.d.ts +++ b/src/openApi/v3/interfaces/OpenApiRequestBody.d.ts @@ -1,12 +1,13 @@ -import { Dictionary } from '../../../utils/types'; -import { OpenApiMediaType } from './OpenApiMediaType'; -import { OpenApiReference } from './OpenApiReference'; +import type { Dictionary } from '../../../utils/types'; +import type { OpenApiMediaType } from './OpenApiMediaType'; +import type { OpenApiReference } from './OpenApiReference'; /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#requestBodyObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#requestBodyObject */ export interface OpenApiRequestBody extends OpenApiReference { description?: string; content: Dictionary; required?: boolean; + nullable?: boolean; } diff --git a/src/openApi/v3/interfaces/OpenApiResponse.d.ts b/src/openApi/v3/interfaces/OpenApiResponse.d.ts index 3918fc96b..b6315fe84 100644 --- a/src/openApi/v3/interfaces/OpenApiResponse.d.ts +++ b/src/openApi/v3/interfaces/OpenApiResponse.d.ts @@ -1,11 +1,11 @@ -import { Dictionary } from '../../../utils/types'; -import { OpenApiHeader } from './OpenApiHeader'; -import { OpenApiLink } from './OpenApiLink'; -import { OpenApiMediaType } from './OpenApiMediaType'; -import { OpenApiReference } from './OpenApiReference'; +import type { Dictionary } from '../../../utils/types'; +import type { OpenApiHeader } from './OpenApiHeader'; +import type { OpenApiLink } from './OpenApiLink'; +import type { OpenApiMediaType } from './OpenApiMediaType'; +import type { OpenApiReference } from './OpenApiReference'; /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#responseObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#responseObject */ export interface OpenApiResponse extends OpenApiReference { description: string; diff --git a/src/openApi/v3/interfaces/OpenApiResponses.d.ts b/src/openApi/v3/interfaces/OpenApiResponses.d.ts index ecc829a7c..bb66e1696 100644 --- a/src/openApi/v3/interfaces/OpenApiResponses.d.ts +++ b/src/openApi/v3/interfaces/OpenApiResponses.d.ts @@ -1,8 +1,8 @@ -import { OpenApiReference } from './OpenApiReference'; -import { OpenApiResponse } from './OpenApiResponse'; +import type { OpenApiReference } from './OpenApiReference'; +import type { OpenApiResponse } from './OpenApiResponse'; /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#responsesObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#responsesObject */ export interface OpenApiResponses extends OpenApiReference { default: OpenApiResponse; diff --git a/src/openApi/v3/interfaces/OpenApiSchema.d.ts b/src/openApi/v3/interfaces/OpenApiSchema.d.ts index 9ff6c1fa5..9d9b43751 100644 --- a/src/openApi/v3/interfaces/OpenApiSchema.d.ts +++ b/src/openApi/v3/interfaces/OpenApiSchema.d.ts @@ -1,13 +1,14 @@ -import { Dictionary } from '../../../utils/types'; -import { OpenApiDiscriminator } from './OpenApiDiscriminator'; -import { OpenApiExternalDocs } from './OpenApiExternalDocs'; -import { OpenApiReference } from './OpenApiReference'; -import { OpenApiXml } from './OpenApiXml'; +import type { Dictionary } from '../../../utils/types'; +import type { WithEnumExtension } from './Extensions/WithEnumExtension'; +import type { OpenApiDiscriminator } from './OpenApiDiscriminator'; +import type { OpenApiExternalDocs } from './OpenApiExternalDocs'; +import type { OpenApiReference } from './OpenApiReference'; +import type { OpenApiXml } from './OpenApiXml'; /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#schemaObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#schemaObject */ -export interface OpenApiSchema extends OpenApiReference { +export interface OpenApiSchema extends OpenApiReference, WithEnumExtension { title?: string; multipleOf?: number; maximum?: number; @@ -19,12 +20,12 @@ export interface OpenApiSchema extends OpenApiReference { pattern?: string; maxItems?: number; minItems?: number; - uniqueItems?: number; + uniqueItems?: boolean; maxProperties?: number; minProperties?: number; required?: string[]; - enum?: string[]; - type?: string; + enum?: (string | number)[]; + type?: string | string[]; allOf?: OpenApiSchema[]; oneOf?: OpenApiSchema[]; anyOf?: OpenApiSchema[]; @@ -33,7 +34,18 @@ export interface OpenApiSchema extends OpenApiReference { properties?: Dictionary; additionalProperties?: boolean | OpenApiSchema; description?: string; - format?: 'int32' | 'int64' | 'float' | 'double' | 'string' | 'boolean' | 'byte' | 'binary' | 'date' | 'date-time' | 'password'; + format?: + | 'int32' + | 'int64' + | 'float' + | 'double' + | 'string' + | 'boolean' + | 'byte' + | 'binary' + | 'date' + | 'date-time' + | 'password'; default?: any; nullable?: boolean; discriminator?: OpenApiDiscriminator; diff --git a/src/openApi/v3/interfaces/OpenApiSecurityRequirement.d.ts b/src/openApi/v3/interfaces/OpenApiSecurityRequirement.d.ts index 147407a8e..03b8546b3 100644 --- a/src/openApi/v3/interfaces/OpenApiSecurityRequirement.d.ts +++ b/src/openApi/v3/interfaces/OpenApiSecurityRequirement.d.ts @@ -1,5 +1,5 @@ /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#securityRequirementObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#securityRequirementObject */ export interface OpenApiSecurityRequirement { [name: string]: string; diff --git a/src/openApi/v3/interfaces/OpenApiSecurityScheme.d.ts b/src/openApi/v3/interfaces/OpenApiSecurityScheme.d.ts index 0a5a461d2..3819dabe3 100644 --- a/src/openApi/v3/interfaces/OpenApiSecurityScheme.d.ts +++ b/src/openApi/v3/interfaces/OpenApiSecurityScheme.d.ts @@ -1,8 +1,8 @@ -import { OpenApiOAuthFlows } from './OpenApiOAuthFlows'; -import { OpenApiReference } from './OpenApiReference'; +import type { OpenApiOAuthFlows } from './OpenApiOAuthFlows'; +import type { OpenApiReference } from './OpenApiReference'; /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#securitySchemeObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#securitySchemeObject */ export interface OpenApiSecurityScheme extends OpenApiReference { type: 'apiKey' | 'http' | 'oauth2' | 'openIdConnect'; diff --git a/src/openApi/v3/interfaces/OpenApiServer.d.ts b/src/openApi/v3/interfaces/OpenApiServer.d.ts index 3220b554a..fb39c71a9 100644 --- a/src/openApi/v3/interfaces/OpenApiServer.d.ts +++ b/src/openApi/v3/interfaces/OpenApiServer.d.ts @@ -1,8 +1,8 @@ -import { Dictionary } from '../../../utils/types'; -import { OpenApiServerVariable } from './OpenApiServerVariable'; +import type { Dictionary } from '../../../utils/types'; +import type { OpenApiServerVariable } from './OpenApiServerVariable'; /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#serverObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#serverObject */ export interface OpenApiServer { url: string; diff --git a/src/openApi/v3/interfaces/OpenApiServerVariable.d.ts b/src/openApi/v3/interfaces/OpenApiServerVariable.d.ts index dbc2c1ff1..5df6d1f0a 100644 --- a/src/openApi/v3/interfaces/OpenApiServerVariable.d.ts +++ b/src/openApi/v3/interfaces/OpenApiServerVariable.d.ts @@ -1,8 +1,10 @@ +import type { WithEnumExtension } from './Extensions/WithEnumExtension'; + /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#serverVariableObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#serverVariableObject */ -export interface OpenApiServerVariable { - enum?: string[]; +export interface OpenApiServerVariable extends WithEnumExtension { + enum?: (string | number)[]; default: string; description?: string; } diff --git a/src/openApi/v3/interfaces/OpenApiTag.d.ts b/src/openApi/v3/interfaces/OpenApiTag.d.ts index 8cbceb9c2..a1918b77f 100644 --- a/src/openApi/v3/interfaces/OpenApiTag.d.ts +++ b/src/openApi/v3/interfaces/OpenApiTag.d.ts @@ -1,7 +1,7 @@ -import { OpenApiExternalDocs } from './OpenApiExternalDocs'; +import type { OpenApiExternalDocs } from './OpenApiExternalDocs'; /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#tagObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#tagObject */ export interface OpenApiTag { name: string; diff --git a/src/openApi/v3/interfaces/OpenApiXml.d.ts b/src/openApi/v3/interfaces/OpenApiXml.d.ts index 2528bbd4a..df13455ae 100644 --- a/src/openApi/v3/interfaces/OpenApiXml.d.ts +++ b/src/openApi/v3/interfaces/OpenApiXml.d.ts @@ -1,5 +1,5 @@ /** - * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#xmlObject + * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#xmlObject */ export interface OpenApiXml { name?: string; diff --git a/src/openApi/v3/parser/constants.ts b/src/openApi/v3/parser/constants.ts deleted file mode 100644 index 3258692a9..000000000 --- a/src/openApi/v3/parser/constants.ts +++ /dev/null @@ -1,51 +0,0 @@ -export enum PrimaryType { - FILE = 'File', - OBJECT = 'any', - BOOLEAN = 'boolean', - NUMBER = 'number', - STRING = 'string', - VOID = 'void', - NULL = 'null', -} - -export const TYPE_MAPPINGS = new Map([ - ['file', PrimaryType.FILE], - ['binary', PrimaryType.FILE], - ['any', PrimaryType.OBJECT], - ['object', PrimaryType.OBJECT], - ['boolean', PrimaryType.BOOLEAN], - ['byte', PrimaryType.NUMBER], - ['int', PrimaryType.NUMBER], - ['int32', PrimaryType.NUMBER], - ['int64', PrimaryType.NUMBER], - ['integer', PrimaryType.NUMBER], - ['float', PrimaryType.NUMBER], - ['double', PrimaryType.NUMBER], - ['short', PrimaryType.NUMBER], - ['long', PrimaryType.NUMBER], - ['number', PrimaryType.NUMBER], - ['char', PrimaryType.STRING], - ['date', PrimaryType.STRING], - ['date-time', PrimaryType.STRING], - ['password', PrimaryType.STRING], - ['string', PrimaryType.STRING], - ['void', PrimaryType.VOID], - ['null', PrimaryType.NULL], -]); - -export enum Method { - GET = 'get', - PUT = 'put', - POST = 'post', - DELETE = 'delete', - OPTIONS = 'options', - HEAD = 'head', - PATCH = 'patch', -} - -export enum ContentType { - APPLICATION_JSON_PATCH = 'application/json-patch+json', - APPLICATION_JSON = 'application/json', - TEXT_JSON = 'text/json', - TEXT_PAIN = 'text/plain', -} diff --git a/src/openApi/v3/parser/escapeName.spec.ts b/src/openApi/v3/parser/escapeName.spec.ts new file mode 100644 index 000000000..8e343d4f9 --- /dev/null +++ b/src/openApi/v3/parser/escapeName.spec.ts @@ -0,0 +1,21 @@ +import { escapeName } from './escapeName'; + +describe('escapeName', () => { + it('should escape', () => { + expect(escapeName('')).toEqual("''"); + expect(escapeName('fooBar')).toEqual('fooBar'); + expect(escapeName('Foo Bar')).toEqual(`'Foo Bar'`); + expect(escapeName('foo bar')).toEqual(`'foo bar'`); + expect(escapeName('foo-bar')).toEqual(`'foo-bar'`); + expect(escapeName('foo.bar')).toEqual(`'foo.bar'`); + expect(escapeName('foo_bar')).toEqual('foo_bar'); + expect(escapeName('123foo.bar')).toEqual(`'123foo.bar'`); + expect(escapeName('@foo.bar')).toEqual(`'@foo.bar'`); + expect(escapeName('$foo.bar')).toEqual(`'$foo.bar'`); + expect(escapeName('_foo.bar')).toEqual(`'_foo.bar'`); + expect(escapeName('123foobar')).toEqual(`'123foobar'`); + expect(escapeName('@foobar')).toEqual(`'@foobar'`); + expect(escapeName('$foobar')).toEqual('$foobar'); + expect(escapeName('_foobar')).toEqual('_foobar'); + }); +}); diff --git a/src/openApi/v3/parser/escapeName.ts b/src/openApi/v3/parser/escapeName.ts new file mode 100644 index 000000000..9d6816c10 --- /dev/null +++ b/src/openApi/v3/parser/escapeName.ts @@ -0,0 +1,9 @@ +export const escapeName = (value: string): string => { + if (value || value === '') { + const validName = /^[a-zA-Z_$][\w$]+$/g.test(value); + if (!validName) { + return `'${value}'`; + } + } + return value; +}; diff --git a/src/openApi/v3/parser/extendEnum.ts b/src/openApi/v3/parser/extendEnum.ts new file mode 100644 index 000000000..a7fa865cb --- /dev/null +++ b/src/openApi/v3/parser/extendEnum.ts @@ -0,0 +1,21 @@ +import type { Enum } from '../../../client/interfaces/Enum'; +import { isString } from '../../../utils/isString'; +import type { WithEnumExtension } from '../interfaces/Extensions/WithEnumExtension'; + +/** + * Extend the enum with the x-enum properties. This adds the capability + * to use names and descriptions inside the generated enums. + * @param enumerators + * @param definition + */ +export const extendEnum = (enumerators: Enum[], definition: WithEnumExtension): Enum[] => { + const names = definition['x-enum-varnames']?.filter(isString); + const descriptions = definition['x-enum-descriptions']?.filter(isString); + + return enumerators.map((enumerator, index) => ({ + name: names?.[index] || enumerator.name, + description: descriptions?.[index] || enumerator.description, + value: enumerator.value, + type: enumerator.type, + })); +}; diff --git a/src/openApi/v3/parser/getComment.ts b/src/openApi/v3/parser/getComment.ts deleted file mode 100644 index d9af7afa2..000000000 --- a/src/openApi/v3/parser/getComment.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { EOL } from 'os'; - -export function getComment(comment?: string): string | null { - if (comment) { - return comment - .split(/(\r\n|\n|\r)+/g) - .filter(line => line) - .map(line => line.trim()) - .join(EOL) - .replace(/(\r\n|\n|\r)+/g, '$1 * '); - } - return null; -} diff --git a/src/openApi/v3/parser/getContent.ts b/src/openApi/v3/parser/getContent.ts index 9620b6b7b..976625817 100644 --- a/src/openApi/v3/parser/getContent.ts +++ b/src/openApi/v3/parser/getContent.ts @@ -1,22 +1,46 @@ -import { ContentType } from './constants'; -import { Dictionary } from '../../../utils/types'; -import { OpenApi } from '../interfaces/OpenApi'; -import { OpenApiMediaType } from '../interfaces/OpenApiMediaType'; -import { OpenApiSchema } from '../interfaces/OpenApiSchema'; +import { isDefined } from '../../../utils/isDefined'; +import type { Dictionary } from '../../../utils/types'; +import type { OpenApi } from '../interfaces/OpenApi'; +import type { OpenApiMediaType } from '../interfaces/OpenApiMediaType'; +import type { OpenApiSchema } from '../interfaces/OpenApiSchema'; -export function getContent(openApi: OpenApi, content: Dictionary): OpenApiSchema | null { - /* prettier-ignore */ - return ( - content[ContentType.APPLICATION_JSON_PATCH] && - content[ContentType.APPLICATION_JSON_PATCH].schema - ) || ( - content[ContentType.APPLICATION_JSON] && - content[ContentType.APPLICATION_JSON].schema - ) || ( - content[ContentType.TEXT_JSON] && - content[ContentType.TEXT_JSON].schema - ) || ( - content[ContentType.TEXT_PAIN] && - content[ContentType.TEXT_PAIN].schema - ) || null; +export interface Content { + mediaType: string; + schema: OpenApiSchema; } + +const BASIC_MEDIA_TYPES = [ + 'application/json-patch+json', + 'application/json', + 'application/x-www-form-urlencoded', + 'text/json', + 'text/plain', + 'multipart/form-data', + 'multipart/mixed', + 'multipart/related', + 'multipart/batch', +]; + +export const getContent = (openApi: OpenApi, content: Dictionary): Content | null => { + const basicMediaTypeWithSchema = Object.keys(content) + .filter(mediaType => { + const cleanMediaType = mediaType.split(';')[0].trim(); + return BASIC_MEDIA_TYPES.includes(cleanMediaType); + }) + .find(mediaType => isDefined(content[mediaType]?.schema)); + if (basicMediaTypeWithSchema) { + return { + mediaType: basicMediaTypeWithSchema, + schema: content[basicMediaTypeWithSchema].schema as OpenApiSchema, + }; + } + + const firstMediaTypeWithSchema = Object.keys(content).find(mediaType => isDefined(content[mediaType]?.schema)); + if (firstMediaTypeWithSchema) { + return { + mediaType: firstMediaTypeWithSchema, + schema: content[firstMediaTypeWithSchema].schema as OpenApiSchema, + }; + } + return null; +}; diff --git a/src/openApi/v3/parser/getEnum.ts b/src/openApi/v3/parser/getEnum.ts index 094a552dc..64c7ca8b5 100644 --- a/src/openApi/v3/parser/getEnum.ts +++ b/src/openApi/v3/parser/getEnum.ts @@ -1,26 +1,34 @@ -import { Enum } from '../../../client/interfaces/Enum'; -import { PrimaryType } from './constants'; +import type { Enum } from '../../../client/interfaces/Enum'; -export function getEnum(values?: (string | number)[]): Enum[] { +export const getEnum = (values?: (string | number)[]): Enum[] => { if (Array.isArray(values)) { return values .filter((value, index, arr) => { return arr.indexOf(value) === index; }) + .filter((value: any) => { + return typeof value === 'number' || typeof value === 'string'; + }) .map(value => { if (typeof value === 'number') { return { - name: `NUM_${value}`, + name: `'_${value}'`, value: String(value), - type: PrimaryType.NUMBER, + type: 'number', + description: null, }; } return { - name: value.replace(/([a-z])([A-Z]+)/g, '$1_$2').toUpperCase(), - value: `'${value}'`, - type: PrimaryType.STRING, + name: String(value) + .replace(/\W+/g, '_') + .replace(/^(\d+)/g, '_$1') + .replace(/([a-z])([A-Z]+)/g, '$1_$2') + .toUpperCase(), + value: `'${value.replace(/'/g, "\\'")}'`, + type: 'string', + description: null, }; }); } return []; -} +}; diff --git a/src/openApi/v3/parser/getEnumFromDescription.ts b/src/openApi/v3/parser/getEnumFromDescription.ts deleted file mode 100644 index 60696e7eb..000000000 --- a/src/openApi/v3/parser/getEnumFromDescription.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Enum } from '../../../client/interfaces/Enum'; -import { PrimaryType } from './constants'; - -export function getEnumFromDescription(description: string): Enum[] { - // Check if we can find this special format string: - // None=0,Something=1,AnotherThing=2 - if (/^(\w+=[0-9]+,?)+$/g.test(description)) { - const matches = description.match(/(\w+=[0-9]+,?)/g); - if (matches) { - // Grab the values from the description - const symbols: Enum[] = []; - matches.forEach(match => { - const name = match.split('=')[0]; - const value = parseInt(match.split('=')[1].replace(/[^0-9]/g, '')); - if (name && Number.isInteger(value)) { - symbols.push({ - name: name.replace(/([a-z])([A-Z]+)/g, '$1_$2').toUpperCase(), - value: String(value), - type: PrimaryType.NUMBER, - }); - } - }); - - // Filter out any duplicate names - return symbols.filter((symbol, index, arr) => { - return arr.map(item => item.name).indexOf(symbol.name) === index; - }); - } - } - - return []; -} diff --git a/src/openApi/v3/parser/getEnumValues.ts b/src/openApi/v3/parser/getEnumValues.ts deleted file mode 100644 index 348208fe2..000000000 --- a/src/openApi/v3/parser/getEnumValues.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Enum } from '../../../client/interfaces/Enum'; - -export function getEnumValues(enumerators: Enum[]): string[] { - // Fetch values from the symbols, just to be sure we filter out - // any double values and finally we sort them to make them easier - // to read when we use them in our generated code. - return enumerators - .map(enumerator => enumerator.value) - .filter((enumerator, index, arr) => { - return arr.indexOf(enumerator) === index; - }) - .sort(); -} diff --git a/src/openApi/v3/parser/getMappedType.spec.ts b/src/openApi/v3/parser/getMappedType.spec.ts index b437f85d9..8dd847c91 100644 --- a/src/openApi/v3/parser/getMappedType.spec.ts +++ b/src/openApi/v3/parser/getMappedType.spec.ts @@ -2,8 +2,8 @@ import { getMappedType } from './getMappedType'; describe('getMappedType', () => { it('should map types to the basics', () => { - expect(getMappedType('File')).toEqual('File'); - expect(getMappedType('String')).toEqual('string'); + expect(getMappedType('file')).toEqual('binary'); + expect(getMappedType('string')).toEqual('string'); expect(getMappedType('date')).toEqual('string'); expect(getMappedType('date-time')).toEqual('string'); expect(getMappedType('float')).toEqual('number'); @@ -15,7 +15,7 @@ describe('getMappedType', () => { expect(getMappedType('object')).toEqual('any'); expect(getMappedType('void')).toEqual('void'); expect(getMappedType('null')).toEqual('null'); - expect(getMappedType('unknown')).toEqual('unknown'); - expect(getMappedType('')).toEqual(''); + expect(getMappedType('unknown')).toEqual(undefined); + expect(getMappedType('')).toEqual(undefined); }); }); diff --git a/src/openApi/v3/parser/getMappedType.ts b/src/openApi/v3/parser/getMappedType.ts index ca11fa7e4..a7c32fd84 100644 --- a/src/openApi/v3/parser/getMappedType.ts +++ b/src/openApi/v3/parser/getMappedType.ts @@ -1,16 +1,32 @@ -import { PrimaryType, TYPE_MAPPINGS } from './constants'; +const TYPE_MAPPINGS = new Map([ + ['file', 'binary'], + ['any', 'any'], + ['object', 'any'], + ['array', 'any[]'], + ['boolean', 'boolean'], + ['byte', 'number'], + ['int', 'number'], + ['integer', 'number'], + ['float', 'number'], + ['double', 'number'], + ['short', 'number'], + ['long', 'number'], + ['number', 'number'], + ['char', 'string'], + ['date', 'string'], + ['date-time', 'string'], + ['password', 'string'], + ['string', 'string'], + ['void', 'void'], + ['null', 'null'], +]); /** * Get mapped type for given type to any basic Typescript/Javascript type. */ -export function getMappedType(type: string): PrimaryType | string { - const mapped = TYPE_MAPPINGS.get(type.toLowerCase()); - if (mapped) { - return mapped; +export const getMappedType = (type: string, format?: string): string | undefined => { + if (format === 'binary') { + return 'binary'; } - return type; -} - -export function hasMappedType(type: string): boolean { - return TYPE_MAPPINGS.has(type.toLowerCase()); -} + return TYPE_MAPPINGS.get(type); +}; diff --git a/src/openApi/v3/parser/getModel.ts b/src/openApi/v3/parser/getModel.ts index 1163280a7..9e9c60a98 100644 --- a/src/openApi/v3/parser/getModel.ts +++ b/src/openApi/v3/parser/getModel.ts @@ -1,28 +1,48 @@ -import { Model } from '../../../client/interfaces/Model'; -import { OpenApi } from '../interfaces/OpenApi'; -import { OpenApiSchema } from '../interfaces/OpenApiSchema'; -import { PrimaryType } from './constants'; -import { getComment } from './getComment'; +import type { Model } from '../../../client/interfaces/Model'; +import { getPattern } from '../../../utils/getPattern'; +import type { OpenApi } from '../interfaces/OpenApi'; +import type { OpenApiSchema } from '../interfaces/OpenApiSchema'; +import { extendEnum } from './extendEnum'; import { getEnum } from './getEnum'; -import { getEnumFromDescription } from './getEnumFromDescription'; +import { getModelComposition } from './getModelComposition'; +import { getModelDefault } from './getModelDefault'; import { getModelProperties } from './getModelProperties'; import { getType } from './getType'; -export function getModel(openApi: OpenApi, definition: OpenApiSchema, isProperty: boolean = false, name: string = ''): Model { +export const getModel = ( + openApi: OpenApi, + definition: OpenApiSchema, + isDefinition: boolean = false, + name: string = '' +): Model => { const model: Model = { - name: name, + name, export: 'interface', - type: PrimaryType.OBJECT, - base: PrimaryType.OBJECT, + type: 'any', + base: 'any', template: null, link: null, - description: getComment(definition.description), - isProperty: isProperty, + description: definition.description || null, + deprecated: definition.deprecated === true, + isDefinition, isReadOnly: definition.readOnly === true, isNullable: definition.nullable === true, isRequired: false, + format: definition.format, + maximum: definition.maximum, + exclusiveMaximum: definition.exclusiveMaximum, + minimum: definition.minimum, + exclusiveMinimum: definition.exclusiveMinimum, + multipleOf: definition.multipleOf, + maxLength: definition.maxLength, + minLength: definition.minLength, + maxItems: definition.maxItems, + minItems: definition.minItems, + uniqueItems: definition.uniqueItems, + maxProperties: definition.maxProperties, + minProperties: definition.minProperties, + pattern: getPattern(definition.pattern), imports: [], - extends: [], enum: [], enums: [], properties: [], @@ -35,27 +55,19 @@ export function getModel(openApi: OpenApi, definition: OpenApiSchema, isProperty model.base = definitionRef.base; model.template = definitionRef.template; model.imports.push(...definitionRef.imports); + model.default = getModelDefault(definition, model); return model; } - if (definition.enum) { + if (definition.enum && definition.type !== 'boolean') { const enumerators = getEnum(definition.enum); - if (enumerators.length) { + const extendedEnumerators = extendEnum(enumerators, definition); + if (extendedEnumerators.length) { model.export = 'enum'; - model.type = PrimaryType.STRING; - model.base = PrimaryType.STRING; - model.enum.push(...enumerators); - return model; - } - } - - if ((definition.type === 'int' || definition.type === 'integer') && definition.description) { - const enumerators = getEnumFromDescription(definition.description); - if (enumerators.length) { - model.export = 'enum'; - model.type = PrimaryType.NUMBER; - model.base = PrimaryType.NUMBER; - model.enum.push(...enumerators); + model.type = 'string'; + model.base = 'string'; + model.enum.push(...extendedEnumerators); + model.default = getModelDefault(definition, model); return model; } } @@ -68,91 +80,117 @@ export function getModel(openApi: OpenApi, definition: OpenApiSchema, isProperty model.base = arrayItems.base; model.template = arrayItems.template; model.imports.push(...arrayItems.imports); + model.default = getModelDefault(definition, model); return model; } else { - const arrayItems = getModel(openApi, definition.items, true); + const arrayItems = getModel(openApi, definition.items); model.export = 'array'; model.type = arrayItems.type; model.base = arrayItems.base; model.template = arrayItems.template; model.link = arrayItems; model.imports.push(...arrayItems.imports); + model.default = getModelDefault(definition, model); return model; } } - if (definition.type === 'object' && definition.additionalProperties && typeof definition.additionalProperties === 'object') { - if (definition.additionalProperties.$ref) { - const additionalProperties = getType(definition.additionalProperties.$ref); + if ( + definition.type === 'object' && + (typeof definition.additionalProperties === 'object' || definition.additionalProperties === true) + ) { + const ap = typeof definition.additionalProperties === 'object' ? definition.additionalProperties : {}; + if (ap.$ref) { + const additionalProperties = getType(ap.$ref); model.export = 'dictionary'; model.type = additionalProperties.type; model.base = additionalProperties.base; model.template = additionalProperties.template; model.imports.push(...additionalProperties.imports); - model.imports.push('Dictionary'); + model.default = getModelDefault(definition, model); return model; } else { - const additionalProperties = getModel(openApi, definition.additionalProperties); + const additionalProperties = getModel(openApi, ap); model.export = 'dictionary'; model.type = additionalProperties.type; model.base = additionalProperties.base; model.template = additionalProperties.template; model.link = additionalProperties; model.imports.push(...additionalProperties.imports); - model.imports.push('Dictionary'); + model.default = getModelDefault(definition, model); return model; } } - if (definition.type === 'object') { - model.export = 'interface'; - model.type = PrimaryType.OBJECT; - model.base = PrimaryType.OBJECT; + if (definition.oneOf?.length) { + const composition = getModelComposition(openApi, definition, definition.oneOf, 'one-of', getModel); + model.export = composition.type; + model.imports.push(...composition.imports); + model.properties.push(...composition.properties); + model.enums.push(...composition.enums); + return model; + } - if (definition.allOf) { - definition.allOf.forEach(parent => { - if (parent.$ref) { - const parentRef = getType(parent.$ref); - model.extends.push(parentRef.type); - model.imports.push(parentRef.base); - } - if (parent.type === 'object' && parent.properties) { - const properties = getModelProperties(openApi, parent); - properties.forEach(property => { - model.properties.push(property); - model.imports.push(...property.imports); - if (property.export === 'enum') { - model.enums.push(property); - } - }); - } - }); - } + if (definition.anyOf?.length) { + const composition = getModelComposition(openApi, definition, definition.anyOf, 'any-of', getModel); + model.export = composition.type; + model.imports.push(...composition.imports); + model.properties.push(...composition.properties); + model.enums.push(...composition.enums); + return model; + } + + if (definition.allOf?.length) { + const composition = getModelComposition(openApi, definition, definition.allOf, 'all-of', getModel); + model.export = composition.type; + model.imports.push(...composition.imports); + model.properties.push(...composition.properties); + model.enums.push(...composition.enums); + return model; + } + if (definition.type === 'object') { if (definition.properties) { - const properties = getModelProperties(openApi, definition); - properties.forEach(property => { - model.properties.push(property); - model.imports.push(...property.imports); - if (property.export === 'enum') { - model.enums.push(property); + model.export = 'interface'; + model.type = 'any'; + model.base = 'any'; + model.default = getModelDefault(definition, model); + + const modelProperties = getModelProperties(openApi, definition, getModel, model); + modelProperties.forEach(modelProperty => { + model.imports.push(...modelProperty.imports); + model.enums.push(...modelProperty.enums); + model.properties.push(modelProperty); + if (modelProperty.export === 'enum') { + model.enums.push(modelProperty); } }); + return model; + } else { + const additionalProperties = getModel(openApi, {}); + model.export = 'dictionary'; + model.type = additionalProperties.type; + model.base = additionalProperties.base; + model.template = additionalProperties.template; + model.link = additionalProperties; + model.imports.push(...additionalProperties.imports); + model.default = getModelDefault(definition, model); + return model; } - - return model; } // If the schema has a type than it can be a basic or generic type. if (definition.type) { - const definitionType = getType(definition.type); + const definitionType = getType(definition.type, definition.format); model.export = 'generic'; model.type = definitionType.type; model.base = definitionType.base; model.template = definitionType.template; + model.isNullable = definitionType.isNullable || model.isNullable; model.imports.push(...definitionType.imports); + model.default = getModelDefault(definition, model); return model; } return model; -} +}; diff --git a/src/openApi/v3/parser/getModelComposition.ts b/src/openApi/v3/parser/getModelComposition.ts new file mode 100644 index 000000000..2c27d1815 --- /dev/null +++ b/src/openApi/v3/parser/getModelComposition.ts @@ -0,0 +1,91 @@ +import type { Model } from '../../../client/interfaces/Model'; +import type { ModelComposition } from '../../../client/interfaces/ModelComposition'; +import type { OpenApi } from '../interfaces/OpenApi'; +import type { OpenApiSchema } from '../interfaces/OpenApiSchema'; +import type { getModel } from './getModel'; +import { getModelProperties } from './getModelProperties'; +import { getRequiredPropertiesFromComposition } from './getRequiredPropertiesFromComposition'; + +// Fix for circular dependency +export type GetModelFn = typeof getModel; + +export const getModelComposition = ( + openApi: OpenApi, + definition: OpenApiSchema, + definitions: OpenApiSchema[], + type: 'one-of' | 'any-of' | 'all-of', + getModel: GetModelFn +): ModelComposition => { + const composition: ModelComposition = { + type, + imports: [], + enums: [], + properties: [], + }; + + const properties: Model[] = []; + + definitions + .map(definition => getModel(openApi, definition)) + .filter(model => { + const hasProperties = model.properties.length; + const hasEnums = model.enums.length; + const isObject = model.type === 'any'; + const isDictionary = model.export === 'dictionary'; + const isEmpty = isObject && !hasProperties && !hasEnums; + return !isEmpty || isDictionary; + }) + .forEach(model => { + composition.imports.push(...model.imports); + composition.enums.push(...model.enums); + composition.properties.push(model); + }); + + if (definition.required) { + const requiredProperties = getRequiredPropertiesFromComposition( + openApi, + definition.required, + definitions, + getModel + ); + requiredProperties.forEach(requiredProperty => { + composition.imports.push(...requiredProperty.imports); + composition.enums.push(...requiredProperty.enums); + }); + properties.push(...requiredProperties); + } + + if (definition.properties) { + const modelProperties = getModelProperties(openApi, definition, getModel); + modelProperties.forEach(modelProperty => { + composition.imports.push(...modelProperty.imports); + composition.enums.push(...modelProperty.enums); + if (modelProperty.export === 'enum') { + composition.enums.push(modelProperty); + } + }); + properties.push(...modelProperties); + } + + if (properties.length) { + composition.properties.push({ + name: 'properties', + export: 'interface', + type: 'any', + base: 'any', + template: null, + link: null, + description: '', + isDefinition: false, + isReadOnly: false, + isNullable: false, + isRequired: false, + imports: [], + enum: [], + enums: [], + properties, + }); + } + + return composition; +}; diff --git a/src/openApi/v3/parser/getModelDefault.ts b/src/openApi/v3/parser/getModelDefault.ts new file mode 100644 index 000000000..1736bf1c0 --- /dev/null +++ b/src/openApi/v3/parser/getModelDefault.ts @@ -0,0 +1,39 @@ +import type { Model } from '../../../client/interfaces/Model'; +import type { OpenApiSchema } from '../interfaces/OpenApiSchema'; + +export const getModelDefault = (definition: OpenApiSchema, model?: Model): string | undefined => { + if (definition.default === undefined) { + return undefined; + } + + if (definition.default === null) { + return 'null'; + } + + const type = definition.type || typeof definition.default; + + switch (type) { + case 'int': + case 'integer': + case 'number': + if (model?.export === 'enum' && model.enum?.[definition.default]) { + return model.enum[definition.default].value; + } + return definition.default; + + case 'boolean': + return JSON.stringify(definition.default); + + case 'string': + return `'${definition.default}'`; + + case 'object': + try { + return JSON.stringify(definition.default, null, 4); + } catch (e) { + // Ignore + } + } + + return undefined; +}; diff --git a/src/openApi/v3/parser/getModelProperties.ts b/src/openApi/v3/parser/getModelProperties.ts index ed1af36ff..6e25ca833 100644 --- a/src/openApi/v3/parser/getModelProperties.ts +++ b/src/openApi/v3/parser/getModelProperties.ts @@ -1,59 +1,108 @@ -import { Model } from '../../../client/interfaces/Model'; -import { OpenApi } from '../interfaces/OpenApi'; -import { OpenApiSchema } from '../interfaces/OpenApiSchema'; -import { getComment } from './getComment'; -import { getModel } from './getModel'; +import type { Model } from '../../../client/interfaces/Model'; +import { findOneOfParentDiscriminator, mapPropertyValue } from '../../../utils/discriminator'; +import { getPattern } from '../../../utils/getPattern'; +import type { OpenApi } from '../interfaces/OpenApi'; +import type { OpenApiSchema } from '../interfaces/OpenApiSchema'; +import { escapeName } from './escapeName'; +import type { getModel } from './getModel'; import { getType } from './getType'; -export function getModelProperties(openApi: OpenApi, definition: OpenApiSchema): Model[] { +// Fix for circular dependency +export type GetModelFn = typeof getModel; + +export const getModelProperties = ( + openApi: OpenApi, + definition: OpenApiSchema, + getModel: GetModelFn, + parent?: Model +): Model[] => { const models: Model[] = []; + const discriminator = findOneOfParentDiscriminator(openApi, parent); for (const propertyName in definition.properties) { if (definition.properties.hasOwnProperty(propertyName)) { const property = definition.properties[propertyName]; - const propertyRequired = definition.required && definition.required.includes(propertyName); - if (property.$ref) { + const propertyRequired = !!definition.required?.includes(propertyName); + const propertyValues: Omit< + Model, + | 'export' + | 'type' + | 'base' + | 'template' + | 'link' + | 'isNullable' + | 'imports' + | 'enum' + | 'enums' + | 'properties' + > = { + name: escapeName(propertyName), + description: property.description || null, + deprecated: property.deprecated === true, + isDefinition: false, + isReadOnly: property.readOnly === true, + isRequired: propertyRequired, + format: property.format, + maximum: property.maximum, + exclusiveMaximum: property.exclusiveMaximum, + minimum: property.minimum, + exclusiveMinimum: property.exclusiveMinimum, + multipleOf: property.multipleOf, + maxLength: property.maxLength, + minLength: property.minLength, + maxItems: property.maxItems, + minItems: property.minItems, + uniqueItems: property.uniqueItems, + maxProperties: property.maxProperties, + minProperties: property.minProperties, + pattern: getPattern(property.pattern), + }; + if (parent && discriminator?.propertyName == propertyName) { + models.push({ + export: 'reference', + type: 'string', + base: `'${mapPropertyValue(discriminator, parent)}'`, + template: null, + isNullable: property.nullable === true, + link: null, + imports: [], + enum: [], + enums: [], + properties: [], + ...propertyValues, + }); + } else if (property.$ref) { const model = getType(property.$ref); models.push({ - name: propertyName, export: 'reference', type: model.type, base: model.base, template: model.template, link: null, - description: getComment(property.description), - isProperty: true, - isReadOnly: property.readOnly === true, - isRequired: propertyRequired === true, - isNullable: property.nullable === true, + isNullable: model.isNullable || property.nullable === true, imports: model.imports, - extends: [], enum: [], enums: [], properties: [], + ...propertyValues, }); } else { const model = getModel(openApi, property); models.push({ - name: propertyName, export: model.export, type: model.type, base: model.base, template: model.template, link: model.link, - description: getComment(property.description), - isProperty: true, - isReadOnly: property.readOnly === true, - isRequired: propertyRequired === true, - isNullable: property.nullable === true, + isNullable: model.isNullable || property.nullable === true, imports: model.imports, - extends: model.extends, enum: model.enum, enums: model.enums, properties: model.properties, + ...propertyValues, }); } } } return models; -} +}; diff --git a/src/openApi/v3/parser/getModelTemplate.spec.ts b/src/openApi/v3/parser/getModelTemplate.spec.ts index 67e46f54e..09c920a4d 100644 --- a/src/openApi/v3/parser/getModelTemplate.spec.ts +++ b/src/openApi/v3/parser/getModelTemplate.spec.ts @@ -7,6 +7,7 @@ describe('getModelTemplate', () => { base: 'Link', template: 'Model', imports: ['Model'], + isNullable: false, }); expect(template).toEqual(''); }); @@ -17,6 +18,7 @@ describe('getModelTemplate', () => { base: 'string', template: null, imports: [], + isNullable: false, }); expect(template).toEqual(''); }); diff --git a/src/openApi/v3/parser/getModelTemplate.ts b/src/openApi/v3/parser/getModelTemplate.ts index f472e7842..b2aa0b33a 100644 --- a/src/openApi/v3/parser/getModelTemplate.ts +++ b/src/openApi/v3/parser/getModelTemplate.ts @@ -1,4 +1,4 @@ -import { Type } from '../../../client/interfaces/Type'; +import type { Type } from '../../../client/interfaces/Type'; /** * If our model has a template type, then we want to generalize that! @@ -6,6 +6,6 @@ import { Type } from '../../../client/interfaces/Type'; * @param modelClass The parsed model class type. * @returns The model template type ( or empty). */ -export function getModelTemplate(modelClass: Type): string { +export const getModelTemplate = (modelClass: Type): string => { return modelClass.template ? '' : ''; -} +}; diff --git a/src/openApi/v3/parser/getModels.ts b/src/openApi/v3/parser/getModels.ts index 162042366..6df7cf1e5 100644 --- a/src/openApi/v3/parser/getModels.ts +++ b/src/openApi/v3/parser/getModels.ts @@ -1,19 +1,33 @@ -import { Model } from '../../../client/interfaces/Model'; -import { OpenApi } from '../interfaces/OpenApi'; +import type { Model } from '../../../client/interfaces/Model'; +import { reservedWords } from '../../../utils/reservedWords'; +import type { OpenApi } from '../interfaces/OpenApi'; import { getModel } from './getModel'; import { getType } from './getType'; -export function getModels(openApi: OpenApi): Map { - const models = new Map(); +export const getModels = (openApi: OpenApi): Model[] => { + const models: Model[] = []; if (openApi.components) { for (const definitionName in openApi.components.schemas) { if (openApi.components.schemas.hasOwnProperty(definitionName)) { const definition = openApi.components.schemas[definitionName]; const definitionType = getType(definitionName); - const model = getModel(openApi, definition, false, definitionType.base); - models.set(definitionType.base, model); + const model = getModel(openApi, definition, true, definitionType.base.replace(reservedWords, '_$1')); + models.push(model); + } + } + for (const definitionName in openApi.components.parameters) { + if (openApi.components.parameters.hasOwnProperty(definitionName)) { + const definition = openApi.components.parameters[definitionName]; + const definitionType = getType(definitionName); + const schema = definition.schema; + if (schema) { + const model = getModel(openApi, schema, true, definitionType.base.replace(reservedWords, '_$1')); + model.description = definition.description || null; + model.deprecated = definition.deprecated; + models.push(model); + } } } } return models; -} +}; diff --git a/src/openApi/v3/parser/getOperation.ts b/src/openApi/v3/parser/getOperation.ts index 20ff34fa9..aee4bd0c2 100644 --- a/src/openApi/v3/parser/getOperation.ts +++ b/src/openApi/v3/parser/getOperation.ts @@ -1,42 +1,50 @@ -import { OpenApi } from '../interfaces/OpenApi'; -import { OpenApiOperation } from '../interfaces/OpenApiOperation'; -import { Operation } from '../../../client/interfaces/Operation'; -import { getComment } from './getComment'; +import type { Operation } from '../../../client/interfaces/Operation'; +import type { OperationParameters } from '../../../client/interfaces/OperationParameters'; +import type { OpenApi } from '../interfaces/OpenApi'; +import type { OpenApiOperation } from '../interfaces/OpenApiOperation'; +import type { OpenApiRequestBody } from '../interfaces/OpenApiRequestBody'; import { getOperationErrors } from './getOperationErrors'; import { getOperationName } from './getOperationName'; import { getOperationParameters } from './getOperationParameters'; -import { getOperationPath } from './getOperationPath'; import { getOperationRequestBody } from './getOperationRequestBody'; +import { getOperationResponseHeader } from './getOperationResponseHeader'; import { getOperationResponses } from './getOperationResponses'; import { getOperationResults } from './getOperationResults'; -import { getServiceClassName } from './getServiceClassName'; +import { getRef } from './getRef'; +import { getServiceName } from './getServiceName'; +import { sortByRequired } from './sortByRequired'; -export function getOperation(openApi: OpenApi, url: string, method: string, op: OpenApiOperation): Operation { - const serviceName = (op.tags && op.tags[0]) || 'Service'; - const serviceClassName = getServiceClassName(serviceName); - const operationNameFallback = `${method}${serviceClassName}`; - const operationName = getOperationName(op.operationId || operationNameFallback); - const operationPath = getOperationPath(url); +export const getOperation = ( + openApi: OpenApi, + url: string, + method: string, + tag: string, + op: OpenApiOperation, + pathParams: OperationParameters +): Operation => { + const serviceName = getServiceName(tag); + const operationName = getOperationName(url, method, op.operationId); // Create a new operation object for this method. const operation: Operation = { - service: serviceClassName, + service: serviceName, name: operationName, - summary: getComment(op.summary), - description: getComment(op.description), + summary: op.summary || null, + description: op.description || null, deprecated: op.deprecated === true, - method: method, - path: operationPath, - parameters: [], - parametersPath: [], - parametersQuery: [], - parametersForm: [], - parametersHeader: [], - parametersCookie: [], - parametersBody: null, + method: method.toUpperCase(), + path: url, + parameters: [...pathParams.parameters], + parametersPath: [...pathParams.parametersPath], + parametersQuery: [...pathParams.parametersQuery], + parametersForm: [...pathParams.parametersForm], + parametersHeader: [...pathParams.parametersHeader], + parametersCookie: [...pathParams.parametersCookie], + parametersBody: pathParams.parametersBody, imports: [], errors: [], results: [], + responseHeader: null, }; // Parse the operation parameters (path, query, body, etc). @@ -53,7 +61,8 @@ export function getOperation(openApi: OpenApi, url: string, method: string, op: } if (op.requestBody) { - const requestBody = getOperationRequestBody(openApi, op.requestBody); + const requestBodyDef = getRef(openApi, op.requestBody); + const requestBody = getOperationRequestBody(openApi, requestBodyDef); operation.imports.push(...requestBody.imports); operation.parameters.push(requestBody); operation.parametersBody = requestBody; @@ -64,11 +73,15 @@ export function getOperation(openApi: OpenApi, url: string, method: string, op: const operationResponses = getOperationResponses(openApi, op.responses); const operationResults = getOperationResults(operationResponses); operation.errors = getOperationErrors(operationResponses); + operation.responseHeader = getOperationResponseHeader(operationResults); + operationResults.forEach(operationResult => { operation.results.push(operationResult); operation.imports.push(...operationResult.imports); }); } + operation.parameters = operation.parameters.sort(sortByRequired); + return operation; -} +}; diff --git a/src/openApi/v3/parser/getOperationErrors.ts b/src/openApi/v3/parser/getOperationErrors.ts index ab6edbb6a..e7624adb5 100644 --- a/src/openApi/v3/parser/getOperationErrors.ts +++ b/src/openApi/v3/parser/getOperationErrors.ts @@ -1,7 +1,7 @@ -import { OperationError } from '../../../client/interfaces/OperationError'; -import { OperationResponse } from '../../../client/interfaces/OperationResponse'; +import type { OperationError } from '../../../client/interfaces/OperationError'; +import type { OperationResponse } from '../../../client/interfaces/OperationResponse'; -export function getOperationErrors(operationResponses: OperationResponse[]): OperationError[] { +export const getOperationErrors = (operationResponses: OperationResponse[]): OperationError[] => { return operationResponses .filter(operationResponse => { return operationResponse.code >= 300 && operationResponse.description; @@ -10,4 +10,4 @@ export function getOperationErrors(operationResponses: OperationResponse[]): Ope code: response.code, description: response.description!, })); -} +}; diff --git a/src/openApi/v3/parser/getOperationName.spec.ts b/src/openApi/v3/parser/getOperationName.spec.ts index ba8a5d3d1..bdaecb8f8 100644 --- a/src/openApi/v3/parser/getOperationName.spec.ts +++ b/src/openApi/v3/parser/getOperationName.spec.ts @@ -2,9 +2,26 @@ import { getOperationName } from './getOperationName'; describe('getOperationName', () => { it('should produce correct result', () => { - expect(getOperationName('')).toEqual(''); - expect(getOperationName('FooBar')).toEqual('fooBar'); - expect(getOperationName('Foo Bar')).toEqual('fooBar'); - expect(getOperationName('foo bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', 'GetAllUsers')).toEqual('getAllUsers'); + expect(getOperationName('/api/v{api-version}/users', 'GET', undefined)).toEqual('getApiUsers'); + expect(getOperationName('/api/v{api-version}/users', 'POST', undefined)).toEqual('postApiUsers'); + expect(getOperationName('/api/v1/users', 'GET', 'GetAllUsers')).toEqual('getAllUsers'); + expect(getOperationName('/api/v1/users', 'GET', undefined)).toEqual('getApiV1Users'); + expect(getOperationName('/api/v1/users', 'POST', undefined)).toEqual('postApiV1Users'); + expect(getOperationName('/api/v1/users/{id}', 'GET', undefined)).toEqual('getApiV1Users'); + expect(getOperationName('/api/v1/users/{id}', 'POST', undefined)).toEqual('postApiV1Users'); + + expect(getOperationName('/api/v{api-version}/users', 'GET', 'fooBar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', 'FooBar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', 'Foo Bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', 'foo bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', 'foo-bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', 'foo_bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', 'foo.bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', '@foo.bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', '$foo.bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', '_foo.bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', '-foo.bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', '123.foo.bar')).toEqual('fooBar'); }); }); diff --git a/src/openApi/v3/parser/getOperationName.ts b/src/openApi/v3/parser/getOperationName.ts index 83a9abcb7..124bf66bd 100644 --- a/src/openApi/v3/parser/getOperationName.ts +++ b/src/openApi/v3/parser/getOperationName.ts @@ -2,10 +2,23 @@ import camelCase from 'camelcase'; /** * Convert the input value to a correct operation (method) classname. - * This converts the input string to camelCase, so the method name follows - * the most popular Javascript and Typescript writing style. + * This will use the operation ID - if available - and otherwise fallback + * on a generated name from the URL */ -export function getOperationName(value: string): string { - const clean = value.replace(/[^\w\s\-]+/g, '_').trim(); - return camelCase(clean); -} +export const getOperationName = (url: string, method: string, operationId?: string): string => { + if (operationId) { + return camelCase( + operationId + .replace(/^[^a-zA-Z]+/g, '') + .replace(/[^\w\-]+/g, '-') + .trim() + ); + } + + const urlWithoutPlaceholders = url + .replace(/[^/]*?{api-version}.*?\//g, '') + .replace(/{(.*?)}/g, '') + .replace(/\//g, '-'); + + return camelCase(`${method}-${urlWithoutPlaceholders}`); +}; diff --git a/src/openApi/v3/parser/getOperationParameter.ts b/src/openApi/v3/parser/getOperationParameter.ts index cbee64e95..97a719c96 100644 --- a/src/openApi/v3/parser/getOperationParameter.ts +++ b/src/openApi/v3/parser/getOperationParameter.ts @@ -1,33 +1,35 @@ -import { OpenApi } from '../interfaces/OpenApi'; -import { OpenApiParameter } from '../interfaces/OpenApiParameter'; -import { OperationParameter } from '../../../client/interfaces/OperationParameter'; -import { PrimaryType } from './constants'; -import { getComment } from './getComment'; +import type { OperationParameter } from '../../../client/interfaces/OperationParameter'; +import { getPattern } from '../../../utils/getPattern'; +import type { OpenApi } from '../interfaces/OpenApi'; +import type { OpenApiParameter } from '../interfaces/OpenApiParameter'; +import type { OpenApiSchema } from '../interfaces/OpenApiSchema'; import { getModel } from './getModel'; +import { getModelDefault } from './getModelDefault'; import { getOperationParameterName } from './getOperationParameterName'; +import { getRef } from './getRef'; import { getType } from './getType'; -export function getOperationParameter(openApi: OpenApi, parameter: OpenApiParameter): OperationParameter { +export const getOperationParameter = (openApi: OpenApi, parameter: OpenApiParameter): OperationParameter => { const operationParameter: OperationParameter = { in: parameter.in, prop: parameter.name, export: 'interface', name: getOperationParameterName(parameter.name), - type: PrimaryType.OBJECT, - base: PrimaryType.OBJECT, + type: 'any', + base: 'any', template: null, link: null, - description: getComment(parameter.description), - default: undefined, - isProperty: false, + description: parameter.description || null, + deprecated: parameter.deprecated === true, + isDefinition: false, isReadOnly: false, isRequired: parameter.required === true, isNullable: parameter.nullable === true, imports: [], - extends: [], enum: [], enums: [], properties: [], + mediaType: null, }; if (parameter.$ref) { @@ -40,24 +42,46 @@ export function getOperationParameter(openApi: OpenApi, parameter: OpenApiParame return operationParameter; } - if (parameter.schema) { - if (parameter.schema.$ref) { - const model = getType(parameter.schema.$ref); + let schema = parameter.schema; + if (schema) { + if (schema.$ref?.startsWith('#/components/parameters/')) { + schema = getRef(openApi, schema); + } + if (schema.$ref) { + const model = getType(schema.$ref); operationParameter.export = 'reference'; operationParameter.type = model.type; operationParameter.base = model.base; operationParameter.template = model.template; operationParameter.imports.push(...model.imports); + operationParameter.default = getModelDefault(schema); return operationParameter; } else { - const model = getModel(openApi, parameter.schema); + const model = getModel(openApi, schema); operationParameter.export = model.export; operationParameter.type = model.type; operationParameter.base = model.base; operationParameter.template = model.template; operationParameter.link = model.link; + operationParameter.isReadOnly = model.isReadOnly; + operationParameter.isRequired = operationParameter.isRequired || model.isRequired; + operationParameter.isNullable = operationParameter.isNullable || model.isNullable; + operationParameter.format = model.format; + operationParameter.maximum = model.maximum; + operationParameter.exclusiveMaximum = model.exclusiveMaximum; + operationParameter.minimum = model.minimum; + operationParameter.exclusiveMinimum = model.exclusiveMinimum; + operationParameter.multipleOf = model.multipleOf; + operationParameter.maxLength = model.maxLength; + operationParameter.minLength = model.minLength; + operationParameter.maxItems = model.maxItems; + operationParameter.minItems = model.minItems; + operationParameter.uniqueItems = model.uniqueItems; + operationParameter.maxProperties = model.maxProperties; + operationParameter.minProperties = model.minProperties; + operationParameter.pattern = getPattern(model.pattern); + operationParameter.default = model.default; operationParameter.imports.push(...model.imports); - operationParameter.extends.push(...model.extends); operationParameter.enum.push(...model.enum); operationParameter.enums.push(...model.enums); operationParameter.properties.push(...model.properties); @@ -66,4 +90,4 @@ export function getOperationParameter(openApi: OpenApi, parameter: OpenApiParame } return operationParameter; -} +}; diff --git a/src/openApi/v3/parser/getOperationParameterDefault.ts b/src/openApi/v3/parser/getOperationParameterDefault.ts deleted file mode 100644 index 5685a7dba..000000000 --- a/src/openApi/v3/parser/getOperationParameterDefault.ts +++ /dev/null @@ -1,15 +0,0 @@ -export function getOperationParameterDefault(value: any): string | null { - if (value === null) { - return 'null'; - } - - switch (typeof value) { - case 'number': - case 'boolean': - return JSON.stringify(value); - case 'string': - return `'${value}'`; - } - - return null; -} diff --git a/src/openApi/v3/parser/getOperationParameterName.spec.ts b/src/openApi/v3/parser/getOperationParameterName.spec.ts new file mode 100644 index 000000000..070749597 --- /dev/null +++ b/src/openApi/v3/parser/getOperationParameterName.spec.ts @@ -0,0 +1,19 @@ +import { getOperationParameterName } from './getOperationParameterName'; + +describe('getOperationParameterName', () => { + it('should produce correct result', () => { + expect(getOperationParameterName('')).toEqual(''); + expect(getOperationParameterName('foobar')).toEqual('foobar'); + expect(getOperationParameterName('fooBar')).toEqual('fooBar'); + expect(getOperationParameterName('foo_bar')).toEqual('fooBar'); + expect(getOperationParameterName('foo-bar')).toEqual('fooBar'); + expect(getOperationParameterName('foo.bar')).toEqual('fooBar'); + expect(getOperationParameterName('@foo.bar')).toEqual('fooBar'); + expect(getOperationParameterName('$foo.bar')).toEqual('fooBar'); + expect(getOperationParameterName('123.foo.bar')).toEqual('fooBar'); + expect(getOperationParameterName('Foo-Bar')).toEqual('fooBar'); + expect(getOperationParameterName('FOO-BAR')).toEqual('fooBar'); + expect(getOperationParameterName('foo[bar]')).toEqual('fooBar'); + expect(getOperationParameterName('foo.bar[]')).toEqual('fooBarArray'); + }); +}); diff --git a/src/openApi/v3/parser/getOperationParameterName.ts b/src/openApi/v3/parser/getOperationParameterName.ts index 54d80d9f6..a3caa291c 100644 --- a/src/openApi/v3/parser/getOperationParameterName.ts +++ b/src/openApi/v3/parser/getOperationParameterName.ts @@ -1,10 +1,16 @@ import camelCase from 'camelcase'; +import { reservedWords } from '../../../utils/reservedWords'; + /** * Replaces any invalid characters from a parameter name. * For example: 'filter.someProperty' becomes 'filterSomeProperty'. */ -export function getOperationParameterName(value: string): string { - const clean = value.replace(/[^\w\s\-]+/g, '_').trim(); - return camelCase(clean); -} +export const getOperationParameterName = (value: string): string => { + const clean = value + .replace(/^[^a-zA-Z]+/g, '') + .replace('[]', 'Array') + .replace(/[^\w\-]+/g, '-') + .trim(); + return camelCase(clean).replace(reservedWords, '_$1'); +}; diff --git a/src/openApi/v3/parser/getOperationParameters.ts b/src/openApi/v3/parser/getOperationParameters.ts index 9ba08031c..051b4a0a9 100644 --- a/src/openApi/v3/parser/getOperationParameters.ts +++ b/src/openApi/v3/parser/getOperationParameters.ts @@ -1,15 +1,10 @@ -import { OpenApi } from '../interfaces/OpenApi'; -import { OpenApiParameter } from '../interfaces/OpenApiParameter'; -import { OperationParameter } from '../../../client/interfaces/OperationParameter'; -import { OperationParameters } from '../../../client/interfaces/OperationParameters'; +import type { OperationParameters } from '../../../client/interfaces/OperationParameters'; +import type { OpenApi } from '../interfaces/OpenApi'; +import type { OpenApiParameter } from '../interfaces/OpenApiParameter'; import { getOperationParameter } from './getOperationParameter'; import { getRef } from './getRef'; -function sortByRequired(a: OperationParameter, b: OperationParameter): number { - return a.isRequired && !b.isRequired ? -1 : !a.isRequired && b.isRequired ? 1 : 0; -} - -export function getOperationParameters(openApi: OpenApi, parameters: OpenApiParameter[]): OperationParameters { +export const getOperationParameters = (openApi: OpenApi, parameters: OpenApiParameter[]): OperationParameters => { const operationParameters: OperationParameters = { imports: [], parameters: [], @@ -18,56 +13,49 @@ export function getOperationParameters(openApi: OpenApi, parameters: OpenApiPara parametersForm: [], parametersCookie: [], parametersHeader: [], - parametersBody: null, + parametersBody: null, // Not used in V3 -> @see requestBody }; // Iterate over the parameters parameters.forEach(parameterOrReference => { - const parameter = getRef(openApi, parameterOrReference); - const param = getOperationParameter(openApi, parameter); + const parameterDef = getRef(openApi, parameterOrReference); + const parameter = getOperationParameter(openApi, parameterDef); // We ignore the "api-version" param, since we do not want to add this // as the first / default parameter for each of the service calls. - if (param.prop !== 'api-version') { - switch (parameter.in) { + if (parameter.prop !== 'api-version') { + switch (parameterDef.in) { case 'path': - operationParameters.parametersPath.push(param); - operationParameters.parameters.push(param); - operationParameters.imports.push(...param.imports); + operationParameters.parametersPath.push(parameter); + operationParameters.parameters.push(parameter); + operationParameters.imports.push(...parameter.imports); break; case 'query': - operationParameters.parametersQuery.push(param); - operationParameters.parameters.push(param); - operationParameters.imports.push(...param.imports); + operationParameters.parametersQuery.push(parameter); + operationParameters.parameters.push(parameter); + operationParameters.imports.push(...parameter.imports); break; case 'formData': - operationParameters.parametersForm.push(param); - operationParameters.parameters.push(param); - operationParameters.imports.push(...param.imports); + operationParameters.parametersForm.push(parameter); + operationParameters.parameters.push(parameter); + operationParameters.imports.push(...parameter.imports); break; case 'cookie': - operationParameters.parametersCookie.push(param); - operationParameters.parameters.push(param); - operationParameters.imports.push(...param.imports); + operationParameters.parametersCookie.push(parameter); + operationParameters.parameters.push(parameter); + operationParameters.imports.push(...parameter.imports); break; case 'header': - operationParameters.parametersHeader.push(param); - operationParameters.parameters.push(param); - operationParameters.imports.push(...param.imports); + operationParameters.parametersHeader.push(parameter); + operationParameters.parameters.push(parameter); + operationParameters.imports.push(...parameter.imports); break; } } }); - - operationParameters.parameters = operationParameters.parameters.sort(sortByRequired); - operationParameters.parametersPath = operationParameters.parametersPath.sort(sortByRequired); - operationParameters.parametersQuery = operationParameters.parametersQuery.sort(sortByRequired); - operationParameters.parametersForm = operationParameters.parametersForm.sort(sortByRequired); - operationParameters.parametersCookie = operationParameters.parametersCookie.sort(sortByRequired); - operationParameters.parametersHeader = operationParameters.parametersHeader.sort(sortByRequired); return operationParameters; -} +}; diff --git a/src/openApi/v3/parser/getOperationPath.spec.ts b/src/openApi/v3/parser/getOperationPath.spec.ts deleted file mode 100644 index 4ede28f43..000000000 --- a/src/openApi/v3/parser/getOperationPath.spec.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { getOperationPath } from './getOperationPath'; - -describe('getOperationPath', () => { - it('should produce correct result', () => { - expect(getOperationPath('/api/v{api-version}/list/{id}/{type}')).toEqual('/api/v${OpenAPI.VERSION}/list/${id}/${type}'); - expect(getOperationPath('/api/v{api-version}/list/{id}')).toEqual('/api/v${OpenAPI.VERSION}/list/${id}'); - expect(getOperationPath('/api/v1/list/{id}')).toEqual('/api/v1/list/${id}'); - expect(getOperationPath('/api/v1/list')).toEqual('/api/v1/list'); - }); -}); diff --git a/src/openApi/v3/parser/getOperationPath.ts b/src/openApi/v3/parser/getOperationPath.ts deleted file mode 100644 index 04b6fd4e4..000000000 --- a/src/openApi/v3/parser/getOperationPath.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Get the final service path, this replaces the "{api-version}" placeholder - * with a new template string placeholder so we can dynamically inject the - * OpenAPI version without the need to hardcode this in the URL. - * @param path - */ -export function getOperationPath(path: string): string { - return path.replace(/{api-version}/g, '{OpenAPI.VERSION}').replace(/\{(.*?)\}/g, '${$1}'); -} diff --git a/src/openApi/v3/parser/getOperationRequestBody.ts b/src/openApi/v3/parser/getOperationRequestBody.ts index 662aa3851..9f9cca241 100644 --- a/src/openApi/v3/parser/getOperationRequestBody.ts +++ b/src/openApi/v3/parser/getOperationRequestBody.ts @@ -1,60 +1,86 @@ -import { OpenApi } from '../interfaces/OpenApi'; -import { OpenApiRequestBody } from '../interfaces/OpenApiRequestBody'; -import { OperationParameter } from '../../../client/interfaces/OperationParameter'; -import { PrimaryType } from './constants'; -import { getComment } from './getComment'; +import type { OperationParameter } from '../../../client/interfaces/OperationParameter'; +import { getPattern } from '../../../utils/getPattern'; +import type { OpenApi } from '../interfaces/OpenApi'; +import type { OpenApiRequestBody } from '../interfaces/OpenApiRequestBody'; import { getContent } from './getContent'; import { getModel } from './getModel'; import { getType } from './getType'; -export function getOperationRequestBody(openApi: OpenApi, parameter: OpenApiRequestBody): OperationParameter { +export const getOperationRequestBody = (openApi: OpenApi, body: OpenApiRequestBody): OperationParameter => { const requestBody: OperationParameter = { in: 'body', - prop: 'body', export: 'interface', + prop: 'requestBody', name: 'requestBody', - type: PrimaryType.OBJECT, - base: PrimaryType.OBJECT, + type: 'any', + base: 'any', template: null, link: null, - description: getComment(parameter.description), + description: body.description || null, default: undefined, - isProperty: false, + isDefinition: false, isReadOnly: false, - isRequired: parameter.required === true, - isNullable: false, + isRequired: body.required === true, + isNullable: body.nullable === true, imports: [], - extends: [], enum: [], enums: [], properties: [], + mediaType: null, }; - if (parameter.content) { - const schema = getContent(openApi, parameter.content); - if (schema) { - if (schema && schema.$ref) { - const model = getType(schema.$ref); + if (body.content) { + const content = getContent(openApi, body.content); + if (content) { + requestBody.mediaType = content.mediaType; + switch (requestBody.mediaType) { + case 'application/x-www-form-urlencoded': + case 'multipart/form-data': + requestBody.in = 'formData'; + requestBody.name = 'formData'; + requestBody.prop = 'formData'; + break; + } + if (content.schema.$ref) { + const model = getType(content.schema.$ref); requestBody.export = 'reference'; requestBody.type = model.type; requestBody.base = model.base; requestBody.template = model.template; requestBody.imports.push(...model.imports); + return requestBody; } else { - const model = getModel(openApi, schema); + const model = getModel(openApi, content.schema); requestBody.export = model.export; requestBody.type = model.type; requestBody.base = model.base; requestBody.template = model.template; requestBody.link = model.link; + requestBody.isReadOnly = model.isReadOnly; + requestBody.isRequired = requestBody.isRequired || model.isRequired; + requestBody.isNullable = requestBody.isNullable || model.isNullable; + requestBody.format = model.format; + requestBody.maximum = model.maximum; + requestBody.exclusiveMaximum = model.exclusiveMaximum; + requestBody.minimum = model.minimum; + requestBody.exclusiveMinimum = model.exclusiveMinimum; + requestBody.multipleOf = model.multipleOf; + requestBody.maxLength = model.maxLength; + requestBody.minLength = model.minLength; + requestBody.maxItems = model.maxItems; + requestBody.minItems = model.minItems; + requestBody.uniqueItems = model.uniqueItems; + requestBody.maxProperties = model.maxProperties; + requestBody.minProperties = model.minProperties; + requestBody.pattern = getPattern(model.pattern); requestBody.imports.push(...model.imports); - requestBody.extends.push(...model.extends); requestBody.enum.push(...model.enum); requestBody.enums.push(...model.enums); requestBody.properties.push(...model.properties); + return requestBody; } } } return requestBody; -} +}; diff --git a/src/openApi/v3/parser/getOperationResponse.ts b/src/openApi/v3/parser/getOperationResponse.ts index 44d7285d5..dff19ec13 100644 --- a/src/openApi/v3/parser/getOperationResponse.ts +++ b/src/openApi/v3/parser/getOperationResponse.ts @@ -1,58 +1,98 @@ -import { OpenApi } from '../interfaces/OpenApi'; -import { OpenApiResponse } from '../interfaces/OpenApiResponse'; -import { OperationResponse } from '../../../client/interfaces/OperationResponse'; -import { PrimaryType } from './constants'; -import { getComment } from './getComment'; +import type { OperationResponse } from '../../../client/interfaces/OperationResponse'; +import { getPattern } from '../../../utils/getPattern'; +import type { OpenApi } from '../interfaces/OpenApi'; +import type { OpenApiResponse } from '../interfaces/OpenApiResponse'; +import type { OpenApiSchema } from '../interfaces/OpenApiSchema'; import { getContent } from './getContent'; import { getModel } from './getModel'; +import { getRef } from './getRef'; import { getType } from './getType'; -export function getOperationResponse(openApi: OpenApi, response: OpenApiResponse, responseCode: number): OperationResponse { +export const getOperationResponse = ( + openApi: OpenApi, + response: OpenApiResponse, + responseCode: number +): OperationResponse => { const operationResponse: OperationResponse = { + in: 'response', name: '', code: responseCode, - description: getComment(response.description)!, + description: response.description || null, export: 'generic', - type: PrimaryType.OBJECT, - base: PrimaryType.OBJECT, + type: 'any', + base: 'any', template: null, link: null, - isProperty: false, + isDefinition: false, isReadOnly: false, isRequired: false, isNullable: false, imports: [], - extends: [], enum: [], enums: [], properties: [], }; if (response.content) { - const schema = getContent(openApi, response.content); - if (schema) { - if (schema && schema.$ref) { - const model = getType(schema.$ref); + const content = getContent(openApi, response.content); + if (content) { + if (content.schema.$ref?.startsWith('#/components/responses/')) { + content.schema = getRef(openApi, content.schema); + } + if (content.schema.$ref) { + const model = getType(content.schema.$ref); operationResponse.export = 'reference'; operationResponse.type = model.type; operationResponse.base = model.base; operationResponse.template = model.template; operationResponse.imports.push(...model.imports); + return operationResponse; } else { - const model = getModel(openApi, schema); + const model = getModel(openApi, content.schema); operationResponse.export = model.export; operationResponse.type = model.type; operationResponse.base = model.base; operationResponse.template = model.template; operationResponse.link = model.link; + operationResponse.isReadOnly = model.isReadOnly; + operationResponse.isRequired = model.isRequired; + operationResponse.isNullable = model.isNullable; + operationResponse.format = model.format; + operationResponse.maximum = model.maximum; + operationResponse.exclusiveMaximum = model.exclusiveMaximum; + operationResponse.minimum = model.minimum; + operationResponse.exclusiveMinimum = model.exclusiveMinimum; + operationResponse.multipleOf = model.multipleOf; + operationResponse.maxLength = model.maxLength; + operationResponse.minLength = model.minLength; + operationResponse.maxItems = model.maxItems; + operationResponse.minItems = model.minItems; + operationResponse.uniqueItems = model.uniqueItems; + operationResponse.maxProperties = model.maxProperties; + operationResponse.minProperties = model.minProperties; + operationResponse.pattern = getPattern(model.pattern); operationResponse.imports.push(...model.imports); - operationResponse.extends.push(...model.extends); operationResponse.enum.push(...model.enum); operationResponse.enums.push(...model.enums); operationResponse.properties.push(...model.properties); + return operationResponse; + } + } + } + + // We support basic properties from response headers, since both + // fetch and XHR client just support string types. + if (response.headers) { + for (const name in response.headers) { + if (response.headers.hasOwnProperty(name)) { + operationResponse.in = 'header'; + operationResponse.name = name; + operationResponse.type = 'string'; + operationResponse.base = 'string'; + return operationResponse; } } } return operationResponse; -} +}; diff --git a/src/openApi/v3/parser/getOperationResponseCode.spec.ts b/src/openApi/v3/parser/getOperationResponseCode.spec.ts new file mode 100644 index 000000000..393907090 --- /dev/null +++ b/src/openApi/v3/parser/getOperationResponseCode.spec.ts @@ -0,0 +1,13 @@ +import { getOperationResponseCode } from './getOperationResponseCode'; + +describe('getOperationResponseCode', () => { + it('should produce correct result', () => { + expect(getOperationResponseCode('')).toEqual(null); + expect(getOperationResponseCode('default')).toEqual(200); + expect(getOperationResponseCode('200')).toEqual(200); + expect(getOperationResponseCode('300')).toEqual(300); + expect(getOperationResponseCode('400')).toEqual(400); + expect(getOperationResponseCode('abc')).toEqual(null); + expect(getOperationResponseCode('-100')).toEqual(100); + }); +}); diff --git a/src/openApi/v3/parser/getOperationResponseCode.ts b/src/openApi/v3/parser/getOperationResponseCode.ts index 080cdc02d..f34c99b75 100644 --- a/src/openApi/v3/parser/getOperationResponseCode.ts +++ b/src/openApi/v3/parser/getOperationResponseCode.ts @@ -1,4 +1,4 @@ -export function getOperationResponseCode(value: string | 'default'): number | null { +export const getOperationResponseCode = (value: string | 'default'): number | null => { // You can specify a "default" response, this is treated as HTTP code 200 if (value === 'default') { return 200; @@ -8,9 +8,9 @@ export function getOperationResponseCode(value: string | 'default'): number | nu if (/[0-9]+/g.test(value)) { const code = parseInt(value); if (Number.isInteger(code)) { - return code; + return Math.abs(code); } } return null; -} +}; diff --git a/src/openApi/v3/parser/getOperationResponseHeader.ts b/src/openApi/v3/parser/getOperationResponseHeader.ts new file mode 100644 index 000000000..09a810916 --- /dev/null +++ b/src/openApi/v3/parser/getOperationResponseHeader.ts @@ -0,0 +1,11 @@ +import type { OperationResponse } from '../../../client/interfaces/OperationResponse'; + +export const getOperationResponseHeader = (operationResponses: OperationResponse[]): string | null => { + const header = operationResponses.find(operationResponses => { + return operationResponses.in === 'header'; + }); + if (header) { + return header.name; + } + return null; +}; diff --git a/src/openApi/v3/parser/getOperationResponses.ts b/src/openApi/v3/parser/getOperationResponses.ts index 876212915..ed628e857 100644 --- a/src/openApi/v3/parser/getOperationResponses.ts +++ b/src/openApi/v3/parser/getOperationResponses.ts @@ -1,12 +1,12 @@ -import { OpenApi } from '../interfaces/OpenApi'; -import { OpenApiResponse } from '../interfaces/OpenApiResponse'; -import { OpenApiResponses } from '../interfaces/OpenApiResponses'; -import { OperationResponse } from '../../../client/interfaces/OperationResponse'; +import type { OperationResponse } from '../../../client/interfaces/OperationResponse'; +import type { OpenApi } from '../interfaces/OpenApi'; +import type { OpenApiResponse } from '../interfaces/OpenApiResponse'; +import type { OpenApiResponses } from '../interfaces/OpenApiResponses'; import { getOperationResponse } from './getOperationResponse'; import { getOperationResponseCode } from './getOperationResponseCode'; import { getRef } from './getRef'; -export function getOperationResponses(openApi: OpenApi, responses: OpenApiResponses): OperationResponse[] { +export const getOperationResponses = (openApi: OpenApi, responses: OpenApiResponses): OperationResponse[] => { const operationResponses: OperationResponse[] = []; // Iterate over each response code and get the @@ -18,7 +18,8 @@ export function getOperationResponses(openApi: OpenApi, responses: OpenApiRespon const responseCode = getOperationResponseCode(code); if (responseCode) { - operationResponses.push(getOperationResponse(openApi, response, responseCode)); + const operationResponse = getOperationResponse(openApi, response, responseCode); + operationResponses.push(operationResponse); } } } @@ -27,4 +28,4 @@ export function getOperationResponses(openApi: OpenApi, responses: OpenApiRespon return operationResponses.sort((a, b): number => { return a.code < b.code ? -1 : a.code > b.code ? 1 : 0; }); -} +}; diff --git a/src/openApi/v3/parser/getOperationResults.ts b/src/openApi/v3/parser/getOperationResults.ts index fdb76359e..9d8111fe8 100644 --- a/src/openApi/v3/parser/getOperationResults.ts +++ b/src/openApi/v3/parser/getOperationResults.ts @@ -1,40 +1,41 @@ -import { Model } from '../../../client/interfaces/Model'; -import { OperationResponse } from '../../../client/interfaces/OperationResponse'; -import { PrimaryType } from './constants'; +import type { Model } from '../../../client/interfaces/Model'; +import type { OperationResponse } from '../../../client/interfaces/OperationResponse'; -function areEqual(a: Model, b: Model): boolean { +const areEqual = (a: Model, b: Model): boolean => { const equal = a.type === b.type && a.base === b.base && a.template === b.template; if (equal && a.link && b.link) { return areEqual(a.link, b.link); } return equal; -} +}; -export function getOperationResults(operationResponses: OperationResponse[]): OperationResponse[] { +export const getOperationResults = (operationResponses: OperationResponse[]): OperationResponse[] => { const operationResults: OperationResponse[] = []; + // Filter out success response codes, but skip "204 No Content" operationResponses.forEach(operationResponse => { - if (operationResponse.code && operationResponse.code >= 200 && operationResponse.code < 300) { + const { code } = operationResponse; + if (code && code !== 204 && code >= 200 && code < 300) { operationResults.push(operationResponse); } }); if (!operationResults.length) { operationResults.push({ + in: 'response', name: '', code: 200, description: '', - export: 'interface', - type: PrimaryType.OBJECT, - base: PrimaryType.OBJECT, + export: 'generic', + type: 'void', + base: 'void', template: null, link: null, - isProperty: false, + isDefinition: false, isReadOnly: false, isRequired: false, isNullable: false, imports: [], - extends: [], enum: [], enums: [], properties: [], @@ -48,4 +49,4 @@ export function getOperationResults(operationResponses: OperationResponse[]): Op }) === index ); }); -} +}; diff --git a/src/openApi/v3/parser/getRef.spec.ts b/src/openApi/v3/parser/getRef.spec.ts new file mode 100644 index 000000000..4195e55bc --- /dev/null +++ b/src/openApi/v3/parser/getRef.spec.ts @@ -0,0 +1,61 @@ +import { getRef } from './getRef'; + +describe('getRef', () => { + it('should produce correct result', () => { + expect( + getRef( + { + openapi: '3.0', + info: { + title: 'dummy', + version: '1.0', + }, + paths: {}, + servers: [ + { + url: 'https://localhost:8080/api', + }, + ], + components: { + schemas: { + Example: { + description: 'This is an Example model ', + type: 'integer', + }, + }, + }, + }, + { + $ref: '#/components/schemas/Example', + } + ) + ).toEqual({ + description: 'This is an Example model ', + type: 'integer', + }); + }); + + it('should produce correct result for encoded ref path', () => { + expect( + getRef( + { + openapi: '3.0', + info: { + title: 'dummy', + version: '1.0', + }, + paths: { + '/api/user/{id}': { + description: 'This is an Example path', + }, + }, + }, + { + $ref: '#/paths/~1api~1user~1%7Bid%7D', + } + ) + ).toEqual({ + description: 'This is an Example path', + }); + }); +}); diff --git a/src/openApi/v3/parser/getRef.ts b/src/openApi/v3/parser/getRef.ts index 303382ba2..2c42690ee 100644 --- a/src/openApi/v3/parser/getRef.ts +++ b/src/openApi/v3/parser/getRef.ts @@ -1,10 +1,13 @@ -import { OpenApi } from '../interfaces/OpenApi'; -import { OpenApiReference } from '../interfaces/OpenApiReference'; +import type { OpenApi } from '../interfaces/OpenApi'; +import type { OpenApiReference } from '../interfaces/OpenApiReference'; -export function getRef(openApi: OpenApi, item: T & OpenApiReference): T { +const ESCAPED_REF_SLASH = /~1/g; +const ESCAPED_REF_TILDE = /~0/g; + +export const getRef = (openApi: OpenApi, item: T & OpenApiReference): T => { if (item.$ref) { // Fetch the paths to the definitions, this converts: - // "#/definitions/Form" to ["definitions", "Form"] + // "#/components/schemas/Form" to ["components", "schemas", "Form"] const paths = item.$ref .replace(/^#/g, '') .split('/') @@ -13,9 +16,12 @@ export function getRef(openApi: OpenApi, item: T & OpenApiReference): T { // Try to find the reference by walking down the path, // if we cannot find it, then we throw an error. let result: any = openApi; - paths.forEach((path: string): void => { - if (result.hasOwnProperty(path)) { - result = result[path]; + paths.forEach(path => { + const decodedPath = decodeURIComponent( + path.replace(ESCAPED_REF_SLASH, '/').replace(ESCAPED_REF_TILDE, '~') + ); + if (result.hasOwnProperty(decodedPath)) { + result = result[decodedPath]; } else { throw new Error(`Could not find reference: "${item.$ref}"`); } @@ -23,4 +29,4 @@ export function getRef(openApi: OpenApi, item: T & OpenApiReference): T { return result as T; } return item as T; -} +}; diff --git a/src/openApi/v3/parser/getRequiredPropertiesFromComposition.ts b/src/openApi/v3/parser/getRequiredPropertiesFromComposition.ts new file mode 100644 index 000000000..0b1f1859f --- /dev/null +++ b/src/openApi/v3/parser/getRequiredPropertiesFromComposition.ts @@ -0,0 +1,33 @@ +import type { Model } from '../../../client/interfaces/Model'; +import type { OpenApi } from '../interfaces/OpenApi'; +import type { OpenApiSchema } from '../interfaces/OpenApiSchema'; +import type { getModel } from './getModel'; +import { getRef } from './getRef'; + +// Fix for circular dependency +export type GetModelFn = typeof getModel; + +export const getRequiredPropertiesFromComposition = ( + openApi: OpenApi, + required: string[], + definitions: OpenApiSchema[], + getModel: GetModelFn +): Model[] => { + return definitions + .reduce((properties, definition) => { + if (definition.$ref) { + const schema = getRef(openApi, definition); + return [...properties, ...getModel(openApi, schema).properties]; + } + return [...properties, ...getModel(openApi, definition).properties]; + }, [] as Model[]) + .filter(property => { + return !property.isRequired && required.includes(property.name); + }) + .map(property => { + return { + ...property, + isRequired: true, + }; + }); +}; diff --git a/src/openApi/v3/parser/getServer.ts b/src/openApi/v3/parser/getServer.ts index aa0180b66..dd60b1cf3 100644 --- a/src/openApi/v3/parser/getServer.ts +++ b/src/openApi/v3/parser/getServer.ts @@ -1,13 +1,13 @@ -import { OpenApi } from '../interfaces/OpenApi'; +import type { OpenApi } from '../interfaces/OpenApi'; -export function getServer(openApi: OpenApi): string { - const server = openApi.servers && openApi.servers[0]; - const variables = (server && server.variables) || {}; - let url = (server && server.url) || ''; +export const getServer = (openApi: OpenApi): string => { + const server = openApi.servers?.[0]; + const variables = server?.variables || {}; + let url = server?.url || ''; for (const variable in variables) { if (variables.hasOwnProperty(variable)) { url = url.replace(`{${variable}}`, variables[variable].default); } } - return url; -} + return url.replace(/\/$/g, ''); +}; diff --git a/src/openApi/v3/parser/getServiceClassName.spec.ts b/src/openApi/v3/parser/getServiceClassName.spec.ts deleted file mode 100644 index 9bcf6e152..000000000 --- a/src/openApi/v3/parser/getServiceClassName.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { getServiceClassName } from './getServiceClassName'; - -describe('getServiceClassName', () => { - it('should produce correct result', () => { - expect(getServiceClassName('')).toEqual(''); - expect(getServiceClassName('FooBar')).toEqual('FooBarService'); - expect(getServiceClassName('Foo Bar')).toEqual('FooBarService'); - expect(getServiceClassName('foo bar')).toEqual('FooBarService'); - expect(getServiceClassName('FooBarService')).toEqual('FooBarService'); - expect(getServiceClassName('Foo Bar Service')).toEqual('FooBarService'); - expect(getServiceClassName('foo bar service')).toEqual('FooBarService'); - }); -}); diff --git a/src/openApi/v3/parser/getServiceClassName.ts b/src/openApi/v3/parser/getServiceClassName.ts deleted file mode 100644 index 94131a3d9..000000000 --- a/src/openApi/v3/parser/getServiceClassName.ts +++ /dev/null @@ -1,14 +0,0 @@ -import camelCase from 'camelcase'; - -/** - * Convert the input value to a correct service classname. This converts - * the input string to PascalCase and appends the "Service" prefix if needed. - */ -export function getServiceClassName(value: string): string { - const clean = value.replace(/[^\w\s\-]+/g, '_').trim(); - const name = camelCase(clean, { pascalCase: true }); - if (name && !name.endsWith('Service')) { - return `${name}Service`; - } - return name; -} diff --git a/src/openApi/v3/parser/getServiceName.spec.ts b/src/openApi/v3/parser/getServiceName.spec.ts new file mode 100644 index 000000000..77c420d3b --- /dev/null +++ b/src/openApi/v3/parser/getServiceName.spec.ts @@ -0,0 +1,13 @@ +import { getServiceName } from './getServiceName'; + +describe('getServiceName', () => { + it('should produce correct result', () => { + expect(getServiceName('')).toEqual(''); + expect(getServiceName('FooBar')).toEqual('FooBar'); + expect(getServiceName('Foo Bar')).toEqual('FooBar'); + expect(getServiceName('foo bar')).toEqual('FooBar'); + expect(getServiceName('@fooBar')).toEqual('FooBar'); + expect(getServiceName('$fooBar')).toEqual('FooBar'); + expect(getServiceName('123fooBar')).toEqual('FooBar'); + }); +}); diff --git a/src/openApi/v3/parser/getServiceName.ts b/src/openApi/v3/parser/getServiceName.ts new file mode 100644 index 000000000..b5b1718f2 --- /dev/null +++ b/src/openApi/v3/parser/getServiceName.ts @@ -0,0 +1,13 @@ +import camelCase from 'camelcase'; + +/** + * Convert the input value to a correct service name. This converts + * the input string to PascalCase. + */ +export const getServiceName = (value: string): string => { + const clean = value + .replace(/^[^a-zA-Z]+/g, '') + .replace(/[^\w\-]+/g, '-') + .trim(); + return camelCase(clean, { pascalCase: true }); +}; diff --git a/src/openApi/v3/parser/getServiceVersion.ts b/src/openApi/v3/parser/getServiceVersion.ts index 9986f1afa..9c7a8a04b 100644 --- a/src/openApi/v3/parser/getServiceVersion.ts +++ b/src/openApi/v3/parser/getServiceVersion.ts @@ -3,6 +3,6 @@ * This basically removes any "v" prefix from the version string. * @param version */ -export function getServiceVersion(version = '1.0'): string { - return version.replace(/^v/gi, ''); -} +export const getServiceVersion = (version = '1.0'): string => { + return String(version).replace(/^v/gi, ''); +}; diff --git a/src/openApi/v3/parser/getServices.spec.ts b/src/openApi/v3/parser/getServices.spec.ts new file mode 100644 index 000000000..baea07e66 --- /dev/null +++ b/src/openApi/v3/parser/getServices.spec.ts @@ -0,0 +1,31 @@ +import { getServices } from './getServices'; + +describe('getServices', () => { + it('should create a unnamed service if tags are empty', () => { + const services = getServices({ + openapi: '3.0.0', + info: { + title: 'x', + version: '1', + }, + paths: { + '/api/trips': { + get: { + tags: [], + responses: { + 200: { + description: 'x', + }, + default: { + description: 'default', + }, + }, + }, + }, + }, + }); + + expect(services).toHaveLength(1); + expect(services[0].name).toEqual('Default'); + }); +}); diff --git a/src/openApi/v3/parser/getServices.ts b/src/openApi/v3/parser/getServices.ts index ed18b28ba..d8fe411bb 100644 --- a/src/openApi/v3/parser/getServices.ts +++ b/src/openApi/v3/parser/getServices.ts @@ -1,49 +1,55 @@ -import { Method } from './constants'; -import { OpenApi } from '../interfaces/OpenApi'; -import { Service } from '../../../client/interfaces/Service'; +import type { Service } from '../../../client/interfaces/Service'; +import { unique } from '../../../utils/unique'; +import type { OpenApi } from '../interfaces/OpenApi'; import { getOperation } from './getOperation'; +import { getOperationParameters } from './getOperationParameters'; /** * Get the OpenAPI services */ -export function getServices(openApi: OpenApi): Map { +export const getServices = (openApi: OpenApi): Service[] => { const services = new Map(); for (const url in openApi.paths) { if (openApi.paths.hasOwnProperty(url)) { + // Grab path and parse any global path parameters const path = openApi.paths[url]; + const pathParams = getOperationParameters(openApi, path.parameters || []); + + // Parse all the methods for this path for (const method in path) { if (path.hasOwnProperty(method)) { switch (method) { - case Method.GET: - case Method.PUT: - case Method.POST: - case Method.DELETE: - case Method.OPTIONS: - case Method.HEAD: - case Method.PATCH: + case 'get': + case 'put': + case 'post': + case 'delete': + case 'options': + case 'head': + case 'patch': // Each method contains an OpenAPI operation, we parse the operation const op = path[method]!; - const operation = getOperation(openApi, url, method, op); + const tags = op.tags?.length ? op.tags.filter(unique) : ['Default']; + tags.forEach(tag => { + const operation = getOperation(openApi, url, method, tag, op, pathParams); - // If we have already declared a service, then we should fetch that and - // append the new method to it. Otherwise we should create a new service object. - const service = - services.get(operation.service) || - ({ + // If we have already declared a service, then we should fetch that and + // append the new method to it. Otherwise we should create a new service object. + const service: Service = services.get(operation.service) || { name: operation.service, operations: [], imports: [], - } as Service); + }; - // Push the operation in the service - service.operations.push(operation); - service.imports.push(...operation.imports); - services.set(operation.service, service); + // Push the operation in the service + service.operations.push(operation); + service.imports.push(...operation.imports); + services.set(operation.service, service); + }); break; } } } } } - return services; -} + return Array.from(services.values()); +}; diff --git a/src/openApi/v3/parser/getType.spec.ts b/src/openApi/v3/parser/getType.spec.ts index 70c061e33..06e23f374 100644 --- a/src/openApi/v3/parser/getType.spec.ts +++ b/src/openApi/v3/parser/getType.spec.ts @@ -7,30 +7,34 @@ describe('getType', () => { expect(type.base).toEqual('number'); expect(type.template).toEqual(null); expect(type.imports).toEqual([]); + expect(type.isNullable).toEqual(false); }); it('should convert string', () => { - const type = getType('String'); + const type = getType('string'); expect(type.type).toEqual('string'); expect(type.base).toEqual('string'); expect(type.template).toEqual(null); expect(type.imports).toEqual([]); + expect(type.isNullable).toEqual(false); }); it('should convert string array', () => { - const type = getType('Array[String]'); - expect(type.type).toEqual('Array'); - expect(type.base).toEqual('Array'); - expect(type.template).toEqual('string'); - expect(type.imports).toEqual(['Array']); + const type = getType('array[string]'); + expect(type.type).toEqual('string[]'); + expect(type.base).toEqual('string'); + expect(type.template).toEqual(null); + expect(type.imports).toEqual([]); + expect(type.isNullable).toEqual(false); }); it('should convert template with primary', () => { - const type = getType('#/components/schemas/Link[String]'); + const type = getType('#/components/schemas/Link[string]'); expect(type.type).toEqual('Link'); expect(type.base).toEqual('Link'); expect(type.template).toEqual('string'); expect(type.imports).toEqual(['Link']); + expect(type.isNullable).toEqual(false); }); it('should convert template with model', () => { @@ -39,6 +43,7 @@ describe('getType', () => { expect(type.base).toEqual('Link'); expect(type.template).toEqual('Model'); expect(type.imports).toEqual(['Link', 'Model']); + expect(type.isNullable).toEqual(false); }); it('should have double imports', () => { @@ -47,13 +52,51 @@ describe('getType', () => { expect(type.base).toEqual('Link'); expect(type.template).toEqual('Link'); expect(type.imports).toEqual(['Link', 'Link']); + expect(type.isNullable).toEqual(false); + }); + + it('should support dot', () => { + const type = getType('#/components/schemas/model.000'); + expect(type.type).toEqual('model_000'); + expect(type.base).toEqual('model_000'); + expect(type.template).toEqual(null); + expect(type.imports).toEqual(['model_000']); + expect(type.isNullable).toEqual(false); + }); + + it('should support dashes', () => { + const type = getType('#/components/schemas/some_special-schema'); + expect(type.type).toEqual('some_special_schema'); + expect(type.base).toEqual('some_special_schema'); + expect(type.template).toEqual(null); + expect(type.imports).toEqual(['some_special_schema']); + expect(type.isNullable).toEqual(false); }); - it('should convert generic', () => { - const type = getType('#/components/schemas/Link', 'Link'); - expect(type.type).toEqual('T'); - expect(type.base).toEqual('T'); + it('should support dollar sign', () => { + const type = getType('#/components/schemas/$some+special+schema'); + expect(type.type).toEqual('$some_special_schema'); + expect(type.base).toEqual('$some_special_schema'); + expect(type.template).toEqual(null); + expect(type.imports).toEqual(['$some_special_schema']); + expect(type.isNullable).toEqual(false); + }); + + it('should support multiple base types', () => { + const type = getType(['string', 'int']); + expect(type.type).toEqual('string | number'); + expect(type.base).toEqual('string | number'); + expect(type.template).toEqual(null); + expect(type.imports).toEqual([]); + expect(type.isNullable).toEqual(false); + }); + + it('should support multiple nullable types', () => { + const type = getType(['string', 'null']); + expect(type.type).toEqual('string'); + expect(type.base).toEqual('string'); expect(type.template).toEqual(null); expect(type.imports).toEqual([]); + expect(type.isNullable).toEqual(true); }); }); diff --git a/src/openApi/v3/parser/getType.ts b/src/openApi/v3/parser/getType.ts index 3c12cc67e..e8ef4733d 100644 --- a/src/openApi/v3/parser/getType.ts +++ b/src/openApi/v3/parser/getType.ts @@ -1,30 +1,60 @@ -import { PrimaryType } from './constants'; -import { Type } from '../../../client/interfaces/Type'; -import { getMappedType, hasMappedType } from './getMappedType'; +import type { Type } from '../../../client/interfaces/Type'; +import { isDefined } from '../../../utils/isDefined'; +import { getMappedType } from './getMappedType'; import { stripNamespace } from './stripNamespace'; +const encode = (value: string): string => { + return value.replace(/^[^a-zA-Z_$]+/g, '').replace(/[^\w$]+/g, '_'); +}; + /** * Parse any string value into a type object. - * @param value String value like "integer" or "Link[Model]". - * @param template Optional template class from parent (needed to process generics) + * @param type String or String[] value like "integer", "Link[Model]" or ["string", "null"]. + * @param format String value like "binary" or "date". */ -export function getType(value?: string, template?: string): Type { +export const getType = (type: string | string[] = 'any', format?: string): Type => { const result: Type = { - type: PrimaryType.OBJECT, - base: PrimaryType.OBJECT, + type: 'any', + base: 'any', template: null, imports: [], + isNullable: false, }; - const valueClean = stripNamespace(value || ''); + // Special case for JSON Schema spec (december 2020, page 17), + // that allows type to be an array of primitive types... + if (Array.isArray(type)) { + const joinedType = type + .filter(value => value !== 'null') + .map(value => getMappedType(value, format)) + .filter(isDefined) + .join(' | '); + result.type = joinedType; + result.base = joinedType; + result.isNullable = type.includes('null'); + return result; + } - if (/\[.*\]$/g.test(valueClean)) { - const matches = valueClean.match(/(.*?)\[(.*)\]$/); - if (matches && matches.length) { - const match1 = getType(matches[1]); - const match2 = getType(matches[2]); + const mapped = getMappedType(type, format); + if (mapped) { + result.type = mapped; + result.base = mapped; + return result; + } - if (match2.type) { + const typeWithoutNamespace = decodeURIComponent(stripNamespace(type)); + + if (/\[.*\]$/g.test(typeWithoutNamespace)) { + const matches = typeWithoutNamespace.match(/(.*?)\[(.*)\]$/); + if (matches?.length) { + const match1 = getType(encode(matches[1])); + const match2 = getType(encode(matches[2])); + + if (match1.type === 'any[]') { + result.type = `${match2.type}[]`; + result.base = `${match2.type}`; + match1.imports = []; + } else if (match2.type) { result.type = `${match1.type}<${match2.type}>`; result.base = match1.type; result.template = match2.type; @@ -36,24 +66,17 @@ export function getType(value?: string, template?: string): Type { result.imports.push(...match1.imports); result.imports.push(...match2.imports); + return result; } - } else if (hasMappedType(valueClean)) { - const mapped = getMappedType(valueClean); - result.type = mapped; - result.base = mapped; - } else if (valueClean) { - result.type = valueClean; - result.base = valueClean; - result.imports.push(valueClean); } - // If the property that we found matched the parent template class - // Then ignore this whole property and return it as a "T" template property. - if (result.type === template) { - result.type = 'T'; // Template; - result.base = 'T'; // Template; - result.imports = []; + if (typeWithoutNamespace) { + const type = encode(typeWithoutNamespace); + result.type = type; + result.base = type; + result.imports.push(type); + return result; } return result; -} +}; diff --git a/src/openApi/v3/parser/isPrimaryType.spec.ts b/src/openApi/v3/parser/isPrimaryType.spec.ts deleted file mode 100644 index ed3e17749..000000000 --- a/src/openApi/v3/parser/isPrimaryType.spec.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { isPrimaryType } from './isPrimaryType'; - -describe('isPrimaryType', () => { - it('should return true for primary types', () => { - expect(isPrimaryType('number')).toBeTruthy(); - expect(isPrimaryType('boolean')).toBeTruthy(); - expect(isPrimaryType('string')).toBeTruthy(); - expect(isPrimaryType('any')).toBeTruthy(); - expect(isPrimaryType('void')).toBeTruthy(); - expect(isPrimaryType('null')).toBeTruthy(); - expect(isPrimaryType('Array')).toBeFalsy(); - expect(isPrimaryType('MyModel')).toBeFalsy(); - }); -}); diff --git a/src/openApi/v3/parser/isPrimaryType.ts b/src/openApi/v3/parser/isPrimaryType.ts deleted file mode 100644 index dfb9e778a..000000000 --- a/src/openApi/v3/parser/isPrimaryType.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { PrimaryType } from './constants'; - -/** - * Check if given type is a primary type. - * @param type - */ -export function isPrimaryType(type: string): type is PrimaryType { - switch (type.toLowerCase()) { - case PrimaryType.FILE: - case PrimaryType.OBJECT: - case PrimaryType.BOOLEAN: - case PrimaryType.NUMBER: - case PrimaryType.STRING: - case PrimaryType.VOID: - case PrimaryType.NULL: - return true; - } - return false; -} diff --git a/src/openApi/v3/parser/sortByRequired.ts b/src/openApi/v3/parser/sortByRequired.ts new file mode 100644 index 000000000..6519bb17e --- /dev/null +++ b/src/openApi/v3/parser/sortByRequired.ts @@ -0,0 +1,9 @@ +import type { OperationParameter } from '../../../client/interfaces/OperationParameter'; + +export const sortByRequired = (a: OperationParameter, b: OperationParameter): number => { + const aNeedsValue = a.isRequired && a.default === undefined; + const bNeedsValue = b.isRequired && b.default === undefined; + if (aNeedsValue && !bNeedsValue) return -1; + if (bNeedsValue && !aNeedsValue) return 1; + return 0; +}; diff --git a/src/openApi/v3/parser/stripNamespace.spec.ts b/src/openApi/v3/parser/stripNamespace.spec.ts index 6f6b668c5..5b3cc4a16 100644 --- a/src/openApi/v3/parser/stripNamespace.spec.ts +++ b/src/openApi/v3/parser/stripNamespace.spec.ts @@ -11,9 +11,5 @@ describe('stripNamespace', () => { expect(stripNamespace('#/components/securitySchemes/Item')).toEqual('Item'); expect(stripNamespace('#/components/links/Item')).toEqual('Item'); expect(stripNamespace('#/components/callbacks/Item')).toEqual('Item'); - expect(stripNamespace('Template[Model]')).toEqual('Template[Model]'); - expect(stripNamespace('namespace.Template[Model]')).toEqual('Template[Model]'); - expect(stripNamespace('namespace.Template[namespace.Model]')).toEqual('Template[Model]'); - expect(stripNamespace('Item')).toEqual('Item'); }); }); diff --git a/src/openApi/v3/parser/stripNamespace.ts b/src/openApi/v3/parser/stripNamespace.ts index 8e06276da..76b9d02d2 100644 --- a/src/openApi/v3/parser/stripNamespace.ts +++ b/src/openApi/v3/parser/stripNamespace.ts @@ -2,35 +2,16 @@ * Strip (OpenAPI) namespaces fom values. * @param value */ -export function stripNamespace(value: string): string { - return ( - value - .trim() - .replace(/^#\/components\/schemas\//, '') - .replace(/^#\/components\/responses\//, '') - .replace(/^#\/components\/parameters\//, '') - .replace(/^#\/components\/examples\//, '') - .replace(/^#\/components\/requestBodies\//, '') - .replace(/^#\/components\/headers\//, '') - .replace(/^#\/components\/securitySchemes\//, '') - .replace(/^#\/components\/links\//, '') - .replace(/^#\/components\/callbacks\//, '') - - // First we remove the namespace from template notation: - // Example: namespace.Template[namespace.Model] -> namespace.Template[Model] - .replace(/(\[.*\]$)/, (s: string): string => { - const v = s - .replace('[', '') - .replace(']', '') - .split('.') - .pop()!; - return `[${v}]`; - }) - - // Then we remove the namespace from the complete result: - // Example: namespace.Template[Model] -> Template[Model] - .replace(/.*/, (s: string): string => { - return s.split('.').pop()!; - }) - ); -} +export const stripNamespace = (value: string): string => { + return value + .trim() + .replace(/^#\/components\/schemas\//, '') + .replace(/^#\/components\/responses\//, '') + .replace(/^#\/components\/parameters\//, '') + .replace(/^#\/components\/examples\//, '') + .replace(/^#\/components\/requestBodies\//, '') + .replace(/^#\/components\/headers\//, '') + .replace(/^#\/components\/securitySchemes\//, '') + .replace(/^#\/components\/links\//, '') + .replace(/^#\/components\/callbacks\//, ''); +}; diff --git a/src/templates/__mocks__/index.ts b/src/templates/__mocks__/index.ts new file mode 100644 index 000000000..7f78e06f9 --- /dev/null +++ b/src/templates/__mocks__/index.ts @@ -0,0 +1,7 @@ +export default { + compiler: [8, '>= 4.3.0'], + useData: true, + main: () => { + return ''; + }, +}; diff --git a/src/templates/client.hbs b/src/templates/client.hbs new file mode 100644 index 000000000..601f27d8f --- /dev/null +++ b/src/templates/client.hbs @@ -0,0 +1,80 @@ +{{>header}} + +{{#equals @root.httpClient 'angular'}} +import { NgModule} from '@angular/core'; +import { HttpClientModule } from '@angular/common/http'; + +import { AngularHttpRequest } from './core/AngularHttpRequest'; +import { BaseHttpRequest } from './core/BaseHttpRequest'; +import type { OpenAPIConfig } from './core/OpenAPI'; +import { OpenAPI } from './core/OpenAPI'; +{{else}} +import type { BaseHttpRequest } from './core/BaseHttpRequest'; +import type { OpenAPIConfig } from './core/OpenAPI'; +import { {{{httpRequest}}} } from './core/{{{httpRequest}}}'; +{{/equals}} + +{{#if services}} +{{#each services}} +import { {{{name}}}{{{@root.postfix}}} } from './services/{{{name}}}{{{@root.postfix}}}'; +{{/each}} +{{/if}} + +{{#equals @root.httpClient 'angular'}} +@NgModule({ + imports: [HttpClientModule], + providers: [ + { + provide: OpenAPI, + useValue: { + BASE: OpenAPI?.BASE ?? '{{{server}}}', + VERSION: OpenAPI?.VERSION ?? '{{{version}}}', + WITH_CREDENTIALS: OpenAPI?.WITH_CREDENTIALS ?? false, + CREDENTIALS: OpenAPI?.CREDENTIALS ?? 'include', + TOKEN: OpenAPI?.TOKEN, + USERNAME: OpenAPI?.USERNAME, + PASSWORD: OpenAPI?.PASSWORD, + HEADERS: OpenAPI?.HEADERS, + ENCODE_PATH: OpenAPI?.ENCODE_PATH, + } as OpenAPIConfig, + }, + { + provide: BaseHttpRequest, + useClass: AngularHttpRequest, + }, + {{#each services}} + {{{name}}}{{{@root.postfix}}}, + {{/each}} + ] +}) +export class {{{clientName}}} {} +{{else}} +type HttpRequestConstructor = new (config: OpenAPIConfig) => BaseHttpRequest; + +export class {{{clientName}}} { + + {{#each services}} + public readonly {{{camelCase name}}}: {{{name}}}{{{@root.postfix}}}; + {{/each}} + + public readonly request: BaseHttpRequest; + + constructor(config?: Partial, HttpRequest: HttpRequestConstructor = {{{httpRequest}}}) { + this.request = new HttpRequest({ + BASE: config?.BASE ?? '{{{server}}}', + VERSION: config?.VERSION ?? '{{{version}}}', + WITH_CREDENTIALS: config?.WITH_CREDENTIALS ?? false, + CREDENTIALS: config?.CREDENTIALS ?? 'include', + TOKEN: config?.TOKEN, + USERNAME: config?.USERNAME, + PASSWORD: config?.PASSWORD, + HEADERS: config?.HEADERS, + ENCODE_PATH: config?.ENCODE_PATH, + }); + + {{#each services}} + this.{{{camelCase name}}} = new {{{name}}}{{{@root.postfix}}}(this.request); + {{/each}} + } +} +{{/equals}} diff --git a/src/templates/core/ApiError.hbs b/src/templates/core/ApiError.hbs new file mode 100644 index 000000000..ab6849d18 --- /dev/null +++ b/src/templates/core/ApiError.hbs @@ -0,0 +1,23 @@ +{{>header}} + +import type { ApiRequestOptions } from './ApiRequestOptions'; +import type { ApiResult } from './ApiResult'; + +export class ApiError extends Error { + public readonly url: string; + public readonly status: number; + public readonly statusText: string; + public readonly body: any; + public readonly request: ApiRequestOptions; + + constructor(request: ApiRequestOptions, response: ApiResult, message: string) { + super(message); + + this.name = 'ApiError'; + this.url = response.url; + this.status = response.status; + this.statusText = response.statusText; + this.body = response.body; + this.request = request; + } +} diff --git a/src/templates/core/ApiRequestOptions.hbs b/src/templates/core/ApiRequestOptions.hbs new file mode 100644 index 000000000..355929a71 --- /dev/null +++ b/src/templates/core/ApiRequestOptions.hbs @@ -0,0 +1,15 @@ +{{>header}} + +export type ApiRequestOptions = { + readonly method: 'GET' | 'PUT' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD' | 'PATCH'; + readonly url: string; + readonly path?: Record; + readonly cookies?: Record; + readonly headers?: Record; + readonly query?: Record; + readonly formData?: Record; + readonly body?: any; + readonly mediaType?: string; + readonly responseHeader?: string; + readonly errors?: Record; +}; diff --git a/src/templates/core/ApiResult.hbs b/src/templates/core/ApiResult.hbs new file mode 100644 index 000000000..a768b8c5a --- /dev/null +++ b/src/templates/core/ApiResult.hbs @@ -0,0 +1,9 @@ +{{>header}} + +export type ApiResult = { + readonly url: string; + readonly ok: boolean; + readonly status: number; + readonly statusText: string; + readonly body: any; +}; diff --git a/src/templates/core/BaseHttpRequest.hbs b/src/templates/core/BaseHttpRequest.hbs new file mode 100644 index 000000000..43ff79cbb --- /dev/null +++ b/src/templates/core/BaseHttpRequest.hbs @@ -0,0 +1,31 @@ +{{>header}} + +{{#equals @root.httpClient 'angular'}} +import type { HttpClient } from '@angular/common/http'; +import type { Observable } from 'rxjs'; + +import type { ApiRequestOptions } from './ApiRequestOptions'; +import type { OpenAPIConfig } from './OpenAPI'; +{{else}} +import type { ApiRequestOptions } from './ApiRequestOptions'; +import type { CancelablePromise } from './CancelablePromise'; +import type { OpenAPIConfig } from './OpenAPI'; +{{/equals}} + +export abstract class BaseHttpRequest { + + {{#equals @root.httpClient 'angular'}} + constructor( + public readonly config: OpenAPIConfig, + public readonly http: HttpClient, + ) {} + {{else}} + constructor(public readonly config: OpenAPIConfig) {} + {{/equals}} + + {{#equals @root.httpClient 'angular'}} + public abstract request(options: ApiRequestOptions): Observable; + {{else}} + public abstract request(options: ApiRequestOptions): CancelablePromise; + {{/equals}} +} diff --git a/src/templates/core/CancelablePromise.hbs b/src/templates/core/CancelablePromise.hbs new file mode 100644 index 000000000..3ac435201 --- /dev/null +++ b/src/templates/core/CancelablePromise.hbs @@ -0,0 +1,129 @@ +{{>header}} + +export class CancelError extends Error { + + constructor(message: string) { + super(message); + this.name = 'CancelError'; + } + + public get isCancelled(): boolean { + return true; + } +} + +export interface OnCancel { + readonly isResolved: boolean; + readonly isRejected: boolean; + readonly isCancelled: boolean; + + (cancelHandler: () => void): void; +} + +export class CancelablePromise implements Promise { + #isResolved: boolean; + #isRejected: boolean; + #isCancelled: boolean; + readonly #cancelHandlers: (() => void)[]; + readonly #promise: Promise; + #resolve?: (value: T | PromiseLike) => void; + #reject?: (reason?: any) => void; + + constructor( + executor: ( + resolve: (value: T | PromiseLike) => void, + reject: (reason?: any) => void, + onCancel: OnCancel + ) => void + ) { + this.#isResolved = false; + this.#isRejected = false; + this.#isCancelled = false; + this.#cancelHandlers = []; + this.#promise = new Promise((resolve, reject) => { + this.#resolve = resolve; + this.#reject = reject; + + const onResolve = (value: T | PromiseLike): void => { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { + return; + } + this.#isResolved = true; + if (this.#resolve) this.#resolve(value); + }; + + const onReject = (reason?: any): void => { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { + return; + } + this.#isRejected = true; + if (this.#reject) this.#reject(reason); + }; + + const onCancel = (cancelHandler: () => void): void => { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { + return; + } + this.#cancelHandlers.push(cancelHandler); + }; + + Object.defineProperty(onCancel, 'isResolved', { + get: (): boolean => this.#isResolved, + }); + + Object.defineProperty(onCancel, 'isRejected', { + get: (): boolean => this.#isRejected, + }); + + Object.defineProperty(onCancel, 'isCancelled', { + get: (): boolean => this.#isCancelled, + }); + + return executor(onResolve, onReject, onCancel as OnCancel); + }); + } + + get [Symbol.toStringTag]() { + return "Cancellable Promise"; + } + + public then( + onFulfilled?: ((value: T) => TResult1 | PromiseLike) | null, + onRejected?: ((reason: any) => TResult2 | PromiseLike) | null + ): Promise { + return this.#promise.then(onFulfilled, onRejected); + } + + public catch( + onRejected?: ((reason: any) => TResult | PromiseLike) | null + ): Promise { + return this.#promise.catch(onRejected); + } + + public finally(onFinally?: (() => void) | null): Promise { + return this.#promise.finally(onFinally); + } + + public cancel(): void { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { + return; + } + this.#isCancelled = true; + if (this.#cancelHandlers.length) { + try { + for (const cancelHandler of this.#cancelHandlers) { + cancelHandler(); + } + } catch (error) { + console.warn('Cancellation threw an error', error); + return; + } + } + this.#cancelHandlers.length = 0; + if (this.#reject) this.#reject(new CancelError('Request aborted')); + } + + public get isCancelled(): boolean { + return this.#isCancelled; + } +} diff --git a/src/templates/core/HttpRequest.hbs b/src/templates/core/HttpRequest.hbs new file mode 100644 index 000000000..e1620a3c0 --- /dev/null +++ b/src/templates/core/HttpRequest.hbs @@ -0,0 +1,61 @@ +{{>header}} + +{{#equals @root.httpClient 'angular'}} +import { Inject, Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import type { Observable } from 'rxjs'; + +import type { ApiRequestOptions } from './ApiRequestOptions'; +import { BaseHttpRequest } from './BaseHttpRequest'; +import type { OpenAPIConfig } from './OpenAPI'; +import { OpenAPI } from './OpenAPI'; +import { request as __request } from './request'; +{{else}} +import type { ApiRequestOptions } from './ApiRequestOptions'; +import { BaseHttpRequest } from './BaseHttpRequest'; +import type { CancelablePromise } from './CancelablePromise'; +import type { OpenAPIConfig } from './OpenAPI'; +import { request as __request } from './request'; +{{/equals}} + +{{#equals @root.httpClient 'angular'}} +@Injectable() +{{/equals}} +export class {{httpRequest}} extends BaseHttpRequest { + + {{#equals @root.httpClient 'angular'}} + constructor( + @Inject(OpenAPI) + config: OpenAPIConfig, + http: HttpClient, + ) { + super(config, http); + } + {{else}} + constructor(config: OpenAPIConfig) { + super(config); + } + {{/equals}} + + {{#equals @root.httpClient 'angular'}} + /** + * Request method + * @param options The request options from the service + * @returns Observable + * @throws ApiError + */ + public override request(options: ApiRequestOptions): Observable { + return __request(this.config, this.http, options); + } + {{else}} + /** + * Request method + * @param options The request options from the service + * @returns CancelablePromise + * @throws ApiError + */ + public override request(options: ApiRequestOptions): CancelablePromise { + return __request(this.config, options); + } + {{/equals}} +} diff --git a/src/templates/core/OpenAPI.hbs b/src/templates/core/OpenAPI.hbs new file mode 100644 index 000000000..7b9560a26 --- /dev/null +++ b/src/templates/core/OpenAPI.hbs @@ -0,0 +1,30 @@ +{{>header}} + +import type { ApiRequestOptions } from './ApiRequestOptions'; + +type Resolver = (options: ApiRequestOptions) => Promise; +type Headers = Record; + +export type OpenAPIConfig = { + BASE: string; + VERSION: string; + WITH_CREDENTIALS: boolean; + CREDENTIALS: 'include' | 'omit' | 'same-origin'; + TOKEN?: string | Resolver | undefined; + USERNAME?: string | Resolver | undefined; + PASSWORD?: string | Resolver | undefined; + HEADERS?: Headers | Resolver | undefined; + ENCODE_PATH?: ((path: string) => string) | undefined; +}; + +export const OpenAPI: OpenAPIConfig = { + BASE: '{{{server}}}', + VERSION: '{{{version}}}', + WITH_CREDENTIALS: false, + CREDENTIALS: 'include', + TOKEN: undefined, + USERNAME: undefined, + PASSWORD: undefined, + HEADERS: undefined, + ENCODE_PATH: undefined, +}; diff --git a/src/templates/core/angular/getHeaders.hbs b/src/templates/core/angular/getHeaders.hbs new file mode 100644 index 000000000..820e7e8aa --- /dev/null +++ b/src/templates/core/angular/getHeaders.hbs @@ -0,0 +1,44 @@ +export const getHeaders = (config: OpenAPIConfig, options: ApiRequestOptions): Observable => { + return forkJoin({ + token: resolve(options, config.TOKEN), + username: resolve(options, config.USERNAME), + password: resolve(options, config.PASSWORD), + additionalHeaders: resolve(options, config.HEADERS), + }).pipe( + map(({ token, username, password, additionalHeaders }) => { + const headers = Object.entries({ + Accept: 'application/json', + ...additionalHeaders, + ...options.headers, + }) + .filter(([_, value]) => isDefined(value)) + .reduce((headers, [key, value]) => ({ + ...headers, + [key]: String(value), + }), {} as Record); + + if (isStringWithValue(token)) { + headers['Authorization'] = `Bearer ${token}`; + } + + if (isStringWithValue(username) && isStringWithValue(password)) { + const credentials = base64(`${username}:${password}`); + headers['Authorization'] = `Basic ${credentials}`; + } + + if (options.body !== undefined) { + if (options.mediaType) { + headers['Content-Type'] = options.mediaType; + } else if (isBlob(options.body)) { + headers['Content-Type'] = options.body.type || 'application/octet-stream'; + } else if (isString(options.body)) { + headers['Content-Type'] = 'text/plain'; + } else if (!isFormData(options.body)) { + headers['Content-Type'] = 'application/json'; + } + } + + return new HttpHeaders(headers); + }), + ); +}; diff --git a/src/templates/core/angular/getRequestBody.hbs b/src/templates/core/angular/getRequestBody.hbs new file mode 100644 index 000000000..891150edf --- /dev/null +++ b/src/templates/core/angular/getRequestBody.hbs @@ -0,0 +1,12 @@ +export const getRequestBody = (options: ApiRequestOptions): any => { + if (options.body) { + if (options.mediaType?.includes('/json')) { + return JSON.stringify(options.body) + } else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) { + return options.body; + } else { + return JSON.stringify(options.body); + } + } + return undefined; +}; diff --git a/src/templates/core/angular/getResponseBody.hbs b/src/templates/core/angular/getResponseBody.hbs new file mode 100644 index 000000000..73653784c --- /dev/null +++ b/src/templates/core/angular/getResponseBody.hbs @@ -0,0 +1,6 @@ +export const getResponseBody = (response: HttpResponse): T | undefined => { + if (response.status !== 204 && response.body !== null) { + return response.body; + } + return undefined; +}; diff --git a/src/templates/core/angular/getResponseHeader.hbs b/src/templates/core/angular/getResponseHeader.hbs new file mode 100644 index 000000000..fcb7ba830 --- /dev/null +++ b/src/templates/core/angular/getResponseHeader.hbs @@ -0,0 +1,9 @@ +export const getResponseHeader = (response: HttpResponse, responseHeader?: string): string | undefined => { + if (responseHeader) { + const value = response.headers.get(responseHeader); + if (isString(value)) { + return value; + } + } + return undefined; +}; diff --git a/src/templates/core/angular/request.hbs b/src/templates/core/angular/request.hbs new file mode 100644 index 000000000..57c98516e --- /dev/null +++ b/src/templates/core/angular/request.hbs @@ -0,0 +1,110 @@ +{{>header}} + +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import type { HttpResponse, HttpErrorResponse } from '@angular/common/http'; +import { forkJoin, of, throwError } from 'rxjs'; +import { catchError, map, switchMap } from 'rxjs/operators'; +import type { Observable } from 'rxjs'; + +import { ApiError } from './ApiError'; +import type { ApiRequestOptions } from './ApiRequestOptions'; +import type { ApiResult } from './ApiResult'; +import type { OpenAPIConfig } from './OpenAPI'; + +{{>functions/isDefined}} + + +{{>functions/isString}} + + +{{>functions/isStringWithValue}} + + +{{>functions/isBlob}} + + +{{>functions/isFormData}} + + +{{>functions/base64}} + + +{{>functions/getQueryString}} + + +{{>functions/getUrl}} + + +{{>functions/getFormData}} + + +{{>functions/resolve}} + + +{{>angular/getHeaders}} + + +{{>angular/getRequestBody}} + + +{{>angular/sendRequest}} + + +{{>angular/getResponseHeader}} + + +{{>angular/getResponseBody}} + + +{{>functions/catchErrorCodes}} + + +/** + * Request method + * @param config The OpenAPI configuration object + * @param http The Angular HTTP client + * @param options The request options from the service + * @returns Observable + * @throws ApiError + */ +export const request = (config: OpenAPIConfig, http: HttpClient, options: ApiRequestOptions): Observable => { + const url = getUrl(config, options); + const formData = getFormData(options); + const body = getRequestBody(options); + + return getHeaders(config, options).pipe( + switchMap(headers => { + return sendRequest(config, options, http, url, formData, body, headers); + }), + map(response => { + const responseBody = getResponseBody(response); + const responseHeader = getResponseHeader(response, options.responseHeader); + return { + url, + ok: response.ok, + status: response.status, + statusText: response.statusText, + body: responseHeader ?? responseBody, + } as ApiResult; + }), + catchError((error: HttpErrorResponse) => { + if (!error.status) { + return throwError(error); + } + return of({ + url, + ok: error.ok, + status: error.status, + statusText: error.statusText, + body: error.error ?? error.statusText, + } as ApiResult); + }), + map(result => { + catchErrorCodes(options, result); + return result.body as T; + }), + catchError((error: ApiError) => { + return throwError(error); + }), + ); +}; diff --git a/src/templates/core/angular/sendRequest.hbs b/src/templates/core/angular/sendRequest.hbs new file mode 100644 index 000000000..ad73d8332 --- /dev/null +++ b/src/templates/core/angular/sendRequest.hbs @@ -0,0 +1,16 @@ +export const sendRequest = ( + config: OpenAPIConfig, + options: ApiRequestOptions, + http: HttpClient, + url: string, + body: any, + formData: FormData | undefined, + headers: HttpHeaders +): Observable> => { + return http.request(options.method, url, { + headers, + body: body ?? formData, + withCredentials: config.WITH_CREDENTIALS, + observe: 'response', + }); +}; diff --git a/src/templates/core/axios/getHeaders.hbs b/src/templates/core/axios/getHeaders.hbs new file mode 100644 index 000000000..23bfb2cf5 --- /dev/null +++ b/src/templates/core/axios/getHeaders.hbs @@ -0,0 +1,45 @@ +export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions, formData?: FormData): Promise> => { + const [token, username, password, additionalHeaders] = await Promise.all([ + resolve(options, config.TOKEN), + resolve(options, config.USERNAME), + resolve(options, config.PASSWORD), + resolve(options, config.HEADERS), + ]); + + const formHeaders = typeof formData?.getHeaders === 'function' && formData?.getHeaders() || {} + + const headers = Object.entries({ + Accept: 'application/json', + ...additionalHeaders, + ...options.headers, + ...formHeaders, + }) + .filter(([_, value]) => isDefined(value)) + .reduce((headers, [key, value]) => ({ + ...headers, + [key]: String(value), + }), {} as Record); + + if (isStringWithValue(token)) { + headers['Authorization'] = `Bearer ${token}`; + } + + if (isStringWithValue(username) && isStringWithValue(password)) { + const credentials = base64(`${username}:${password}`); + headers['Authorization'] = `Basic ${credentials}`; + } + + if (options.body !== undefined) { + if (options.mediaType) { + headers['Content-Type'] = options.mediaType; + } else if (isBlob(options.body)) { + headers['Content-Type'] = options.body.type || 'application/octet-stream'; + } else if (isString(options.body)) { + headers['Content-Type'] = 'text/plain'; + } else if (!isFormData(options.body)) { + headers['Content-Type'] = 'application/json'; + } + } + + return headers; +}; diff --git a/src/templates/core/axios/getRequestBody.hbs b/src/templates/core/axios/getRequestBody.hbs new file mode 100644 index 000000000..b61b468e1 --- /dev/null +++ b/src/templates/core/axios/getRequestBody.hbs @@ -0,0 +1,6 @@ +export const getRequestBody = (options: ApiRequestOptions): any => { + if (options.body) { + return options.body; + } + return undefined; +}; diff --git a/src/templates/core/axios/getResponseBody.hbs b/src/templates/core/axios/getResponseBody.hbs new file mode 100644 index 000000000..c73057c3c --- /dev/null +++ b/src/templates/core/axios/getResponseBody.hbs @@ -0,0 +1,6 @@ +export const getResponseBody = (response: AxiosResponse): any => { + if (response.status !== 204) { + return response.data; + } + return undefined; +}; diff --git a/src/templates/core/axios/getResponseHeader.hbs b/src/templates/core/axios/getResponseHeader.hbs new file mode 100644 index 000000000..6a28e2f16 --- /dev/null +++ b/src/templates/core/axios/getResponseHeader.hbs @@ -0,0 +1,9 @@ +export const getResponseHeader = (response: AxiosResponse, responseHeader?: string): string | undefined => { + if (responseHeader) { + const content = response.headers[responseHeader]; + if (isString(content)) { + return content; + } + } + return undefined; +}; diff --git a/src/templates/core/axios/request.hbs b/src/templates/core/axios/request.hbs new file mode 100644 index 000000000..6612f1614 --- /dev/null +++ b/src/templates/core/axios/request.hbs @@ -0,0 +1,102 @@ +{{>header}} + +import axios from 'axios'; +import type { AxiosError, AxiosRequestConfig, AxiosResponse, AxiosInstance } from 'axios'; +import FormData from 'form-data'; + +import { ApiError } from './ApiError'; +import type { ApiRequestOptions } from './ApiRequestOptions'; +import type { ApiResult } from './ApiResult'; +import { CancelablePromise } from './CancelablePromise'; +import type { OnCancel } from './CancelablePromise'; +import type { OpenAPIConfig } from './OpenAPI'; + +{{>functions/isDefined}} + + +{{>functions/isString}} + + +{{>functions/isStringWithValue}} + + +{{>functions/isBlob}} + + +{{>functions/isFormData}} + + +{{>functions/isSuccess}} + + +{{>functions/base64}} + + +{{>functions/getQueryString}} + + +{{>functions/getUrl}} + + +{{>functions/getFormData}} + + +{{>functions/resolve}} + + +{{>axios/getHeaders}} + + +{{>axios/getRequestBody}} + + +{{>axios/sendRequest}} + + +{{>axios/getResponseHeader}} + + +{{>axios/getResponseBody}} + + +{{>functions/catchErrorCodes}} + + +/** + * Request method + * @param config The OpenAPI configuration object + * @param options The request options from the service + * @param axiosClient The axios client instance to use + * @returns CancelablePromise + * @throws ApiError + */ +export const request = (config: OpenAPIConfig, options: ApiRequestOptions, axiosClient: AxiosInstance = axios): CancelablePromise => { + return new CancelablePromise(async (resolve, reject, onCancel) => { + try { + const url = getUrl(config, options); + const formData = getFormData(options); + const body = getRequestBody(options); + const headers = await getHeaders(config, options, formData); + + if (!onCancel.isCancelled) { + const response = await sendRequest(config, options, url, body, formData, headers, onCancel, axiosClient); + const responseBody = getResponseBody(response); + const responseHeader = getResponseHeader(response, options.responseHeader); + + const result: ApiResult = { + url, + ok: isSuccess(response.status), + status: response.status, + statusText: response.statusText, + body: responseHeader ?? responseBody, + }; + + catchErrorCodes(options, result); + + resolve(result.body); + } + } catch (error) { + reject(error); + } + }); +}; diff --git a/src/templates/core/axios/sendRequest.hbs b/src/templates/core/axios/sendRequest.hbs new file mode 100644 index 000000000..66b5dcb1d --- /dev/null +++ b/src/templates/core/axios/sendRequest.hbs @@ -0,0 +1,34 @@ +export const sendRequest = async ( + config: OpenAPIConfig, + options: ApiRequestOptions, + url: string, + body: any, + formData: FormData | undefined, + headers: Record, + onCancel: OnCancel, + axiosClient: AxiosInstance +): Promise> => { + const source = axios.CancelToken.source(); + + const requestConfig: AxiosRequestConfig = { + url, + headers, + data: body ?? formData, + method: options.method, + withCredentials: config.WITH_CREDENTIALS, + withXSRFToken: config.CREDENTIALS === 'include' ? config.WITH_CREDENTIALS : false, + cancelToken: source.token, + }; + + onCancel(() => source.cancel('The user aborted a request.')); + + try { + return await axiosClient.request(requestConfig); + } catch (error) { + const axiosError = error as AxiosError; + if (axiosError.response) { + return axiosError.response; + } + throw error; + } +}; diff --git a/src/templates/core/fetch/getHeaders.hbs b/src/templates/core/fetch/getHeaders.hbs new file mode 100644 index 000000000..5e373364f --- /dev/null +++ b/src/templates/core/fetch/getHeaders.hbs @@ -0,0 +1,42 @@ +export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions): Promise => { + const [token, username, password, additionalHeaders] = await Promise.all([ + resolve(options, config.TOKEN), + resolve(options, config.USERNAME), + resolve(options, config.PASSWORD), + resolve(options, config.HEADERS), + ]); + + const headers = Object.entries({ + Accept: 'application/json', + ...additionalHeaders, + ...options.headers, + }) + .filter(([_, value]) => isDefined(value)) + .reduce((headers, [key, value]) => ({ + ...headers, + [key]: String(value), + }), {} as Record); + + if (isStringWithValue(token)) { + headers['Authorization'] = `Bearer ${token}`; + } + + if (isStringWithValue(username) && isStringWithValue(password)) { + const credentials = base64(`${username}:${password}`); + headers['Authorization'] = `Basic ${credentials}`; + } + + if (options.body !== undefined) { + if (options.mediaType) { + headers['Content-Type'] = options.mediaType; + } else if (isBlob(options.body)) { + headers['Content-Type'] = options.body.type || 'application/octet-stream'; + } else if (isString(options.body)) { + headers['Content-Type'] = 'text/plain'; + } else if (!isFormData(options.body)) { + headers['Content-Type'] = 'application/json'; + } + } + + return new Headers(headers); +}; diff --git a/src/templates/core/fetch/getRequestBody.hbs b/src/templates/core/fetch/getRequestBody.hbs new file mode 100644 index 000000000..a82b2719d --- /dev/null +++ b/src/templates/core/fetch/getRequestBody.hbs @@ -0,0 +1,12 @@ +export const getRequestBody = (options: ApiRequestOptions): any => { + if (options.body !== undefined) { + if (options.mediaType?.includes('/json')) { + return JSON.stringify(options.body) + } else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) { + return options.body; + } else { + return JSON.stringify(options.body); + } + } + return undefined; +}; diff --git a/src/templates/core/fetch/getResponseBody.hbs b/src/templates/core/fetch/getResponseBody.hbs new file mode 100644 index 000000000..1011380ee --- /dev/null +++ b/src/templates/core/fetch/getResponseBody.hbs @@ -0,0 +1,19 @@ +export const getResponseBody = async (response: Response): Promise => { + if (response.status !== 204) { + try { + const contentType = response.headers.get('Content-Type'); + if (contentType) { + const jsonTypes = ['application/json', 'application/problem+json'] + const isJSON = jsonTypes.some(type => contentType.toLowerCase().startsWith(type)); + if (isJSON) { + return await response.json(); + } else { + return await response.text(); + } + } + } catch (error) { + console.error(error); + } + } + return undefined; +}; diff --git a/src/templates/core/fetch/getResponseHeader.hbs b/src/templates/core/fetch/getResponseHeader.hbs new file mode 100644 index 000000000..cc415c0a7 --- /dev/null +++ b/src/templates/core/fetch/getResponseHeader.hbs @@ -0,0 +1,9 @@ +export const getResponseHeader = (response: Response, responseHeader?: string): string | undefined => { + if (responseHeader) { + const content = response.headers.get(responseHeader); + if (isString(content)) { + return content; + } + } + return undefined; +}; diff --git a/src/templates/core/fetch/request.hbs b/src/templates/core/fetch/request.hbs new file mode 100644 index 000000000..4af6f9440 --- /dev/null +++ b/src/templates/core/fetch/request.hbs @@ -0,0 +1,94 @@ +{{>header}} + +import { ApiError } from './ApiError'; +import type { ApiRequestOptions } from './ApiRequestOptions'; +import type { ApiResult } from './ApiResult'; +import { CancelablePromise } from './CancelablePromise'; +import type { OnCancel } from './CancelablePromise'; +import type { OpenAPIConfig } from './OpenAPI'; + +{{>functions/isDefined}} + + +{{>functions/isString}} + + +{{>functions/isStringWithValue}} + + +{{>functions/isBlob}} + + +{{>functions/isFormData}} + + +{{>functions/base64}} + + +{{>functions/getQueryString}} + + +{{>functions/getUrl}} + + +{{>functions/getFormData}} + + +{{>functions/resolve}} + + +{{>fetch/getHeaders}} + + +{{>fetch/getRequestBody}} + + +{{>fetch/sendRequest}} + + +{{>fetch/getResponseHeader}} + + +{{>fetch/getResponseBody}} + + +{{>functions/catchErrorCodes}} + + +/** + * Request method + * @param config The OpenAPI configuration object + * @param options The request options from the service + * @returns CancelablePromise + * @throws ApiError + */ +export const request = (config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise => { + return new CancelablePromise(async (resolve, reject, onCancel) => { + try { + const url = getUrl(config, options); + const formData = getFormData(options); + const body = getRequestBody(options); + const headers = await getHeaders(config, options); + + if (!onCancel.isCancelled) { + const response = await sendRequest(config, options, url, body, formData, headers, onCancel); + const responseBody = await getResponseBody(response); + const responseHeader = getResponseHeader(response, options.responseHeader); + + const result: ApiResult = { + url, + ok: response.ok, + status: response.status, + statusText: response.statusText, + body: responseHeader ?? responseBody, + }; + + catchErrorCodes(options, result); + + resolve(result.body); + } + } catch (error) { + reject(error); + } + }); +}; diff --git a/src/templates/core/fetch/sendRequest.hbs b/src/templates/core/fetch/sendRequest.hbs new file mode 100644 index 000000000..73f71f428 --- /dev/null +++ b/src/templates/core/fetch/sendRequest.hbs @@ -0,0 +1,26 @@ +export const sendRequest = async ( + config: OpenAPIConfig, + options: ApiRequestOptions, + url: string, + body: any, + formData: FormData | undefined, + headers: Headers, + onCancel: OnCancel +): Promise => { + const controller = new AbortController(); + + const request: RequestInit = { + headers, + body: body ?? formData, + method: options.method, + signal: controller.signal, + }; + + if (config.WITH_CREDENTIALS) { + request.credentials = config.CREDENTIALS; + } + + onCancel(() => controller.abort()); + + return await fetch(url, request); +}; diff --git a/src/templates/core/functions/base64.hbs b/src/templates/core/functions/base64.hbs new file mode 100644 index 000000000..5b7e43aed --- /dev/null +++ b/src/templates/core/functions/base64.hbs @@ -0,0 +1,8 @@ +export const base64 = (str: string): string => { + try { + return btoa(str); + } catch (err) { + // @ts-ignore + return Buffer.from(str).toString('base64'); + } +}; diff --git a/src/templates/core/functions/catchErrorCodes.hbs b/src/templates/core/functions/catchErrorCodes.hbs new file mode 100644 index 000000000..42f69d071 --- /dev/null +++ b/src/templates/core/functions/catchErrorCodes.hbs @@ -0,0 +1,35 @@ + + +export const catchErrorCodes = (options: ApiRequestOptions, result: ApiResult): void => { + const errors: Record = { + 400: 'Bad Request', + 401: 'Unauthorized', + 403: 'Forbidden', + 404: 'Not Found', + 500: 'Internal Server Error', + 502: 'Bad Gateway', + 503: 'Service Unavailable', + ...options.errors, + } + + const error = errors[result.status]; + if (error) { + throw new ApiError(options, result, error); + } + + if (!result.ok) { + const errorStatus = result.status ?? 'unknown'; + const errorStatusText = result.statusText ?? 'unknown'; + const errorBody = (() => { + try { + return JSON.stringify(result.body, null, 2); + } catch (e) { + return undefined; + } + })(); + + throw new ApiError(options, result, + `Generic Error: status: ${errorStatus}; status text: ${errorStatusText}; body: ${errorBody}` + ); + } +}; diff --git a/src/templates/core/functions/getFormData.hbs b/src/templates/core/functions/getFormData.hbs new file mode 100644 index 000000000..b21930d39 --- /dev/null +++ b/src/templates/core/functions/getFormData.hbs @@ -0,0 +1,26 @@ +export const getFormData = (options: ApiRequestOptions): FormData | undefined => { + if (options.formData) { + const formData = new FormData(); + + const process = (key: string, value: any) => { + if (isString(value) || isBlob(value)) { + formData.append(key, value); + } else { + formData.append(key, JSON.stringify(value)); + } + }; + + Object.entries(options.formData) + .filter(([_, value]) => isDefined(value)) + .forEach(([key, value]) => { + if (Array.isArray(value)) { + value.forEach(v => process(key, v)); + } else { + process(key, value); + } + }); + + return formData; + } + return undefined; +}; diff --git a/src/templates/core/functions/getQueryString.hbs b/src/templates/core/functions/getQueryString.hbs new file mode 100644 index 000000000..7946851dd --- /dev/null +++ b/src/templates/core/functions/getQueryString.hbs @@ -0,0 +1,33 @@ +export const getQueryString = (params: Record): string => { + const qs: string[] = []; + + const append = (key: string, value: any) => { + qs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`); + }; + + const process = (key: string, value: any) => { + if (isDefined(value)) { + if (Array.isArray(value)) { + value.forEach(v => { + process(key, v); + }); + } else if (typeof value === 'object') { + Object.entries(value).forEach(([k, v]) => { + process(`${key}[${k}]`, v); + }); + } else { + append(key, value); + } + } + }; + + Object.entries(params).forEach(([key, value]) => { + process(key, value); + }); + + if (qs.length > 0) { + return `?${qs.join('&')}`; + } + + return ''; +}; diff --git a/src/templates/core/functions/getUrl.hbs b/src/templates/core/functions/getUrl.hbs new file mode 100644 index 000000000..fe181ab2e --- /dev/null +++ b/src/templates/core/functions/getUrl.hbs @@ -0,0 +1,18 @@ +const getUrl = (config: OpenAPIConfig, options: ApiRequestOptions): string => { + const encoder = config.ENCODE_PATH || encodeURI; + + const path = options.url + .replace('{api-version}', config.VERSION) + .replace(/{(.*?)}/g, (substring: string, group: string) => { + if (options.path?.hasOwnProperty(group)) { + return encoder(String(options.path[group])); + } + return substring; + }); + + const url = `${config.BASE}${path}`; + if (options.query) { + return `${url}${getQueryString(options.query)}`; + } + return url; +}; diff --git a/src/templates/core/functions/isBlob.hbs b/src/templates/core/functions/isBlob.hbs new file mode 100644 index 000000000..d75c5b515 --- /dev/null +++ b/src/templates/core/functions/isBlob.hbs @@ -0,0 +1,12 @@ +export const isBlob = (value: any): value is Blob => { + return ( + typeof value === 'object' && + typeof value.type === 'string' && + typeof value.stream === 'function' && + typeof value.arrayBuffer === 'function' && + typeof value.constructor === 'function' && + typeof value.constructor.name === 'string' && + /^(Blob|File)$/.test(value.constructor.name) && + /^(Blob|File)$/.test(value[Symbol.toStringTag]) + ); +}; diff --git a/src/templates/core/functions/isDefined.hbs b/src/templates/core/functions/isDefined.hbs new file mode 100644 index 000000000..56cc63b5f --- /dev/null +++ b/src/templates/core/functions/isDefined.hbs @@ -0,0 +1,3 @@ +export const isDefined = (value: T | null | undefined): value is Exclude => { + return value !== undefined && value !== null; +}; diff --git a/src/templates/core/functions/isFormData.hbs b/src/templates/core/functions/isFormData.hbs new file mode 100644 index 000000000..98ec89ed5 --- /dev/null +++ b/src/templates/core/functions/isFormData.hbs @@ -0,0 +1,3 @@ +export const isFormData = (value: any): value is FormData => { + return value instanceof FormData; +}; diff --git a/src/templates/core/functions/isString.hbs b/src/templates/core/functions/isString.hbs new file mode 100644 index 000000000..71e1586af --- /dev/null +++ b/src/templates/core/functions/isString.hbs @@ -0,0 +1,3 @@ +export const isString = (value: any): value is string => { + return typeof value === 'string'; +}; diff --git a/src/templates/core/functions/isStringWithValue.hbs b/src/templates/core/functions/isStringWithValue.hbs new file mode 100644 index 000000000..f5bd03a26 --- /dev/null +++ b/src/templates/core/functions/isStringWithValue.hbs @@ -0,0 +1,3 @@ +export const isStringWithValue = (value: any): value is string => { + return isString(value) && value !== ''; +}; diff --git a/src/templates/core/functions/isSuccess.hbs b/src/templates/core/functions/isSuccess.hbs new file mode 100644 index 000000000..5749d56e4 --- /dev/null +++ b/src/templates/core/functions/isSuccess.hbs @@ -0,0 +1,3 @@ +export const isSuccess = (status: number): boolean => { + return status >= 200 && status < 300; +}; diff --git a/src/templates/core/functions/resolve.hbs b/src/templates/core/functions/resolve.hbs new file mode 100644 index 000000000..bdab21649 --- /dev/null +++ b/src/templates/core/functions/resolve.hbs @@ -0,0 +1,8 @@ +type Resolver = (options: ApiRequestOptions) => Promise; + +export const resolve = async (options: ApiRequestOptions, resolver?: T | Resolver): Promise => { + if (typeof resolver === 'function') { + return (resolver as Resolver)(options); + } + return resolver; +}; diff --git a/src/templates/core/node/getHeaders.hbs b/src/templates/core/node/getHeaders.hbs new file mode 100644 index 000000000..f4f6a04c6 --- /dev/null +++ b/src/templates/core/node/getHeaders.hbs @@ -0,0 +1,42 @@ +export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions): Promise => { + const [token, username, password, additionalHeaders] = await Promise.all([ + resolve(options, config.TOKEN), + resolve(options, config.USERNAME), + resolve(options, config.PASSWORD), + resolve(options, config.HEADERS), + ]); + + const headers = Object.entries({ + Accept: 'application/json', + ...additionalHeaders, + ...options.headers, + }) + .filter(([_, value]) => isDefined(value)) + .reduce((headers, [key, value]) => ({ + ...headers, + [key]: String(value), + }), {} as Record); + + if (isStringWithValue(token)) { + headers['Authorization'] = `Bearer ${token}`; + } + + if (isStringWithValue(username) && isStringWithValue(password)) { + const credentials = base64(`${username}:${password}`); + headers['Authorization'] = `Basic ${credentials}`; + } + + if (options.body !== undefined) { + if (options.mediaType) { + headers['Content-Type'] = options.mediaType; + } else if (isBlob(options.body)) { + headers['Content-Type'] = 'application/octet-stream'; + } else if (isString(options.body)) { + headers['Content-Type'] = 'text/plain'; + } else if (!isFormData(options.body)) { + headers['Content-Type'] = 'application/json'; + } + } + + return new Headers(headers); +}; diff --git a/src/templates/core/node/getRequestBody.hbs b/src/templates/core/node/getRequestBody.hbs new file mode 100644 index 000000000..a60421623 --- /dev/null +++ b/src/templates/core/node/getRequestBody.hbs @@ -0,0 +1,12 @@ +export const getRequestBody = (options: ApiRequestOptions): any => { + if (options.body !== undefined) { + if (options.mediaType?.includes('/json')) { + return JSON.stringify(options.body) + } else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) { + return options.body as any; + } else { + return JSON.stringify(options.body); + } + } + return undefined; +}; diff --git a/src/templates/core/node/getResponseBody.hbs b/src/templates/core/node/getResponseBody.hbs new file mode 100644 index 000000000..1011380ee --- /dev/null +++ b/src/templates/core/node/getResponseBody.hbs @@ -0,0 +1,19 @@ +export const getResponseBody = async (response: Response): Promise => { + if (response.status !== 204) { + try { + const contentType = response.headers.get('Content-Type'); + if (contentType) { + const jsonTypes = ['application/json', 'application/problem+json'] + const isJSON = jsonTypes.some(type => contentType.toLowerCase().startsWith(type)); + if (isJSON) { + return await response.json(); + } else { + return await response.text(); + } + } + } catch (error) { + console.error(error); + } + } + return undefined; +}; diff --git a/src/templates/core/node/getResponseHeader.hbs b/src/templates/core/node/getResponseHeader.hbs new file mode 100644 index 000000000..cc415c0a7 --- /dev/null +++ b/src/templates/core/node/getResponseHeader.hbs @@ -0,0 +1,9 @@ +export const getResponseHeader = (response: Response, responseHeader?: string): string | undefined => { + if (responseHeader) { + const content = response.headers.get(responseHeader); + if (isString(content)) { + return content; + } + } + return undefined; +}; diff --git a/src/templates/core/node/request.hbs b/src/templates/core/node/request.hbs new file mode 100644 index 000000000..8e6f6110e --- /dev/null +++ b/src/templates/core/node/request.hbs @@ -0,0 +1,99 @@ +{{>header}} + +import FormData from 'form-data'; +import fetch, { Headers } from 'node-fetch'; +import type { RequestInit, Response } from 'node-fetch'; +import type { AbortSignal } from 'node-fetch/externals'; + +import { ApiError } from './ApiError'; +import type { ApiRequestOptions } from './ApiRequestOptions'; +import type { ApiResult } from './ApiResult'; +import { CancelablePromise } from './CancelablePromise'; +import type { OnCancel } from './CancelablePromise'; +import type { OpenAPIConfig } from './OpenAPI'; + +{{>functions/isDefined}} + + +{{>functions/isString}} + + +{{>functions/isStringWithValue}} + + +{{>functions/isBlob}} + + +{{>functions/isFormData}} + + +{{>functions/base64}} + + +{{>functions/getQueryString}} + + +{{>functions/getUrl}} + + +{{>functions/getFormData}} + + +{{>functions/resolve}} + + +{{>node/getHeaders}} + + +{{>node/getRequestBody}} + + +{{>node/sendRequest}} + + +{{>node/getResponseHeader}} + + +{{>node/getResponseBody}} + + +{{>functions/catchErrorCodes}} + + +/** + * Request method + * @param config The OpenAPI configuration object + * @param options The request options from the service + * @returns CancelablePromise + * @throws ApiError + */ +export const request = (config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise => { + return new CancelablePromise(async (resolve, reject, onCancel) => { + try { + const url = getUrl(config, options); + const formData = getFormData(options); + const body = getRequestBody(options); + const headers = await getHeaders(config, options); + + if (!onCancel.isCancelled) { + const response = await sendRequest(options, url, body, formData, headers, onCancel); + const responseBody = await getResponseBody(response); + const responseHeader = getResponseHeader(response, options.responseHeader); + + const result: ApiResult = { + url, + ok: response.ok, + status: response.status, + statusText: response.statusText, + body: responseHeader ?? responseBody, + }; + + catchErrorCodes(options, result); + + resolve(result.body); + } + } catch (error) { + reject(error); + } + }); +}; diff --git a/src/templates/core/node/sendRequest.hbs b/src/templates/core/node/sendRequest.hbs new file mode 100644 index 000000000..a2ebf86d4 --- /dev/null +++ b/src/templates/core/node/sendRequest.hbs @@ -0,0 +1,21 @@ +export const sendRequest = async ( + options: ApiRequestOptions, + url: string, + body: any, + formData: FormData | undefined, + headers: Headers, + onCancel: OnCancel +): Promise => { + const controller = new AbortController(); + + const request: RequestInit = { + headers, + method: options.method, + body: body ?? formData, + signal: controller.signal as AbortSignal, + }; + + onCancel(() => controller.abort()); + + return await fetch(url, request); +}; diff --git a/src/templates/core/request.hbs b/src/templates/core/request.hbs new file mode 100644 index 000000000..c4e2478dd --- /dev/null +++ b/src/templates/core/request.hbs @@ -0,0 +1,5 @@ +{{~#equals @root.httpClient 'fetch'}}{{>fetch/request}}{{/equals~}} +{{~#equals @root.httpClient 'xhr'}}{{>xhr/request}}{{/equals~}} +{{~#equals @root.httpClient 'axios'}}{{>axios/request}}{{/equals~}} +{{~#equals @root.httpClient 'angular'}}{{>angular/request}}{{/equals~}} +{{~#equals @root.httpClient 'node'}}{{>node/request}}{{/equals~}} diff --git a/src/templates/core/xhr/getHeaders.hbs b/src/templates/core/xhr/getHeaders.hbs new file mode 100644 index 000000000..5e373364f --- /dev/null +++ b/src/templates/core/xhr/getHeaders.hbs @@ -0,0 +1,42 @@ +export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions): Promise => { + const [token, username, password, additionalHeaders] = await Promise.all([ + resolve(options, config.TOKEN), + resolve(options, config.USERNAME), + resolve(options, config.PASSWORD), + resolve(options, config.HEADERS), + ]); + + const headers = Object.entries({ + Accept: 'application/json', + ...additionalHeaders, + ...options.headers, + }) + .filter(([_, value]) => isDefined(value)) + .reduce((headers, [key, value]) => ({ + ...headers, + [key]: String(value), + }), {} as Record); + + if (isStringWithValue(token)) { + headers['Authorization'] = `Bearer ${token}`; + } + + if (isStringWithValue(username) && isStringWithValue(password)) { + const credentials = base64(`${username}:${password}`); + headers['Authorization'] = `Basic ${credentials}`; + } + + if (options.body !== undefined) { + if (options.mediaType) { + headers['Content-Type'] = options.mediaType; + } else if (isBlob(options.body)) { + headers['Content-Type'] = options.body.type || 'application/octet-stream'; + } else if (isString(options.body)) { + headers['Content-Type'] = 'text/plain'; + } else if (!isFormData(options.body)) { + headers['Content-Type'] = 'application/json'; + } + } + + return new Headers(headers); +}; diff --git a/src/templates/core/xhr/getRequestBody.hbs b/src/templates/core/xhr/getRequestBody.hbs new file mode 100644 index 000000000..a82b2719d --- /dev/null +++ b/src/templates/core/xhr/getRequestBody.hbs @@ -0,0 +1,12 @@ +export const getRequestBody = (options: ApiRequestOptions): any => { + if (options.body !== undefined) { + if (options.mediaType?.includes('/json')) { + return JSON.stringify(options.body) + } else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) { + return options.body; + } else { + return JSON.stringify(options.body); + } + } + return undefined; +}; diff --git a/src/templates/core/xhr/getResponseBody.hbs b/src/templates/core/xhr/getResponseBody.hbs new file mode 100644 index 000000000..ccf83b1ff --- /dev/null +++ b/src/templates/core/xhr/getResponseBody.hbs @@ -0,0 +1,19 @@ +export const getResponseBody = (xhr: XMLHttpRequest): any => { + if (xhr.status !== 204) { + try { + const contentType = xhr.getResponseHeader('Content-Type'); + if (contentType) { + const jsonTypes = ['application/json', 'application/problem+json'] + const isJSON = jsonTypes.some(type => contentType.toLowerCase().startsWith(type)); + if (isJSON) { + return JSON.parse(xhr.responseText); + } else { + return xhr.responseText; + } + } + } catch (error) { + console.error(error); + } + } + return undefined; +}; diff --git a/src/templates/core/xhr/getResponseHeader.hbs b/src/templates/core/xhr/getResponseHeader.hbs new file mode 100644 index 000000000..2ebc80e7a --- /dev/null +++ b/src/templates/core/xhr/getResponseHeader.hbs @@ -0,0 +1,9 @@ +export const getResponseHeader = (xhr: XMLHttpRequest, responseHeader?: string): string | undefined => { + if (responseHeader) { + const content = xhr.getResponseHeader(responseHeader); + if (isString(content)) { + return content; + } + } + return undefined; +}; diff --git a/src/templates/core/xhr/request.hbs b/src/templates/core/xhr/request.hbs new file mode 100644 index 000000000..47f92870b --- /dev/null +++ b/src/templates/core/xhr/request.hbs @@ -0,0 +1,97 @@ +{{>header}} + +import { ApiError } from './ApiError'; +import type { ApiRequestOptions } from './ApiRequestOptions'; +import type { ApiResult } from './ApiResult'; +import { CancelablePromise } from './CancelablePromise'; +import type { OnCancel } from './CancelablePromise'; +import type { OpenAPIConfig } from './OpenAPI'; + +{{>functions/isDefined}} + + +{{>functions/isString}} + + +{{>functions/isStringWithValue}} + + +{{>functions/isBlob}} + + +{{>functions/isFormData}} + + +{{>functions/isSuccess}} + + +{{>functions/base64}} + + +{{>functions/getQueryString}} + + +{{>functions/getUrl}} + + +{{>functions/getFormData}} + + +{{>functions/resolve}} + + +{{>fetch/getHeaders}} + + +{{>xhr/getRequestBody}} + + +{{>xhr/sendRequest}} + + +{{>xhr/getResponseHeader}} + + +{{>xhr/getResponseBody}} + + +{{>functions/catchErrorCodes}} + + +/** + * Request method + * @param config The OpenAPI configuration object + * @param options The request options from the service + * @returns CancelablePromise + * @throws ApiError + */ +export const request = (config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise => { + return new CancelablePromise(async (resolve, reject, onCancel) => { + try { + const url = getUrl(config, options); + const formData = getFormData(options); + const body = getRequestBody(options); + const headers = await getHeaders(config, options); + + if (!onCancel.isCancelled) { + const response = await sendRequest(config, options, url, body, formData, headers, onCancel); + const responseBody = getResponseBody(response); + const responseHeader = getResponseHeader(response, options.responseHeader); + + const result: ApiResult = { + url, + ok: isSuccess(response.status), + status: response.status, + statusText: response.statusText, + body: responseHeader ?? responseBody, + }; + + catchErrorCodes(options, result); + + resolve(result.body); + } + } catch (error) { + reject(error); + } + }); +}; diff --git a/src/templates/core/xhr/sendRequest.hbs b/src/templates/core/xhr/sendRequest.hbs new file mode 100644 index 000000000..0badf8daa --- /dev/null +++ b/src/templates/core/xhr/sendRequest.hbs @@ -0,0 +1,26 @@ +export const sendRequest = async ( + config: OpenAPIConfig, + options: ApiRequestOptions, + url: string, + body: any, + formData: FormData | undefined, + headers: Headers, + onCancel: OnCancel +): Promise => { + const xhr = new XMLHttpRequest(); + xhr.open(options.method, url, true); + xhr.withCredentials = config.WITH_CREDENTIALS; + + headers.forEach((value, key) => { + xhr.setRequestHeader(key, value); + }); + + return new Promise((resolve, reject) => { + xhr.onload = () => resolve(xhr); + xhr.onabort = () => reject(new Error('Request aborted')); + xhr.onerror = () => reject(new Error('Network error')); + xhr.send(body ?? formData); + + onCancel(() => xhr.abort()); + }); +}; diff --git a/src/templates/exportModel.hbs b/src/templates/exportModel.hbs new file mode 100644 index 000000000..7ddb2c3e8 --- /dev/null +++ b/src/templates/exportModel.hbs @@ -0,0 +1,26 @@ +{{>header}} + +{{#if imports}} + +{{#each imports}} +import type { {{{this}}} } from './{{{this}}}'; +{{/each}} +{{/if}} + +{{#equals export 'interface'}} +{{>exportInterface}} +{{else equals export 'one-of'}} +{{>exportComposition}} +{{else equals export 'any-of'}} +{{>exportComposition}} +{{else equals export 'all-of'}} +{{>exportComposition}} +{{else equals export 'enum'}} +{{#if @root.useUnionTypes}} +{{>exportType}} +{{else}} +{{>exportEnum}} +{{/if}} +{{else}} +{{>exportType}} +{{/equals}} diff --git a/src/templates/exportSchema.hbs b/src/templates/exportSchema.hbs new file mode 100644 index 000000000..f54c25fd9 --- /dev/null +++ b/src/templates/exportSchema.hbs @@ -0,0 +1,3 @@ +{{>header}} + +export const ${{{name}}} = {{>schema}} as const; diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs new file mode 100644 index 000000000..d6bccbbeb --- /dev/null +++ b/src/templates/exportService.hbs @@ -0,0 +1,152 @@ +{{>header}} + +{{#equals @root.httpClient 'angular'}} +{{#if @root.exportClient}} +import { Injectable } from '@angular/core'; +import type { Observable } from 'rxjs'; +{{else}} +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import type { Observable } from 'rxjs'; +{{/if}} + +{{/equals}} +{{#if imports}} +{{#each imports}} +import type { {{{this}}} } from '../models/{{{this}}}'; +{{/each}} + +{{/if}} +{{#notEquals @root.httpClient 'angular'}} +import type { CancelablePromise } from '../core/CancelablePromise'; +{{/notEquals}} +{{#if @root.exportClient}} +{{#equals @root.httpClient 'angular'}} +import { BaseHttpRequest } from '../core/BaseHttpRequest'; +{{else}} +import type { BaseHttpRequest } from '../core/BaseHttpRequest'; +{{/equals}} +{{else}} +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +{{/if}} + +{{#equals @root.httpClient 'angular'}} +@Injectable({ + providedIn: 'root', +}) +{{/equals}} +export class {{{name}}}{{{@root.postfix}}} { + {{#if @root.exportClient}} + + constructor(public readonly httpRequest: BaseHttpRequest) {} + {{else}} + {{#equals @root.httpClient 'angular'}} + + constructor(public readonly http: HttpClient) {} + {{/equals}} + {{/if}} + + {{#each operations}} + /** + {{#if deprecated}} + * @deprecated + {{/if}} + {{#if summary}} + * {{{escapeComment summary}}} + {{/if}} + {{#if description}} + * {{{escapeComment description}}} + {{/if}} + {{#unless @root.useOptions}} + {{#if parameters}} + {{#each parameters}} + * @param {{{name}}} {{#if description}}{{{escapeComment description}}}{{/if}} + {{/each}} + {{/if}} + {{/unless}} + {{#each results}} + * @returns {{{type}}} {{#if description}}{{{escapeComment description}}}{{/if}} + {{/each}} + * @throws ApiError + */ + {{#if @root.exportClient}} + {{#equals @root.httpClient 'angular'}} + public {{{name}}}({{>parameters}}): Observable<{{>result}}> { + return this.httpRequest.request({ + {{else}} + public {{{name}}}({{>parameters}}): CancelablePromise<{{>result}}> { + return this.httpRequest.request({ + {{/equals}} + {{else}} + {{#equals @root.httpClient 'angular'}} + public {{{name}}}({{>parameters}}): Observable<{{>result}}> { + return __request(OpenAPI, this.http, { + {{else}} + public static {{{name}}}({{>parameters}}): CancelablePromise<{{>result}}> { + return __request(OpenAPI, { + {{/equals}} + {{/if}} + method: '{{{method}}}', + url: '{{{path}}}', + {{#if parametersPath}} + path: { + {{#each parametersPath}} + '{{{prop}}}': {{{name}}}, + {{/each}} + }, + {{/if}} + {{#if parametersCookie}} + cookies: { + {{#each parametersCookie}} + '{{{prop}}}': {{{name}}}, + {{/each}} + }, + {{/if}} + {{#if parametersHeader}} + headers: { + {{#each parametersHeader}} + '{{{prop}}}': {{{name}}}, + {{/each}} + }, + {{/if}} + {{#if parametersQuery}} + query: { + {{#each parametersQuery}} + '{{{prop}}}': {{{name}}}, + {{/each}} + }, + {{/if}} + {{#if parametersForm}} + formData: { + {{#each parametersForm}} + '{{{prop}}}': {{{name}}}, + {{/each}} + }, + {{/if}} + {{#if parametersBody}} + {{#equals parametersBody.in 'formData'}} + formData: {{{parametersBody.name}}}, + {{/equals}} + {{#equals parametersBody.in 'body'}} + body: {{{parametersBody.name}}}, + {{/equals}} + {{#if parametersBody.mediaType}} + mediaType: '{{{parametersBody.mediaType}}}', + {{/if}} + {{/if}} + {{#if responseHeader}} + responseHeader: '{{{responseHeader}}}', + {{/if}} + {{#if errors}} + errors: { + {{#each errors}} + {{{code}}}: `{{{escapeDescription description}}}`, + {{/each}} + }, + {{/if}} + }); + } + + {{/each}} +} diff --git a/src/templates/index.hbs b/src/templates/index.hbs new file mode 100644 index 000000000..6f5b27d8c --- /dev/null +++ b/src/templates/index.hbs @@ -0,0 +1,47 @@ +{{>header}} + +{{#if @root.exportClient}} +export { {{{clientName}}} } from './{{{clientName}}}'; + +{{/if}} +{{#if @root.exportCore}} +export { ApiError } from './core/ApiError'; +{{#if @root.exportClient}} +export { BaseHttpRequest } from './core/BaseHttpRequest'; +{{/if}} +export { CancelablePromise, CancelError } from './core/CancelablePromise'; +export { OpenAPI } from './core/OpenAPI'; +export type { OpenAPIConfig } from './core/OpenAPI'; +{{/if}} +{{#if @root.exportModels}} +{{#if models}} + +{{#each models}} +{{#if @root.useUnionTypes}} +export type { {{{name}}}{{#if @root.postfixModels}} as {{{name}}}{{{@root.postfixModels}}}{{/if}} } from './models/{{{name}}}'; +{{else if enum}} +export { {{{name}}}{{#if @root.postfixModels}} as {{{name}}}{{{@root.postfixModels}}}{{/if}} } from './models/{{{name}}}'; +{{else if enums}} +export { {{{name}}}{{#if @root.postfixModels}} as {{{name}}}{{{@root.postfixModels}}}{{/if}} } from './models/{{{name}}}'; +{{else}} +export type { {{{name}}}{{#if @root.postfixModels}} as {{{name}}}{{{@root.postfixModels}}}{{/if}} } from './models/{{{name}}}'; +{{/if}} +{{/each}} +{{/if}} +{{/if}} +{{#if @root.exportSchemas}} +{{#if models}} + +{{#each models}} +export { ${{{name}}} } from './schemas/${{{name}}}'; +{{/each}} +{{/if}} +{{/if}} +{{#if @root.exportServices}} +{{#if services}} + +{{#each services}} +export { {{{name}}}{{{@root.postfixServices}}} } from './services/{{{name}}}{{{@root.postfixServices}}}'; +{{/each}} +{{/if}} +{{/if}} diff --git a/src/templates/javascript/core/ApiError.js b/src/templates/javascript/core/ApiError.js deleted file mode 100644 index 25388488a..000000000 --- a/src/templates/javascript/core/ApiError.js +++ /dev/null @@ -1,52 +0,0 @@ -/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { isSuccess } from "./isSuccess"; - -export class ApiError extends Error { - - constructor(result, message) { - super(message); - - this.url = result.url; - this.status = result.status; - this.statusText = result.statusText; - this.body = result.body; - } -} - -(function (ApiError) { - let Message; - (function (Message) { - Message.BAD_REQUEST = 'Bad Request'; - Message.UNAUTHORIZED = 'Unauthorized'; - Message.FORBIDDEN = 'Forbidden'; - Message.NOT_FOUND = 'Not Found'; - Message.INTERNAL_SERVER_ERROR = 'Internal Server Error'; - Message.BAD_GATEWAY = 'Bad Gateway'; - Message.SERVICE_UNAVAILABLE = 'Service Unavailable'; - Message.GENERIC_ERROR = 'Generic Error'; - })(Message = ApiError.Message || (ApiError.Message = {})); -})(ApiError || (ApiError = {})); - -/** - * Catch common errors (based on status code). - * @param result - */ -export function catchGenericError(result) { - - switch (result.status) { - case 400: throw new ApiError(result, ApiError.Message.BAD_REQUEST); - case 401: throw new ApiError(result, ApiError.Message.UNAUTHORIZED); - case 403: throw new ApiError(result, ApiError.Message.FORBIDDEN); - case 404: throw new ApiError(result, ApiError.Message.NOT_FOUND); - case 500: throw new ApiError(result, ApiError.Message.INTERNAL_SERVER_ERROR); - case 502: throw new ApiError(result, ApiError.Message.BAD_GATEWAY); - case 503: throw new ApiError(result, ApiError.Message.SERVICE_UNAVAILABLE); - } - - if (!isSuccess(result.status)) { - throw new ApiError(result, ApiError.Message.GENERIC_ERROR); - } -} diff --git a/src/templates/javascript/core/OpenAPI.hbs b/src/templates/javascript/core/OpenAPI.hbs deleted file mode 100644 index b671b5495..000000000 --- a/src/templates/javascript/core/OpenAPI.hbs +++ /dev/null @@ -1,11 +0,0 @@ -/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -export let OpenAPI; -(function (OpenAPI) { - OpenAPI.BASE = '{{{server}}}'; - OpenAPI.VERSION = '{{{version}}}'; - OpenAPI.CLIENT = '{{{httpClient}}}'; - OpenAPI.TOKEN = ''; -})(OpenAPI || (OpenAPI = {})); diff --git a/src/templates/javascript/core/getFormData.js b/src/templates/javascript/core/getFormData.js deleted file mode 100644 index 50ef98850..000000000 --- a/src/templates/javascript/core/getFormData.js +++ /dev/null @@ -1,21 +0,0 @@ -/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -/** - * Get FormData from object. This method is needed to upload - * multipart form data to the REST API. - * @param params Key value based object. - */ -export function getFormData(params) { - const formData = new FormData(); - for (const key in params) { - if (typeof params[key] !== 'undefined') { - const value = params[key]; - if (value !== undefined && value !== null) { - formData.append(key, value); - } - } - } - return formData; -} diff --git a/src/templates/javascript/core/getQueryString.js b/src/templates/javascript/core/getQueryString.js deleted file mode 100644 index 190ba2c06..000000000 --- a/src/templates/javascript/core/getQueryString.js +++ /dev/null @@ -1,30 +0,0 @@ -/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -/** - * Get query string from query parameters object. This method also - * supports multi-value items by creating a key for each item. - * @param params Key value based object. - */ -export function getQueryString(params) { - const qs = []; - for (const key in params) { - if (typeof params[key] !== 'undefined') { - const value = params[key]; - if (value !== undefined && value !== null) { - if (Array.isArray(value)) { - value.forEach(value => { - qs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`); - }); - } else { - qs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`); - } - } - } - } - if (qs.length > 0) { - return `?${qs.join('&')}`; - } - return ''; -} diff --git a/src/templates/javascript/core/isSuccess.js b/src/templates/javascript/core/isSuccess.js deleted file mode 100644 index e0995c262..000000000 --- a/src/templates/javascript/core/isSuccess.js +++ /dev/null @@ -1,11 +0,0 @@ -/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -/** - * Check success response code. - * @param status Status code - */ -export function isSuccess(status) { - return status >= 200 && status < 300; -} diff --git a/src/templates/javascript/core/request.js b/src/templates/javascript/core/request.js deleted file mode 100644 index 502d90580..000000000 --- a/src/templates/javascript/core/request.js +++ /dev/null @@ -1,78 +0,0 @@ -/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import {getFormData} from './getFormData'; -import {getQueryString} from './getQueryString'; -import {OpenAPI} from './OpenAPI'; -import {requestUsingFetch} from './requestUsingFetch'; -import {requestUsingXHR} from './requestUsingXHR'; - -/** - * Create the request. - * @param options Request method options. - * @returns Result object (see above) - */ -export async function request(options) { - - // Create the request URL - let url = `${OpenAPI.BASE}${options.path}`; - - // Create request headers - const headers = new Headers({ - ...options.headers, - Accept: 'application/json' - }); - - // Create request settings - const request = { - headers, - method: options.method, - credentials: 'same-origin' - }; - - // If we have a bearer token then we set the authentication header. - if (OpenAPI.TOKEN !== null && OpenAPI.TOKEN !== '') { - headers.append('Authorization', `Bearer ${OpenAPI.TOKEN}`); - } - - // Add the query parameters (if defined). - if (options.query) { - url += getQueryString(options.query); - } - - // Append formData as body - if (options.formData) { - request.body = getFormData(options.formData); - } else if (options.body) { - - // If this is blob data, then pass it directly to the body and set content type. - // Otherwise we just convert request data to JSON string (needed for fetch api) - if (options.body instanceof Blob) { - request.body = options.body; - if (options.body.type) { - headers.append('Content-Type', options.body.type); - } - } else { - request.body = JSON.stringify(options.body); - headers.append('Content-Type', 'application/json'); - } - } - - try { - switch (OpenAPI.CLIENT) { - case 'xhr': - return await requestUsingXHR(url, request); - default: - return await requestUsingFetch(url, request); - } - } catch (error) { - return { - url, - ok: false, - status: 0, - statusText: '', - body: error - }; - } -} diff --git a/src/templates/javascript/core/requestUsingFetch.js b/src/templates/javascript/core/requestUsingFetch.js deleted file mode 100644 index f5e3411e8..000000000 --- a/src/templates/javascript/core/requestUsingFetch.js +++ /dev/null @@ -1,47 +0,0 @@ -/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -/** - * Request content using the new Fetch API. This is the default API that is used and - * is create for all JSON, XML and text objects. However it is limited to UTF-8. - * This is a problem for some of the Docs content, since that requires UTF-16! - * @param url The url to request. - * @param request The request object, containing method, headers, body, etc. - */ -export async function requestUsingFetch(url, request) { - - // Fetch response using fetch API. - const response = await fetch(url, request); - - // Create result object. - const result = { - url, - ok: response.ok, - status: response.status, - statusText: response.statusText, - body: null - }; - - // Try to parse the content for any response status code. - // We check the "Content-Type" header to see if we need to parse the - // content as json or as plain text. - const contentType = response.headers.get('Content-Type'); - if (contentType) { - switch (contentType.toLowerCase()) { - case 'application/json': - case 'application/json; charset=utf-8': - result.body = await response.json(); - break; - - case 'text/plain': - case 'text/xml': - case 'text/xml; charset=utf-8': - case 'text/xml; charset=utf-16': - result.body = await response.text(); - break; - } - } - - return result; -} diff --git a/src/templates/javascript/core/requestUsingXHR.js b/src/templates/javascript/core/requestUsingXHR.js deleted file mode 100644 index 97aecaaa6..000000000 --- a/src/templates/javascript/core/requestUsingXHR.js +++ /dev/null @@ -1,70 +0,0 @@ -/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { isSuccess } from './isSuccess'; - -/** - * Request content using the new legacy XMLHttpRequest API. This method is useful - * when we want to request UTF-16 content, since it natively supports loading UTF-16. - * We could do the same with the Fetch API, but then we will need to convert the - * content using JavaScript... And that is very very slow. - * @param url The url to request. - * @param request The request object, containing method, headers, body, etc. - */ -export async function requestUsingXHR(url, request) { - return new Promise(resolve => { - const xhr = new XMLHttpRequest(); - - // Open the request, remember to do this before adding any headers, - // because the request needs to be initialized! - xhr.open(request.method, url, true); - - // Add the headers (required when dealing with JSON) - const headers = request.headers as Headers; - headers.forEach((value, key) => { - xhr.setRequestHeader(key, value); - }); - - // Register the readystate handler, this will fire when the request is done. - xhr.onreadystatechange = () => { - if (xhr.readyState === XMLHttpRequest.DONE) { - - // Create result object. - const result = { - url, - ok: isSuccess(xhr.status), - status: xhr.status, - statusText: xhr.statusText, - body: null - }; - - // Try to parse the content for any response status code. - // We check the "Content-Type" header to see if we need to parse the - // content as json or as plain text. - const contentType = xhr.getResponseHeader('Content-Type'); - if (contentType) { - switch (contentType.toLowerCase()) { - case 'application/json': - case 'application/json; charset=utf-8': - result.body = JSON.parse(xhr.responseText); - break; - - case 'text/plain': - case 'text/xml': - case 'text/xml; charset=utf-8': - case 'text/xml; charset=utf-16': - result.body = xhr.responseText; - break; - } - } - - // Done! - resolve(result); - } - }; - - // Start the request! - xhr.send(request.body); - }); -} diff --git a/src/templates/javascript/index.hbs b/src/templates/javascript/index.hbs deleted file mode 100644 index 76dc57b4b..000000000 --- a/src/templates/javascript/index.hbs +++ /dev/null @@ -1,19 +0,0 @@ -/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -export { ApiError } from './core/ApiError'; -export { isSuccess } from './core/isSuccess'; -export { OpenAPI } from './core/OpenAPI'; -{{#if models}} - -{{#each models}} -{{#notEquals this 'Dictionary'}}export { {{{this}}} } from './models/{{{this}}}';{{/notEquals}} -{{/each}} -{{/if}} -{{#if services}} - -{{#each services}} -export { {{{this}}} } from './services/{{{this}}}'; -{{/each}} -{{/if}} diff --git a/src/templates/javascript/model.hbs b/src/templates/javascript/model.hbs deleted file mode 100644 index 8085526a0..000000000 --- a/src/templates/javascript/model.hbs +++ /dev/null @@ -1,24 +0,0 @@ -/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -{{#if imports}} -{{#each imports}} -{{#notEquals this 'Dictionary'}}import { {{{this}}} } from '../models/{{{this}}}';{{/notEquals}} -{{/each}} -{{/if}} -import * as yup from 'yup'; - -{{#equals export 'reference'}} -{{>exportReference}} -{{else equals export 'generic'}} -{{>exportGeneric}} -{{else equals export 'enum'}} -{{>exportEnum}} -{{else equals export 'array'}} -{{>exportArray}} -{{else equals export 'dictionary'}} -{{>exportDictionary}} -{{else equals export 'interface'}} -{{>exportInterface}} -{{/equals}} diff --git a/src/templates/javascript/partials/exportArray.hbs b/src/templates/javascript/partials/exportArray.hbs deleted file mode 100644 index f21595568..000000000 --- a/src/templates/javascript/partials/exportArray.hbs +++ /dev/null @@ -1,19 +0,0 @@ -{{#if description}} -/** - * {{{description}}} - */ -{{/if}} -export let {{{name}}}; -(function ({{{name}}}) { - - {{{name}}}.schema = {{>validation}}; - - {{{name}}}.validate = async function(value) { - return {{{name}}}.schema.validate(value, { strict: true }); - }; - - {{{name}}}.validateSync = function(value) { - return {{{name}}}.schema.validateSync(value, { strict: true }); - }; - -})({{{name}}} || ({{{name}}} = {})); diff --git a/src/templates/javascript/partials/exportDictionary.hbs b/src/templates/javascript/partials/exportDictionary.hbs deleted file mode 100644 index f21595568..000000000 --- a/src/templates/javascript/partials/exportDictionary.hbs +++ /dev/null @@ -1,19 +0,0 @@ -{{#if description}} -/** - * {{{description}}} - */ -{{/if}} -export let {{{name}}}; -(function ({{{name}}}) { - - {{{name}}}.schema = {{>validation}}; - - {{{name}}}.validate = async function(value) { - return {{{name}}}.schema.validate(value, { strict: true }); - }; - - {{{name}}}.validateSync = function(value) { - return {{{name}}}.schema.validateSync(value, { strict: true }); - }; - -})({{{name}}} || ({{{name}}} = {})); diff --git a/src/templates/javascript/partials/exportEnum.hbs b/src/templates/javascript/partials/exportEnum.hbs deleted file mode 100644 index 39c67a7be..000000000 --- a/src/templates/javascript/partials/exportEnum.hbs +++ /dev/null @@ -1,23 +0,0 @@ -{{#if description}} -/** - * {{{description}}} - */ -{{/if}} -export let {{{name}}}; -(function ({{{name}}}) { - - {{#each enum}} - {{{../name}}}.{{{name}}} = {{{value}}}; - {{/each}} - - {{{name}}}.schema = {{>validation}}; - - {{{name}}}.validate = async function(value) { - return {{{name}}}.schema.validate(value, { strict: true }); - }; - - {{{name}}}.validateSync = function(value) { - return {{{name}}}.schema.validateSync(value, { strict: true }); - }; - -})({{{name}}} || ({{{name}}} = {})); diff --git a/src/templates/javascript/partials/exportGeneric.hbs b/src/templates/javascript/partials/exportGeneric.hbs deleted file mode 100644 index f21595568..000000000 --- a/src/templates/javascript/partials/exportGeneric.hbs +++ /dev/null @@ -1,19 +0,0 @@ -{{#if description}} -/** - * {{{description}}} - */ -{{/if}} -export let {{{name}}}; -(function ({{{name}}}) { - - {{{name}}}.schema = {{>validation}}; - - {{{name}}}.validate = async function(value) { - return {{{name}}}.schema.validate(value, { strict: true }); - }; - - {{{name}}}.validateSync = function(value) { - return {{{name}}}.schema.validateSync(value, { strict: true }); - }; - -})({{{name}}} || ({{{name}}} = {})); diff --git a/src/templates/javascript/partials/exportInterface.hbs b/src/templates/javascript/partials/exportInterface.hbs deleted file mode 100644 index b6a25e6c7..000000000 --- a/src/templates/javascript/partials/exportInterface.hbs +++ /dev/null @@ -1,32 +0,0 @@ -{{#if description}} -/** - * {{{description}}} - */ -{{/if}} -export let {{{name}}}; -(function ({{{name}}}) { - - {{#each enums}} - {{#if description}} - /** - * {{{description}}} - */ - {{/if}} - {{{../name}}}.{{{name}}} = { - {{#each enum}} - {{{name}}}: {{{value}}}{{#unless @last}},{{/unless}} - {{/each}} - }; - - {{/each}} - {{{name}}}.schema = {{>validation}}; - - {{{name}}}.validate = async function(value) { - return {{{name}}}.schema.validate(value, { strict: true }); - }; - - {{{name}}}.validateSync = function(value) { - return {{{name}}}.schema.validateSync(value, { strict: true }); - }; - -})({{{name}}} || ({{{name}}} = {})); diff --git a/src/templates/javascript/partials/exportReference.hbs b/src/templates/javascript/partials/exportReference.hbs deleted file mode 100644 index f21595568..000000000 --- a/src/templates/javascript/partials/exportReference.hbs +++ /dev/null @@ -1,19 +0,0 @@ -{{#if description}} -/** - * {{{description}}} - */ -{{/if}} -export let {{{name}}}; -(function ({{{name}}}) { - - {{{name}}}.schema = {{>validation}}; - - {{{name}}}.validate = async function(value) { - return {{{name}}}.schema.validate(value, { strict: true }); - }; - - {{{name}}}.validateSync = function(value) { - return {{{name}}}.schema.validateSync(value, { strict: true }); - }; - -})({{{name}}} || ({{{name}}} = {})); diff --git a/src/templates/javascript/partials/validation.hbs b/src/templates/javascript/partials/validation.hbs deleted file mode 100644 index e07d81bed..000000000 --- a/src/templates/javascript/partials/validation.hbs +++ /dev/null @@ -1,13 +0,0 @@ -{{#equals export 'reference'}} -{{>validationReference}} -{{else equals export 'generic'}} -{{>validationGeneric}} -{{else equals export 'enum'}} -{{>validationEnum}} -{{else equals export 'array'}} -{{>validationArray}} -{{else equals export 'dictionary'}} -{{>validationDictionary}} -{{else equals export 'interface'}} -{{>validationInterface}} -{{/equals}} diff --git a/src/templates/javascript/partials/validationArray.hbs b/src/templates/javascript/partials/validationArray.hbs deleted file mode 100644 index f530ecc8f..000000000 --- a/src/templates/javascript/partials/validationArray.hbs +++ /dev/null @@ -1,5 +0,0 @@ -{{~#if link~}} -yup.array().of({{>validation link}}) -{{~else~}} -yup.array().of({{{base}}}.schema) -{{~/if~}} diff --git a/src/templates/javascript/partials/validationDictionary.hbs b/src/templates/javascript/partials/validationDictionary.hbs deleted file mode 100644 index 9031c3d4b..000000000 --- a/src/templates/javascript/partials/validationDictionary.hbs +++ /dev/null @@ -1,19 +0,0 @@ -{{~#if link~}} -yup.lazy(value => { - return yup.object().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: {{>validation link}} - }), {}) - ); -}) -{{~else~}} -yup.lazy(value => { - return yup.object().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: {{{base}}}.schema - }), {}) - ); -}) -{{~/if~}} diff --git a/src/templates/javascript/partials/validationEnum.hbs b/src/templates/javascript/partials/validationEnum.hbs deleted file mode 100644 index f6f9c50f6..000000000 --- a/src/templates/javascript/partials/validationEnum.hbs +++ /dev/null @@ -1,13 +0,0 @@ -{{~#equals parent name~}} -yup.mixed().oneOf([ - {{#each enum}} - {{{../parent}}}.{{{name}}}{{#unless @last}},{{/unless}} - {{/each}} -]) -{{~else~}} -yup.mixed().oneOf([ - {{#each enum}} - {{{value}}}{{#unless @last}},{{/unless}} - {{/each}} -]) -{{~/equals~}} diff --git a/src/templates/javascript/partials/validationGeneric.hbs b/src/templates/javascript/partials/validationGeneric.hbs deleted file mode 100644 index 25b52dbd6..000000000 --- a/src/templates/javascript/partials/validationGeneric.hbs +++ /dev/null @@ -1,9 +0,0 @@ -{{~#equals type 'boolean'~}} -yup.boolean() -{{~else equals type 'number'~}} -yup.number() -{{~else equals type 'string'~}} -yup.string() -{{~else~}} -yup.mixed() -{{~/equals~}} diff --git a/src/templates/javascript/partials/validationInterface.hbs b/src/templates/javascript/partials/validationInterface.hbs deleted file mode 100644 index b3108028b..000000000 --- a/src/templates/javascript/partials/validationInterface.hbs +++ /dev/null @@ -1,21 +0,0 @@ -( -{{#if extends}} -{{#each extends}} -{{{this}}}.schema.concat( -{{/each}} -{{/if}} -{{#if properties}} -yup.object().shape({ - {{#each properties}} - {{{name}}}: yup.lazy(() => {{>validation parent=name}}.default(undefined){{#if isNullable}}.isNullable(){{/if}}){{#if isRequired}}.isRequired(){{/if}}{{#unless @last}},{{/unless}} - {{/each}} -}).noUnknown() -{{else}} -yup.object() -{{/if}} -{{#if extends}} -{{#each extends}} -) -{{/each}} -{{/if}} -) diff --git a/src/templates/javascript/partials/validationReference.hbs b/src/templates/javascript/partials/validationReference.hbs deleted file mode 100644 index bb7edfd16..000000000 --- a/src/templates/javascript/partials/validationReference.hbs +++ /dev/null @@ -1 +0,0 @@ -{{{base}}}.schema diff --git a/src/templates/javascript/service.hbs b/src/templates/javascript/service.hbs deleted file mode 100644 index b08fcc4fd..000000000 --- a/src/templates/javascript/service.hbs +++ /dev/null @@ -1,80 +0,0 @@ -/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ApiError, catchGenericError } from '../core/ApiError'; -import { request } from '../core/request'; -import { OpenAPI } from '../core/OpenAPI'; - -export class {{{name}}} { - - {{#each operations}} - /** - {{#if deprecated}} - * @deprecated - {{/if}} - {{#if summary}} - * {{{summary}}} - {{/if}} - {{#if description}} - * {{{description}}} - {{/if}} - {{#if parameters}} - {{#each parameters}} - * @param {{{name}}} {{{description}}} - {{/each}} - {{/if}} - {{#each results}} - * @result {{{type}}} {{{description}}} - {{/each}} - * @throws ApiError - */ - static async {{{name}}}({{#if parameters}} - {{#each parameters}} - {{{name}}}{{#if default}} = {{{default}}}{{/if}}{{#unless @last}},{{/unless}} - {{/each}} - {{/if}}) { - - const result = await request({ - method: '{{{method}}}', - path: `{{{path}}}`{{#if parametersCookie}}, - cookies: { - {{#each parametersCookie}} - '{{{prop}}}': {{{name}}}{{#unless @last}},{{/unless}} - {{/each}} - }{{/if}}{{#if parametersCookie}}, - headers: { - {{#each parametersHeader}} - '{{{prop}}}': {{{name}}}{{#unless @last}},{{/unless}} - {{/each}} - }{{/if}}{{#if parametersQuery}}, - query: { - {{#each parametersQuery}} - '{{{prop}}}': {{{name}}}{{#unless @last}},{{/unless}} - {{/each}} - }{{/if}}{{#if parametersForm}}, - formData: { - {{#each parametersForm}} - '{{{prop}}}': {{{name}}}{{#unless @last}},{{/unless}} - {{/each}} - }{{/if}}{{#if parametersBody}}, - body: {{{parametersBody.name}}}{{/if}} - }); - {{#if errors}} - - if (!result.ok) { - switch (result.status) { - {{#each errors}} - case {{{code}}}: throw new ApiError(result, `{{{description}}}`); - {{/each}} - } - } - {{/if}} - - catchGenericError(result); - - return result.body; - } - - {{/each}} -} diff --git a/src/templates/partials/base.hbs b/src/templates/partials/base.hbs new file mode 100644 index 000000000..1799e7d2a --- /dev/null +++ b/src/templates/partials/base.hbs @@ -0,0 +1,9 @@ +{{~#equals base 'binary'~}} +{{~#equals @root.httpClient 'fetch'}}Blob{{/equals~}} +{{~#equals @root.httpClient 'xhr'}}Blob{{/equals~}} +{{~#equals @root.httpClient 'axios'}}Blob{{/equals~}} +{{~#equals @root.httpClient 'angular'}}Blob{{/equals~}} +{{~#equals @root.httpClient 'node'}}Blob{{/equals~}} +{{~else~}} +{{{base}}} +{{~/equals~}} diff --git a/src/templates/partials/exportComposition.hbs b/src/templates/partials/exportComposition.hbs new file mode 100644 index 000000000..15bf6f65c --- /dev/null +++ b/src/templates/partials/exportComposition.hbs @@ -0,0 +1,38 @@ +{{#ifdef description deprecated}} +/** +{{#if description}} + * {{{escapeComment description}}} +{{/if}} +{{#if deprecated}} + * @deprecated +{{/if}} + */ +{{/ifdef}} +export type {{{name}}} = {{>type parent=name}}; +{{#if enums}} +{{#unless @root.useUnionTypes}} + +export namespace {{{name}}} { + + {{#each enums}} + {{#ifdef description deprecated}} + /** + {{#if description}} + * {{{escapeComment description}}} + {{/if}} + {{#if deprecated}} + * @deprecated + {{/if}} + */ + {{/ifdef}} + export enum {{{name}}} { + {{#each enum}} + {{{name}}} = {{{value}}}, + {{/each}} + } + + {{/each}} + +} +{{/unless}} +{{/if}} diff --git a/src/templates/partials/exportEnum.hbs b/src/templates/partials/exportEnum.hbs new file mode 100644 index 000000000..f47622ef9 --- /dev/null +++ b/src/templates/partials/exportEnum.hbs @@ -0,0 +1,24 @@ +{{#ifdef description deprecated}} +/** +{{#if description}} + * {{{escapeComment description}}} +{{/if}} +{{#if deprecated}} + * @deprecated +{{/if}} + */ +{{/ifdef}} +export enum {{{name}}} { + {{#each enum}} + {{#if description}} + /** + * {{{escapeComment description}}} + */ + {{/if}} + {{#containsSpaces name}} + '{{{name}}}' = {{{value}}}, + {{else}} + {{{name}}} = {{{value}}}, + {{/containsSpaces}} + {{/each}} +} diff --git a/src/templates/partials/exportInterface.hbs b/src/templates/partials/exportInterface.hbs new file mode 100644 index 000000000..b61e26441 --- /dev/null +++ b/src/templates/partials/exportInterface.hbs @@ -0,0 +1,47 @@ +{{#ifdef description deprecated}} +/** +{{#if description}} + * {{{escapeComment description}}} +{{/if}} +{{#if deprecated}} + * @deprecated +{{/if}} + */ +{{/ifdef}} +export type {{{name}}} = { + {{#each properties}} + {{#ifdef description deprecated}} + /** + {{#if description}} + * {{{escapeComment description}}} + {{/if}} + {{#if deprecated}} + * @deprecated + {{/if}} + */ + {{/ifdef}} + {{>isReadOnly}}{{{name}}}{{>isRequired}}: {{>type parent=../name}}; + {{/each}} +}; +{{#if enums}} +{{#unless @root.useUnionTypes}} + +export namespace {{{name}}} { + + {{#each enums}} + {{#if description}} + /** + * {{{escapeComment description}}} + */ + {{/if}} + export enum {{{name}}} { + {{#each enum}} + {{{name}}} = {{{value}}}, + {{/each}} + } + + {{/each}} + +} +{{/unless}} +{{/if}} diff --git a/src/templates/partials/exportType.hbs b/src/templates/partials/exportType.hbs new file mode 100644 index 000000000..b57790a0b --- /dev/null +++ b/src/templates/partials/exportType.hbs @@ -0,0 +1,11 @@ +{{#ifdef description deprecated}} +/** +{{#if description}} + * {{{escapeComment description}}} +{{/if}} +{{#if deprecated}} + * @deprecated +{{/if}} + */ +{{/ifdef}} +export type {{{name}}} = {{>type}}; diff --git a/src/templates/partials/header.hbs b/src/templates/partials/header.hbs new file mode 100644 index 000000000..d25d56363 --- /dev/null +++ b/src/templates/partials/header.hbs @@ -0,0 +1,4 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ diff --git a/src/templates/partials/isNullable.hbs b/src/templates/partials/isNullable.hbs new file mode 100644 index 000000000..7ef73e3d0 --- /dev/null +++ b/src/templates/partials/isNullable.hbs @@ -0,0 +1 @@ +{{#if isNullable}} | null{{/if}} diff --git a/src/templates/partials/isReadOnly.hbs b/src/templates/partials/isReadOnly.hbs new file mode 100644 index 000000000..7ab3bdbf6 --- /dev/null +++ b/src/templates/partials/isReadOnly.hbs @@ -0,0 +1 @@ +{{#if isReadOnly}}readonly {{/if}} diff --git a/src/templates/partials/isRequired.hbs b/src/templates/partials/isRequired.hbs new file mode 100644 index 000000000..b829272b9 --- /dev/null +++ b/src/templates/partials/isRequired.hbs @@ -0,0 +1,5 @@ +{{~#if @root.useOptions~}} +{{#unless isRequired}}?{{else if default}}?{{/unless}} +{{~else~}} +{{#unless isRequired}}{{#unless default}}?{{/unless}}{{/unless}} +{{~/if~}} diff --git a/src/templates/partials/parameters.hbs b/src/templates/partials/parameters.hbs new file mode 100644 index 000000000..57ab5a7d1 --- /dev/null +++ b/src/templates/partials/parameters.hbs @@ -0,0 +1,28 @@ +{{#if parameters}} +{{#if @root.useOptions~}} +{ +{{#each parameters}} +{{{name}}}{{#if default}} = {{{default}}}{{/if}}, +{{/each}} +}: { +{{#each parameters}} +{{#ifdef description deprecated}} +/** +{{#if description}} + * {{{escapeComment description}}} +{{/if}} +{{#if deprecated}} + * @deprecated +{{/if}} + */ +{{/ifdef}} +{{{name}}}{{>isRequired}}: {{>type}}, +{{/each}} +} +{{~else}} + +{{#each parameters}} +{{{name}}}{{>isRequired}}: {{>type}}{{#if default}} = {{{default}}}{{/if}}, +{{/each}} +{{/if}} +{{/if}} diff --git a/src/templates/typescript/partials/result.hbs b/src/templates/partials/result.hbs similarity index 100% rename from src/templates/typescript/partials/result.hbs rename to src/templates/partials/result.hbs diff --git a/src/templates/partials/schema.hbs b/src/templates/partials/schema.hbs new file mode 100644 index 000000000..14b9156b0 --- /dev/null +++ b/src/templates/partials/schema.hbs @@ -0,0 +1,17 @@ +{{#equals export 'interface'}} +{{>schemaInterface}} +{{else equals export 'enum'}} +{{>schemaEnum}} +{{else equals export 'array'}} +{{>schemaArray}} +{{else equals export 'dictionary'}} +{{>schemaDictionary}} +{{else equals export 'any-of'}} +{{>schemaComposition}} +{{else equals export 'all-of'}} +{{>schemaComposition}} +{{else equals export 'one-of'}} +{{>schemaComposition}} +{{else}} +{{>schemaGeneric}} +{{/equals}} diff --git a/src/templates/partials/schemaArray.hbs b/src/templates/partials/schemaArray.hbs new file mode 100644 index 000000000..44871265b --- /dev/null +++ b/src/templates/partials/schemaArray.hbs @@ -0,0 +1,19 @@ +{ + type: 'array', +{{#if link}} + contains: {{>schema link}}, +{{else}} + contains: { + type: '{{{base}}}', + }, +{{/if}} +{{#if isReadOnly}} + isReadOnly: {{{isReadOnly}}}, +{{/if}} +{{#if isRequired}} + isRequired: {{{isRequired}}}, +{{/if}} +{{#if isNullable}} + isNullable: {{{isNullable}}}, +{{/if}} +} diff --git a/src/templates/partials/schemaComposition.hbs b/src/templates/partials/schemaComposition.hbs new file mode 100644 index 000000000..050f6696d --- /dev/null +++ b/src/templates/partials/schemaComposition.hbs @@ -0,0 +1,16 @@ +{ + type: '{{export}}', +{{#if description}} + description: `{{{escapeDescription description}}}`, +{{/if}} + contains: [{{#each properties}}{{>schema}}{{#unless @last}}, {{/unless}}{{/each}}], +{{#if isReadOnly}} + isReadOnly: {{{isReadOnly}}}, +{{/if}} +{{#if isRequired}} + isRequired: {{{isRequired}}}, +{{/if}} +{{#if isNullable}} + isNullable: {{{isNullable}}}, +{{/if}} +} diff --git a/src/templates/partials/schemaDictionary.hbs b/src/templates/partials/schemaDictionary.hbs new file mode 100644 index 000000000..1e755f7af --- /dev/null +++ b/src/templates/partials/schemaDictionary.hbs @@ -0,0 +1,19 @@ +{ + type: 'dictionary', +{{#if link}} + contains: {{>schema link}}, +{{else}} + contains: { + type: '{{{base}}}', + }, +{{/if}} +{{#if isReadOnly}} + isReadOnly: {{{isReadOnly}}}, +{{/if}} +{{#if isRequired}} + isRequired: {{{isRequired}}}, +{{/if}} +{{#if isNullable}} + isNullable: {{{isNullable}}}, +{{/if}} +} diff --git a/src/templates/partials/schemaEnum.hbs b/src/templates/partials/schemaEnum.hbs new file mode 100644 index 000000000..eaba3fc5f --- /dev/null +++ b/src/templates/partials/schemaEnum.hbs @@ -0,0 +1,12 @@ +{ + type: 'Enum', +{{#if isReadOnly}} + isReadOnly: {{{isReadOnly}}}, +{{/if}} +{{#if isRequired}} + isRequired: {{{isRequired}}}, +{{/if}} +{{#if isNullable}} + isNullable: {{{isNullable}}}, +{{/if}} +} diff --git a/src/templates/partials/schemaGeneric.hbs b/src/templates/partials/schemaGeneric.hbs new file mode 100644 index 000000000..23580a673 --- /dev/null +++ b/src/templates/partials/schemaGeneric.hbs @@ -0,0 +1,59 @@ +{ +{{#if type}} + type: '{{{type}}}', +{{/if}} +{{#if description}} + description: `{{{escapeDescription description}}}`, +{{/if}} +{{#if isReadOnly}} + isReadOnly: {{{isReadOnly}}}, +{{/if}} +{{#if isRequired}} + isRequired: {{{isRequired}}}, +{{/if}} +{{#if isNullable}} + isNullable: {{{isNullable}}}, +{{/if}} +{{#if format}} + format: '{{{format}}}', +{{/if}} +{{#if maximum}} + maximum: {{{maximum}}}, +{{/if}} +{{#if exclusiveMaximum}} + exclusiveMaximum: {{{exclusiveMaximum}}}, +{{/if}} +{{#if minimum}} + minimum: {{{minimum}}}, +{{/if}} +{{#if exclusiveMinimum}} + exclusiveMinimum: {{{exclusiveMinimum}}}, +{{/if}} +{{#if multipleOf}} + multipleOf: {{{multipleOf}}}, +{{/if}} +{{#if maxLength}} + maxLength: {{{maxLength}}}, +{{/if}} +{{#if minLength}} + minLength: {{{minLength}}}, +{{/if}} +{{#if pattern}} + pattern: '{{{pattern}}}', +{{/if}} +{{#if maxItems}} + maxItems: {{{maxItems}}}, +{{/if}} +{{#if minItems}} + minItems: {{{minItems}}}, +{{/if}} +{{#if uniqueItems}} + uniqueItems: {{{uniqueItems}}}, +{{/if}} +{{#if maxProperties}} + maxProperties: {{{maxProperties}}}, +{{/if}} +{{#if minProperties}} + minProperties: {{{minProperties}}}, +{{/if}} +} diff --git a/src/templates/partials/schemaInterface.hbs b/src/templates/partials/schemaInterface.hbs new file mode 100644 index 000000000..3417c5fb9 --- /dev/null +++ b/src/templates/partials/schemaInterface.hbs @@ -0,0 +1,21 @@ +{ +{{#if description}} + description: `{{{escapeDescription description}}}`, +{{/if}} + properties: { +{{#if properties}} + {{#each properties}} + {{{name}}}: {{>schema}}, + {{/each}} +{{/if}} + }, +{{#if isReadOnly}} + isReadOnly: {{{isReadOnly}}}, +{{/if}} +{{#if isRequired}} + isRequired: {{{isRequired}}}, +{{/if}} +{{#if isNullable}} + isNullable: {{{isNullable}}}, +{{/if}} +} diff --git a/src/templates/partials/type.hbs b/src/templates/partials/type.hbs new file mode 100644 index 000000000..b6b4834bd --- /dev/null +++ b/src/templates/partials/type.hbs @@ -0,0 +1,19 @@ +{{#equals export 'interface'}} +{{>typeInterface}} +{{else equals export 'reference'}} +{{>typeReference}} +{{else equals export 'enum'}} +{{>typeEnum}} +{{else equals export 'array'}} +{{>typeArray}} +{{else equals export 'dictionary'}} +{{>typeDictionary}} +{{else equals export 'one-of'}} +{{>typeUnion}} +{{else equals export 'any-of'}} +{{>typeUnion}} +{{else equals export 'all-of'}} +{{>typeIntersection}} +{{else}} +{{>typeGeneric}} +{{/equals}} diff --git a/src/templates/partials/typeArray.hbs b/src/templates/partials/typeArray.hbs new file mode 100644 index 000000000..c3d44374f --- /dev/null +++ b/src/templates/partials/typeArray.hbs @@ -0,0 +1,5 @@ +{{~#if link~}} +Array<{{>type link}}>{{>isNullable}} +{{~else~}} +Array<{{>base}}>{{>isNullable}} +{{~/if~}} diff --git a/src/templates/partials/typeDictionary.hbs b/src/templates/partials/typeDictionary.hbs new file mode 100644 index 000000000..12d57036c --- /dev/null +++ b/src/templates/partials/typeDictionary.hbs @@ -0,0 +1,5 @@ +{{~#if link~}} +Recordtype link}}>{{>isNullable}} +{{~else~}} +Recordbase}}>{{>isNullable}} +{{~/if~}} diff --git a/src/templates/partials/typeEnum.hbs b/src/templates/partials/typeEnum.hbs new file mode 100644 index 000000000..781fd5ec5 --- /dev/null +++ b/src/templates/partials/typeEnum.hbs @@ -0,0 +1,2 @@ +{{#enumerator enum parent name}}{{this}}{{/enumerator}}{{>isNullable}} + diff --git a/src/templates/partials/typeGeneric.hbs b/src/templates/partials/typeGeneric.hbs new file mode 100644 index 000000000..0ac6aea3b --- /dev/null +++ b/src/templates/partials/typeGeneric.hbs @@ -0,0 +1 @@ +{{>base}}{{>isNullable}} diff --git a/src/templates/partials/typeInterface.hbs b/src/templates/partials/typeInterface.hbs new file mode 100644 index 000000000..3d5acad07 --- /dev/null +++ b/src/templates/partials/typeInterface.hbs @@ -0,0 +1,23 @@ +{{~#if properties~}} +{ +{{#each properties}} +{{#ifdef description deprecated}} +/** +{{#if description}} + * {{{escapeComment description}}} +{{/if}} +{{#if deprecated}} + * @deprecated +{{/if}} + */ +{{/ifdef}} +{{#if ../parent}} +{{>isReadOnly}}{{{name}}}{{>isRequired}}: {{>type parent=../parent}}; +{{else}} +{{>isReadOnly}}{{{name}}}{{>isRequired}}: {{>type}}; +{{/if}} +{{/each}} +}{{>isNullable}} +{{~else~}} +any +{{~/if~}} diff --git a/src/templates/partials/typeIntersection.hbs b/src/templates/partials/typeIntersection.hbs new file mode 100644 index 000000000..031896f7c --- /dev/null +++ b/src/templates/partials/typeIntersection.hbs @@ -0,0 +1 @@ +{{#intersection properties parent}}{{this}}{{/intersection}}{{>isNullable}} diff --git a/src/templates/partials/typeReference.hbs b/src/templates/partials/typeReference.hbs new file mode 100644 index 000000000..0ac6aea3b --- /dev/null +++ b/src/templates/partials/typeReference.hbs @@ -0,0 +1 @@ +{{>base}}{{>isNullable}} diff --git a/src/templates/partials/typeUnion.hbs b/src/templates/partials/typeUnion.hbs new file mode 100644 index 000000000..59371dfe4 --- /dev/null +++ b/src/templates/partials/typeUnion.hbs @@ -0,0 +1 @@ +{{#union properties parent}}{{this}}{{/union}}{{>isNullable}} diff --git a/src/templates/typescript/core/ApiError.ts b/src/templates/typescript/core/ApiError.ts deleted file mode 100644 index 375350de6..000000000 --- a/src/templates/typescript/core/ApiError.ts +++ /dev/null @@ -1,57 +0,0 @@ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { isSuccess } from './isSuccess'; -import { Result } from './Result'; - -export class ApiError extends Error { - - public readonly url: string; - public readonly status: number; - public readonly statusText: string; - public readonly body: any; - - constructor(result: Readonly, message: string) { - super(message); - - this.url = result.url; - this.status = result.status; - this.statusText = result.statusText; - this.body = result.body; - } -} - -export namespace ApiError { - export enum Message { - BAD_REQUEST = 'Bad Request', - UNAUTHORIZED = 'Unauthorized', - FORBIDDEN = 'Forbidden', - NOT_FOUND = 'Not Found', - INTERNAL_SERVER_ERROR = 'Internal Server Error', - BAD_GATEWAY = 'Bad Gateway', - SERVICE_UNAVAILABLE = 'Service Unavailable', - GENERIC_ERROR = 'Generic Error', - } -} - -/** - * Catch common errors (based on status code). - * @param result - */ -export function catchGenericError(result: Result): void { - switch (result.status) { - case 400: throw new ApiError(result, ApiError.Message.BAD_REQUEST); - case 401: throw new ApiError(result, ApiError.Message.UNAUTHORIZED); - case 403: throw new ApiError(result, ApiError.Message.FORBIDDEN); - case 404: throw new ApiError(result, ApiError.Message.NOT_FOUND); - case 500: throw new ApiError(result, ApiError.Message.INTERNAL_SERVER_ERROR); - case 502: throw new ApiError(result, ApiError.Message.BAD_GATEWAY); - case 503: throw new ApiError(result, ApiError.Message.SERVICE_UNAVAILABLE); - } - - if (!isSuccess(result.status)) { - throw new ApiError(result, ApiError.Message.GENERIC_ERROR); - } -} diff --git a/src/templates/typescript/core/OpenAPI.hbs b/src/templates/typescript/core/OpenAPI.hbs deleted file mode 100644 index e47cff6dc..000000000 --- a/src/templates/typescript/core/OpenAPI.hbs +++ /dev/null @@ -1,11 +0,0 @@ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -export namespace OpenAPI { - export let BASE = '{{{server}}}'; - export let VERSION = '{{{version}}}'; - export let CLIENT = '{{{httpClient}}}'; - export let TOKEN = ''; -} diff --git a/src/templates/typescript/core/RequestOptions.ts b/src/templates/typescript/core/RequestOptions.ts deleted file mode 100644 index e077369c0..000000000 --- a/src/templates/typescript/core/RequestOptions.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -export interface RequestOptions { - method: 'get' | 'put' | 'post' | 'delete' | 'options' | 'head' | 'patch'; - path: string; - cookies?: { [key: string]: any }; - headers?: { [key: string]: any }; - query?: { [key: string]: any }; - formData?: { [key: string]: any }; - body?: any; -} diff --git a/src/templates/typescript/core/Result.ts b/src/templates/typescript/core/Result.ts deleted file mode 100644 index a3489944f..000000000 --- a/src/templates/typescript/core/Result.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -export interface Result { - url: string; - ok: boolean; - status: number; - statusText: string; - body: any; -} diff --git a/src/templates/typescript/core/getFormData.ts b/src/templates/typescript/core/getFormData.ts deleted file mode 100644 index ceaecb57a..000000000 --- a/src/templates/typescript/core/getFormData.ts +++ /dev/null @@ -1,22 +0,0 @@ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -/** - * Get FormData from object. This method is needed to upload - * multipart form data to the REST API. - * @param params Key value based object. - */ -export function getFormData(params: { [key: string]: any }): FormData { - const formData = new FormData(); - for (const key in params) { - if (typeof params[key] !== 'undefined') { - const value: any = params[key]; - if (value !== undefined && value !== null) { - formData.append(key, value); - } - } - } - return formData; -} diff --git a/src/templates/typescript/core/getQueryString.ts b/src/templates/typescript/core/getQueryString.ts deleted file mode 100644 index 8866db77d..000000000 --- a/src/templates/typescript/core/getQueryString.ts +++ /dev/null @@ -1,31 +0,0 @@ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -/** - * Get query string from query parameters object. This method also - * supports multi-value items by creating a key for each item. - * @param params Key value based object. - */ -export function getQueryString(params: { [key: string]: any }): string { - const qs: string[] = []; - for (const key in params) { - if (typeof params[key] !== 'undefined') { - const value: any = params[key]; - if (value !== undefined && value !== null) { - if (Array.isArray(value)) { - value.forEach(value => { - qs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`); - }); - } else { - qs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`); - } - } - } - } - if (qs.length > 0) { - return `?${qs.join('&')}`; - } - return ''; -} diff --git a/src/templates/typescript/core/isSuccess.ts b/src/templates/typescript/core/isSuccess.ts deleted file mode 100644 index 8d3d21156..000000000 --- a/src/templates/typescript/core/isSuccess.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -/** - * Check success response code. - * @param status Status code - */ -export function isSuccess(status: number): boolean { - return status >= 200 && status < 300; -} diff --git a/src/templates/typescript/core/request.ts b/src/templates/typescript/core/request.ts deleted file mode 100644 index 62dd3f581..000000000 --- a/src/templates/typescript/core/request.ts +++ /dev/null @@ -1,81 +0,0 @@ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import {getFormData} from './getFormData'; -import {getQueryString} from './getQueryString'; -import {OpenAPI} from './OpenAPI'; -import {RequestOptions} from './RequestOptions'; -import {requestUsingFetch} from './requestUsingFetch'; -import {requestUsingXHR} from './requestUsingXHR'; -import {Result} from './Result'; - -/** - * Create the request. - * @param options Request method options. - * @returns Result object (see above) - */ -export async function request(options: Readonly): Promise { - - // Create the request URL - let url = `${OpenAPI.BASE}${options.path}`; - - // Create request headers - const headers = new Headers({ - ...options.headers, - Accept: 'application/json' - }); - - // Create request settings - const request: RequestInit = { - headers, - method: options.method, - credentials: 'same-origin' - }; - - // If we have a bearer token then we set the authentication header. - if (OpenAPI.TOKEN !== null && OpenAPI.TOKEN !== '') { - headers.append('Authorization', `Bearer ${OpenAPI.TOKEN}`); - } - - // Add the query parameters (if defined). - if (options.query) { - url += getQueryString(options.query); - } - - // Append formData as body - if (options.formData) { - request.body = getFormData(options.formData); - } else if (options.body) { - - // If this is blob data, then pass it directly to the body and set content type. - // Otherwise we just convert request data to JSON string (needed for fetch api) - if (options.body instanceof Blob) { - request.body = options.body; - if (options.body.type) { - headers.append('Content-Type', options.body.type); - } - } else { - request.body = JSON.stringify(options.body); - headers.append('Content-Type', 'application/json'); - } - } - - try { - switch (OpenAPI.CLIENT) { - case 'xhr': - return await requestUsingXHR(url, request); - default: - return await requestUsingFetch(url, request); - } - } catch (error) { - return { - url, - ok: false, - status: 0, - statusText: '', - body: error - }; - } -} diff --git a/src/templates/typescript/core/requestUsingFetch.ts b/src/templates/typescript/core/requestUsingFetch.ts deleted file mode 100644 index aab83716c..000000000 --- a/src/templates/typescript/core/requestUsingFetch.ts +++ /dev/null @@ -1,50 +0,0 @@ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { Result } from './Result'; - -/** - * Request content using the new Fetch API. This is the default API that is used and - * is create for all JSON, XML and text objects. However it is limited to UTF-8. - * This is a problem for some of the Docs content, since that requires UTF-16! - * @param url The url to request. - * @param request The request object, containing method, headers, body, etc. - */ -export async function requestUsingFetch(url: string, request: Readonly): Promise { - - // Fetch response using fetch API. - const response = await fetch(url, request); - - // Create result object. - const result: Result = { - url, - ok: response.ok, - status: response.status, - statusText: response.statusText, - body: null - }; - - // Try to parse the content for any response status code. - // We check the "Content-Type" header to see if we need to parse the - // content as json or as plain text. - const contentType = response.headers.get('Content-Type'); - if (contentType) { - switch (contentType.toLowerCase()) { - case 'application/json': - case 'application/json; charset=utf-8': - result.body = await response.json(); - break; - - case 'text/plain': - case 'text/xml': - case 'text/xml; charset=utf-8': - case 'text/xml; charset=utf-16': - result.body = await response.text(); - break; - } - } - - return result; -} diff --git a/src/templates/typescript/core/requestUsingXHR.ts b/src/templates/typescript/core/requestUsingXHR.ts deleted file mode 100644 index a2302cc40..000000000 --- a/src/templates/typescript/core/requestUsingXHR.ts +++ /dev/null @@ -1,72 +0,0 @@ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { Result } from './Result'; -import { isSuccess } from './isSuccess'; - -/** - * Request content using the new legacy XMLHttpRequest API. This method is useful - * when we want to request UTF-16 content, since it natively supports loading UTF-16. - * We could do the same with the Fetch API, but then we will need to convert the - * content using JavaScript... And that is very very slow. - * @param url The url to request. - * @param request The request object, containing method, headers, body, etc. - */ -export async function requestUsingXHR(url: string, request: Readonly): Promise { - return new Promise(resolve => { - const xhr = new XMLHttpRequest(); - - // Open the request, remember to do this before adding any headers, - // because the request needs to be initialized! - xhr.open(request.method!, url, true); - - // Add the headers (required when dealing with JSON) - const headers = request.headers as Headers; - headers.forEach((value: string, key: string): void => { - xhr.setRequestHeader(key, value); - }); - - // Register the readystate handler, this will fire when the request is done. - xhr.onreadystatechange = () => { - if (xhr.readyState === XMLHttpRequest.DONE) { - - // Create result object. - const result: Result = { - url, - ok: isSuccess(xhr.status), - status: xhr.status, - statusText: xhr.statusText, - body: null - }; - - // Try to parse the content for any response status code. - // We check the "Content-Type" header to see if we need to parse the - // content as json or as plain text. - const contentType = xhr.getResponseHeader('Content-Type'); - if (contentType) { - switch (contentType.toLowerCase()) { - case 'application/json': - case 'application/json; charset=utf-8': - result.body = JSON.parse(xhr.responseText); - break; - - case 'text/plain': - case 'text/xml': - case 'text/xml; charset=utf-8': - case 'text/xml; charset=utf-16': - result.body = xhr.responseText; - break; - } - } - - // Done! - resolve(result); - } - }; - - // Start the request! - xhr.send(request.body); - }); -} diff --git a/src/templates/typescript/index.hbs b/src/templates/typescript/index.hbs deleted file mode 100644 index 637cf9f4a..000000000 --- a/src/templates/typescript/index.hbs +++ /dev/null @@ -1,20 +0,0 @@ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -export { ApiError } from './core/ApiError'; -export { isSuccess } from './core/isSuccess'; -export { OpenAPI } from './core/OpenAPI'; -{{#if models}} - -{{#each models}} -export { {{{this}}} } from './models/{{{this}}}'; -{{/each}} -{{/if}} -{{#if services}} - -{{#each services}} -export { {{{this}}} } from './services/{{{this}}}'; -{{/each}} -{{/if}} diff --git a/src/templates/typescript/model.hbs b/src/templates/typescript/model.hbs deleted file mode 100644 index 7d3fbb339..000000000 --- a/src/templates/typescript/model.hbs +++ /dev/null @@ -1,25 +0,0 @@ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -{{#if imports}} -{{#each imports}} -import { {{{this}}} } from '../models/{{{this}}}'; -{{/each}} -{{/if}} -import * as yup from 'yup'; - -{{#equals export 'reference'}} -{{>exportReference}} -{{else equals export 'generic'}} -{{>exportGeneric}} -{{else equals export 'enum'}} -{{>exportEnum}} -{{else equals export 'array'}} -{{>exportArray}} -{{else equals export 'dictionary'}} -{{>exportDictionary}} -{{else equals export 'interface'}} -{{>exportInterface}} -{{/equals}} diff --git a/src/templates/typescript/models/Dictionary.ts b/src/templates/typescript/models/Dictionary.ts deleted file mode 100644 index d780f127b..000000000 --- a/src/templates/typescript/models/Dictionary.ts +++ /dev/null @@ -1,8 +0,0 @@ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -export interface Dictionary { - [key: string]: T; -} diff --git a/src/templates/typescript/partials/exportArray.hbs b/src/templates/typescript/partials/exportArray.hbs deleted file mode 100644 index 1e7a09bdf..000000000 --- a/src/templates/typescript/partials/exportArray.hbs +++ /dev/null @@ -1,19 +0,0 @@ -{{#if description}} -/** - * {{{description}}} - */ -{{/if}} -export type {{{name}}} = {{>type}}{{#if isNullable}} | null{{/if}}; - -export namespace {{{name}}} { - - export const schema = {{>validation}}; - - export async function validate(value: any): Promise<{{{name}}}{{#if isNullable}} | null{{/if}}> { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): {{{name}}}{{#if isNullable}} | null{{/if}} { - return schema.validateSync(value, { strict: true }); - } -} diff --git a/src/templates/typescript/partials/exportDictionary.hbs b/src/templates/typescript/partials/exportDictionary.hbs deleted file mode 100644 index 1e7a09bdf..000000000 --- a/src/templates/typescript/partials/exportDictionary.hbs +++ /dev/null @@ -1,19 +0,0 @@ -{{#if description}} -/** - * {{{description}}} - */ -{{/if}} -export type {{{name}}} = {{>type}}{{#if isNullable}} | null{{/if}}; - -export namespace {{{name}}} { - - export const schema = {{>validation}}; - - export async function validate(value: any): Promise<{{{name}}}{{#if isNullable}} | null{{/if}}> { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): {{{name}}}{{#if isNullable}} | null{{/if}} { - return schema.validateSync(value, { strict: true }); - } -} diff --git a/src/templates/typescript/partials/exportEnum.hbs b/src/templates/typescript/partials/exportEnum.hbs deleted file mode 100644 index 55754f9c1..000000000 --- a/src/templates/typescript/partials/exportEnum.hbs +++ /dev/null @@ -1,23 +0,0 @@ -{{#if description}} -/** - * {{{description}}} - */ -{{/if}} -export enum {{{name}}} { - {{#each enum}} - {{{name}}} = {{{value}}}{{#unless @last}},{{/unless}} - {{/each}} -} - -export namespace {{{name}}} { - - export const schema = {{>validation parent=name}}; - - export async function validate(value: any): Promise<{{{name}}}> { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): {{{name}}} { - return schema.validateSync(value, { strict: true }); - } -} diff --git a/src/templates/typescript/partials/exportGeneric.hbs b/src/templates/typescript/partials/exportGeneric.hbs deleted file mode 100644 index 1e7a09bdf..000000000 --- a/src/templates/typescript/partials/exportGeneric.hbs +++ /dev/null @@ -1,19 +0,0 @@ -{{#if description}} -/** - * {{{description}}} - */ -{{/if}} -export type {{{name}}} = {{>type}}{{#if isNullable}} | null{{/if}}; - -export namespace {{{name}}} { - - export const schema = {{>validation}}; - - export async function validate(value: any): Promise<{{{name}}}{{#if isNullable}} | null{{/if}}> { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): {{{name}}}{{#if isNullable}} | null{{/if}} { - return schema.validateSync(value, { strict: true }); - } -} diff --git a/src/templates/typescript/partials/exportInterface.hbs b/src/templates/typescript/partials/exportInterface.hbs deleted file mode 100644 index f5192cccb..000000000 --- a/src/templates/typescript/partials/exportInterface.hbs +++ /dev/null @@ -1,41 +0,0 @@ -{{#if description}} -/** - * {{{description}}} - */ -{{/if}} -export interface {{{name}}}{{#if extends}} extends {{#each extends}}{{{this}}}{{#unless @last}}, {{/unless}}{{/each}}{{/if}} { - {{#each properties}} - {{#if description}} - /** - * {{{description}}} - */ - {{/if}} - {{#if isReadOnly}}readonly {{/if}}{{{name}}}{{#unless isRequired}}?{{/unless}}: {{>type parent=../name}}{{#if isNullable}} | null{{/if}}; - {{/each}} -} - -export namespace {{{name}}} { - - {{#each enums}} - {{#if description}} - /** - * {{{description}}} - */ - {{/if}} - export enum {{{name}}} { - {{#each enum}} - {{{name}}} = {{{value}}}{{#unless @last}},{{/unless}} - {{/each}} - } - - {{/each}} - export const schema: yup.ObjectSchema<{{{name}}}> = {{>validation}}; - - export async function validate(value: any): Promise<{{{name}}}> { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): {{{name}}} { - return schema.validateSync(value, { strict: true }); - } -} diff --git a/src/templates/typescript/partials/exportReference.hbs b/src/templates/typescript/partials/exportReference.hbs deleted file mode 100644 index 1e7a09bdf..000000000 --- a/src/templates/typescript/partials/exportReference.hbs +++ /dev/null @@ -1,19 +0,0 @@ -{{#if description}} -/** - * {{{description}}} - */ -{{/if}} -export type {{{name}}} = {{>type}}{{#if isNullable}} | null{{/if}}; - -export namespace {{{name}}} { - - export const schema = {{>validation}}; - - export async function validate(value: any): Promise<{{{name}}}{{#if isNullable}} | null{{/if}}> { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): {{{name}}}{{#if isNullable}} | null{{/if}} { - return schema.validateSync(value, { strict: true }); - } -} diff --git a/src/templates/typescript/partials/type.hbs b/src/templates/typescript/partials/type.hbs deleted file mode 100644 index d01ee230f..000000000 --- a/src/templates/typescript/partials/type.hbs +++ /dev/null @@ -1,13 +0,0 @@ -{{#equals export 'reference'}} -{{>typeReference}} -{{else equals export 'generic'}} -{{>typeGeneric}} -{{else equals export 'enum'}} -{{>typeEnum}} -{{else equals export 'array'}} -{{>typeArray}} -{{else equals export 'dictionary'}} -{{>typeDictionary}} -{{else equals export 'interface'}} -{{>typeInterface}} -{{/equals}} diff --git a/src/templates/typescript/partials/typeArray.hbs b/src/templates/typescript/partials/typeArray.hbs deleted file mode 100644 index 0fd14c915..000000000 --- a/src/templates/typescript/partials/typeArray.hbs +++ /dev/null @@ -1,5 +0,0 @@ -{{~#if link~}} -Array<{{>type link}}> -{{~else~}} -Array<{{{type}}}> -{{~/if~}} diff --git a/src/templates/typescript/partials/typeDictionary.hbs b/src/templates/typescript/partials/typeDictionary.hbs deleted file mode 100644 index 413903eef..000000000 --- a/src/templates/typescript/partials/typeDictionary.hbs +++ /dev/null @@ -1,5 +0,0 @@ -{{~#if link~}} -Dictionary<{{>type link}}> -{{~else~}} -Dictionary<{{{type}}}> -{{~/if~}} diff --git a/src/templates/typescript/partials/typeEnum.hbs b/src/templates/typescript/partials/typeEnum.hbs deleted file mode 100644 index 65428fbc3..000000000 --- a/src/templates/typescript/partials/typeEnum.hbs +++ /dev/null @@ -1,9 +0,0 @@ -{{~#if parent~}} -{{{parent}}}.{{{name}}} -{{~else~}} -( -{{~#each enum~}} -{{{value}}}{{#unless @last}} | {{/unless}} -{{~/each~}} -) -{{~/if~}} diff --git a/src/templates/typescript/partials/typeGeneric.hbs b/src/templates/typescript/partials/typeGeneric.hbs deleted file mode 100644 index 1a5d12392..000000000 --- a/src/templates/typescript/partials/typeGeneric.hbs +++ /dev/null @@ -1 +0,0 @@ -{{{base}}} diff --git a/src/templates/typescript/partials/typeInterface.hbs b/src/templates/typescript/partials/typeInterface.hbs deleted file mode 100644 index 1b0823b6f..000000000 --- a/src/templates/typescript/partials/typeInterface.hbs +++ /dev/null @@ -1,14 +0,0 @@ -{{~#if properties~}} -{ -{{#each properties}} -{{#if description}} -/** - * {{{description}}} - */ -{{/if}} -{{#if isReadOnly}}readonly {{/if}}{{{name}}}{{#unless isRequired}}?{{/unless}}: {{>type}}{{#if isNullable}} | null{{/if}}{{#unless @last}},{{/unless}} -{{/each}} -} -{{~else~}} -any -{{~/if~}} diff --git a/src/templates/typescript/partials/typeReference.hbs b/src/templates/typescript/partials/typeReference.hbs deleted file mode 100644 index 1a5d12392..000000000 --- a/src/templates/typescript/partials/typeReference.hbs +++ /dev/null @@ -1 +0,0 @@ -{{{base}}} diff --git a/src/templates/typescript/partials/validation.hbs b/src/templates/typescript/partials/validation.hbs deleted file mode 100644 index e07d81bed..000000000 --- a/src/templates/typescript/partials/validation.hbs +++ /dev/null @@ -1,13 +0,0 @@ -{{#equals export 'reference'}} -{{>validationReference}} -{{else equals export 'generic'}} -{{>validationGeneric}} -{{else equals export 'enum'}} -{{>validationEnum}} -{{else equals export 'array'}} -{{>validationArray}} -{{else equals export 'dictionary'}} -{{>validationDictionary}} -{{else equals export 'interface'}} -{{>validationInterface}} -{{/equals}} diff --git a/src/templates/typescript/partials/validationArray.hbs b/src/templates/typescript/partials/validationArray.hbs deleted file mode 100644 index a51849a99..000000000 --- a/src/templates/typescript/partials/validationArray.hbs +++ /dev/null @@ -1,5 +0,0 @@ -{{~#if link~}} -yup.array<{{>type link}}>().of({{>validation link}}) -{{~else~}} -yup.array<{{{type}}}>().of({{{base}}}.schema) -{{~/if~}} diff --git a/src/templates/typescript/partials/validationDictionary.hbs b/src/templates/typescript/partials/validationDictionary.hbs deleted file mode 100644 index d0a2a4bfd..000000000 --- a/src/templates/typescript/partials/validationDictionary.hbs +++ /dev/null @@ -1,19 +0,0 @@ -{{~#if link~}} -yup.lazytype link}}>>(value => { - return yup.objecttype link}}>>().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: {{>validation link}} - }), {}) - ); -}) -{{~else~}} -yup.lazy>(value => { - return yup.object>().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: {{{base}}}.schema - }), {}) - ); -}) -{{~/if~}} diff --git a/src/templates/typescript/partials/validationEnum.hbs b/src/templates/typescript/partials/validationEnum.hbs deleted file mode 100644 index 308893504..000000000 --- a/src/templates/typescript/partials/validationEnum.hbs +++ /dev/null @@ -1,13 +0,0 @@ -{{~#equals parent name~}} -yup.mixed<{{{name}}}>().oneOf([ - {{#each enum}} - {{{../parent}}}.{{{name}}}{{#unless @last}},{{/unless}} - {{/each}} -]) -{{~else~}} -yup.mixed<{{{type}}}>().oneOf([ - {{#each enum}} - {{{value}}}{{#unless @last}},{{/unless}} - {{/each}} -]) -{{~/equals~}} diff --git a/src/templates/typescript/partials/validationGeneric.hbs b/src/templates/typescript/partials/validationGeneric.hbs deleted file mode 100644 index 430a4f345..000000000 --- a/src/templates/typescript/partials/validationGeneric.hbs +++ /dev/null @@ -1,9 +0,0 @@ -{{~#equals type 'boolean'~}} -yup.boolean() -{{~else equals type 'number'~}} -yup.number() -{{~else equals type 'string'~}} -yup.string() -{{~else~}} -yup.mixed<{{{type}}}>() -{{~/equals~}} diff --git a/src/templates/typescript/partials/validationInterface.hbs b/src/templates/typescript/partials/validationInterface.hbs deleted file mode 100644 index 0ba1b4ff5..000000000 --- a/src/templates/typescript/partials/validationInterface.hbs +++ /dev/null @@ -1,21 +0,0 @@ -( -{{#if extends}} -{{#each extends}} -{{{this}}}.schema.concat( -{{/each}} -{{/if}} -{{#if properties}} -yup.object{{#unless isProperty}}{{#if name}}<{{{name}}}>{{/if}}{{/unless}}().shape({ - {{#each properties}} - {{{name}}}: yup.lazy(() => {{>validation parent=name}}.default(undefined){{#if isNullable}}.nullable(){{/if}}{{#if isRequired}}.required(){{/if}}){{#unless @last}},{{/unless}} - {{/each}} -}).noUnknown() -{{else}} -yup.object() -{{/if}} -{{#if extends}} -{{#each extends}} -) -{{/each}} -{{/if}} -) diff --git a/src/templates/typescript/partials/validationReference.hbs b/src/templates/typescript/partials/validationReference.hbs deleted file mode 100644 index bb7edfd16..000000000 --- a/src/templates/typescript/partials/validationReference.hbs +++ /dev/null @@ -1 +0,0 @@ -{{{base}}}.schema diff --git a/src/templates/typescript/service.hbs b/src/templates/typescript/service.hbs deleted file mode 100644 index 5a354112b..000000000 --- a/src/templates/typescript/service.hbs +++ /dev/null @@ -1,86 +0,0 @@ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -{{#if imports}} -{{#each imports}} -import { {{{this}}} } from '../models/{{{this}}}'; -{{/each}} -{{/if}} -import { ApiError, catchGenericError } from '../core/ApiError'; -import { request } from '../core/request'; -import { OpenAPI } from '../core/OpenAPI'; - -export class {{{name}}} { - - {{#each operations}} - /** - {{#if deprecated}} - * @deprecated - {{/if}} - {{#if summary}} - * {{{summary}}} - {{/if}} - {{#if description}} - * {{{description}}} - {{/if}} - {{#if parameters}} - {{#each parameters}} - * @param {{{name}}} {{{description}}} - {{/each}} - {{/if}} - {{#each results}} - * @result {{{type}}} {{{description}}} - {{/each}} - * @throws ApiError - */ - public static async {{{name}}}({{#if parameters}} - {{#each parameters}} - {{{name}}}{{#unless isRequired}}?{{/unless}}: {{>type}}{{#if isNullable}} | null{{/if}}{{#if default}} = {{{default}}}{{/if}}{{#unless @last}},{{/unless}} - {{/each}} - {{/if}}): Promise<{{>result}}> { - - const result = await request({ - method: '{{{method}}}', - path: `{{{path}}}`{{#if parametersCookie}}, - cookies: { - {{#each parametersCookie}} - '{{{prop}}}': {{{name}}}{{#unless @last}},{{/unless}} - {{/each}} - }{{/if}}{{#if parametersCookie}}, - headers: { - {{#each parametersHeader}} - '{{{prop}}}': {{{name}}}{{#unless @last}},{{/unless}} - {{/each}} - }{{/if}}{{#if parametersQuery}}, - query: { - {{#each parametersQuery}} - '{{{prop}}}': {{{name}}}{{#unless @last}},{{/unless}} - {{/each}} - }{{/if}}{{#if parametersForm}}, - formData: { - {{#each parametersForm}} - '{{{prop}}}': {{{name}}}{{#unless @last}},{{/unless}} - {{/each}} - }{{/if}}{{#if parametersBody}}, - body: {{{parametersBody.name}}}{{/if}} - }); - {{#if errors}} - - if (!result.ok) { - switch (result.status) { - {{#each errors}} - case {{{code}}}: throw new ApiError(result, `{{{description}}}`); - {{/each}} - } - } - {{/if}} - - catchGenericError(result); - - return result.body; - } - - {{/each}} -} diff --git a/src/typings/hbs.d.ts b/src/typings/hbs.d.ts new file mode 100644 index 000000000..d5a0d4345 --- /dev/null +++ b/src/typings/hbs.d.ts @@ -0,0 +1,16 @@ +/** + * We precompile the handlebar templates during the build process, + * however in the source code we want to reference these templates + * by importing the hbs files directly. Of course this is not allowed + * by Typescript, so we need to provide some declaration for these + * types. + * @see: build.js for more information + */ +declare module '*.hbs' { + const template: { + compiler: [number, string]; + useData: true; + main: () => void; + }; + export default template; +} diff --git a/src/utils/__mocks__/fileSystem.ts b/src/utils/__mocks__/fileSystem.ts new file mode 100644 index 000000000..c35190ace --- /dev/null +++ b/src/utils/__mocks__/fileSystem.ts @@ -0,0 +1,6 @@ +export const readFile = jest.fn(); +export const writeFile = jest.fn(); +export const copyFile = jest.fn(); +export const exists = jest.fn(); +export const rmdir = jest.fn(); +export const mkdir = jest.fn(); diff --git a/src/utils/discriminator.ts b/src/utils/discriminator.ts new file mode 100644 index 000000000..15e1ef510 --- /dev/null +++ b/src/utils/discriminator.ts @@ -0,0 +1,42 @@ +import type { Model } from '../client/interfaces/Model'; +import type { OpenApi } from '../openApi/v3/interfaces/OpenApi'; +import type { OpenApiDiscriminator } from '../openApi/v3/interfaces/OpenApiDiscriminator'; +import { stripNamespace } from '../openApi/v3/parser/stripNamespace'; +import type { Dictionary } from './types'; + +const inverseDictionary = (map: Dictionary): Dictionary => { + const m2: Dictionary = {}; + for (const key in map) { + m2[map[key]] = key; + } + return m2; +}; + +export const findOneOfParentDiscriminator = (openApi: OpenApi, parent?: Model): OpenApiDiscriminator | undefined => { + if (openApi.components && parent) { + for (const definitionName in openApi.components.schemas) { + if (openApi.components.schemas.hasOwnProperty(definitionName)) { + const schema = openApi.components.schemas[definitionName]; + if ( + schema.discriminator && + schema.oneOf?.length && + schema.oneOf.some(definition => definition.$ref && stripNamespace(definition.$ref) == parent.name) + ) { + return schema.discriminator; + } + } + } + } + return undefined; +}; + +export const mapPropertyValue = (discriminator: OpenApiDiscriminator, parent: Model): string => { + if (discriminator.mapping) { + const mapping = inverseDictionary(discriminator.mapping); + const key = Object.keys(mapping).find(item => stripNamespace(item) == parent.name); + if (key && mapping[key]) { + return mapping[key]; + } + } + return parent.name; +}; diff --git a/src/utils/exportModel.ts b/src/utils/exportModel.ts deleted file mode 100644 index 8c49c12ba..000000000 --- a/src/utils/exportModel.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Model } from '../client/interfaces/Model'; - -export function exportModel(model: Model): Model { - return { - ...model, - imports: model.imports - .filter(name => { - return model.name !== name; - }) - .filter((name, index, arr) => { - return arr.indexOf(name) === index; - }) - .sort((a, b) => { - const nameA = a.toLowerCase(); - const nameB = b.toLowerCase(); - return nameA.localeCompare(nameB); - }), - properties: model.properties.sort((a, b) => { - const nameA = a.name.toLowerCase(); - const nameB = b.name.toLowerCase(); - return nameA.localeCompare(nameB); - }), - enums: model.enums - .filter((property, index, arr) => { - return arr.findIndex(item => item.name === property.name) === index; - }) - .sort((a, b) => { - const nameA = a.name.toLowerCase(); - const nameB = b.name.toLowerCase(); - return nameA.localeCompare(nameB); - }), - enum: model.enum - .filter((enumerator, index, arr) => { - return arr.findIndex(item => item.name === enumerator.name) === index; - }) - .sort((a, b) => { - const nameA = a.name.toLowerCase(); - const nameB = b.name.toLowerCase(); - return nameA.localeCompare(nameB); - }), - }; -} diff --git a/src/utils/exportService.ts b/src/utils/exportService.ts deleted file mode 100644 index c51f50614..000000000 --- a/src/utils/exportService.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Service } from '../client/interfaces/Service'; - -export function exportService(service: Service): Service { - const names = new Map(); - return { - ...service, - imports: service.imports - .filter(name => { - return service.name !== name; - }) - .filter((name, index, arr) => { - return arr.indexOf(name) === index; - }) - .sort((a, b) => { - const nameA = a.toLowerCase(); - const nameB = b.toLowerCase(); - return nameA.localeCompare(nameB); - }), - operations: service.operations - .map(operation => { - const name = operation.name; - const index = names.get(name) || 0; - if (index > 0) { - operation.name = `${name}${index}`; - } - names.set(name, index + 1); - return operation; - }) - .sort((a, b) => { - const nameA = a.name.toLowerCase(); - const nameB = b.name.toLowerCase(); - return nameA.localeCompare(nameB); - }), - }; -} diff --git a/src/utils/fileSystem.ts b/src/utils/fileSystem.ts new file mode 100644 index 000000000..3d39afbaa --- /dev/null +++ b/src/utils/fileSystem.ts @@ -0,0 +1,16 @@ +import { + copyFile as __copyFile, + mkdirp as __mkdirp, + pathExists as __pathExists, + readFile as __readFile, + remove as __remove, + writeFile as __writeFile, +} from 'fs-extra'; + +// Export calls (needed for mocking) +export const readFile = __readFile; +export const writeFile = __writeFile; +export const copyFile = __copyFile; +export const exists = __pathExists; +export const mkdir = __mkdirp; +export const rmdir = __remove; diff --git a/src/utils/flatMap.spec.ts b/src/utils/flatMap.spec.ts new file mode 100644 index 000000000..4cd2c7a54 --- /dev/null +++ b/src/utils/flatMap.spec.ts @@ -0,0 +1,9 @@ +import { flatMap } from './flatMap'; + +describe('flatMap', () => { + it('should produce correct result', () => { + expect(flatMap([1, 2, 3], i => [i])).toEqual([1, 2, 3]); + expect(flatMap([1, 2, 3], i => [i + 1])).toEqual([2, 3, 4]); + expect(flatMap([1, 2, 3], () => [1])).toEqual([1, 1, 1]); + }); +}); diff --git a/src/utils/flatMap.ts b/src/utils/flatMap.ts new file mode 100644 index 000000000..7dbcb3150 --- /dev/null +++ b/src/utils/flatMap.ts @@ -0,0 +1,11 @@ +/** + * Calls a defined callback on each element of an array. + * Then, flattens the result into a new array. + */ +export const flatMap = (array: T[], callback: (value: T, index: number, array: T[]) => U[]): U[] => { + const result: U[] = []; + array.map(callback).forEach(arr => { + result.push(...arr); + }); + return result; +}; diff --git a/src/utils/formatCode.spec.ts b/src/utils/formatCode.spec.ts new file mode 100644 index 000000000..794fcc967 --- /dev/null +++ b/src/utils/formatCode.spec.ts @@ -0,0 +1,36 @@ +import { EOL } from 'os'; + +import { formatCode } from './formatCode'; + +const input1 = `{ foo: true }`; + +const output1 = `{ foo: true }`; + +const input2 = `{ foo: true, bar: 123 }`; + +const output2 = `{ foo: true, bar: 123 }`; + +const input3 = `{ +foo: true, +bar: 123 +}`; + +const output3 = `{${EOL}\tfoo: true,${EOL}\tbar: 123${EOL}}`; + +const input4 = `{ +\t\t\t\tfoo: true, +\t\t\t\tbar: 123 +}`; + +const output4 = `{${EOL}\tfoo: true,${EOL}\tbar: 123${EOL}}`; + +describe('format', () => { + it('should produce correct result', () => { + expect(formatCode(``)).toEqual(''); + expect(formatCode(`{}`)).toEqual('{}'); + expect(formatCode(input1)).toEqual(output1); + expect(formatCode(input2)).toEqual(output2); + expect(formatCode(input3)).toEqual(output3); + expect(formatCode(input4)).toEqual(output4); + }); +}); diff --git a/src/utils/format.ts b/src/utils/formatCode.ts similarity index 79% rename from src/utils/format.ts rename to src/utils/formatCode.ts index 8b4fbca3e..9d0e8e69b 100644 --- a/src/utils/format.ts +++ b/src/utils/formatCode.ts @@ -1,8 +1,8 @@ import { EOL } from 'os'; -export function format(s: string): string { +export const formatCode = (s: string): string => { let indent: number = 0; - let lines = s.split(EOL); + let lines = s.split(/[\r\n]+/); lines = lines.map(line => { line = line.trim().replace(/^\*/g, ' *'); let i = indent; @@ -13,11 +13,11 @@ export function format(s: string): string { indent--; i--; } - const result = `${' '.repeat(i)}${line}`; + const result = `${'\t'.repeat(i)}${line}`; if (result.trim() === '') { return ''; } return result; }); return lines.join(EOL); -} +}; diff --git a/src/utils/formatIndentation.ts b/src/utils/formatIndentation.ts new file mode 100644 index 000000000..63e1ca912 --- /dev/null +++ b/src/utils/formatIndentation.ts @@ -0,0 +1,20 @@ +import { EOL } from 'os'; + +import { Indent } from '../Indent'; + +export const formatIndentation = (s: string, indent: Indent): string => { + let lines = s.split(EOL); + lines = lines.map(line => { + switch (indent) { + case Indent.SPACE_4: + return line.replace(/\t/g, ' '); + case Indent.SPACE_2: + return line.replace(/\t/g, ' '); + case Indent.TAB: + return line; // Default output is tab formatted + } + }); + // Make sure we have a blank line at the end + const content = lines.join(EOL); + return `${content}${EOL}`; +}; diff --git a/src/utils/getFileName.spec.ts b/src/utils/getFileName.spec.ts deleted file mode 100644 index 3f3e8b043..000000000 --- a/src/utils/getFileName.spec.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Language } from '../index'; -import { getFileName } from './getFileName'; - -describe('getFileName', () => { - it('should convert to correct file name', () => { - expect(getFileName('file', Language.TYPESCRIPT)).toEqual('file.ts'); - expect(getFileName('file', Language.JAVASCRIPT)).toEqual('file.js'); - }); -}); diff --git a/src/utils/getFileName.ts b/src/utils/getFileName.ts deleted file mode 100644 index 711c0c062..000000000 --- a/src/utils/getFileName.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Language } from '../index'; - -/** - * Get the correct file name and extension for a given language. - * @param fileName Any file name. - * @param language Typescript or Javascript. - */ -export function getFileName(fileName: string, language: Language): string { - switch (language) { - case Language.TYPESCRIPT: - return `${fileName}.ts`; - case Language.JAVASCRIPT: - return `${fileName}.js`; - } - return fileName; -} diff --git a/src/utils/getHttpRequestName.ts b/src/utils/getHttpRequestName.ts new file mode 100644 index 000000000..53b7ad05a --- /dev/null +++ b/src/utils/getHttpRequestName.ts @@ -0,0 +1,20 @@ +import { HttpClient } from '../HttpClient'; + +/** + * Generate the HttpRequest filename based on the selected client + * @param httpClient The selected httpClient (fetch, xhr, node or axios) + */ +export const getHttpRequestName = (httpClient: HttpClient): string => { + switch (httpClient) { + case HttpClient.FETCH: + return 'FetchHttpRequest'; + case HttpClient.XHR: + return 'XHRHttpRequest'; + case HttpClient.NODE: + return 'NodeHttpRequest'; + case HttpClient.AXIOS: + return 'AxiosHttpRequest'; + case HttpClient.ANGULAR: + return 'AngularHttpRequest'; + } +}; diff --git a/src/utils/getModelNames.spec.ts b/src/utils/getModelNames.spec.ts index 38ea1b8a9..a5a17d4b4 100644 --- a/src/utils/getModelNames.spec.ts +++ b/src/utils/getModelNames.spec.ts @@ -1,10 +1,9 @@ -import { Model } from '../client/interfaces/Model'; +import type { Model } from '../client/interfaces/Model'; import { getModelNames } from './getModelNames'; describe('getModelNames', () => { it('should return sorted list', () => { - const models = new Map(); - models.set('John', { + const john: Model = { export: 'interface', name: 'John', type: 'John', @@ -12,17 +11,16 @@ describe('getModelNames', () => { template: null, link: null, description: null, - isProperty: false, + isDefinition: true, isReadOnly: false, isRequired: false, isNullable: false, imports: [], - extends: [], enum: [], enums: [], properties: [], - }); - models.set('Jane', { + }; + const jane: Model = { export: 'interface', name: 'Jane', type: 'Jane', @@ -30,17 +28,16 @@ describe('getModelNames', () => { template: null, link: null, description: null, - isProperty: false, + isDefinition: true, isReadOnly: false, isRequired: false, isNullable: false, imports: [], - extends: [], enum: [], enums: [], properties: [], - }); - models.set('Doe', { + }; + const doe: Model = { export: 'interface', name: 'Doe', type: 'Doe', @@ -48,18 +45,18 @@ describe('getModelNames', () => { template: null, link: null, description: null, - isProperty: false, + isDefinition: true, isReadOnly: false, isRequired: false, isNullable: false, imports: [], - extends: [], enum: [], enums: [], properties: [], - }); + }; + const models: Model[] = [john, jane, doe]; - expect(getModelNames(new Map())).toEqual(['Dictionary']); - expect(getModelNames(models)).toEqual(['Dictionary', 'Doe', 'Jane', 'John']); + expect(getModelNames([])).toEqual([]); + expect(getModelNames(models)).toEqual(['Doe', 'Jane', 'John']); }); }); diff --git a/src/utils/getModelNames.ts b/src/utils/getModelNames.ts index 9d04f6c84..26b76f713 100644 --- a/src/utils/getModelNames.ts +++ b/src/utils/getModelNames.ts @@ -1,12 +1,6 @@ -import { Model } from '../client/interfaces/Model'; +import type { Model } from '../client/interfaces/Model'; +import { sort } from './sort'; -export function getModelNames(models: Map): string[] { - return Array.from(models.values()) - .map(model => model.name) - .concat(['Dictionary']) - .sort((a, b) => { - const nameA = a.toLowerCase(); - const nameB = b.toLowerCase(); - return nameA.localeCompare(nameB, 'en'); - }); -} +export const getModelNames = (models: Model[]): string[] => { + return models.map(model => model.name).sort(sort); +}; diff --git a/src/utils/getOpenApiSpec.spec.ts b/src/utils/getOpenApiSpec.spec.ts deleted file mode 100644 index 22735d1af..000000000 --- a/src/utils/getOpenApiSpec.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import * as fs from 'fs'; -import { getOpenApiSpec } from './getOpenApiSpec'; - -jest.mock('fs'); - -const fsExistsSync = fs.existsSync as jest.MockedFunction; -const fsReadFileSync = fs.readFileSync as jest.MockedFunction; - -describe('getOpenApiSpec', () => { - it('should read the json file', () => { - fsExistsSync.mockReturnValue(true); - fsReadFileSync.mockReturnValue('{"message": "Hello World!"}'); - const spec = getOpenApiSpec('spec.json'); - expect(spec.message).toEqual('Hello World!'); - }); - - it('should read the yaml file', () => { - fsExistsSync.mockReturnValue(true); - fsReadFileSync.mockReturnValue('message: "Hello World!"'); - const spec = getOpenApiSpec('spec.yaml'); - expect(spec.message).toEqual('Hello World!'); - }); -}); diff --git a/src/utils/getOpenApiSpec.ts b/src/utils/getOpenApiSpec.ts index 709de0f92..3fb33f44e 100644 --- a/src/utils/getOpenApiSpec.ts +++ b/src/utils/getOpenApiSpec.ts @@ -1,45 +1,15 @@ -import * as fs from 'fs'; -import * as path from 'path'; -import * as yaml from 'js-yaml'; +import RefParser from '@apidevtools/json-schema-ref-parser'; +import { resolve } from 'path'; -/** - * Check if given file exists and try to read the content as string. - * @param filePath - */ -function read(filePath: string): string { - if (fs.existsSync(filePath)) { - try { - return fs.readFileSync(filePath, 'utf8').toString(); - } catch (e) { - throw new Error(`Could not read OpenApi spec: "${filePath}"`); - } - } - throw new Error(`Could not find OpenApi spec: "${filePath}"`); -} +import { exists } from './fileSystem'; /** * Load and parse te open api spec. If the file extension is ".yml" or ".yaml" - * we will try to parse the file as a YAML spec, otherwise we will fallback + * we will try to parse the file as a YAML spec, otherwise we will fall back * on parsing the file as JSON. - * @param filePath + * @param location: Path or url */ -export function getOpenApiSpec(filePath: string): any { - const content = read(filePath); - const extname = path.extname(filePath).toLowerCase(); - switch (extname) { - case '.yml': - case '.yaml': - try { - return yaml.safeLoad(content); - } catch (e) { - throw new Error(`Could not parse OpenApi YAML: "${filePath}"`); - } - - default: - try { - return JSON.parse(content); - } catch (e) { - throw new Error(`Could not parse OpenApi JSON: "${filePath}"`); - } - } -} +export const getOpenApiSpec = async (location: string): Promise => { + const absolutePathOrUrl = (await exists(location)) ? resolve(location) : location; + return await RefParser.bundle(absolutePathOrUrl, absolutePathOrUrl, {}); +}; diff --git a/src/utils/getOpenApiVersion.ts b/src/utils/getOpenApiVersion.ts index b9ff66b53..9c7cc7e47 100644 --- a/src/utils/getOpenApiVersion.ts +++ b/src/utils/getOpenApiVersion.ts @@ -9,9 +9,9 @@ export enum OpenApiVersion { * an incompatible type. Or if the type is missing... * @param openApi The loaded spec (can be any object) */ -export function getOpenApiVersion(openApi: any): OpenApiVersion { +export const getOpenApiVersion = (openApi: any): OpenApiVersion => { const info: any = openApi.swagger || openApi.openapi; - if (info && typeof info === 'string') { + if (typeof info === 'string') { const c = info.charAt(0); const v = Number.parseInt(c); if (v === OpenApiVersion.V2 || v === OpenApiVersion.V3) { @@ -19,4 +19,4 @@ export function getOpenApiVersion(openApi: any): OpenApiVersion { } } throw new Error(`Unsupported Open API version: "${String(info)}"`); -} +}; diff --git a/src/utils/getPattern.spec.ts b/src/utils/getPattern.spec.ts new file mode 100644 index 000000000..3f3756f01 --- /dev/null +++ b/src/utils/getPattern.spec.ts @@ -0,0 +1,16 @@ +import { getPattern } from './getPattern'; + +describe('getPattern', () => { + it('should produce correct result', () => { + expect(getPattern()).toEqual(undefined); + expect(getPattern('')).toEqual(''); + expect(getPattern('^[a-zA-Z]')).toEqual('^[a-zA-Z]'); + expect(getPattern('^\\w+$')).toEqual('^\\\\w+$'); + expect(getPattern('^\\d{3}-\\d{2}-\\d{4}$')).toEqual('^\\\\d{3}-\\\\d{2}-\\\\d{4}$'); + expect(getPattern('\\')).toEqual('\\\\'); + expect(getPattern('\\/')).toEqual('\\\\/'); + expect(getPattern('\\/\\/')).toEqual('\\\\/\\\\/'); + // eslint-disable-next-line prettier/prettier + expect(getPattern("'")).toEqual("\\'"); + }); +}); diff --git a/src/utils/getPattern.ts b/src/utils/getPattern.ts new file mode 100644 index 000000000..b4580f5a6 --- /dev/null +++ b/src/utils/getPattern.ts @@ -0,0 +1,14 @@ +/** + * The spec generates a pattern like this '^\d{3}-\d{2}-\d{4}$' + * However, to use it in HTML or inside new RegExp() we need to + * escape the pattern to become: '^\\d{3}-\\d{2}-\\d{4}$' in order + * to make it a valid regexp string. + * + * Also, escape single quote characters, because the output uses single quotes for strings + * + * @param pattern + */ +export const getPattern = (pattern?: string): string | undefined => { + // eslint-disable-next-line prettier/prettier + return pattern?.replace(/\\/g, '\\\\').replace(/'/g, "\\'"); +}; diff --git a/src/utils/getServiceNames.spec.ts b/src/utils/getServiceNames.spec.ts index c41a51505..53fa0bd40 100644 --- a/src/utils/getServiceNames.spec.ts +++ b/src/utils/getServiceNames.spec.ts @@ -1,26 +1,27 @@ -import { Service } from '../client/interfaces/Service'; +import type { Service } from '../client/interfaces/Service'; import { getServiceNames } from './getServiceNames'; describe('getServiceNames', () => { it('should return sorted list', () => { - const services = new Map(); - services.set('John', { + const john: Service = { name: 'John', operations: [], imports: [], - }); - services.set('Jane', { + }; + const jane: Service = { name: 'Jane', operations: [], imports: [], - }); - services.set('Doe', { + }; + const doe: Service = { name: 'Doe', operations: [], imports: [], - }); + }; - expect(getServiceNames(new Map())).toEqual([]); + const services = [john, jane, doe]; + + expect(getServiceNames([])).toEqual([]); expect(getServiceNames(services)).toEqual(['Doe', 'Jane', 'John']); }); }); diff --git a/src/utils/getServiceNames.ts b/src/utils/getServiceNames.ts index 172512523..913b746cf 100644 --- a/src/utils/getServiceNames.ts +++ b/src/utils/getServiceNames.ts @@ -1,11 +1,6 @@ -import { Service } from '../client/interfaces/Service'; +import type { Service } from '../client/interfaces/Service'; +import { sort } from './sort'; -export function getServiceNames(services: Map): string[] { - return Array.from(services.values()) - .map(service => service.name) - .sort((a, b) => { - const nameA = a.toLowerCase(); - const nameB = b.toLowerCase(); - return nameA.localeCompare(nameB, 'en'); - }); -} +export const getServiceNames = (services: Service[]): string[] => { + return services.map(service => service.name).sort(sort); +}; diff --git a/src/utils/isDefined.ts b/src/utils/isDefined.ts new file mode 100644 index 000000000..470b6f9d4 --- /dev/null +++ b/src/utils/isDefined.ts @@ -0,0 +1,7 @@ +/** + * Check if a value is defined + * @param value + */ +export const isDefined = (value: T | undefined | null | ''): value is Exclude => { + return value !== undefined && value !== null && value !== ''; +}; diff --git a/src/utils/isEqual.ts b/src/utils/isEqual.ts new file mode 100644 index 000000000..f0d1c2a39 --- /dev/null +++ b/src/utils/isEqual.ts @@ -0,0 +1,38 @@ +export const isEqual = (a: any, b: any): boolean => { + if (a === b) { + return true; + } + + if (a && b && typeof a === 'object' && typeof b === 'object') { + if (Array.isArray(a) && Array.isArray(b)) { + if (a.length !== b.length) { + return false; + } + for (let i = 0; i < a.length; i++) { + if (!isEqual(a[i], b[i])) { + return false; + } + } + return true; + } + + const keysA = Object.keys(a); + const keysB = Object.keys(b); + if (keysA.length !== keysB.length) { + return false; + } + + for (let i = 0; i < keysA.length; i++) { + const key = keysA[i]; + if (!Object.prototype.hasOwnProperty.call(b, key)) { + return false; + } + if (!isEqual(a[key], b[key])) { + return false; + } + } + return true; + } + + return a !== a && b !== b; +}; diff --git a/src/utils/isString.spec.ts b/src/utils/isString.spec.ts new file mode 100644 index 000000000..f082aa2c2 --- /dev/null +++ b/src/utils/isString.spec.ts @@ -0,0 +1,13 @@ +import { isString } from './isString'; + +describe('isString', () => { + it('should produce correct result', () => { + expect(isString('foo')).toBeTruthy(); + expect(isString('123')).toBeTruthy(); + expect(isString('-1')).toBeTruthy(); + expect(isString('')).toBeTruthy(); + expect(isString(null)).toBeFalsy(); + expect(isString(undefined)).toBeFalsy(); + expect(isString({})).toBeFalsy(); + }); +}); diff --git a/src/utils/isString.ts b/src/utils/isString.ts new file mode 100644 index 000000000..581c602c9 --- /dev/null +++ b/src/utils/isString.ts @@ -0,0 +1,3 @@ +export const isString = (val: any): val is string => { + return typeof val === 'string'; +}; diff --git a/src/utils/isSubdirectory.spec.ts b/src/utils/isSubdirectory.spec.ts new file mode 100644 index 000000000..8b0574e70 --- /dev/null +++ b/src/utils/isSubdirectory.spec.ts @@ -0,0 +1,15 @@ +import { resolve } from 'path'; + +import { isSubDirectory } from './isSubdirectory'; + +describe('isSubDirectory', () => { + it('should return correct result', () => { + expect(isSubDirectory(resolve('/'), resolve('/'))).toBeFalsy(); + expect(isSubDirectory(resolve('.'), resolve('.'))).toBeFalsy(); + expect(isSubDirectory(resolve('./project'), resolve('./project'))).toBeFalsy(); + expect(isSubDirectory(resolve('./project'), resolve('../'))).toBeFalsy(); + expect(isSubDirectory(resolve('./project'), resolve('../../'))).toBeFalsy(); + expect(isSubDirectory(resolve('./'), resolve('./output'))).toBeTruthy(); + expect(isSubDirectory(resolve('./'), resolve('../output'))).toBeTruthy(); + }); +}); diff --git a/src/utils/isSubdirectory.ts b/src/utils/isSubdirectory.ts new file mode 100644 index 000000000..761eb89d0 --- /dev/null +++ b/src/utils/isSubdirectory.ts @@ -0,0 +1,5 @@ +import { relative } from 'path'; + +export const isSubDirectory = (parent: string, child: string) => { + return relative(child, parent).startsWith('..'); +}; diff --git a/src/utils/postProcessClient.ts b/src/utils/postProcessClient.ts new file mode 100644 index 000000000..0033923d4 --- /dev/null +++ b/src/utils/postProcessClient.ts @@ -0,0 +1,15 @@ +import type { Client } from '../client/interfaces/Client'; +import { postProcessModel } from './postProcessModel'; +import { postProcessService } from './postProcessService'; + +/** + * Post process client + * @param client Client object with all the models, services, etc. + */ +export const postProcessClient = (client: Client): Client => { + return { + ...client, + models: client.models.map(model => postProcessModel(model)), + services: client.services.map(service => postProcessService(service)), + }; +}; diff --git a/src/utils/postProcessModel.ts b/src/utils/postProcessModel.ts new file mode 100644 index 000000000..195a94e4f --- /dev/null +++ b/src/utils/postProcessModel.ts @@ -0,0 +1,18 @@ +import type { Model } from '../client/interfaces/Model'; +import { postProcessModelEnum } from './postProcessModelEnum'; +import { postProcessModelEnums } from './postProcessModelEnums'; +import { postProcessModelImports } from './postProcessModelImports'; + +/** + * Post processes the model. + * This will clean up any double imports or enum values. + * @param model + */ +export const postProcessModel = (model: Model): Model => { + return { + ...model, + imports: postProcessModelImports(model), + enums: postProcessModelEnums(model), + enum: postProcessModelEnum(model), + }; +}; diff --git a/src/utils/postProcessModelEnum.ts b/src/utils/postProcessModelEnum.ts new file mode 100644 index 000000000..f442b369a --- /dev/null +++ b/src/utils/postProcessModelEnum.ts @@ -0,0 +1,12 @@ +import type { Enum } from '../client/interfaces/Enum'; +import type { Model } from '../client/interfaces/Model'; + +/** + * Set unique enum values for the model + * @param model + */ +export const postProcessModelEnum = (model: Model): Enum[] => { + return model.enum.filter((property, index, arr) => { + return arr.findIndex(item => item.name === property.name) === index; + }); +}; diff --git a/src/utils/postProcessModelEnums.ts b/src/utils/postProcessModelEnums.ts new file mode 100644 index 000000000..2f06127aa --- /dev/null +++ b/src/utils/postProcessModelEnums.ts @@ -0,0 +1,11 @@ +import type { Model } from '../client/interfaces/Model'; + +/** + * Set unique enum values for the model + * @param model The model that is post-processed + */ +export const postProcessModelEnums = (model: Model): Model[] => { + return model.enums.filter((property, index, arr) => { + return arr.findIndex(item => item.name === property.name) === index; + }); +}; diff --git a/src/utils/postProcessModelImports.ts b/src/utils/postProcessModelImports.ts new file mode 100644 index 000000000..00c0d4539 --- /dev/null +++ b/src/utils/postProcessModelImports.ts @@ -0,0 +1,14 @@ +import type { Model } from '../client/interfaces/Model'; +import { sort } from './sort'; +import { unique } from './unique'; + +/** + * Set unique imports, sorted by name + * @param model The model that is post-processed + */ +export const postProcessModelImports = (model: Model): string[] => { + return model.imports + .filter(unique) + .sort(sort) + .filter(name => model.name !== name); +}; diff --git a/src/utils/postProcessService.ts b/src/utils/postProcessService.ts new file mode 100644 index 000000000..2851f4a6a --- /dev/null +++ b/src/utils/postProcessService.ts @@ -0,0 +1,13 @@ +import type { Service } from '../client/interfaces/Service'; +import { postProcessServiceImports } from './postProcessServiceImports'; +import { postProcessServiceOperations } from './postProcessServiceOperations'; + +export const postProcessService = (service: Service): Service => { + const clone = { ...service }; + clone.operations = postProcessServiceOperations(clone); + clone.operations.forEach(operation => { + clone.imports.push(...operation.imports); + }); + clone.imports = postProcessServiceImports(clone); + return clone; +}; diff --git a/src/utils/postProcessServiceImports.ts b/src/utils/postProcessServiceImports.ts new file mode 100644 index 000000000..b47cfe793 --- /dev/null +++ b/src/utils/postProcessServiceImports.ts @@ -0,0 +1,11 @@ +import type { Service } from '../client/interfaces/Service'; +import { sort } from './sort'; +import { unique } from './unique'; + +/** + * Set unique imports, sorted by name + * @param service + */ +export const postProcessServiceImports = (service: Service): string[] => { + return service.imports.filter(unique).sort(sort); +}; diff --git a/src/utils/postProcessServiceOperations.ts b/src/utils/postProcessServiceOperations.ts new file mode 100644 index 000000000..5b88a5b21 --- /dev/null +++ b/src/utils/postProcessServiceOperations.ts @@ -0,0 +1,26 @@ +import type { Operation } from '../client/interfaces/Operation'; +import type { Service } from '../client/interfaces/Service'; +import { flatMap } from './flatMap'; + +export const postProcessServiceOperations = (service: Service): Operation[] => { + const names = new Map(); + + return service.operations.map(operation => { + const clone = { ...operation }; + + // Parse the service parameters and results, very similar to how we parse + // properties of models. These methods will extend the type if needed. + clone.imports.push(...flatMap(clone.parameters, parameter => parameter.imports)); + clone.imports.push(...flatMap(clone.results, result => result.imports)); + + // Check if the operation name is unique, if not then prefix this with a number + const name = clone.name; + const index = names.get(name) || 0; + if (index > 0) { + clone.name = `${name}${index}`; + } + names.set(name, index + 1); + + return clone; + }); +}; diff --git a/src/utils/readHandlebarsTemplate.spec.ts b/src/utils/readHandlebarsTemplate.spec.ts deleted file mode 100644 index 7ec2d2545..000000000 --- a/src/utils/readHandlebarsTemplate.spec.ts +++ /dev/null @@ -1,19 +0,0 @@ -import * as fs from 'fs'; -import { readHandlebarsTemplate } from './readHandlebarsTemplate'; - -jest.mock('fs'); - -const fsExistsSync = fs.existsSync as jest.MockedFunction; -const fsReadFileSync = fs.readFileSync as jest.MockedFunction; - -describe('readHandlebarsTemplate', () => { - it('should read the template', () => { - fsExistsSync.mockReturnValue(true); - fsReadFileSync.mockReturnValue('{{{message}}}'); - - const template = readHandlebarsTemplate('/'); - - expect(template).toBeDefined(); - expect(template({ message: 'Hello World!' })).toEqual('Hello World!'); - }); -}); diff --git a/src/utils/readHandlebarsTemplate.ts b/src/utils/readHandlebarsTemplate.ts deleted file mode 100644 index e721f2f23..000000000 --- a/src/utils/readHandlebarsTemplate.ts +++ /dev/null @@ -1,30 +0,0 @@ -import * as Handlebars from 'handlebars'; -import * as fs from 'fs'; - -/** - * Read and compile the Handlebars template. - * @param filePath - */ -export function readHandlebarsTemplate(filePath: string): Handlebars.TemplateDelegate { - if (fs.existsSync(filePath)) { - try { - const template = fs - .readFileSync(filePath, 'utf8') - .toString() - .trim(); - return Handlebars.compile(template, { - strict: true, - noEscape: true, - preventIndent: true, - knownHelpersOnly: true, - knownHelpers: { - equals: true, - notEquals: true, - }, - }); - } catch (e) { - throw new Error(`Could not compile Handlebar template: "${filePath}"`); - } - } - throw new Error(`Could not find Handlebar template: "${filePath}"`); -} diff --git a/src/utils/readHandlebarsTemplates.spec.ts b/src/utils/readHandlebarsTemplates.spec.ts deleted file mode 100644 index 9e034723d..000000000 --- a/src/utils/readHandlebarsTemplates.spec.ts +++ /dev/null @@ -1,31 +0,0 @@ -import * as fs from 'fs'; -import * as glob from 'glob'; -import { Language } from '../index'; -import { readHandlebarsTemplates } from './readHandlebarsTemplates'; - -jest.mock('fs'); -jest.mock('glob'); - -const fsExistsSync = fs.existsSync as jest.MockedFunction; -const fsReadFileSync = fs.readFileSync as jest.MockedFunction; -const globSync = glob.sync as jest.MockedFunction; - -describe('readHandlebarsTemplates', () => { - it('should read the templates', () => { - fsExistsSync.mockReturnValue(true); - fsReadFileSync.mockReturnValue('{{{message}}}'); - globSync.mockReturnValue([]); - - const template = readHandlebarsTemplates(Language.TYPESCRIPT); - - expect(template).toBeDefined(); - expect(template.index).toBeDefined(); - expect(template.model).toBeDefined(); - expect(template.service).toBeDefined(); - expect(template.settings).toBeDefined(); - expect(template.index({ message: 'Hello World!' })).toEqual('Hello World!'); - expect(template.model({ message: 'Hello World!' })).toEqual('Hello World!'); - expect(template.service({ message: 'Hello World!' })).toEqual('Hello World!'); - expect(template.settings({ message: 'Hello World!' })).toEqual('Hello World!'); - }); -}); diff --git a/src/utils/readHandlebarsTemplates.ts b/src/utils/readHandlebarsTemplates.ts deleted file mode 100644 index 69868094a..000000000 --- a/src/utils/readHandlebarsTemplates.ts +++ /dev/null @@ -1,41 +0,0 @@ -import * as Handlebars from 'handlebars'; -import * as glob from 'glob'; -import * as path from 'path'; -import { Language } from '../index'; -import { readHandlebarsTemplate } from './readHandlebarsTemplate'; -import { registerHandlebarHelpers } from './registerHandlebarHelpers'; - -export interface Templates { - index: Handlebars.TemplateDelegate; - model: Handlebars.TemplateDelegate; - service: Handlebars.TemplateDelegate; - settings: Handlebars.TemplateDelegate; -} - -/** - * Read all the Handlebar templates that we need and return on wrapper object - * so we can easily access the templates in out generator / write functions. - * @param language The language we need to generate (Typescript or Javascript). - */ -export function readHandlebarsTemplates(language: Language): Templates { - try { - registerHandlebarHelpers(); - - const templates: Templates = { - index: readHandlebarsTemplate(path.resolve(__dirname, `../../src/templates/${language}/index.hbs`)), - model: readHandlebarsTemplate(path.resolve(__dirname, `../../src/templates/${language}/model.hbs`)), - service: readHandlebarsTemplate(path.resolve(__dirname, `../../src/templates/${language}/service.hbs`)), - settings: readHandlebarsTemplate(path.resolve(__dirname, `../../src/templates/${language}/core/OpenAPI.hbs`)), - }; - - const partials = path.resolve(__dirname, `../../src/templates/${language}/partials`); - const partialsFiles = glob.sync('*.hbs', { cwd: partials }); - partialsFiles.forEach(partial => { - Handlebars.registerPartial(path.basename(partial, '.hbs'), readHandlebarsTemplate(path.resolve(partials, partial))); - }); - - return templates; - } catch (e) { - throw new Error(`Could not read Handlebar templates`); - } -} diff --git a/src/utils/readSpec.ts b/src/utils/readSpec.ts new file mode 100644 index 000000000..016bf929e --- /dev/null +++ b/src/utils/readSpec.ts @@ -0,0 +1,13 @@ +import { readSpecFromDisk } from './readSpecFromDisk'; +import { readSpecFromHttp } from './readSpecFromHttp'; +import { readSpecFromHttps } from './readSpecFromHttps'; + +export const readSpec = async (input: string): Promise => { + if (input.startsWith('https://')) { + return await readSpecFromHttps(input); + } + if (input.startsWith('http://')) { + return await readSpecFromHttp(input); + } + return await readSpecFromDisk(input); +}; diff --git a/src/utils/readSpecFromDisk.ts b/src/utils/readSpecFromDisk.ts new file mode 100644 index 000000000..7a5b76671 --- /dev/null +++ b/src/utils/readSpecFromDisk.ts @@ -0,0 +1,21 @@ +import { resolve } from 'path'; + +import { exists, readFile } from './fileSystem'; + +/** + * Check if given file exists and try to read the content as string. + * @param input + */ +export const readSpecFromDisk = async (input: string): Promise => { + const filePath = resolve(process.cwd(), input); + const fileExists = await exists(filePath); + if (fileExists) { + try { + const content = await readFile(filePath, 'utf8'); + return content.toString(); + } catch (e) { + throw new Error(`Could not read OpenApi spec: "${filePath}"`); + } + } + throw new Error(`Could not find OpenApi spec: "${filePath}"`); +}; diff --git a/src/utils/readSpecFromHttp.ts b/src/utils/readSpecFromHttp.ts new file mode 100644 index 000000000..e4cc828a5 --- /dev/null +++ b/src/utils/readSpecFromHttp.ts @@ -0,0 +1,22 @@ +import { get } from 'http'; + +/** + * Download the spec file from a HTTP resource + * @param url + */ +export const readSpecFromHttp = async (url: string): Promise => { + return new Promise((resolve, reject) => { + get(url, response => { + let body = ''; + response.on('data', chunk => { + body += chunk; + }); + response.on('end', () => { + resolve(body); + }); + response.on('error', () => { + reject(`Could not read OpenApi spec: "${url}"`); + }); + }); + }); +}; diff --git a/src/utils/readSpecFromHttps.ts b/src/utils/readSpecFromHttps.ts new file mode 100644 index 000000000..52cdc57db --- /dev/null +++ b/src/utils/readSpecFromHttps.ts @@ -0,0 +1,22 @@ +import { get } from 'https'; + +/** + * Download the spec file from a HTTPS resource + * @param url + */ +export const readSpecFromHttps = async (url: string): Promise => { + return new Promise((resolve, reject) => { + get(url, response => { + let body = ''; + response.on('data', chunk => { + body += chunk; + }); + response.on('end', () => { + resolve(body); + }); + response.on('error', () => { + reject(`Could not read OpenApi spec: "${url}"`); + }); + }); + }); +}; diff --git a/src/utils/registerHandlebarHelpers.spec.ts b/src/utils/registerHandlebarHelpers.spec.ts new file mode 100644 index 000000000..f8347abdb --- /dev/null +++ b/src/utils/registerHandlebarHelpers.spec.ts @@ -0,0 +1,25 @@ +import Handlebars from 'handlebars/runtime'; + +import { HttpClient } from '../HttpClient'; +import { registerHandlebarHelpers } from './registerHandlebarHelpers'; + +describe('registerHandlebarHelpers', () => { + it('should register the helpers', () => { + registerHandlebarHelpers({ + httpClient: HttpClient.FETCH, + useOptions: false, + useUnionTypes: false, + }); + const helpers = Object.keys(Handlebars.helpers); + expect(helpers).toContain('ifdef'); + expect(helpers).toContain('equals'); + expect(helpers).toContain('notEquals'); + expect(helpers).toContain('containsSpaces'); + expect(helpers).toContain('union'); + expect(helpers).toContain('intersection'); + expect(helpers).toContain('enumerator'); + expect(helpers).toContain('escapeComment'); + expect(helpers).toContain('escapeDescription'); + expect(helpers).toContain('camelCase'); + }); +}); diff --git a/src/utils/registerHandlebarHelpers.ts b/src/utils/registerHandlebarHelpers.ts index 3d8768540..88f47c19b 100644 --- a/src/utils/registerHandlebarHelpers.ts +++ b/src/utils/registerHandlebarHelpers.ts @@ -1,12 +1,107 @@ -import * as Handlebars from 'handlebars'; +import camelCase from 'camelcase'; +import Handlebars from 'handlebars/runtime'; +import { EOL } from 'os'; -export function registerHandlebarHelpers(): void { - Handlebars.registerHelper('equals', function(a: string, b: string, options: Handlebars.HelperOptions): string { - // @ts-ignore - return a === b ? options.fn(this) : options.inverse(this); +import type { Enum } from '../client/interfaces/Enum'; +import type { Model } from '../client/interfaces/Model'; +import type { HttpClient } from '../HttpClient'; +import { unique } from './unique'; + +export const registerHandlebarHelpers = (root: { + httpClient: HttpClient; + useOptions: boolean; + useUnionTypes: boolean; +}): void => { + Handlebars.registerHelper('ifdef', function (this: any, ...args): string { + const options = args.pop(); + if (!args.every(value => !value)) { + return options.fn(this); + } + return options.inverse(this); + }); + + Handlebars.registerHelper( + 'equals', + function (this: any, a: string, b: string, options: Handlebars.HelperOptions): string { + return a === b ? options.fn(this) : options.inverse(this); + } + ); + + Handlebars.registerHelper( + 'notEquals', + function (this: any, a: string, b: string, options: Handlebars.HelperOptions): string { + return a !== b ? options.fn(this) : options.inverse(this); + } + ); + + Handlebars.registerHelper( + 'containsSpaces', + function (this: any, value: string, options: Handlebars.HelperOptions): string { + return /\s+/.test(value) ? options.fn(this) : options.inverse(this); + } + ); + + Handlebars.registerHelper( + 'union', + function (this: any, properties: Model[], parent: string | undefined, options: Handlebars.HelperOptions) { + const type = Handlebars.partials['type']; + const types = properties.map(property => type({ ...root, ...property, parent })); + const uniqueTypes = types.filter(unique); + let uniqueTypesString = uniqueTypes.join(' | '); + if (uniqueTypes.length > 1) { + uniqueTypesString = `(${uniqueTypesString})`; + } + return options.fn(uniqueTypesString); + } + ); + + Handlebars.registerHelper( + 'intersection', + function (this: any, properties: Model[], parent: string | undefined, options: Handlebars.HelperOptions) { + const type = Handlebars.partials['type']; + const types = properties.map(property => type({ ...root, ...property, parent })); + const uniqueTypes = types.filter(unique); + let uniqueTypesString = uniqueTypes.join(' & '); + if (uniqueTypes.length > 1) { + uniqueTypesString = `(${uniqueTypesString})`; + } + return options.fn(uniqueTypesString); + } + ); + + Handlebars.registerHelper( + 'enumerator', + function ( + this: any, + enumerators: Enum[], + parent: string | undefined, + name: string | undefined, + options: Handlebars.HelperOptions + ) { + if (!root.useUnionTypes && parent && name) { + return `${parent}.${name}`; + } + return options.fn( + enumerators + .map(enumerator => enumerator.value) + .filter(unique) + .join(' | ') + ); + } + ); + + Handlebars.registerHelper('escapeComment', function (value: string): string { + return value + .replace(/\*\//g, '*') + .replace(/\/\*/g, '*') + .replace(/\r?\n(.*)/g, (_, w) => `${EOL} * ${w.trim()}`); }); - Handlebars.registerHelper('notEquals', function(a: string, b: string, options: Handlebars.HelperOptions): string { - // @ts-ignore - return a !== b ? options.fn(this) : options.inverse(this); + + Handlebars.registerHelper('escapeDescription', function (value: string): string { + return value.replace(/\\/g, '\\\\').replace(/`/g, '\\`').replace(/\${/g, '\\${'); + }); + + Handlebars.registerHelper('camelCase', function (value: string): string { + return camelCase(value); }); -} +}; diff --git a/src/utils/registerHandlebarTemplates.spec.ts b/src/utils/registerHandlebarTemplates.spec.ts new file mode 100644 index 000000000..5e1302384 --- /dev/null +++ b/src/utils/registerHandlebarTemplates.spec.ts @@ -0,0 +1,21 @@ +import { HttpClient } from '../HttpClient'; +import { registerHandlebarTemplates } from './registerHandlebarTemplates'; + +describe('registerHandlebarTemplates', () => { + it('should return correct templates', () => { + const templates = registerHandlebarTemplates({ + httpClient: HttpClient.FETCH, + useOptions: false, + useUnionTypes: false, + }); + expect(templates.index).toBeDefined(); + expect(templates.exports.model).toBeDefined(); + expect(templates.exports.schema).toBeDefined(); + expect(templates.exports.service).toBeDefined(); + expect(templates.core.settings).toBeDefined(); + expect(templates.core.apiError).toBeDefined(); + expect(templates.core.apiRequestOptions).toBeDefined(); + expect(templates.core.apiResult).toBeDefined(); + expect(templates.core.request).toBeDefined(); + }); +}); diff --git a/src/utils/registerHandlebarTemplates.ts b/src/utils/registerHandlebarTemplates.ts new file mode 100644 index 000000000..bf77cbdc1 --- /dev/null +++ b/src/utils/registerHandlebarTemplates.ts @@ -0,0 +1,224 @@ +import Handlebars from 'handlebars/runtime'; + +import { HttpClient } from '../HttpClient'; +import templateClient from '../templates/client.hbs'; +import angularGetHeaders from '../templates/core/angular/getHeaders.hbs'; +import angularGetRequestBody from '../templates/core/angular/getRequestBody.hbs'; +import angularGetResponseBody from '../templates/core/angular/getResponseBody.hbs'; +import angularGetResponseHeader from '../templates/core/angular/getResponseHeader.hbs'; +import angularRequest from '../templates/core/angular/request.hbs'; +import angularSendRequest from '../templates/core/angular/sendRequest.hbs'; +import templateCoreApiError from '../templates/core/ApiError.hbs'; +import templateCoreApiRequestOptions from '../templates/core/ApiRequestOptions.hbs'; +import templateCoreApiResult from '../templates/core/ApiResult.hbs'; +import axiosGetHeaders from '../templates/core/axios/getHeaders.hbs'; +import axiosGetRequestBody from '../templates/core/axios/getRequestBody.hbs'; +import axiosGetResponseBody from '../templates/core/axios/getResponseBody.hbs'; +import axiosGetResponseHeader from '../templates/core/axios/getResponseHeader.hbs'; +import axiosRequest from '../templates/core/axios/request.hbs'; +import axiosSendRequest from '../templates/core/axios/sendRequest.hbs'; +import templateCoreBaseHttpRequest from '../templates/core/BaseHttpRequest.hbs'; +import templateCancelablePromise from '../templates/core/CancelablePromise.hbs'; +import fetchGetHeaders from '../templates/core/fetch/getHeaders.hbs'; +import fetchGetRequestBody from '../templates/core/fetch/getRequestBody.hbs'; +import fetchGetResponseBody from '../templates/core/fetch/getResponseBody.hbs'; +import fetchGetResponseHeader from '../templates/core/fetch/getResponseHeader.hbs'; +import fetchRequest from '../templates/core/fetch/request.hbs'; +import fetchSendRequest from '../templates/core/fetch/sendRequest.hbs'; +import functionBase64 from '../templates/core/functions/base64.hbs'; +import functionCatchErrorCodes from '../templates/core/functions/catchErrorCodes.hbs'; +import functionGetFormData from '../templates/core/functions/getFormData.hbs'; +import functionGetQueryString from '../templates/core/functions/getQueryString.hbs'; +import functionGetUrl from '../templates/core/functions/getUrl.hbs'; +import functionIsBlob from '../templates/core/functions/isBlob.hbs'; +import functionIsDefined from '../templates/core/functions/isDefined.hbs'; +import functionIsFormData from '../templates/core/functions/isFormData.hbs'; +import functionIsString from '../templates/core/functions/isString.hbs'; +import functionIsStringWithValue from '../templates/core/functions/isStringWithValue.hbs'; +import functionIsSuccess from '../templates/core/functions/isSuccess.hbs'; +import functionResolve from '../templates/core/functions/resolve.hbs'; +import templateCoreHttpRequest from '../templates/core/HttpRequest.hbs'; +import nodeGetHeaders from '../templates/core/node/getHeaders.hbs'; +import nodeGetRequestBody from '../templates/core/node/getRequestBody.hbs'; +import nodeGetResponseBody from '../templates/core/node/getResponseBody.hbs'; +import nodeGetResponseHeader from '../templates/core/node/getResponseHeader.hbs'; +import nodeRequest from '../templates/core/node/request.hbs'; +import nodeSendRequest from '../templates/core/node/sendRequest.hbs'; +import templateCoreSettings from '../templates/core/OpenAPI.hbs'; +import templateCoreRequest from '../templates/core/request.hbs'; +import xhrGetHeaders from '../templates/core/xhr/getHeaders.hbs'; +import xhrGetRequestBody from '../templates/core/xhr/getRequestBody.hbs'; +import xhrGetResponseBody from '../templates/core/xhr/getResponseBody.hbs'; +import xhrGetResponseHeader from '../templates/core/xhr/getResponseHeader.hbs'; +import xhrRequest from '../templates/core/xhr/request.hbs'; +import xhrSendRequest from '../templates/core/xhr/sendRequest.hbs'; +import templateExportModel from '../templates/exportModel.hbs'; +import templateExportSchema from '../templates/exportSchema.hbs'; +import templateExportService from '../templates/exportService.hbs'; +import templateIndex from '../templates/index.hbs'; +import partialBase from '../templates/partials/base.hbs'; +import partialExportComposition from '../templates/partials/exportComposition.hbs'; +import partialExportEnum from '../templates/partials/exportEnum.hbs'; +import partialExportInterface from '../templates/partials/exportInterface.hbs'; +import partialExportType from '../templates/partials/exportType.hbs'; +import partialHeader from '../templates/partials/header.hbs'; +import partialIsNullable from '../templates/partials/isNullable.hbs'; +import partialIsReadOnly from '../templates/partials/isReadOnly.hbs'; +import partialIsRequired from '../templates/partials/isRequired.hbs'; +import partialParameters from '../templates/partials/parameters.hbs'; +import partialResult from '../templates/partials/result.hbs'; +import partialSchema from '../templates/partials/schema.hbs'; +import partialSchemaArray from '../templates/partials/schemaArray.hbs'; +import partialSchemaComposition from '../templates/partials/schemaComposition.hbs'; +import partialSchemaDictionary from '../templates/partials/schemaDictionary.hbs'; +import partialSchemaEnum from '../templates/partials/schemaEnum.hbs'; +import partialSchemaGeneric from '../templates/partials/schemaGeneric.hbs'; +import partialSchemaInterface from '../templates/partials/schemaInterface.hbs'; +import partialType from '../templates/partials/type.hbs'; +import partialTypeArray from '../templates/partials/typeArray.hbs'; +import partialTypeDictionary from '../templates/partials/typeDictionary.hbs'; +import partialTypeEnum from '../templates/partials/typeEnum.hbs'; +import partialTypeGeneric from '../templates/partials/typeGeneric.hbs'; +import partialTypeInterface from '../templates/partials/typeInterface.hbs'; +import partialTypeIntersection from '../templates/partials/typeIntersection.hbs'; +import partialTypeReference from '../templates/partials/typeReference.hbs'; +import partialTypeUnion from '../templates/partials/typeUnion.hbs'; +import { registerHandlebarHelpers } from './registerHandlebarHelpers'; + +export interface Templates { + index: Handlebars.TemplateDelegate; + client: Handlebars.TemplateDelegate; + exports: { + model: Handlebars.TemplateDelegate; + schema: Handlebars.TemplateDelegate; + service: Handlebars.TemplateDelegate; + }; + core: { + settings: Handlebars.TemplateDelegate; + apiError: Handlebars.TemplateDelegate; + apiRequestOptions: Handlebars.TemplateDelegate; + apiResult: Handlebars.TemplateDelegate; + cancelablePromise: Handlebars.TemplateDelegate; + request: Handlebars.TemplateDelegate; + baseHttpRequest: Handlebars.TemplateDelegate; + httpRequest: Handlebars.TemplateDelegate; + }; +} + +/** + * Read all the Handlebar templates that we need and return on wrapper object + * so we can easily access the templates in out generator / write functions. + */ +export const registerHandlebarTemplates = (root: { + httpClient: HttpClient; + useOptions: boolean; + useUnionTypes: boolean; +}): Templates => { + registerHandlebarHelpers(root); + + // Main templates (entry points for the files we write to disk) + const templates: Templates = { + index: Handlebars.template(templateIndex), + client: Handlebars.template(templateClient), + exports: { + model: Handlebars.template(templateExportModel), + schema: Handlebars.template(templateExportSchema), + service: Handlebars.template(templateExportService), + }, + core: { + settings: Handlebars.template(templateCoreSettings), + apiError: Handlebars.template(templateCoreApiError), + apiRequestOptions: Handlebars.template(templateCoreApiRequestOptions), + apiResult: Handlebars.template(templateCoreApiResult), + cancelablePromise: Handlebars.template(templateCancelablePromise), + request: Handlebars.template(templateCoreRequest), + baseHttpRequest: Handlebars.template(templateCoreBaseHttpRequest), + httpRequest: Handlebars.template(templateCoreHttpRequest), + }, + }; + + // Partials for the generations of the models, services, etc. + Handlebars.registerPartial('exportEnum', Handlebars.template(partialExportEnum)); + Handlebars.registerPartial('exportInterface', Handlebars.template(partialExportInterface)); + Handlebars.registerPartial('exportComposition', Handlebars.template(partialExportComposition)); + Handlebars.registerPartial('exportType', Handlebars.template(partialExportType)); + Handlebars.registerPartial('header', Handlebars.template(partialHeader)); + Handlebars.registerPartial('isNullable', Handlebars.template(partialIsNullable)); + Handlebars.registerPartial('isReadOnly', Handlebars.template(partialIsReadOnly)); + Handlebars.registerPartial('isRequired', Handlebars.template(partialIsRequired)); + Handlebars.registerPartial('parameters', Handlebars.template(partialParameters)); + Handlebars.registerPartial('result', Handlebars.template(partialResult)); + Handlebars.registerPartial('schema', Handlebars.template(partialSchema)); + Handlebars.registerPartial('schemaArray', Handlebars.template(partialSchemaArray)); + Handlebars.registerPartial('schemaDictionary', Handlebars.template(partialSchemaDictionary)); + Handlebars.registerPartial('schemaEnum', Handlebars.template(partialSchemaEnum)); + Handlebars.registerPartial('schemaGeneric', Handlebars.template(partialSchemaGeneric)); + Handlebars.registerPartial('schemaInterface', Handlebars.template(partialSchemaInterface)); + Handlebars.registerPartial('schemaComposition', Handlebars.template(partialSchemaComposition)); + Handlebars.registerPartial('type', Handlebars.template(partialType)); + Handlebars.registerPartial('typeArray', Handlebars.template(partialTypeArray)); + Handlebars.registerPartial('typeDictionary', Handlebars.template(partialTypeDictionary)); + Handlebars.registerPartial('typeEnum', Handlebars.template(partialTypeEnum)); + Handlebars.registerPartial('typeGeneric', Handlebars.template(partialTypeGeneric)); + Handlebars.registerPartial('typeInterface', Handlebars.template(partialTypeInterface)); + Handlebars.registerPartial('typeReference', Handlebars.template(partialTypeReference)); + Handlebars.registerPartial('typeUnion', Handlebars.template(partialTypeUnion)); + Handlebars.registerPartial('typeIntersection', Handlebars.template(partialTypeIntersection)); + Handlebars.registerPartial('base', Handlebars.template(partialBase)); + + // Generic functions used in 'request' file @see src/templates/core/request.hbs for more info + Handlebars.registerPartial('functions/catchErrorCodes', Handlebars.template(functionCatchErrorCodes)); + Handlebars.registerPartial('functions/getFormData', Handlebars.template(functionGetFormData)); + Handlebars.registerPartial('functions/getQueryString', Handlebars.template(functionGetQueryString)); + Handlebars.registerPartial('functions/getUrl', Handlebars.template(functionGetUrl)); + Handlebars.registerPartial('functions/isBlob', Handlebars.template(functionIsBlob)); + Handlebars.registerPartial('functions/isDefined', Handlebars.template(functionIsDefined)); + Handlebars.registerPartial('functions/isFormData', Handlebars.template(functionIsFormData)); + Handlebars.registerPartial('functions/isString', Handlebars.template(functionIsString)); + Handlebars.registerPartial('functions/isStringWithValue', Handlebars.template(functionIsStringWithValue)); + Handlebars.registerPartial('functions/isSuccess', Handlebars.template(functionIsSuccess)); + Handlebars.registerPartial('functions/base64', Handlebars.template(functionBase64)); + Handlebars.registerPartial('functions/resolve', Handlebars.template(functionResolve)); + + // Specific files for the fetch client implementation + Handlebars.registerPartial('fetch/getHeaders', Handlebars.template(fetchGetHeaders)); + Handlebars.registerPartial('fetch/getRequestBody', Handlebars.template(fetchGetRequestBody)); + Handlebars.registerPartial('fetch/getResponseBody', Handlebars.template(fetchGetResponseBody)); + Handlebars.registerPartial('fetch/getResponseHeader', Handlebars.template(fetchGetResponseHeader)); + Handlebars.registerPartial('fetch/sendRequest', Handlebars.template(fetchSendRequest)); + Handlebars.registerPartial('fetch/request', Handlebars.template(fetchRequest)); + + // Specific files for the xhr client implementation + Handlebars.registerPartial('xhr/getHeaders', Handlebars.template(xhrGetHeaders)); + Handlebars.registerPartial('xhr/getRequestBody', Handlebars.template(xhrGetRequestBody)); + Handlebars.registerPartial('xhr/getResponseBody', Handlebars.template(xhrGetResponseBody)); + Handlebars.registerPartial('xhr/getResponseHeader', Handlebars.template(xhrGetResponseHeader)); + Handlebars.registerPartial('xhr/sendRequest', Handlebars.template(xhrSendRequest)); + Handlebars.registerPartial('xhr/request', Handlebars.template(xhrRequest)); + + // Specific files for the node client implementation + Handlebars.registerPartial('node/getHeaders', Handlebars.template(nodeGetHeaders)); + Handlebars.registerPartial('node/getRequestBody', Handlebars.template(nodeGetRequestBody)); + Handlebars.registerPartial('node/getResponseBody', Handlebars.template(nodeGetResponseBody)); + Handlebars.registerPartial('node/getResponseHeader', Handlebars.template(nodeGetResponseHeader)); + Handlebars.registerPartial('node/sendRequest', Handlebars.template(nodeSendRequest)); + Handlebars.registerPartial('node/request', Handlebars.template(nodeRequest)); + + // Specific files for the axios client implementation + Handlebars.registerPartial('axios/getHeaders', Handlebars.template(axiosGetHeaders)); + Handlebars.registerPartial('axios/getRequestBody', Handlebars.template(axiosGetRequestBody)); + Handlebars.registerPartial('axios/getResponseBody', Handlebars.template(axiosGetResponseBody)); + Handlebars.registerPartial('axios/getResponseHeader', Handlebars.template(axiosGetResponseHeader)); + Handlebars.registerPartial('axios/sendRequest', Handlebars.template(axiosSendRequest)); + Handlebars.registerPartial('axios/request', Handlebars.template(axiosRequest)); + + // Specific files for the angular client implementation + Handlebars.registerPartial('angular/getHeaders', Handlebars.template(angularGetHeaders)); + Handlebars.registerPartial('angular/getRequestBody', Handlebars.template(angularGetRequestBody)); + Handlebars.registerPartial('angular/getResponseBody', Handlebars.template(angularGetResponseBody)); + Handlebars.registerPartial('angular/getResponseHeader', Handlebars.template(angularGetResponseHeader)); + Handlebars.registerPartial('angular/sendRequest', Handlebars.template(angularSendRequest)); + Handlebars.registerPartial('angular/request', Handlebars.template(angularRequest)); + + return templates; +}; diff --git a/src/utils/reservedWords.ts b/src/utils/reservedWords.ts new file mode 100644 index 000000000..4c385c17c --- /dev/null +++ b/src/utils/reservedWords.ts @@ -0,0 +1,2 @@ +export const reservedWords = + /^(arguments|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|eval|export|extends|false|finally|for|function|if|implements|import|in|instanceof|interface|let|new|null|package|private|protected|public|return|static|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)$/g; diff --git a/src/utils/sort.spec.ts b/src/utils/sort.spec.ts new file mode 100644 index 000000000..7d89ff1a5 --- /dev/null +++ b/src/utils/sort.spec.ts @@ -0,0 +1,10 @@ +import { sort } from './sort'; + +describe('sort', () => { + it('should return correct index', () => { + expect(sort('a', 'b')).toEqual(-1); + expect(sort('b', 'a')).toEqual(1); + expect(sort('a', 'a')).toEqual(0); + expect(sort('', '')).toEqual(0); + }); +}); diff --git a/src/utils/sort.ts b/src/utils/sort.ts new file mode 100644 index 000000000..1d76998f4 --- /dev/null +++ b/src/utils/sort.ts @@ -0,0 +1,5 @@ +export const sort = (a: string, b: string): number => { + const nameA = a.toLowerCase(); + const nameB = b.toLowerCase(); + return nameA.localeCompare(nameB, 'en'); +}; diff --git a/src/utils/sortModelsByName.spec.ts b/src/utils/sortModelsByName.spec.ts new file mode 100644 index 000000000..ab57a7d98 --- /dev/null +++ b/src/utils/sortModelsByName.spec.ts @@ -0,0 +1,62 @@ +import type { Model } from '../client/interfaces/Model'; +import { sortModelsByName } from './sortModelsByName'; + +describe('sortModelsByName', () => { + it('should return sorted list', () => { + const john: Model = { + export: 'interface', + name: 'John', + type: 'John', + base: 'John', + template: null, + link: null, + description: null, + isDefinition: true, + isReadOnly: false, + isRequired: false, + isNullable: false, + imports: [], + enum: [], + enums: [], + properties: [], + }; + const jane: Model = { + export: 'interface', + name: 'Jane', + type: 'Jane', + base: 'Jane', + template: null, + link: null, + description: null, + isDefinition: true, + isReadOnly: false, + isRequired: false, + isNullable: false, + imports: [], + enum: [], + enums: [], + properties: [], + }; + const doe: Model = { + export: 'interface', + name: 'Doe', + type: 'Doe', + base: 'Doe', + template: null, + link: null, + description: null, + isDefinition: true, + isReadOnly: false, + isRequired: false, + isNullable: false, + imports: [], + enum: [], + enums: [], + properties: [], + }; + const models: Model[] = [john, jane, doe]; + + expect(sortModelsByName([])).toEqual([]); + expect(sortModelsByName(models)).toEqual([doe, jane, john]); + }); +}); diff --git a/src/utils/sortModelsByName.ts b/src/utils/sortModelsByName.ts new file mode 100644 index 000000000..33fae3990 --- /dev/null +++ b/src/utils/sortModelsByName.ts @@ -0,0 +1,9 @@ +import type { Model } from '../client/interfaces/Model'; + +export const sortModelsByName = (models: Model[]): Model[] => { + return models.sort((a, b) => { + const nameA = a.name.toLowerCase(); + const nameB = b.name.toLowerCase(); + return nameA.localeCompare(nameB, 'en'); + }); +}; diff --git a/src/utils/sortServicesByName.spec.ts b/src/utils/sortServicesByName.spec.ts new file mode 100644 index 000000000..bcce6c4ee --- /dev/null +++ b/src/utils/sortServicesByName.spec.ts @@ -0,0 +1,27 @@ +import type { Service } from '../client/interfaces/Service'; +import { sortServicesByName } from './sortServicesByName'; + +describe('sortServicesByName', () => { + it('should return sorted list', () => { + const john: Service = { + name: 'John', + operations: [], + imports: [], + }; + const jane: Service = { + name: 'Jane', + operations: [], + imports: [], + }; + const doe: Service = { + name: 'Doe', + operations: [], + imports: [], + }; + + const services: Service[] = [john, jane, doe]; + + expect(sortServicesByName([])).toEqual([]); + expect(sortServicesByName(services)).toEqual([doe, jane, john]); + }); +}); diff --git a/src/utils/sortServicesByName.ts b/src/utils/sortServicesByName.ts new file mode 100644 index 000000000..4bbef1269 --- /dev/null +++ b/src/utils/sortServicesByName.ts @@ -0,0 +1,9 @@ +import type { Service } from '../client/interfaces/Service'; + +export const sortServicesByName = (services: Service[]): Service[] => { + return services.sort((a, b) => { + const nameA = a.name.toLowerCase(); + const nameB = b.name.toLowerCase(); + return nameA.localeCompare(nameB, 'en'); + }); +}; diff --git a/src/utils/unique.spec.ts b/src/utils/unique.spec.ts new file mode 100644 index 000000000..f4bb98238 --- /dev/null +++ b/src/utils/unique.spec.ts @@ -0,0 +1,12 @@ +import { unique } from './unique'; + +describe('unique', () => { + it('should return correct index', () => { + expect(unique('a', 0, ['a', 'b', 'c'])).toBeTruthy(); + expect(unique('a', 1, ['a', 'b', 'c'])).toBeFalsy(); + expect(unique('a', 2, ['a', 'b', 'c'])).toBeFalsy(); + expect(unique('a', 0, ['a', 'b', 'c'])).toBeTruthy(); + expect(unique('a', 1, ['z', 'a', 'b'])).toBeTruthy(); + expect(unique('a', 2, ['y', 'z', 'a'])).toBeTruthy(); + }); +}); diff --git a/src/utils/unique.ts b/src/utils/unique.ts new file mode 100644 index 000000000..65c0f7c7a --- /dev/null +++ b/src/utils/unique.ts @@ -0,0 +1,3 @@ +export const unique = (val: T, index: number, arr: T[]): boolean => { + return arr.indexOf(val) === index; +}; diff --git a/src/utils/writeClient.spec.ts b/src/utils/writeClient.spec.ts index b616b1bcd..3c06a95a5 100644 --- a/src/utils/writeClient.spec.ts +++ b/src/utils/writeClient.spec.ts @@ -1,47 +1,59 @@ -import * as fs from 'fs'; -import * as glob from 'glob'; -import * as mkdirp from 'mkdirp'; -import * as rimraf from 'rimraf'; -import { Client } from '../client/interfaces/Client'; -import { HttpClient, Language } from '../index'; -import { Model } from '../client/interfaces/Model'; -import { Service } from '../client/interfaces/Service'; -import { Templates } from './readHandlebarsTemplates'; +import type { Client } from '../client/interfaces/Client'; +import { HttpClient } from '../HttpClient'; +import { Indent } from '../Indent'; +import { mkdir, rmdir, writeFile } from './fileSystem'; +import type { Templates } from './registerHandlebarTemplates'; import { writeClient } from './writeClient'; -jest.mock('rimraf'); -jest.mock('mkdirp'); -jest.mock('fs'); -jest.mock('glob'); - -const rimrafSync = mkdirp.sync as jest.MockedFunction; -const mkdirpSync = rimraf.sync as jest.MockedFunction; -const fsWriteFileSync = fs.writeFileSync as jest.MockedFunction; -const globSync = glob.sync as jest.MockedFunction; +jest.mock('./fileSystem'); describe('writeClient', () => { - it('should write to filesystem', () => { + it('should write to filesystem', async () => { const client: Client = { server: 'http://localhost:8080', version: 'v1', - models: new Map(), - services: new Map(), + models: [], + services: [], }; const templates: Templates = { - index: () => 'dummy', - model: () => 'dummy', - service: () => 'dummy', - settings: () => 'dummy', + index: () => 'index', + client: () => 'client', + exports: { + model: () => 'model', + schema: () => 'schema', + service: () => 'service', + }, + core: { + settings: () => 'settings', + apiError: () => 'apiError', + apiRequestOptions: () => 'apiRequestOptions', + apiResult: () => 'apiResult', + cancelablePromise: () => 'cancelablePromise', + request: () => 'request', + baseHttpRequest: () => 'baseHttpRequest', + httpRequest: () => 'httpRequest', + }, }; - globSync.mockReturnValue([]); - - writeClient(client, Language.TYPESCRIPT, HttpClient.FETCH, templates, '/'); + await writeClient( + client, + templates, + './dist', + HttpClient.FETCH, + false, + false, + true, + true, + true, + true, + Indent.SPACE_4, + 'Service', + 'AppClient' + ); - expect(rimrafSync).toBeCalled(); - expect(mkdirpSync).toBeCalled(); - expect(fsWriteFileSync).toBeCalled(); - expect(globSync).toBeCalled(); + expect(rmdir).toBeCalled(); + expect(mkdir).toBeCalled(); + expect(writeFile).toBeCalled(); }); }); diff --git a/src/utils/writeClient.ts b/src/utils/writeClient.ts index 351f8ac5e..cea2f3d88 100644 --- a/src/utils/writeClient.ts +++ b/src/utils/writeClient.ts @@ -1,63 +1,118 @@ -import * as fs from 'fs'; -import * as glob from 'glob'; -import * as mkdirp from 'mkdirp'; -import * as path from 'path'; -import * as rimraf from 'rimraf'; -import { Client } from '../client/interfaces/Client'; -import { HttpClient, Language } from '../index'; -import { Templates } from './readHandlebarsTemplates'; +import { resolve } from 'path'; + +import type { Client } from '../client/interfaces/Client'; +import type { HttpClient } from '../HttpClient'; +import type { Indent } from '../Indent'; +import { mkdir, rmdir } from './fileSystem'; +import { isDefined } from './isDefined'; +import { isSubDirectory } from './isSubdirectory'; +import type { Templates } from './registerHandlebarTemplates'; +import { writeClientClass } from './writeClientClass'; +import { writeClientCore } from './writeClientCore'; import { writeClientIndex } from './writeClientIndex'; import { writeClientModels } from './writeClientModels'; +import { writeClientSchemas } from './writeClientSchemas'; import { writeClientServices } from './writeClientServices'; -import { writeClientSettings } from './writeClientSettings'; /** - * Write our OpenAPI client, using the given templates at the given output path. + * Write our OpenAPI client, using the given templates at the given output * @param client Client object with all the models, services, etc. - * @param language The language that should be generated (Typescript or Javascript). - * @param httpClient The selected httpClient (fetch or XHR). - * @param templates Templates wrapper with all loaded Handlebars templates. - * @param outputPath + * @param templates Templates wrapper with all loaded Handlebars templates + * @param output The relative location of the output directory + * @param httpClient The selected httpClient (fetch, xhr, node or axios) + * @param useOptions Use options or arguments functions + * @param useUnionTypes Use union types instead of enums + * @param exportCore Generate core client classes + * @param exportServices Generate services + * @param exportModels Generate models + * @param exportSchemas Generate schemas + * @param exportSchemas Generate schemas + * @param indent Indentation options (4, 2 or tab) + * @param postfixServices Service name postfix + * @param postfixModels Model name postfix + * @param clientName Custom client class name + * @param request Path to custom request file */ -export function writeClient(client: Client, language: Language, httpClient: HttpClient, templates: Templates, outputPath: string): void { - const outputPathCore = path.resolve(outputPath, 'core'); - const outputPathModels = path.resolve(outputPath, 'models'); - const outputPathServices = path.resolve(outputPath, 'services'); - - // Clean output directory - try { - rimraf.sync(outputPath); - } catch (e) { - throw new Error(`Could not clean output directory`); +export const writeClient = async ( + client: Client, + templates: Templates, + output: string, + httpClient: HttpClient, + useOptions: boolean, + useUnionTypes: boolean, + exportCore: boolean, + exportServices: boolean, + exportModels: boolean, + exportSchemas: boolean, + indent: Indent, + postfixServices: string, + postfixModels: string, + clientName?: string, + request?: string +): Promise => { + const outputPath = resolve(process.cwd(), output); + const outputPathCore = resolve(outputPath, 'core'); + const outputPathModels = resolve(outputPath, 'models'); + const outputPathSchemas = resolve(outputPath, 'schemas'); + const outputPathServices = resolve(outputPath, 'services'); + + if (!isSubDirectory(process.cwd(), output)) { + throw new Error(`Output folder is not a subdirectory of the current working directory`); + } + + if (exportCore) { + await rmdir(outputPathCore); + await mkdir(outputPathCore); + await writeClientCore(client, templates, outputPathCore, httpClient, indent, clientName, request); + } + + if (exportServices) { + await rmdir(outputPathServices); + await mkdir(outputPathServices); + await writeClientServices( + client.services, + templates, + outputPathServices, + httpClient, + useUnionTypes, + useOptions, + indent, + postfixServices, + clientName + ); + } + + if (exportSchemas) { + await rmdir(outputPathSchemas); + await mkdir(outputPathSchemas); + await writeClientSchemas(client.models, templates, outputPathSchemas, httpClient, useUnionTypes, indent); + } + + if (exportModels) { + await rmdir(outputPathModels); + await mkdir(outputPathModels); + await writeClientModels(client.models, templates, outputPathModels, httpClient, useUnionTypes, indent); } - // Create new directories - try { - mkdirp.sync(outputPath); - mkdirp.sync(outputPathCore); - mkdirp.sync(outputPathModels); - mkdirp.sync(outputPathServices); - } catch (e) { - throw new Error(`Could not create output directories`); + if (isDefined(clientName)) { + await mkdir(outputPath); + await writeClientClass(client, templates, outputPath, httpClient, clientName, indent, postfixServices); } - // Copy all support files - const supportFiles = path.resolve(__dirname, `../../src/templates/${language}/`); - const supportFilesList = glob.sync('**/*.{ts,js}', { cwd: supportFiles }); - supportFilesList.forEach(file => { - fs.copyFileSync( - path.resolve(supportFiles, file), // From input path - path.resolve(outputPath, file) // To output path + if (exportCore || exportServices || exportSchemas || exportModels) { + await mkdir(outputPath); + await writeClientIndex( + client, + templates, + outputPath, + useUnionTypes, + exportCore, + exportServices, + exportModels, + exportSchemas, + postfixServices, + postfixModels, + clientName ); - }); - - // Write the client files - try { - writeClientIndex(client, language, templates, outputPath); - writeClientModels(client.models, language, templates, outputPathModels); - writeClientServices(client.services, language, templates, outputPathServices); - writeClientSettings(client, language, httpClient, templates, outputPathCore); - } catch (e) { - throw e; } -} +}; diff --git a/src/utils/writeClientClass.spec.ts b/src/utils/writeClientClass.spec.ts new file mode 100644 index 000000000..102f2eb57 --- /dev/null +++ b/src/utils/writeClientClass.spec.ts @@ -0,0 +1,43 @@ +import type { Client } from '../client/interfaces/Client'; +import { HttpClient } from '../HttpClient'; +import { Indent } from '../Indent'; +import { writeFile } from './fileSystem'; +import type { Templates } from './registerHandlebarTemplates'; +import { writeClientClass } from './writeClientClass'; + +jest.mock('./fileSystem'); + +describe('writeClientClass', () => { + it('should write to filesystem', async () => { + const client: Client = { + server: 'http://localhost:8080', + version: 'v1', + models: [], + services: [], + }; + + const templates: Templates = { + index: () => 'index', + client: () => 'client', + exports: { + model: () => 'model', + schema: () => 'schema', + service: () => 'service', + }, + core: { + settings: () => 'settings', + apiError: () => 'apiError', + apiRequestOptions: () => 'apiRequestOptions', + apiResult: () => 'apiResult', + cancelablePromise: () => 'cancelablePromise', + request: () => 'request', + baseHttpRequest: () => 'baseHttpRequest', + httpRequest: () => 'httpRequest', + }, + }; + + await writeClientClass(client, templates, './dist', HttpClient.FETCH, 'AppClient', Indent.SPACE_4, ''); + + expect(writeFile).toBeCalled(); + }); +}); diff --git a/src/utils/writeClientClass.ts b/src/utils/writeClientClass.ts new file mode 100644 index 000000000..558150bb4 --- /dev/null +++ b/src/utils/writeClientClass.ts @@ -0,0 +1,47 @@ +import { resolve } from 'path'; + +import type { Client } from '../client/interfaces/Client'; +import type { HttpClient } from '../HttpClient'; +import type { Indent } from '../Indent'; +import { writeFile } from './fileSystem'; +import { formatCode as f } from './formatCode'; +import { formatIndentation as i } from './formatIndentation'; +import { getHttpRequestName } from './getHttpRequestName'; +import type { Templates } from './registerHandlebarTemplates'; +import { sortModelsByName } from './sortModelsByName'; +import { sortServicesByName } from './sortServicesByName'; + +/** + * Generate the OpenAPI client index file using the Handlebar template and write it to disk. + * The index file just contains all the exports you need to use the client as a standalone + * library. But yuo can also import individual models and services directly. + * @param client Client object, containing, models, schemas and services + * @param templates The loaded handlebar templates + * @param outputPath Directory to write the generated files to + * @param httpClient The selected httpClient (fetch, xhr, node or axios) + * @param clientName Custom client class name + * @param indent Indentation options (4, 2 or tab) + * @param postfix Service name postfix + */ +export const writeClientClass = async ( + client: Client, + templates: Templates, + outputPath: string, + httpClient: HttpClient, + clientName: string, + indent: Indent, + postfix: string +): Promise => { + const templateResult = templates.client({ + clientName, + httpClient, + postfix, + server: client.server, + version: client.version, + models: sortModelsByName(client.models), + services: sortServicesByName(client.services), + httpRequest: getHttpRequestName(httpClient), + }); + + await writeFile(resolve(outputPath, `${clientName}.ts`), i(f(templateResult), indent)); +}; diff --git a/src/utils/writeClientCore.spec.ts b/src/utils/writeClientCore.spec.ts new file mode 100644 index 000000000..7db71f59b --- /dev/null +++ b/src/utils/writeClientCore.spec.ts @@ -0,0 +1,51 @@ +import { EOL } from 'os'; +import { resolve } from 'path'; + +import type { Client } from '../client/interfaces/Client'; +import { HttpClient } from '../HttpClient'; +import { Indent } from '../Indent'; +import { writeFile } from './fileSystem'; +import type { Templates } from './registerHandlebarTemplates'; +import { writeClientCore } from './writeClientCore'; + +jest.mock('./fileSystem'); + +describe('writeClientCore', () => { + it('should write to filesystem', async () => { + const client: Client = { + server: 'http://localhost:8080', + version: '1.0', + models: [], + services: [], + }; + + const templates: Templates = { + index: () => 'index', + client: () => 'client', + exports: { + model: () => 'model', + schema: () => 'schema', + service: () => 'service', + }, + core: { + settings: () => 'settings', + apiError: () => 'apiError', + apiRequestOptions: () => 'apiRequestOptions', + apiResult: () => 'apiResult', + cancelablePromise: () => 'cancelablePromise', + request: () => 'request', + baseHttpRequest: () => 'baseHttpRequest', + httpRequest: () => 'httpRequest', + }, + }; + + await writeClientCore(client, templates, '/', HttpClient.FETCH, Indent.SPACE_4); + + expect(writeFile).toBeCalledWith(resolve('/', '/OpenAPI.ts'), `settings${EOL}`); + expect(writeFile).toBeCalledWith(resolve('/', '/ApiError.ts'), `apiError${EOL}`); + expect(writeFile).toBeCalledWith(resolve('/', '/ApiRequestOptions.ts'), `apiRequestOptions${EOL}`); + expect(writeFile).toBeCalledWith(resolve('/', '/ApiResult.ts'), `apiResult${EOL}`); + expect(writeFile).toBeCalledWith(resolve('/', '/CancelablePromise.ts'), `cancelablePromise${EOL}`); + expect(writeFile).toBeCalledWith(resolve('/', '/request.ts'), `request${EOL}`); + }); +}); diff --git a/src/utils/writeClientCore.ts b/src/utils/writeClientCore.ts new file mode 100644 index 000000000..6d35849d2 --- /dev/null +++ b/src/utils/writeClientCore.ts @@ -0,0 +1,60 @@ +import { resolve } from 'path'; + +import type { Client } from '../client/interfaces/Client'; +import type { HttpClient } from '../HttpClient'; +import type { Indent } from '../Indent'; +import { copyFile, exists, writeFile } from './fileSystem'; +import { formatIndentation as i } from './formatIndentation'; +import { getHttpRequestName } from './getHttpRequestName'; +import { isDefined } from './isDefined'; +import type { Templates } from './registerHandlebarTemplates'; + +/** + * Generate OpenAPI core files, this includes the basic boilerplate code to handle requests. + * @param client Client object, containing, models, schemas and services + * @param templates The loaded handlebar templates + * @param outputPath Directory to write the generated files to + * @param httpClient The selected httpClient (fetch, xhr, node or axios) + * @param indent Indentation options (4, 2 or tab) + * @param clientName Custom client class name + * @param request Path to custom request file + */ +export const writeClientCore = async ( + client: Client, + templates: Templates, + outputPath: string, + httpClient: HttpClient, + indent: Indent, + clientName?: string, + request?: string +): Promise => { + const httpRequest = getHttpRequestName(httpClient); + const context = { + httpClient, + clientName, + httpRequest, + server: client.server, + version: client.version, + }; + + await writeFile(resolve(outputPath, 'OpenAPI.ts'), i(templates.core.settings(context), indent)); + await writeFile(resolve(outputPath, 'ApiError.ts'), i(templates.core.apiError(context), indent)); + await writeFile(resolve(outputPath, 'ApiRequestOptions.ts'), i(templates.core.apiRequestOptions(context), indent)); + await writeFile(resolve(outputPath, 'ApiResult.ts'), i(templates.core.apiResult(context), indent)); + await writeFile(resolve(outputPath, 'CancelablePromise.ts'), i(templates.core.cancelablePromise(context), indent)); + await writeFile(resolve(outputPath, 'request.ts'), i(templates.core.request(context), indent)); + + if (isDefined(clientName)) { + await writeFile(resolve(outputPath, 'BaseHttpRequest.ts'), i(templates.core.baseHttpRequest(context), indent)); + await writeFile(resolve(outputPath, `${httpRequest}.ts`), i(templates.core.httpRequest(context), indent)); + } + + if (request) { + const requestFile = resolve(process.cwd(), request); + const requestFileExists = await exists(requestFile); + if (!requestFileExists) { + throw new Error(`Custom request file "${requestFile}" does not exists`); + } + await copyFile(requestFile, resolve(outputPath, 'request.ts')); + } +}; diff --git a/src/utils/writeClientIndex.spec.ts b/src/utils/writeClientIndex.spec.ts index cb72a7286..a7d5b610a 100644 --- a/src/utils/writeClientIndex.spec.ts +++ b/src/utils/writeClientIndex.spec.ts @@ -1,30 +1,43 @@ -import * as fs from 'fs'; -import { Client } from '../client/interfaces/Client'; -import { Language } from '../index'; -import { Model } from '../client/interfaces/Model'; -import { Service } from '../client/interfaces/Service'; -import { Templates } from './readHandlebarsTemplates'; -import { writeClientIndex } from './writeClientIndex'; +import { resolve } from 'path'; -jest.mock('fs'); +import type { Client } from '../client/interfaces/Client'; +import { writeFile } from './fileSystem'; +import type { Templates } from './registerHandlebarTemplates'; +import { writeClientIndex } from './writeClientIndex'; -const fsWriteFileSync = fs.writeFileSync as jest.MockedFunction; +jest.mock('./fileSystem'); describe('writeClientIndex', () => { - it('should write to filesystem', () => { + it('should write to filesystem', async () => { const client: Client = { server: 'http://localhost:8080', version: '1.0', - models: new Map(), - services: new Map(), + models: [], + services: [], }; + const templates: Templates = { - index: () => 'dummy', - model: () => 'dummy', - service: () => 'dummy', - settings: () => 'dummy', + index: () => 'index', + client: () => 'client', + exports: { + model: () => 'model', + schema: () => 'schema', + service: () => 'service', + }, + core: { + settings: () => 'settings', + apiError: () => 'apiError', + apiRequestOptions: () => 'apiRequestOptions', + apiResult: () => 'apiResult', + cancelablePromise: () => 'cancelablePromise', + request: () => 'request', + baseHttpRequest: () => 'baseHttpRequest', + httpRequest: () => 'httpRequest', + }, }; - writeClientIndex(client, Language.TYPESCRIPT, templates, '/'); - expect(fsWriteFileSync).toBeCalledWith('/index.ts', 'dummy'); + + await writeClientIndex(client, templates, '/', true, true, true, true, true, 'Service', ''); + + expect(writeFile).toBeCalledWith(resolve('/', '/index.ts'), 'index'); }); }); diff --git a/src/utils/writeClientIndex.ts b/src/utils/writeClientIndex.ts index 8c25e60b3..5044294d5 100644 --- a/src/utils/writeClientIndex.ts +++ b/src/utils/writeClientIndex.ts @@ -1,34 +1,56 @@ -import * as fs from 'fs'; -import * as path from 'path'; -import { Client } from '../client/interfaces/Client'; -import { Language } from '../index'; -import { Templates } from './readHandlebarsTemplates'; -import { getFileName } from './getFileName'; -import { getModelNames } from './getModelNames'; -import { getServiceNames } from './getServiceNames'; +import { resolve } from 'path'; + +import type { Client } from '../client/interfaces/Client'; +import { writeFile } from './fileSystem'; +import { isDefined } from './isDefined'; +import { Templates } from './registerHandlebarTemplates'; +import { sortModelsByName } from './sortModelsByName'; +import { sortServicesByName } from './sortServicesByName'; /** * Generate the OpenAPI client index file using the Handlebar template and write it to disk. * The index file just contains all the exports you need to use the client as a standalone * library. But yuo can also import individual models and services directly. - * @param client Client object, containing, models, schemas and services. - * @param language The output language (Typescript or javascript). - * @param templates The loaded handlebar templates. - * @param outputPath + * @param client Client object, containing, models, schemas and services + * @param templates The loaded handlebar templates + * @param outputPath Directory to write the generated files to + * @param useUnionTypes Use union types instead of enums + * @param exportCore Generate core + * @param exportServices Generate services + * @param exportModels Generate models + * @param exportSchemas Generate schemas + * @param postfixServices Service name postfix + * @param postfixModels Model name postfix + * @param clientName Custom client class name */ -export function writeClientIndex(client: Client, language: Language, templates: Templates, outputPath: string): void { - const fileName = getFileName('index', language); - try { - fs.writeFileSync( - path.resolve(outputPath, fileName), - templates.index({ - server: client.server, - version: client.version, - models: getModelNames(client.models), - services: getServiceNames(client.services), - }) - ); - } catch (e) { - throw new Error(`Could not write index: "${fileName}"`); - } -} +export const writeClientIndex = async ( + client: Client, + templates: Templates, + outputPath: string, + useUnionTypes: boolean, + exportCore: boolean, + exportServices: boolean, + exportModels: boolean, + exportSchemas: boolean, + postfixServices: string, + postfixModels: string, + clientName?: string +): Promise => { + const templateResult = templates.index({ + exportCore, + exportServices, + exportModels, + exportSchemas, + useUnionTypes, + postfixServices, + postfixModels, + clientName, + server: client.server, + version: client.version, + models: sortModelsByName(client.models), + services: sortServicesByName(client.services), + exportClient: isDefined(clientName), + }); + + await writeFile(resolve(outputPath, 'index.ts'), templateResult); +}; diff --git a/src/utils/writeClientModels.spec.ts b/src/utils/writeClientModels.spec.ts index 3628c2e32..ee0f2b4f6 100644 --- a/src/utils/writeClientModels.spec.ts +++ b/src/utils/writeClientModels.spec.ts @@ -1,41 +1,59 @@ -import * as fs from 'fs'; -import { Language } from '../index'; -import { Model } from '../client/interfaces/Model'; -import { Templates } from './readHandlebarsTemplates'; -import { writeClientModels } from './writeClientModels'; +import { EOL } from 'os'; +import { resolve } from 'path'; -jest.mock('fs'); +import type { Model } from '../client/interfaces/Model'; +import { HttpClient } from '../HttpClient'; +import { Indent } from '../Indent'; +import { writeFile } from './fileSystem'; +import type { Templates } from './registerHandlebarTemplates'; +import { writeClientModels } from './writeClientModels'; -const fsWriteFileSync = fs.writeFileSync as jest.MockedFunction; +jest.mock('./fileSystem'); describe('writeClientModels', () => { - it('should write to filesystem', () => { - const models = new Map(); - models.set('Item', { - export: 'interface', - name: 'Item', - type: 'Item', - base: 'Item', - template: null, - link: null, - description: null, - isProperty: false, - isReadOnly: false, - isRequired: false, - isNullable: false, - imports: [], - extends: [], - enum: [], - enums: [], - properties: [], - }); + it('should write to filesystem', async () => { + const models: Model[] = [ + { + export: 'interface', + name: 'User', + type: 'User', + base: 'User', + template: null, + link: null, + description: null, + isDefinition: true, + isReadOnly: false, + isRequired: false, + isNullable: false, + imports: [], + enum: [], + enums: [], + properties: [], + }, + ]; + const templates: Templates = { - index: () => 'dummy', - model: () => 'dummy', - service: () => 'dummy', - settings: () => 'dummy', + index: () => 'index', + client: () => 'client', + exports: { + model: () => 'model', + schema: () => 'schema', + service: () => 'service', + }, + core: { + settings: () => 'settings', + apiError: () => 'apiError', + apiRequestOptions: () => 'apiRequestOptions', + apiResult: () => 'apiResult', + cancelablePromise: () => 'cancelablePromise', + request: () => 'request', + baseHttpRequest: () => 'baseHttpRequest', + httpRequest: () => 'httpRequest', + }, }; - writeClientModels(models, Language.TYPESCRIPT, templates, '/'); - expect(fsWriteFileSync).toBeCalledWith('/Item.ts', 'dummy'); + + await writeClientModels(models, templates, '/', HttpClient.FETCH, false, Indent.SPACE_4); + + expect(writeFile).toBeCalledWith(resolve('/', '/User.ts'), `model${EOL}`); }); }); diff --git a/src/utils/writeClientModels.ts b/src/utils/writeClientModels.ts index 440ba3a22..997569b9f 100644 --- a/src/utils/writeClientModels.ts +++ b/src/utils/writeClientModels.ts @@ -1,28 +1,37 @@ -import * as fs from 'fs'; -import * as path from 'path'; -import { Language } from '../index'; -import { Model } from '../client/interfaces/Model'; -import { Templates } from './readHandlebarsTemplates'; -import { exportModel } from './exportModel'; -import { format } from './format'; -import { getFileName } from './getFileName'; +import { resolve } from 'path'; + +import type { Model } from '../client/interfaces/Model'; +import type { HttpClient } from '../HttpClient'; +import type { Indent } from '../Indent'; +import { writeFile } from './fileSystem'; +import { formatCode as f } from './formatCode'; +import { formatIndentation as i } from './formatIndentation'; +import type { Templates } from './registerHandlebarTemplates'; /** * Generate Models using the Handlebar template and write to disk. - * @param models Array of Models to write. - * @param language The output language (Typescript or javascript). - * @param templates The loaded handlebar templates. - * @param outputPath + * @param models Array of Models to write + * @param templates The loaded handlebar templates + * @param outputPath Directory to write the generated files to + * @param httpClient The selected httpClient (fetch, xhr, node or axios) + * @param useUnionTypes Use union types instead of enums + * @param indent Indentation options (4, 2 or tab) */ -export function writeClientModels(models: Map, language: Language, templates: Templates, outputPath: string): void { - models.forEach(model => { - const fileName = getFileName(model.name, language); - try { - const templateData = exportModel(model); - const templateResult = templates.model(templateData); - fs.writeFileSync(path.resolve(outputPath, fileName), format(templateResult)); - } catch (e) { - throw new Error(`Could not write model: "${fileName}"`); - } - }); -} +export const writeClientModels = async ( + models: Model[], + templates: Templates, + outputPath: string, + httpClient: HttpClient, + useUnionTypes: boolean, + indent: Indent +): Promise => { + for (const model of models) { + const file = resolve(outputPath, `${model.name}.ts`); + const templateResult = templates.exports.model({ + ...model, + httpClient, + useUnionTypes, + }); + await writeFile(file, i(f(templateResult), indent)); + } +}; diff --git a/src/utils/writeClientSchemas.spec.ts b/src/utils/writeClientSchemas.spec.ts new file mode 100644 index 000000000..e75928b8c --- /dev/null +++ b/src/utils/writeClientSchemas.spec.ts @@ -0,0 +1,59 @@ +import { EOL } from 'os'; +import { resolve } from 'path'; + +import type { Model } from '../client/interfaces/Model'; +import { HttpClient } from '../HttpClient'; +import { Indent } from '../Indent'; +import { writeFile } from './fileSystem'; +import type { Templates } from './registerHandlebarTemplates'; +import { writeClientSchemas } from './writeClientSchemas'; + +jest.mock('./fileSystem'); + +describe('writeClientSchemas', () => { + it('should write to filesystem', async () => { + const models: Model[] = [ + { + export: 'interface', + name: 'User', + type: 'User', + base: 'User', + template: null, + link: null, + description: null, + isDefinition: true, + isReadOnly: false, + isRequired: false, + isNullable: false, + imports: [], + enum: [], + enums: [], + properties: [], + }, + ]; + + const templates: Templates = { + index: () => 'index', + client: () => 'client', + exports: { + model: () => 'model', + schema: () => 'schema', + service: () => 'service', + }, + core: { + settings: () => 'settings', + apiError: () => 'apiError', + apiRequestOptions: () => 'apiRequestOptions', + apiResult: () => 'apiResult', + cancelablePromise: () => 'cancelablePromise', + request: () => 'request', + baseHttpRequest: () => 'baseHttpRequest', + httpRequest: () => 'httpRequest', + }, + }; + + await writeClientSchemas(models, templates, '/', HttpClient.FETCH, false, Indent.SPACE_4); + + expect(writeFile).toBeCalledWith(resolve('/', '/$User.ts'), `schema${EOL}`); + }); +}); diff --git a/src/utils/writeClientSchemas.ts b/src/utils/writeClientSchemas.ts new file mode 100644 index 000000000..e1c885f64 --- /dev/null +++ b/src/utils/writeClientSchemas.ts @@ -0,0 +1,37 @@ +import { resolve } from 'path'; + +import type { Model } from '../client/interfaces/Model'; +import type { HttpClient } from '../HttpClient'; +import type { Indent } from '../Indent'; +import { writeFile } from './fileSystem'; +import { formatCode as f } from './formatCode'; +import { formatIndentation as i } from './formatIndentation'; +import type { Templates } from './registerHandlebarTemplates'; + +/** + * Generate Schemas using the Handlebar template and write to disk. + * @param models Array of Models to write + * @param templates The loaded handlebar templates + * @param outputPath Directory to write the generated files to + * @param httpClient The selected httpClient (fetch, xhr, node or axios) + * @param useUnionTypes Use union types instead of enums + * @param indent Indentation options (4, 2 or tab) + */ +export const writeClientSchemas = async ( + models: Model[], + templates: Templates, + outputPath: string, + httpClient: HttpClient, + useUnionTypes: boolean, + indent: Indent +): Promise => { + for (const model of models) { + const file = resolve(outputPath, `$${model.name}.ts`); + const templateResult = templates.exports.schema({ + ...model, + httpClient, + useUnionTypes, + }); + await writeFile(file, i(f(templateResult), indent)); + } +}; diff --git a/src/utils/writeClientServices.spec.ts b/src/utils/writeClientServices.spec.ts index c191d76ab..f936d6609 100644 --- a/src/utils/writeClientServices.spec.ts +++ b/src/utils/writeClientServices.spec.ts @@ -1,28 +1,47 @@ -import * as fs from 'fs'; -import { Language } from '../index'; -import { Service } from '../client/interfaces/Service'; -import { Templates } from './readHandlebarsTemplates'; -import { writeClientServices } from './writeClientServices'; +import { EOL } from 'os'; +import { resolve } from 'path'; -jest.mock('fs'); +import type { Service } from '../client/interfaces/Service'; +import { HttpClient } from '../HttpClient'; +import { Indent } from '../Indent'; +import { writeFile } from './fileSystem'; +import type { Templates } from './registerHandlebarTemplates'; +import { writeClientServices } from './writeClientServices'; -const fsWriteFileSync = fs.writeFileSync as jest.MockedFunction; +jest.mock('./fileSystem'); describe('writeClientServices', () => { - it('should write to filesystem', () => { - const services = new Map(); - services.set('Item', { - name: 'Item', - operations: [], - imports: [], - }); + it('should write to filesystem', async () => { + const services: Service[] = [ + { + name: 'User', + operations: [], + imports: [], + }, + ]; + const templates: Templates = { - index: () => 'dummy', - model: () => 'dummy', - service: () => 'dummy', - settings: () => 'dummy', + index: () => 'index', + client: () => 'client', + exports: { + model: () => 'model', + schema: () => 'schema', + service: () => 'service', + }, + core: { + settings: () => 'settings', + apiError: () => 'apiError', + apiRequestOptions: () => 'apiRequestOptions', + apiResult: () => 'apiResult', + cancelablePromise: () => 'cancelablePromise', + request: () => 'request', + baseHttpRequest: () => 'baseHttpRequest', + httpRequest: () => 'httpRequest', + }, }; - writeClientServices(services, Language.TYPESCRIPT, templates, '/'); - expect(fsWriteFileSync).toBeCalledWith('/Item.ts', 'dummy'); + + await writeClientServices(services, templates, '/', HttpClient.FETCH, false, false, Indent.SPACE_4, 'Service'); + + expect(writeFile).toBeCalledWith(resolve('/', '/UserService.ts'), `service${EOL}`); }); }); diff --git a/src/utils/writeClientServices.ts b/src/utils/writeClientServices.ts index 88aea452b..2f95341d2 100644 --- a/src/utils/writeClientServices.ts +++ b/src/utils/writeClientServices.ts @@ -1,28 +1,47 @@ -import * as fs from 'fs'; -import * as path from 'path'; -import { Language } from '../index'; -import { Service } from '../client/interfaces/Service'; -import { Templates } from './readHandlebarsTemplates'; -import { exportService } from './exportService'; -import { format } from './format'; -import { getFileName } from './getFileName'; +import { resolve } from 'path'; + +import type { Service } from '../client/interfaces/Service'; +import type { HttpClient } from '../HttpClient'; +import type { Indent } from '../Indent'; +import { writeFile } from './fileSystem'; +import { formatCode as f } from './formatCode'; +import { formatIndentation as i } from './formatIndentation'; +import { isDefined } from './isDefined'; +import type { Templates } from './registerHandlebarTemplates'; /** * Generate Services using the Handlebar template and write to disk. - * @param services Array of Services to write. - * @param language The output language (Typescript or javascript). - * @param templates The loaded handlebar templates. - * @param outputPath + * @param services Array of Services to write + * @param templates The loaded handlebar templates + * @param outputPath Directory to write the generated files to + * @param httpClient The selected httpClient (fetch, xhr, node or axios) + * @param useUnionTypes Use union types instead of enums + * @param useOptions Use options or arguments functions + * @param indent Indentation options (4, 2 or tab) + * @param postfix Service name postfix + * @param clientName Custom client class name */ -export function writeClientServices(services: Map, language: Language, templates: Templates, outputPath: string): void { - services.forEach(service => { - const fileName = getFileName(service.name, language); - try { - const templateData = exportService(service); - const templateResult = templates.service(templateData); - fs.writeFileSync(path.resolve(outputPath, fileName), format(templateResult)); - } catch (e) { - throw new Error(`Could not write service: "${fileName}"`); - } - }); -} +export const writeClientServices = async ( + services: Service[], + templates: Templates, + outputPath: string, + httpClient: HttpClient, + useUnionTypes: boolean, + useOptions: boolean, + indent: Indent, + postfix: string, + clientName?: string +): Promise => { + for (const service of services) { + const file = resolve(outputPath, `${service.name}${postfix}.ts`); + const templateResult = templates.exports.service({ + ...service, + httpClient, + useUnionTypes, + useOptions, + postfix, + exportClient: isDefined(clientName), + }); + await writeFile(file, i(f(templateResult), indent)); + } +}; diff --git a/src/utils/writeClientSettings.ts b/src/utils/writeClientSettings.ts deleted file mode 100644 index dc37ae562..000000000 --- a/src/utils/writeClientSettings.ts +++ /dev/null @@ -1,23 +0,0 @@ -import * as fs from 'fs'; -import * as path from 'path'; -import { Client } from '../client/interfaces/Client'; -import { HttpClient, Language } from '../index'; -import { Templates } from './readHandlebarsTemplates'; -import { getFileName } from './getFileName'; - -export function writeClientSettings(client: Client, language: Language, httpClient: HttpClient, templates: Templates, outputPath: string): void { - const fileName = getFileName('OpenAPI', language); - try { - fs.writeFileSync( - path.resolve(outputPath, fileName), - templates.settings({ - language, - httpClient, - server: client.server, - version: client.version, - }) - ); - } catch (e) { - throw new Error(`Could not write settings: "${fileName}"`); - } -} diff --git a/test/__snapshots__/index.spec.js.snap b/test/__snapshots__/index.spec.js.snap deleted file mode 100644 index b19492431..000000000 --- a/test/__snapshots__/index.spec.js.snap +++ /dev/null @@ -1,8296 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`generation v2 javascript file(./test/result/v2/javascript/core/ApiError.js): ./test/result/v2/javascript/core/ApiError.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { isSuccess } from \\"./isSuccess\\"; - -export class ApiError extends Error { - - constructor(result, message) { - super(message); - - this.url = result.url; - this.status = result.status; - this.statusText = result.statusText; - this.body = result.body; - } -} - -(function (ApiError) { - let Message; - (function (Message) { - Message.BAD_REQUEST = 'Bad Request'; - Message.UNAUTHORIZED = 'Unauthorized'; - Message.FORBIDDEN = 'Forbidden'; - Message.NOT_FOUND = 'Not Found'; - Message.INTERNAL_SERVER_ERROR = 'Internal Server Error'; - Message.BAD_GATEWAY = 'Bad Gateway'; - Message.SERVICE_UNAVAILABLE = 'Service Unavailable'; - Message.GENERIC_ERROR = 'Generic Error'; - })(Message = ApiError.Message || (ApiError.Message = {})); -})(ApiError || (ApiError = {})); - -/** - * Catch common errors (based on status code). - * @param result - */ -export function catchGenericError(result) { - - switch (result.status) { - case 400: throw new ApiError(result, ApiError.Message.BAD_REQUEST); - case 401: throw new ApiError(result, ApiError.Message.UNAUTHORIZED); - case 403: throw new ApiError(result, ApiError.Message.FORBIDDEN); - case 404: throw new ApiError(result, ApiError.Message.NOT_FOUND); - case 500: throw new ApiError(result, ApiError.Message.INTERNAL_SERVER_ERROR); - case 502: throw new ApiError(result, ApiError.Message.BAD_GATEWAY); - case 503: throw new ApiError(result, ApiError.Message.SERVICE_UNAVAILABLE); - } - - if (!isSuccess(result.status)) { - throw new ApiError(result, ApiError.Message.GENERIC_ERROR); - } -} -" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/core/OpenAPI.js): ./test/result/v2/javascript/core/OpenAPI.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -export let OpenAPI; -(function (OpenAPI) { - OpenAPI.BASE = 'http://localhost:8080/api'; - OpenAPI.VERSION = '9.0'; - OpenAPI.CLIENT = 'xhr'; - OpenAPI.TOKEN = ''; -})(OpenAPI || (OpenAPI = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/core/getFormData.js): ./test/result/v2/javascript/core/getFormData.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -/** - * Get FormData from object. This method is needed to upload - * multipart form data to the REST API. - * @param params Key value based object. - */ -export function getFormData(params) { - const formData = new FormData(); - for (const key in params) { - if (typeof params[key] !== 'undefined') { - const value = params[key]; - if (value !== undefined && value !== null) { - formData.append(key, value); - } - } - } - return formData; -} -" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/core/getQueryString.js): ./test/result/v2/javascript/core/getQueryString.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -/** - * Get query string from query parameters object. This method also - * supports multi-value items by creating a key for each item. - * @param params Key value based object. - */ -export function getQueryString(params) { - const qs = []; - for (const key in params) { - if (typeof params[key] !== 'undefined') { - const value = params[key]; - if (value !== undefined && value !== null) { - if (Array.isArray(value)) { - value.forEach(value => { - qs.push(\`\${encodeURIComponent(key)}=\${encodeURIComponent(String(value))}\`); - }); - } else { - qs.push(\`\${encodeURIComponent(key)}=\${encodeURIComponent(String(value))}\`); - } - } - } - } - if (qs.length > 0) { - return \`?\${qs.join('&')}\`; - } - return ''; -} -" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/core/isSuccess.js): ./test/result/v2/javascript/core/isSuccess.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -/** - * Check success response code. - * @param status Status code - */ -export function isSuccess(status) { - return status >= 200 && status < 300; -} -" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/core/request.js): ./test/result/v2/javascript/core/request.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import {getFormData} from './getFormData'; -import {getQueryString} from './getQueryString'; -import {OpenAPI} from './OpenAPI'; -import {requestUsingFetch} from './requestUsingFetch'; -import {requestUsingXHR} from './requestUsingXHR'; - -/** - * Create the request. - * @param options Request method options. - * @returns Result object (see above) - */ -export async function request(options) { - - // Create the request URL - let url = \`\${OpenAPI.BASE}\${options.path}\`; - - // Create request headers - const headers = new Headers({ - ...options.headers, - Accept: 'application/json' - }); - - // Create request settings - const request = { - headers, - method: options.method, - credentials: 'same-origin' - }; - - // If we have a bearer token then we set the authentication header. - if (OpenAPI.TOKEN !== null && OpenAPI.TOKEN !== '') { - headers.append('Authorization', \`Bearer \${OpenAPI.TOKEN}\`); - } - - // Add the query parameters (if defined). - if (options.query) { - url += getQueryString(options.query); - } - - // Append formData as body - if (options.formData) { - request.body = getFormData(options.formData); - } else if (options.body) { - - // If this is blob data, then pass it directly to the body and set content type. - // Otherwise we just convert request data to JSON string (needed for fetch api) - if (options.body instanceof Blob) { - request.body = options.body; - if (options.body.type) { - headers.append('Content-Type', options.body.type); - } - } else { - request.body = JSON.stringify(options.body); - headers.append('Content-Type', 'application/json'); - } - } - - try { - switch (OpenAPI.CLIENT) { - case 'xhr': - return await requestUsingXHR(url, request); - default: - return await requestUsingFetch(url, request); - } - } catch (error) { - return { - url, - ok: false, - status: 0, - statusText: '', - body: error - }; - } -} -" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/core/requestUsingFetch.js): ./test/result/v2/javascript/core/requestUsingFetch.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -/** - * Request content using the new Fetch API. This is the default API that is used and - * is create for all JSON, XML and text objects. However it is limited to UTF-8. - * This is a problem for some of the Docs content, since that requires UTF-16! - * @param url The url to request. - * @param request The request object, containing method, headers, body, etc. - */ -export async function requestUsingFetch(url, request) { - - // Fetch response using fetch API. - const response = await fetch(url, request); - - // Create result object. - const result = { - url, - ok: response.ok, - status: response.status, - statusText: response.statusText, - body: null - }; - - // Try to parse the content for any response status code. - // We check the \\"Content-Type\\" header to see if we need to parse the - // content as json or as plain text. - const contentType = response.headers.get('Content-Type'); - if (contentType) { - switch (contentType.toLowerCase()) { - case 'application/json': - case 'application/json; charset=utf-8': - result.body = await response.json(); - break; - - case 'text/plain': - case 'text/xml': - case 'text/xml; charset=utf-8': - case 'text/xml; charset=utf-16': - result.body = await response.text(); - break; - } - } - - return result; -} -" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/core/requestUsingXHR.js): ./test/result/v2/javascript/core/requestUsingXHR.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { isSuccess } from './isSuccess'; - -/** - * Request content using the new legacy XMLHttpRequest API. This method is useful - * when we want to request UTF-16 content, since it natively supports loading UTF-16. - * We could do the same with the Fetch API, but then we will need to convert the - * content using JavaScript... And that is very very slow. - * @param url The url to request. - * @param request The request object, containing method, headers, body, etc. - */ -export async function requestUsingXHR(url, request) { - return new Promise(resolve => { - const xhr = new XMLHttpRequest(); - - // Open the request, remember to do this before adding any headers, - // because the request needs to be initialized! - xhr.open(request.method, url, true); - - // Add the headers (required when dealing with JSON) - const headers = request.headers as Headers; - headers.forEach((value, key) => { - xhr.setRequestHeader(key, value); - }); - - // Register the readystate handler, this will fire when the request is done. - xhr.onreadystatechange = () => { - if (xhr.readyState === XMLHttpRequest.DONE) { - - // Create result object. - const result = { - url, - ok: isSuccess(xhr.status), - status: xhr.status, - statusText: xhr.statusText, - body: null - }; - - // Try to parse the content for any response status code. - // We check the \\"Content-Type\\" header to see if we need to parse the - // content as json or as plain text. - const contentType = xhr.getResponseHeader('Content-Type'); - if (contentType) { - switch (contentType.toLowerCase()) { - case 'application/json': - case 'application/json; charset=utf-8': - result.body = JSON.parse(xhr.responseText); - break; - - case 'text/plain': - case 'text/xml': - case 'text/xml; charset=utf-8': - case 'text/xml; charset=utf-16': - result.body = xhr.responseText; - break; - } - } - - // Done! - resolve(result); - } - }; - - // Start the request! - xhr.send(request.body); - }); -} -" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/index.js): ./test/result/v2/javascript/index.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -export { ApiError } from './core/ApiError'; -export { isSuccess } from './core/isSuccess'; -export { OpenAPI } from './core/OpenAPI'; - -export { ArrayWithArray } from './models/ArrayWithArray'; -export { ArrayWithBooleans } from './models/ArrayWithBooleans'; -export { ArrayWithNumbers } from './models/ArrayWithNumbers'; -export { ArrayWithProperties } from './models/ArrayWithProperties'; -export { ArrayWithReferences } from './models/ArrayWithReferences'; -export { ArrayWithStrings } from './models/ArrayWithStrings'; - -export { DictionaryWithArray } from './models/DictionaryWithArray'; -export { DictionaryWithDictionary } from './models/DictionaryWithDictionary'; -export { DictionaryWithProperties } from './models/DictionaryWithProperties'; -export { DictionaryWithReference } from './models/DictionaryWithReference'; -export { DictionaryWithString } from './models/DictionaryWithString'; -export { EnumFromDescription } from './models/EnumFromDescription'; -export { EnumWithNumbers } from './models/EnumWithNumbers'; -export { EnumWithStrings } from './models/EnumWithStrings'; -export { ModelLink } from './models/ModelLink'; -export { ModelThatExtends } from './models/ModelThatExtends'; -export { ModelThatExtendsExtends } from './models/ModelThatExtendsExtends'; -export { ModelWithArray } from './models/ModelWithArray'; -export { ModelWithBoolean } from './models/ModelWithBoolean'; -export { ModelWithCircularReference } from './models/ModelWithCircularReference'; -export { ModelWithDictionary } from './models/ModelWithDictionary'; -export { ModelWithDuplicateImports } from './models/ModelWithDuplicateImports'; -export { ModelWithDuplicateProperties } from './models/ModelWithDuplicateProperties'; -export { ModelWithEnum } from './models/ModelWithEnum'; -export { ModelWithEnumFromDescription } from './models/ModelWithEnumFromDescription'; -export { ModelWithInteger } from './models/ModelWithInteger'; -export { ModelWithLink } from './models/ModelWithLink'; -export { ModelWithNestedEnums } from './models/ModelWithNestedEnums'; -export { ModelWithNestedProperties } from './models/ModelWithNestedProperties'; -export { ModelWithProperties } from './models/ModelWithProperties'; -export { ModelWithReference } from './models/ModelWithReference'; -export { ModelWithString } from './models/ModelWithString'; -export { SimpleBoolean } from './models/SimpleBoolean'; -export { SimpleFile } from './models/SimpleFile'; -export { SimpleInteger } from './models/SimpleInteger'; -export { SimpleReference } from './models/SimpleReference'; -export { SimpleString } from './models/SimpleString'; - -export { ComplexService } from './services/ComplexService'; -export { ParametersService } from './services/ParametersService'; -export { ResponseService } from './services/ResponseService'; -export { SimpleService } from './services/SimpleService'; -export { TypesService } from './services/TypesService'; -" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/ArrayWithArray.js): ./test/result/v2/javascript/models/ArrayWithArray.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a simple array containing an array - */ -export let ArrayWithArray; -(function (ArrayWithArray) { - - ArrayWithArray.schema = yup.array().of(yup.array().of(ModelWithString.schema)); - - ArrayWithArray.validate = async function(value) { - return ArrayWithArray.schema.validate(value, { strict: true }); - }; - - ArrayWithArray.validateSync = function(value) { - return ArrayWithArray.schema.validateSync(value, { strict: true }); - }; - -})(ArrayWithArray || (ArrayWithArray = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/ArrayWithBooleans.js): ./test/result/v2/javascript/models/ArrayWithBooleans.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple array with booleans - */ -export let ArrayWithBooleans; -(function (ArrayWithBooleans) { - - ArrayWithBooleans.schema = yup.array().of(yup.boolean()); - - ArrayWithBooleans.validate = async function(value) { - return ArrayWithBooleans.schema.validate(value, { strict: true }); - }; - - ArrayWithBooleans.validateSync = function(value) { - return ArrayWithBooleans.schema.validateSync(value, { strict: true }); - }; - -})(ArrayWithBooleans || (ArrayWithBooleans = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/ArrayWithNumbers.js): ./test/result/v2/javascript/models/ArrayWithNumbers.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple array with numbers - */ -export let ArrayWithNumbers; -(function (ArrayWithNumbers) { - - ArrayWithNumbers.schema = yup.array().of(yup.number()); - - ArrayWithNumbers.validate = async function(value) { - return ArrayWithNumbers.schema.validate(value, { strict: true }); - }; - - ArrayWithNumbers.validateSync = function(value) { - return ArrayWithNumbers.schema.validateSync(value, { strict: true }); - }; - -})(ArrayWithNumbers || (ArrayWithNumbers = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/ArrayWithProperties.js): ./test/result/v2/javascript/models/ArrayWithProperties.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple array with properties - */ -export let ArrayWithProperties; -(function (ArrayWithProperties) { - - ArrayWithProperties.schema = yup.array().of(( - yup.object().shape({ - foo: yup.lazy(() => yup.string().default(undefined)), - bar: yup.lazy(() => yup.string().default(undefined)) - }).noUnknown() - )); - - ArrayWithProperties.validate = async function(value) { - return ArrayWithProperties.schema.validate(value, { strict: true }); - }; - - ArrayWithProperties.validateSync = function(value) { - return ArrayWithProperties.schema.validateSync(value, { strict: true }); - }; - -})(ArrayWithProperties || (ArrayWithProperties = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/ArrayWithReferences.js): ./test/result/v2/javascript/models/ArrayWithReferences.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a simple array with references - */ -export let ArrayWithReferences; -(function (ArrayWithReferences) { - - ArrayWithReferences.schema = yup.array().of(ModelWithString.schema); - - ArrayWithReferences.validate = async function(value) { - return ArrayWithReferences.schema.validate(value, { strict: true }); - }; - - ArrayWithReferences.validateSync = function(value) { - return ArrayWithReferences.schema.validateSync(value, { strict: true }); - }; - -})(ArrayWithReferences || (ArrayWithReferences = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/ArrayWithStrings.js): ./test/result/v2/javascript/models/ArrayWithStrings.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple array with strings - */ -export let ArrayWithStrings; -(function (ArrayWithStrings) { - - ArrayWithStrings.schema = yup.array().of(yup.string()); - - ArrayWithStrings.validate = async function(value) { - return ArrayWithStrings.schema.validate(value, { strict: true }); - }; - - ArrayWithStrings.validateSync = function(value) { - return ArrayWithStrings.schema.validateSync(value, { strict: true }); - }; - -})(ArrayWithStrings || (ArrayWithStrings = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/DictionaryWithArray.js): ./test/result/v2/javascript/models/DictionaryWithArray.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a complex dictionary - */ -export let DictionaryWithArray; -(function (DictionaryWithArray) { - - DictionaryWithArray.schema = yup.lazy(value => { - return yup.object().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: yup.array().of(ModelWithString.schema) - }), {}) - ); - }); - - DictionaryWithArray.validate = async function(value) { - return DictionaryWithArray.schema.validate(value, { strict: true }); - }; - - DictionaryWithArray.validateSync = function(value) { - return DictionaryWithArray.schema.validateSync(value, { strict: true }); - }; - -})(DictionaryWithArray || (DictionaryWithArray = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/DictionaryWithDictionary.js): ./test/result/v2/javascript/models/DictionaryWithDictionary.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - - -import * as yup from 'yup'; - -/** - * This is a string dictionary - */ -export let DictionaryWithDictionary; -(function (DictionaryWithDictionary) { - - DictionaryWithDictionary.schema = yup.lazy(value => { - return yup.object().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: yup.lazy(value => { - return yup.object().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: yup.string() - }), {}) - ); - }) - }), {}) - ); - }); - - DictionaryWithDictionary.validate = async function(value) { - return DictionaryWithDictionary.schema.validate(value, { strict: true }); - }; - - DictionaryWithDictionary.validateSync = function(value) { - return DictionaryWithDictionary.schema.validateSync(value, { strict: true }); - }; - -})(DictionaryWithDictionary || (DictionaryWithDictionary = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/DictionaryWithProperties.js): ./test/result/v2/javascript/models/DictionaryWithProperties.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - - -import * as yup from 'yup'; - -/** - * This is a complex dictionary - */ -export let DictionaryWithProperties; -(function (DictionaryWithProperties) { - - DictionaryWithProperties.schema = yup.lazy(value => { - return yup.object().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: ( - yup.object().shape({ - foo: yup.lazy(() => yup.string().default(undefined)), - bar: yup.lazy(() => yup.string().default(undefined)) - }).noUnknown() - ) - }), {}) - ); - }); - - DictionaryWithProperties.validate = async function(value) { - return DictionaryWithProperties.schema.validate(value, { strict: true }); - }; - - DictionaryWithProperties.validateSync = function(value) { - return DictionaryWithProperties.schema.validateSync(value, { strict: true }); - }; - -})(DictionaryWithProperties || (DictionaryWithProperties = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/DictionaryWithReference.js): ./test/result/v2/javascript/models/DictionaryWithReference.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a string reference - */ -export let DictionaryWithReference; -(function (DictionaryWithReference) { - - DictionaryWithReference.schema = yup.lazy(value => { - return yup.object().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: ModelWithString.schema - }), {}) - ); - }); - - DictionaryWithReference.validate = async function(value) { - return DictionaryWithReference.schema.validate(value, { strict: true }); - }; - - DictionaryWithReference.validateSync = function(value) { - return DictionaryWithReference.schema.validateSync(value, { strict: true }); - }; - -})(DictionaryWithReference || (DictionaryWithReference = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/DictionaryWithString.js): ./test/result/v2/javascript/models/DictionaryWithString.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - - -import * as yup from 'yup'; - -/** - * This is a string dictionary - */ -export let DictionaryWithString; -(function (DictionaryWithString) { - - DictionaryWithString.schema = yup.lazy(value => { - return yup.object().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: yup.string() - }), {}) - ); - }); - - DictionaryWithString.validate = async function(value) { - return DictionaryWithString.schema.validate(value, { strict: true }); - }; - - DictionaryWithString.validateSync = function(value) { - return DictionaryWithString.schema.validateSync(value, { strict: true }); - }; - -})(DictionaryWithString || (DictionaryWithString = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/EnumFromDescription.js): ./test/result/v2/javascript/models/EnumFromDescription.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * Success=1,Warning=2,Error=3 - */ -export let EnumFromDescription; -(function (EnumFromDescription) { - - EnumFromDescription.ERROR = 3; - EnumFromDescription.SUCCESS = 1; - EnumFromDescription.WARNING = 2; - - EnumFromDescription.schema = yup.mixed().oneOf([ - 3, - 1, - 2 - ]); - - EnumFromDescription.validate = async function(value) { - return EnumFromDescription.schema.validate(value, { strict: true }); - }; - - EnumFromDescription.validateSync = function(value) { - return EnumFromDescription.schema.validateSync(value, { strict: true }); - }; - -})(EnumFromDescription || (EnumFromDescription = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/EnumWithNumbers.js): ./test/result/v2/javascript/models/EnumWithNumbers.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple enum with numbers - */ -export let EnumWithNumbers; -(function (EnumWithNumbers) { - - EnumWithNumbers.NUM_1 = 1; - EnumWithNumbers.NUM_2 = 2; - EnumWithNumbers.NUM_3 = 3; - - EnumWithNumbers.schema = yup.mixed().oneOf([ - 1, - 2, - 3 - ]); - - EnumWithNumbers.validate = async function(value) { - return EnumWithNumbers.schema.validate(value, { strict: true }); - }; - - EnumWithNumbers.validateSync = function(value) { - return EnumWithNumbers.schema.validateSync(value, { strict: true }); - }; - -})(EnumWithNumbers || (EnumWithNumbers = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/EnumWithStrings.js): ./test/result/v2/javascript/models/EnumWithStrings.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple enum with strings - */ -export let EnumWithStrings; -(function (EnumWithStrings) { - - EnumWithStrings.ERROR = 'Error'; - EnumWithStrings.SUCCESS = 'Success'; - EnumWithStrings.WARNING = 'Warning'; - - EnumWithStrings.schema = yup.mixed().oneOf([ - 'Error', - 'Success', - 'Warning' - ]); - - EnumWithStrings.validate = async function(value) { - return EnumWithStrings.schema.validate(value, { strict: true }); - }; - - EnumWithStrings.validateSync = function(value) { - return EnumWithStrings.schema.validateSync(value, { strict: true }); - }; - -})(EnumWithStrings || (EnumWithStrings = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/ModelLink.js): ./test/result/v2/javascript/models/ModelLink.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a model that can have a template?? - */ -export let ModelLink; -(function (ModelLink) { - - ModelLink.schema = ( - yup.object().shape({ - id: yup.lazy(() => yup.string().default(undefined)) - }).noUnknown() - ); - - ModelLink.validate = async function(value) { - return ModelLink.schema.validate(value, { strict: true }); - }; - - ModelLink.validateSync = function(value) { - return ModelLink.schema.validateSync(value, { strict: true }); - }; - -})(ModelLink || (ModelLink = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/ModelThatExtends.js): ./test/result/v2/javascript/models/ModelThatExtends.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a model that extends another model - */ -export let ModelThatExtends; -(function (ModelThatExtends) { - - ModelThatExtends.schema = ( - ModelWithString.schema.concat( - yup.object().shape({ - propExtendsA: yup.lazy(() => yup.string().default(undefined)), - propExtendsB: yup.lazy(() => ModelWithString.schema.default(undefined)) - }).noUnknown() - ) - ); - - ModelThatExtends.validate = async function(value) { - return ModelThatExtends.schema.validate(value, { strict: true }); - }; - - ModelThatExtends.validateSync = function(value) { - return ModelThatExtends.schema.validateSync(value, { strict: true }); - }; - -})(ModelThatExtends || (ModelThatExtends = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/ModelThatExtendsExtends.js): ./test/result/v2/javascript/models/ModelThatExtendsExtends.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelThatExtends } from '../models/ModelThatExtends'; -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a model that extends another model - */ -export let ModelThatExtendsExtends; -(function (ModelThatExtendsExtends) { - - ModelThatExtendsExtends.schema = ( - ModelWithString.schema.concat( - ModelThatExtends.schema.concat( - yup.object().shape({ - propExtendsC: yup.lazy(() => yup.string().default(undefined)), - propExtendsD: yup.lazy(() => ModelWithString.schema.default(undefined)) - }).noUnknown() - ) - ) - ); - - ModelThatExtendsExtends.validate = async function(value) { - return ModelThatExtendsExtends.schema.validate(value, { strict: true }); - }; - - ModelThatExtendsExtends.validateSync = function(value) { - return ModelThatExtendsExtends.schema.validateSync(value, { strict: true }); - }; - -})(ModelThatExtendsExtends || (ModelThatExtendsExtends = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/ModelWithArray.js): ./test/result/v2/javascript/models/ModelWithArray.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a model with one property containing an array - */ -export let ModelWithArray; -(function (ModelWithArray) { - - ModelWithArray.schema = ( - yup.object().shape({ - prop: yup.lazy(() => yup.array().of(ModelWithString.schema).default(undefined)) - }).noUnknown() - ); - - ModelWithArray.validate = async function(value) { - return ModelWithArray.schema.validate(value, { strict: true }); - }; - - ModelWithArray.validateSync = function(value) { - return ModelWithArray.schema.validateSync(value, { strict: true }); - }; - -})(ModelWithArray || (ModelWithArray = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/ModelWithBoolean.js): ./test/result/v2/javascript/models/ModelWithBoolean.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a model with one boolean property - */ -export let ModelWithBoolean; -(function (ModelWithBoolean) { - - ModelWithBoolean.schema = ( - yup.object().shape({ - prop: yup.lazy(() => yup.boolean().default(undefined)) - }).noUnknown() - ); - - ModelWithBoolean.validate = async function(value) { - return ModelWithBoolean.schema.validate(value, { strict: true }); - }; - - ModelWithBoolean.validateSync = function(value) { - return ModelWithBoolean.schema.validateSync(value, { strict: true }); - }; - -})(ModelWithBoolean || (ModelWithBoolean = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/ModelWithCircularReference.js): ./test/result/v2/javascript/models/ModelWithCircularReference.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a model with one property containing a circular reference - */ -export let ModelWithCircularReference; -(function (ModelWithCircularReference) { - - ModelWithCircularReference.schema = ( - yup.object().shape({ - prop: yup.lazy(() => ModelWithCircularReference.schema.default(undefined)) - }).noUnknown() - ); - - ModelWithCircularReference.validate = async function(value) { - return ModelWithCircularReference.schema.validate(value, { strict: true }); - }; - - ModelWithCircularReference.validateSync = function(value) { - return ModelWithCircularReference.schema.validateSync(value, { strict: true }); - }; - -})(ModelWithCircularReference || (ModelWithCircularReference = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/ModelWithDictionary.js): ./test/result/v2/javascript/models/ModelWithDictionary.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - - -import * as yup from 'yup'; - -/** - * This is a model with one property containing a dictionary - */ -export let ModelWithDictionary; -(function (ModelWithDictionary) { - - ModelWithDictionary.schema = ( - yup.object().shape({ - prop: yup.lazy(() => yup.lazy(value => { - return yup.object().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: yup.string() - }), {}) - ); - }).default(undefined)) - }).noUnknown() - ); - - ModelWithDictionary.validate = async function(value) { - return ModelWithDictionary.schema.validate(value, { strict: true }); - }; - - ModelWithDictionary.validateSync = function(value) { - return ModelWithDictionary.schema.validateSync(value, { strict: true }); - }; - -})(ModelWithDictionary || (ModelWithDictionary = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/ModelWithDuplicateImports.js): ./test/result/v2/javascript/models/ModelWithDuplicateImports.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a model with duplicated imports - */ -export let ModelWithDuplicateImports; -(function (ModelWithDuplicateImports) { - - ModelWithDuplicateImports.schema = ( - yup.object().shape({ - propA: yup.lazy(() => ModelWithString.schema.default(undefined)), - propB: yup.lazy(() => ModelWithString.schema.default(undefined)), - propC: yup.lazy(() => ModelWithString.schema.default(undefined)) - }).noUnknown() - ); - - ModelWithDuplicateImports.validate = async function(value) { - return ModelWithDuplicateImports.schema.validate(value, { strict: true }); - }; - - ModelWithDuplicateImports.validateSync = function(value) { - return ModelWithDuplicateImports.schema.validateSync(value, { strict: true }); - }; - -})(ModelWithDuplicateImports || (ModelWithDuplicateImports = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/ModelWithDuplicateProperties.js): ./test/result/v2/javascript/models/ModelWithDuplicateProperties.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a model with duplicated properties - */ -export let ModelWithDuplicateProperties; -(function (ModelWithDuplicateProperties) { - - ModelWithDuplicateProperties.schema = ( - yup.object().shape({ - prop: yup.lazy(() => ModelWithString.schema.default(undefined)) - }).noUnknown() - ); - - ModelWithDuplicateProperties.validate = async function(value) { - return ModelWithDuplicateProperties.schema.validate(value, { strict: true }); - }; - - ModelWithDuplicateProperties.validateSync = function(value) { - return ModelWithDuplicateProperties.schema.validateSync(value, { strict: true }); - }; - -})(ModelWithDuplicateProperties || (ModelWithDuplicateProperties = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/ModelWithEnum.js): ./test/result/v2/javascript/models/ModelWithEnum.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a model with one enum - */ -export let ModelWithEnum; -(function (ModelWithEnum) { - - /** - * This is a simple enum with strings - */ - ModelWithEnum.test = { - SUCCESS: 'Success', - WARNING: 'Warning', - ERROR: 'Error' - }; - - ModelWithEnum.schema = ( - yup.object().shape({ - test: yup.lazy(() => yup.mixed().oneOf([ - test.SUCCESS, - test.WARNING, - test.ERROR - ]).default(undefined)) - }).noUnknown() - ); - - ModelWithEnum.validate = async function(value) { - return ModelWithEnum.schema.validate(value, { strict: true }); - }; - - ModelWithEnum.validateSync = function(value) { - return ModelWithEnum.schema.validateSync(value, { strict: true }); - }; - -})(ModelWithEnum || (ModelWithEnum = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/ModelWithEnumFromDescription.js): ./test/result/v2/javascript/models/ModelWithEnumFromDescription.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a model with one enum - */ -export let ModelWithEnumFromDescription; -(function (ModelWithEnumFromDescription) { - - /** - * Success=1,Warning=2,Error=3 - */ - ModelWithEnumFromDescription.test = { - SUCCESS: 1, - WARNING: 2, - ERROR: 3 - }; - - ModelWithEnumFromDescription.schema = ( - yup.object().shape({ - test: yup.lazy(() => yup.mixed().oneOf([ - test.SUCCESS, - test.WARNING, - test.ERROR - ]).default(undefined)) - }).noUnknown() - ); - - ModelWithEnumFromDescription.validate = async function(value) { - return ModelWithEnumFromDescription.schema.validate(value, { strict: true }); - }; - - ModelWithEnumFromDescription.validateSync = function(value) { - return ModelWithEnumFromDescription.schema.validateSync(value, { strict: true }); - }; - -})(ModelWithEnumFromDescription || (ModelWithEnumFromDescription = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/ModelWithInteger.js): ./test/result/v2/javascript/models/ModelWithInteger.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a model with one number property - */ -export let ModelWithInteger; -(function (ModelWithInteger) { - - ModelWithInteger.schema = ( - yup.object().shape({ - prop: yup.lazy(() => yup.number().default(undefined)) - }).noUnknown() - ); - - ModelWithInteger.validate = async function(value) { - return ModelWithInteger.schema.validate(value, { strict: true }); - }; - - ModelWithInteger.validateSync = function(value) { - return ModelWithInteger.schema.validateSync(value, { strict: true }); - }; - -})(ModelWithInteger || (ModelWithInteger = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/ModelWithLink.js): ./test/result/v2/javascript/models/ModelWithLink.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelLink } from '../models/ModelLink'; -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a model that can have a template?? - */ -export let ModelWithLink; -(function (ModelWithLink) { - - ModelWithLink.schema = ( - yup.object().shape({ - prop: yup.lazy(() => ModelLink.schema.default(undefined)) - }).noUnknown() - ); - - ModelWithLink.validate = async function(value) { - return ModelWithLink.schema.validate(value, { strict: true }); - }; - - ModelWithLink.validateSync = function(value) { - return ModelWithLink.schema.validateSync(value, { strict: true }); - }; - -})(ModelWithLink || (ModelWithLink = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/ModelWithNestedEnums.js): ./test/result/v2/javascript/models/ModelWithNestedEnums.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { array } from '../models/array'; - -import * as yup from 'yup'; - -/** - * This is a model with nested enums - */ -export let ModelWithNestedEnums; -(function (ModelWithNestedEnums) { - - ModelWithNestedEnums.schema = ( - yup.object().shape({ - arrayWithDescription: yup.lazy(() => yup.mixed().default(undefined)), - arrayWithEnum: yup.lazy(() => yup.mixed().default(undefined)), - dictionaryWithEnum: yup.lazy(() => yup.lazy(value => { - return yup.object().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: yup.mixed().oneOf([ - 'Success', - 'Warning', - 'Error' - ]) - }), {}) - ); - }).default(undefined)), - dictionaryWithEnumFromDescription: yup.lazy(() => yup.lazy(value => { - return yup.object().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: yup.mixed().oneOf([ - 1, - 2, - 3 - ]) - }), {}) - ); - }).default(undefined)) - }).noUnknown() - ); - - ModelWithNestedEnums.validate = async function(value) { - return ModelWithNestedEnums.schema.validate(value, { strict: true }); - }; - - ModelWithNestedEnums.validateSync = function(value) { - return ModelWithNestedEnums.schema.validateSync(value, { strict: true }); - }; - -})(ModelWithNestedEnums || (ModelWithNestedEnums = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/ModelWithNestedProperties.js): ./test/result/v2/javascript/models/ModelWithNestedProperties.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a model with one nested property - */ -export let ModelWithNestedProperties; -(function (ModelWithNestedProperties) { - - ModelWithNestedProperties.schema = ( - yup.object().shape({ - first: yup.lazy(() => ( - yup.object().shape({ - second: yup.lazy(() => ( - yup.object().shape({ - third: yup.lazy(() => yup.string().default(undefined)).isRequired() - }).noUnknown() - ).default(undefined)).isRequired() - }).noUnknown() - ).default(undefined)).isRequired() - }).noUnknown() - ); - - ModelWithNestedProperties.validate = async function(value) { - return ModelWithNestedProperties.schema.validate(value, { strict: true }); - }; - - ModelWithNestedProperties.validateSync = function(value) { - return ModelWithNestedProperties.schema.validateSync(value, { strict: true }); - }; - -})(ModelWithNestedProperties || (ModelWithNestedProperties = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/ModelWithProperties.js): ./test/result/v2/javascript/models/ModelWithProperties.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a model with one nested property - */ -export let ModelWithProperties; -(function (ModelWithProperties) { - - ModelWithProperties.schema = ( - yup.object().shape({ - boolean: yup.lazy(() => yup.boolean().default(undefined)), - number: yup.lazy(() => yup.number().default(undefined)), - reference: yup.lazy(() => ModelWithString.schema.default(undefined)), - required: yup.lazy(() => yup.string().default(undefined)).isRequired(), - requiredAndreadOnly: yup.lazy(() => yup.string().default(undefined)).isRequired(), - string: yup.lazy(() => yup.string().default(undefined)) - }).noUnknown() - ); - - ModelWithProperties.validate = async function(value) { - return ModelWithProperties.schema.validate(value, { strict: true }); - }; - - ModelWithProperties.validateSync = function(value) { - return ModelWithProperties.schema.validateSync(value, { strict: true }); - }; - -})(ModelWithProperties || (ModelWithProperties = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/ModelWithReference.js): ./test/result/v2/javascript/models/ModelWithReference.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a model with one property containing a reference - */ -export let ModelWithReference; -(function (ModelWithReference) { - - ModelWithReference.schema = ( - yup.object().shape({ - prop: yup.lazy(() => ModelWithString.schema.default(undefined)) - }).noUnknown() - ); - - ModelWithReference.validate = async function(value) { - return ModelWithReference.schema.validate(value, { strict: true }); - }; - - ModelWithReference.validateSync = function(value) { - return ModelWithReference.schema.validateSync(value, { strict: true }); - }; - -})(ModelWithReference || (ModelWithReference = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/ModelWithString.js): ./test/result/v2/javascript/models/ModelWithString.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a model with one string property - */ -export let ModelWithString; -(function (ModelWithString) { - - ModelWithString.schema = ( - yup.object().shape({ - prop: yup.lazy(() => yup.string().default(undefined)) - }).noUnknown() - ); - - ModelWithString.validate = async function(value) { - return ModelWithString.schema.validate(value, { strict: true }); - }; - - ModelWithString.validateSync = function(value) { - return ModelWithString.schema.validateSync(value, { strict: true }); - }; - -})(ModelWithString || (ModelWithString = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/SimpleBoolean.js): ./test/result/v2/javascript/models/SimpleBoolean.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple boolean - */ -export let SimpleBoolean; -(function (SimpleBoolean) { - - SimpleBoolean.schema = yup.boolean(); - - SimpleBoolean.validate = async function(value) { - return SimpleBoolean.schema.validate(value, { strict: true }); - }; - - SimpleBoolean.validateSync = function(value) { - return SimpleBoolean.schema.validateSync(value, { strict: true }); - }; - -})(SimpleBoolean || (SimpleBoolean = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/SimpleFile.js): ./test/result/v2/javascript/models/SimpleFile.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple file - */ -export let SimpleFile; -(function (SimpleFile) { - - SimpleFile.schema = yup.mixed(); - - SimpleFile.validate = async function(value) { - return SimpleFile.schema.validate(value, { strict: true }); - }; - - SimpleFile.validateSync = function(value) { - return SimpleFile.schema.validateSync(value, { strict: true }); - }; - -})(SimpleFile || (SimpleFile = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/SimpleInteger.js): ./test/result/v2/javascript/models/SimpleInteger.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple number - */ -export let SimpleInteger; -(function (SimpleInteger) { - - SimpleInteger.schema = yup.number(); - - SimpleInteger.validate = async function(value) { - return SimpleInteger.schema.validate(value, { strict: true }); - }; - - SimpleInteger.validateSync = function(value) { - return SimpleInteger.schema.validateSync(value, { strict: true }); - }; - -})(SimpleInteger || (SimpleInteger = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/SimpleReference.js): ./test/result/v2/javascript/models/SimpleReference.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a simple reference - */ -export let SimpleReference; -(function (SimpleReference) { - - SimpleReference.schema = ModelWithString.schema; - - SimpleReference.validate = async function(value) { - return SimpleReference.schema.validate(value, { strict: true }); - }; - - SimpleReference.validateSync = function(value) { - return SimpleReference.schema.validateSync(value, { strict: true }); - }; - -})(SimpleReference || (SimpleReference = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/models/SimpleString.js): ./test/result/v2/javascript/models/SimpleString.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple string - */ -export let SimpleString; -(function (SimpleString) { - - SimpleString.schema = yup.string(); - - SimpleString.validate = async function(value) { - return SimpleString.schema.validate(value, { strict: true }); - }; - - SimpleString.validateSync = function(value) { - return SimpleString.schema.validateSync(value, { strict: true }); - }; - -})(SimpleString || (SimpleString = {}));" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/services/ComplexService.js): ./test/result/v2/javascript/services/ComplexService.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ApiError, catchGenericError } from '../core/ApiError'; -import { request } from '../core/request'; -import { OpenAPI } from '../core/OpenAPI'; - -export class ComplexService { - - /** - * @param parameterObject Parameter containing object - * @param parameterReference Parameter containing reference - * @result ModelWithString Successful response - * @throws ApiError - */ - static async complexTypes( - parameterObject, - parameterReference - ) { - - const result = await request({ - method: 'get', - path: \`/api/v\${OpenAPI.VERSION}/complex\`, - query: { - 'parameterObject': parameterObject, - 'parameterReference': parameterReference - } - }); - - if (!result.ok) { - switch (result.status) { - case 400: throw new ApiError(result, \`400 server error\`); - case 500: throw new ApiError(result, \`500 server error\`); - } - } - - catchGenericError(result); - - return result.body; - } - -}" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/services/ParametersService.js): ./test/result/v2/javascript/services/ParametersService.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ApiError, catchGenericError } from '../core/ApiError'; -import { request } from '../core/request'; -import { OpenAPI } from '../core/OpenAPI'; - -export class ParametersService { - - /** - * @param parameterHeader This is the parameter that goes into the request header - * @param parameterQuery This is the parameter that goes into the request query params - * @param parameterForm This is the parameter that goes into the request form data - * @param parameterBody This is the parameter that is send as request body - * @throws ApiError - */ - static async callWithParameters( - parameterHeader, - parameterQuery, - parameterForm, - parameterBody - ) { - - const result = await request({ - method: 'get', - path: \`/api/v\${OpenAPI.VERSION}/parameters\`, - query: { - 'parameterQuery': parameterQuery - }, - formData: { - 'parameterForm': parameterForm - }, - body: parameterBody - }); - - catchGenericError(result); - - return result.body; - } - -}" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/services/ResponseService.js): ./test/result/v2/javascript/services/ResponseService.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ApiError, catchGenericError } from '../core/ApiError'; -import { request } from '../core/request'; -import { OpenAPI } from '../core/OpenAPI'; - -export class ResponseService { - - /** - * @result ModelWithString Message for default response - * @throws ApiError - */ - static async callWithDuplicateResponses() { - - const result = await request({ - method: 'post', - path: \`/api/v\${OpenAPI.VERSION}/response\` - }); - - if (!result.ok) { - switch (result.status) { - case 500: throw new ApiError(result, \`Message for 500 error\`); - case 501: throw new ApiError(result, \`Message for 501 error\`); - case 502: throw new ApiError(result, \`Message for 502 error\`); - } - } - - catchGenericError(result); - - return result.body; - } - - /** - * @result ModelWithString Message for default response - * @throws ApiError - */ - static async callWithResponse() { - - const result = await request({ - method: 'get', - path: \`/api/v\${OpenAPI.VERSION}/response\` - }); - - catchGenericError(result); - - return result.body; - } - - /** - * @result ModelWithString Message for default response - * @result ModelThatExtends Message for 201 response - * @result ModelThatExtendsExtends Message for 202 response - * @throws ApiError - */ - static async callWithResponses() { - - const result = await request({ - method: 'put', - path: \`/api/v\${OpenAPI.VERSION}/response\` - }); - - if (!result.ok) { - switch (result.status) { - case 500: throw new ApiError(result, \`Message for 500 error\`); - case 501: throw new ApiError(result, \`Message for 501 error\`); - case 502: throw new ApiError(result, \`Message for 502 error\`); - } - } - - catchGenericError(result); - - return result.body; - } - -}" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/services/SimpleService.js): ./test/result/v2/javascript/services/SimpleService.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ApiError, catchGenericError } from '../core/ApiError'; -import { request } from '../core/request'; -import { OpenAPI } from '../core/OpenAPI'; - -export class SimpleService { - - /** - * @throws ApiError - */ - static async deleteCallWithoutParametersAndResponse() { - - const result = await request({ - method: 'delete', - path: \`/api/v\${OpenAPI.VERSION}/simple\` - }); - - catchGenericError(result); - - return result.body; - } - - /** - * @throws ApiError - */ - static async getCallWithoutParametersAndResponse() { - - const result = await request({ - method: 'get', - path: \`/api/v\${OpenAPI.VERSION}/simple\` - }); - - catchGenericError(result); - - return result.body; - } - - /** - * @throws ApiError - */ - static async headCallWithoutParametersAndResponse() { - - const result = await request({ - method: 'head', - path: \`/api/v\${OpenAPI.VERSION}/simple\` - }); - - catchGenericError(result); - - return result.body; - } - - /** - * @throws ApiError - */ - static async optionsCallWithoutParametersAndResponse() { - - const result = await request({ - method: 'options', - path: \`/api/v\${OpenAPI.VERSION}/simple\` - }); - - catchGenericError(result); - - return result.body; - } - - /** - * @throws ApiError - */ - static async patchCallWithoutParametersAndResponse() { - - const result = await request({ - method: 'patch', - path: \`/api/v\${OpenAPI.VERSION}/simple\` - }); - - catchGenericError(result); - - return result.body; - } - - /** - * @throws ApiError - */ - static async postCallWithoutParametersAndResponse() { - - const result = await request({ - method: 'post', - path: \`/api/v\${OpenAPI.VERSION}/simple\` - }); - - catchGenericError(result); - - return result.body; - } - - /** - * @throws ApiError - */ - static async putCallWithoutParametersAndResponse() { - - const result = await request({ - method: 'put', - path: \`/api/v\${OpenAPI.VERSION}/simple\` - }); - - catchGenericError(result); - - return result.body; - } - -}" -`; - -exports[`generation v2 javascript file(./test/result/v2/javascript/services/TypesService.js): ./test/result/v2/javascript/services/TypesService.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ApiError, catchGenericError } from '../core/ApiError'; -import { request } from '../core/request'; -import { OpenAPI } from '../core/OpenAPI'; - -export class TypesService { - - /** - * @param parameterNumber This is a number parameter - * @param parameterString This is a string parameter - * @param parameterBoolean This is a boolean parameter - * @param parameterObject This is an object parameter - * @param parameterArray This is an array parameter - * @param parameterDictionary This is a dictionary parameter - * @param parameterEnum This is an enum parameter - * @param id This is a number parameter - * @result number Response is a simple number - * @result string Response is a simple string - * @result boolean Response is a simple boolean - * @result any Response is a simple object - * @throws ApiError - */ - static async types( - parameterNumber = 123, - parameterString = 'default', - parameterBoolean = true, - parameterObject = null, - parameterArray, - parameterDictionary, - parameterEnum, - id - ) { - - const result = await request({ - method: 'get', - path: \`/api/v\${OpenAPI.VERSION}/types\`, - query: { - 'parameterNumber': parameterNumber, - 'parameterString': parameterString, - 'parameterBoolean': parameterBoolean, - 'parameterObject': parameterObject, - 'parameterArray': parameterArray, - 'parameterDictionary': parameterDictionary, - 'parameterEnum': parameterEnum - } - }); - - catchGenericError(result); - - return result.body; - } - -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/core/ApiError.ts): ./test/result/v2/typescript/core/ApiError.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { isSuccess } from './isSuccess'; -import { Result } from './Result'; - -export class ApiError extends Error { - - public readonly url: string; - public readonly status: number; - public readonly statusText: string; - public readonly body: any; - - constructor(result: Readonly, message: string) { - super(message); - - this.url = result.url; - this.status = result.status; - this.statusText = result.statusText; - this.body = result.body; - } -} - -export namespace ApiError { - export enum Message { - BAD_REQUEST = 'Bad Request', - UNAUTHORIZED = 'Unauthorized', - FORBIDDEN = 'Forbidden', - NOT_FOUND = 'Not Found', - INTERNAL_SERVER_ERROR = 'Internal Server Error', - BAD_GATEWAY = 'Bad Gateway', - SERVICE_UNAVAILABLE = 'Service Unavailable', - GENERIC_ERROR = 'Generic Error', - } -} - -/** - * Catch common errors (based on status code). - * @param result - */ -export function catchGenericError(result: Result): void { - switch (result.status) { - case 400: throw new ApiError(result, ApiError.Message.BAD_REQUEST); - case 401: throw new ApiError(result, ApiError.Message.UNAUTHORIZED); - case 403: throw new ApiError(result, ApiError.Message.FORBIDDEN); - case 404: throw new ApiError(result, ApiError.Message.NOT_FOUND); - case 500: throw new ApiError(result, ApiError.Message.INTERNAL_SERVER_ERROR); - case 502: throw new ApiError(result, ApiError.Message.BAD_GATEWAY); - case 503: throw new ApiError(result, ApiError.Message.SERVICE_UNAVAILABLE); - } - - if (!isSuccess(result.status)) { - throw new ApiError(result, ApiError.Message.GENERIC_ERROR); - } -} -" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/core/OpenAPI.ts): ./test/result/v2/typescript/core/OpenAPI.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -export namespace OpenAPI { - export let BASE = 'http://localhost:8080/api'; - export let VERSION = '9.0'; - export let CLIENT = 'fetch'; - export let TOKEN = ''; -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/core/RequestOptions.ts): ./test/result/v2/typescript/core/RequestOptions.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -export interface RequestOptions { - method: 'get' | 'put' | 'post' | 'delete' | 'options' | 'head' | 'patch'; - path: string; - cookies?: { [key: string]: any }; - headers?: { [key: string]: any }; - query?: { [key: string]: any }; - formData?: { [key: string]: any }; - body?: any; -} -" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/core/Result.ts): ./test/result/v2/typescript/core/Result.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -export interface Result { - url: string; - ok: boolean; - status: number; - statusText: string; - body: any; -} -" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/core/getFormData.ts): ./test/result/v2/typescript/core/getFormData.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -/** - * Get FormData from object. This method is needed to upload - * multipart form data to the REST API. - * @param params Key value based object. - */ -export function getFormData(params: { [key: string]: any }): FormData { - const formData = new FormData(); - for (const key in params) { - if (typeof params[key] !== 'undefined') { - const value: any = params[key]; - if (value !== undefined && value !== null) { - formData.append(key, value); - } - } - } - return formData; -} -" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/core/getQueryString.ts): ./test/result/v2/typescript/core/getQueryString.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -/** - * Get query string from query parameters object. This method also - * supports multi-value items by creating a key for each item. - * @param params Key value based object. - */ -export function getQueryString(params: { [key: string]: any }): string { - const qs: string[] = []; - for (const key in params) { - if (typeof params[key] !== 'undefined') { - const value: any = params[key]; - if (value !== undefined && value !== null) { - if (Array.isArray(value)) { - value.forEach(value => { - qs.push(\`\${encodeURIComponent(key)}=\${encodeURIComponent(String(value))}\`); - }); - } else { - qs.push(\`\${encodeURIComponent(key)}=\${encodeURIComponent(String(value))}\`); - } - } - } - } - if (qs.length > 0) { - return \`?\${qs.join('&')}\`; - } - return ''; -} -" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/core/isSuccess.ts): ./test/result/v2/typescript/core/isSuccess.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -/** - * Check success response code. - * @param status Status code - */ -export function isSuccess(status: number): boolean { - return status >= 200 && status < 300; -} -" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/core/request.ts): ./test/result/v2/typescript/core/request.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import {getFormData} from './getFormData'; -import {getQueryString} from './getQueryString'; -import {OpenAPI} from './OpenAPI'; -import {RequestOptions} from './RequestOptions'; -import {requestUsingFetch} from './requestUsingFetch'; -import {requestUsingXHR} from './requestUsingXHR'; -import {Result} from './Result'; - -/** - * Create the request. - * @param options Request method options. - * @returns Result object (see above) - */ -export async function request(options: Readonly): Promise { - - // Create the request URL - let url = \`\${OpenAPI.BASE}\${options.path}\`; - - // Create request headers - const headers = new Headers({ - ...options.headers, - Accept: 'application/json' - }); - - // Create request settings - const request: RequestInit = { - headers, - method: options.method, - credentials: 'same-origin' - }; - - // If we have a bearer token then we set the authentication header. - if (OpenAPI.TOKEN !== null && OpenAPI.TOKEN !== '') { - headers.append('Authorization', \`Bearer \${OpenAPI.TOKEN}\`); - } - - // Add the query parameters (if defined). - if (options.query) { - url += getQueryString(options.query); - } - - // Append formData as body - if (options.formData) { - request.body = getFormData(options.formData); - } else if (options.body) { - - // If this is blob data, then pass it directly to the body and set content type. - // Otherwise we just convert request data to JSON string (needed for fetch api) - if (options.body instanceof Blob) { - request.body = options.body; - if (options.body.type) { - headers.append('Content-Type', options.body.type); - } - } else { - request.body = JSON.stringify(options.body); - headers.append('Content-Type', 'application/json'); - } - } - - try { - switch (OpenAPI.CLIENT) { - case 'xhr': - return await requestUsingXHR(url, request); - default: - return await requestUsingFetch(url, request); - } - } catch (error) { - return { - url, - ok: false, - status: 0, - statusText: '', - body: error - }; - } -} -" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/core/requestUsingFetch.ts): ./test/result/v2/typescript/core/requestUsingFetch.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { Result } from './Result'; - -/** - * Request content using the new Fetch API. This is the default API that is used and - * is create for all JSON, XML and text objects. However it is limited to UTF-8. - * This is a problem for some of the Docs content, since that requires UTF-16! - * @param url The url to request. - * @param request The request object, containing method, headers, body, etc. - */ -export async function requestUsingFetch(url: string, request: Readonly): Promise { - - // Fetch response using fetch API. - const response = await fetch(url, request); - - // Create result object. - const result: Result = { - url, - ok: response.ok, - status: response.status, - statusText: response.statusText, - body: null - }; - - // Try to parse the content for any response status code. - // We check the \\"Content-Type\\" header to see if we need to parse the - // content as json or as plain text. - const contentType = response.headers.get('Content-Type'); - if (contentType) { - switch (contentType.toLowerCase()) { - case 'application/json': - case 'application/json; charset=utf-8': - result.body = await response.json(); - break; - - case 'text/plain': - case 'text/xml': - case 'text/xml; charset=utf-8': - case 'text/xml; charset=utf-16': - result.body = await response.text(); - break; - } - } - - return result; -} -" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/core/requestUsingXHR.ts): ./test/result/v2/typescript/core/requestUsingXHR.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { Result } from './Result'; -import { isSuccess } from './isSuccess'; - -/** - * Request content using the new legacy XMLHttpRequest API. This method is useful - * when we want to request UTF-16 content, since it natively supports loading UTF-16. - * We could do the same with the Fetch API, but then we will need to convert the - * content using JavaScript... And that is very very slow. - * @param url The url to request. - * @param request The request object, containing method, headers, body, etc. - */ -export async function requestUsingXHR(url: string, request: Readonly): Promise { - return new Promise(resolve => { - const xhr = new XMLHttpRequest(); - - // Open the request, remember to do this before adding any headers, - // because the request needs to be initialized! - xhr.open(request.method!, url, true); - - // Add the headers (required when dealing with JSON) - const headers = request.headers as Headers; - headers.forEach((value: string, key: string): void => { - xhr.setRequestHeader(key, value); - }); - - // Register the readystate handler, this will fire when the request is done. - xhr.onreadystatechange = () => { - if (xhr.readyState === XMLHttpRequest.DONE) { - - // Create result object. - const result: Result = { - url, - ok: isSuccess(xhr.status), - status: xhr.status, - statusText: xhr.statusText, - body: null - }; - - // Try to parse the content for any response status code. - // We check the \\"Content-Type\\" header to see if we need to parse the - // content as json or as plain text. - const contentType = xhr.getResponseHeader('Content-Type'); - if (contentType) { - switch (contentType.toLowerCase()) { - case 'application/json': - case 'application/json; charset=utf-8': - result.body = JSON.parse(xhr.responseText); - break; - - case 'text/plain': - case 'text/xml': - case 'text/xml; charset=utf-8': - case 'text/xml; charset=utf-16': - result.body = xhr.responseText; - break; - } - } - - // Done! - resolve(result); - } - }; - - // Start the request! - xhr.send(request.body); - }); -} -" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/index.ts): ./test/result/v2/typescript/index.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -export { ApiError } from './core/ApiError'; -export { isSuccess } from './core/isSuccess'; -export { OpenAPI } from './core/OpenAPI'; - -export { ArrayWithArray } from './models/ArrayWithArray'; -export { ArrayWithBooleans } from './models/ArrayWithBooleans'; -export { ArrayWithNumbers } from './models/ArrayWithNumbers'; -export { ArrayWithProperties } from './models/ArrayWithProperties'; -export { ArrayWithReferences } from './models/ArrayWithReferences'; -export { ArrayWithStrings } from './models/ArrayWithStrings'; -export { Dictionary } from './models/Dictionary'; -export { DictionaryWithArray } from './models/DictionaryWithArray'; -export { DictionaryWithDictionary } from './models/DictionaryWithDictionary'; -export { DictionaryWithProperties } from './models/DictionaryWithProperties'; -export { DictionaryWithReference } from './models/DictionaryWithReference'; -export { DictionaryWithString } from './models/DictionaryWithString'; -export { EnumFromDescription } from './models/EnumFromDescription'; -export { EnumWithNumbers } from './models/EnumWithNumbers'; -export { EnumWithStrings } from './models/EnumWithStrings'; -export { ModelLink } from './models/ModelLink'; -export { ModelThatExtends } from './models/ModelThatExtends'; -export { ModelThatExtendsExtends } from './models/ModelThatExtendsExtends'; -export { ModelWithArray } from './models/ModelWithArray'; -export { ModelWithBoolean } from './models/ModelWithBoolean'; -export { ModelWithCircularReference } from './models/ModelWithCircularReference'; -export { ModelWithDictionary } from './models/ModelWithDictionary'; -export { ModelWithDuplicateImports } from './models/ModelWithDuplicateImports'; -export { ModelWithDuplicateProperties } from './models/ModelWithDuplicateProperties'; -export { ModelWithEnum } from './models/ModelWithEnum'; -export { ModelWithEnumFromDescription } from './models/ModelWithEnumFromDescription'; -export { ModelWithInteger } from './models/ModelWithInteger'; -export { ModelWithLink } from './models/ModelWithLink'; -export { ModelWithNestedEnums } from './models/ModelWithNestedEnums'; -export { ModelWithNestedProperties } from './models/ModelWithNestedProperties'; -export { ModelWithProperties } from './models/ModelWithProperties'; -export { ModelWithReference } from './models/ModelWithReference'; -export { ModelWithString } from './models/ModelWithString'; -export { SimpleBoolean } from './models/SimpleBoolean'; -export { SimpleFile } from './models/SimpleFile'; -export { SimpleInteger } from './models/SimpleInteger'; -export { SimpleReference } from './models/SimpleReference'; -export { SimpleString } from './models/SimpleString'; - -export { ComplexService } from './services/ComplexService'; -export { ParametersService } from './services/ParametersService'; -export { ResponseService } from './services/ResponseService'; -export { SimpleService } from './services/SimpleService'; -export { TypesService } from './services/TypesService'; -" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/ArrayWithArray.ts): ./test/result/v2/typescript/models/ArrayWithArray.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a simple array containing an array - */ -export type ArrayWithArray = Array>; - -export namespace ArrayWithArray { - - export const schema = yup.array>().of(yup.array().of(ModelWithString.schema)); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ArrayWithArray { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/ArrayWithBooleans.ts): ./test/result/v2/typescript/models/ArrayWithBooleans.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple array with booleans - */ -export type ArrayWithBooleans = Array; - -export namespace ArrayWithBooleans { - - export const schema = yup.array().of(yup.boolean()); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ArrayWithBooleans { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/ArrayWithNumbers.ts): ./test/result/v2/typescript/models/ArrayWithNumbers.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple array with numbers - */ -export type ArrayWithNumbers = Array; - -export namespace ArrayWithNumbers { - - export const schema = yup.array().of(yup.number()); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ArrayWithNumbers { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/ArrayWithProperties.ts): ./test/result/v2/typescript/models/ArrayWithProperties.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple array with properties - */ -export type ArrayWithProperties = Array<{ - foo?: string, - bar?: string -}>; - -export namespace ArrayWithProperties { - - export const schema = yup.array<{ - foo?: string, - bar?: string - }>().of(( - yup.object().shape({ - foo: yup.lazy(() => yup.string().default(undefined)), - bar: yup.lazy(() => yup.string().default(undefined)) - }).noUnknown() - )); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ArrayWithProperties { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/ArrayWithReferences.ts): ./test/result/v2/typescript/models/ArrayWithReferences.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a simple array with references - */ -export type ArrayWithReferences = Array; - -export namespace ArrayWithReferences { - - export const schema = yup.array().of(ModelWithString.schema); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ArrayWithReferences { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/ArrayWithStrings.ts): ./test/result/v2/typescript/models/ArrayWithStrings.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple array with strings - */ -export type ArrayWithStrings = Array; - -export namespace ArrayWithStrings { - - export const schema = yup.array().of(yup.string()); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ArrayWithStrings { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/Dictionary.ts): ./test/result/v2/typescript/models/Dictionary.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -export interface Dictionary { - [key: string]: T; -} -" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/DictionaryWithArray.ts): ./test/result/v2/typescript/models/DictionaryWithArray.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { Dictionary } from '../models/Dictionary'; -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a complex dictionary - */ -export type DictionaryWithArray = Dictionary>; - -export namespace DictionaryWithArray { - - export const schema = yup.lazy>>(value => { - return yup.object>>().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: yup.array().of(ModelWithString.schema) - }), {}) - ); - }); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): DictionaryWithArray { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/DictionaryWithDictionary.ts): ./test/result/v2/typescript/models/DictionaryWithDictionary.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { Dictionary } from '../models/Dictionary'; -import * as yup from 'yup'; - -/** - * This is a string dictionary - */ -export type DictionaryWithDictionary = Dictionary>; - -export namespace DictionaryWithDictionary { - - export const schema = yup.lazy>>(value => { - return yup.object>>().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: yup.lazy>(value => { - return yup.object>().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: yup.string() - }), {}) - ); - }) - }), {}) - ); - }); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): DictionaryWithDictionary { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/DictionaryWithProperties.ts): ./test/result/v2/typescript/models/DictionaryWithProperties.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { Dictionary } from '../models/Dictionary'; -import * as yup from 'yup'; - -/** - * This is a complex dictionary - */ -export type DictionaryWithProperties = Dictionary<{ - foo?: string, - bar?: string -}>; - -export namespace DictionaryWithProperties { - - export const schema = yup.lazy>(value => { - return yup.object>().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: ( - yup.object().shape({ - foo: yup.lazy(() => yup.string().default(undefined)), - bar: yup.lazy(() => yup.string().default(undefined)) - }).noUnknown() - ) - }), {}) - ); - }); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): DictionaryWithProperties { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/DictionaryWithReference.ts): ./test/result/v2/typescript/models/DictionaryWithReference.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { Dictionary } from '../models/Dictionary'; -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a string reference - */ -export type DictionaryWithReference = Dictionary; - -export namespace DictionaryWithReference { - - export const schema = yup.lazy>(value => { - return yup.object>().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: ModelWithString.schema - }), {}) - ); - }); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): DictionaryWithReference { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/DictionaryWithString.ts): ./test/result/v2/typescript/models/DictionaryWithString.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { Dictionary } from '../models/Dictionary'; -import * as yup from 'yup'; - -/** - * This is a string dictionary - */ -export type DictionaryWithString = Dictionary; - -export namespace DictionaryWithString { - - export const schema = yup.lazy>(value => { - return yup.object>().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: yup.string() - }), {}) - ); - }); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): DictionaryWithString { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/EnumFromDescription.ts): ./test/result/v2/typescript/models/EnumFromDescription.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * Success=1,Warning=2,Error=3 - */ -export enum EnumFromDescription { - ERROR = 3, - SUCCESS = 1, - WARNING = 2 -} - -export namespace EnumFromDescription { - - export const schema = yup.mixed().oneOf([ - EnumFromDescription.ERROR, - EnumFromDescription.SUCCESS, - EnumFromDescription.WARNING - ]); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): EnumFromDescription { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/EnumWithNumbers.ts): ./test/result/v2/typescript/models/EnumWithNumbers.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple enum with numbers - */ -export enum EnumWithNumbers { - NUM_1 = 1, - NUM_2 = 2, - NUM_3 = 3 -} - -export namespace EnumWithNumbers { - - export const schema = yup.mixed().oneOf([ - EnumWithNumbers.NUM_1, - EnumWithNumbers.NUM_2, - EnumWithNumbers.NUM_3 - ]); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): EnumWithNumbers { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/EnumWithStrings.ts): ./test/result/v2/typescript/models/EnumWithStrings.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple enum with strings - */ -export enum EnumWithStrings { - ERROR = 'Error', - SUCCESS = 'Success', - WARNING = 'Warning' -} - -export namespace EnumWithStrings { - - export const schema = yup.mixed().oneOf([ - EnumWithStrings.ERROR, - EnumWithStrings.SUCCESS, - EnumWithStrings.WARNING - ]); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): EnumWithStrings { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/ModelLink.ts): ./test/result/v2/typescript/models/ModelLink.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a model that can have a template?? - */ -export interface ModelLink { - id?: string; -} - -export namespace ModelLink { - - export const schema: yup.ObjectSchema = ( - yup.object().shape({ - id: yup.lazy(() => yup.string().default(undefined)) - }).noUnknown() - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelLink { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/ModelThatExtends.ts): ./test/result/v2/typescript/models/ModelThatExtends.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a model that extends another model - */ -export interface ModelThatExtends extends ModelWithString { - propExtendsA?: string; - propExtendsB?: ModelWithString; -} - -export namespace ModelThatExtends { - - export const schema: yup.ObjectSchema = ( - ModelWithString.schema.concat( - yup.object().shape({ - propExtendsA: yup.lazy(() => yup.string().default(undefined)), - propExtendsB: yup.lazy(() => ModelWithString.schema.default(undefined)) - }).noUnknown() - ) - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelThatExtends { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/ModelThatExtendsExtends.ts): ./test/result/v2/typescript/models/ModelThatExtendsExtends.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelThatExtends } from '../models/ModelThatExtends'; -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a model that extends another model - */ -export interface ModelThatExtendsExtends extends ModelWithString, ModelThatExtends { - propExtendsC?: string; - propExtendsD?: ModelWithString; -} - -export namespace ModelThatExtendsExtends { - - export const schema: yup.ObjectSchema = ( - ModelWithString.schema.concat( - ModelThatExtends.schema.concat( - yup.object().shape({ - propExtendsC: yup.lazy(() => yup.string().default(undefined)), - propExtendsD: yup.lazy(() => ModelWithString.schema.default(undefined)) - }).noUnknown() - ) - ) - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelThatExtendsExtends { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/ModelWithArray.ts): ./test/result/v2/typescript/models/ModelWithArray.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a model with one property containing an array - */ -export interface ModelWithArray { - prop?: Array; -} - -export namespace ModelWithArray { - - export const schema: yup.ObjectSchema = ( - yup.object().shape({ - prop: yup.lazy(() => yup.array().of(ModelWithString.schema).default(undefined)) - }).noUnknown() - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelWithArray { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/ModelWithBoolean.ts): ./test/result/v2/typescript/models/ModelWithBoolean.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a model with one boolean property - */ -export interface ModelWithBoolean { - /** - * This is a simple boolean property - */ - prop?: boolean; -} - -export namespace ModelWithBoolean { - - export const schema: yup.ObjectSchema = ( - yup.object().shape({ - prop: yup.lazy(() => yup.boolean().default(undefined)) - }).noUnknown() - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelWithBoolean { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/ModelWithCircularReference.ts): ./test/result/v2/typescript/models/ModelWithCircularReference.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a model with one property containing a circular reference - */ -export interface ModelWithCircularReference { - prop?: ModelWithCircularReference; -} - -export namespace ModelWithCircularReference { - - export const schema: yup.ObjectSchema = ( - yup.object().shape({ - prop: yup.lazy(() => ModelWithCircularReference.schema.default(undefined)) - }).noUnknown() - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelWithCircularReference { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/ModelWithDictionary.ts): ./test/result/v2/typescript/models/ModelWithDictionary.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { Dictionary } from '../models/Dictionary'; -import * as yup from 'yup'; - -/** - * This is a model with one property containing a dictionary - */ -export interface ModelWithDictionary { - prop?: Dictionary; -} - -export namespace ModelWithDictionary { - - export const schema: yup.ObjectSchema = ( - yup.object().shape({ - prop: yup.lazy(() => yup.lazy>(value => { - return yup.object>().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: yup.string() - }), {}) - ); - }).default(undefined)) - }).noUnknown() - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelWithDictionary { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/ModelWithDuplicateImports.ts): ./test/result/v2/typescript/models/ModelWithDuplicateImports.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a model with duplicated imports - */ -export interface ModelWithDuplicateImports { - propA?: ModelWithString; - propB?: ModelWithString; - propC?: ModelWithString; -} - -export namespace ModelWithDuplicateImports { - - export const schema: yup.ObjectSchema = ( - yup.object().shape({ - propA: yup.lazy(() => ModelWithString.schema.default(undefined)), - propB: yup.lazy(() => ModelWithString.schema.default(undefined)), - propC: yup.lazy(() => ModelWithString.schema.default(undefined)) - }).noUnknown() - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelWithDuplicateImports { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/ModelWithDuplicateProperties.ts): ./test/result/v2/typescript/models/ModelWithDuplicateProperties.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a model with duplicated properties - */ -export interface ModelWithDuplicateProperties { - prop?: ModelWithString; -} - -export namespace ModelWithDuplicateProperties { - - export const schema: yup.ObjectSchema = ( - yup.object().shape({ - prop: yup.lazy(() => ModelWithString.schema.default(undefined)) - }).noUnknown() - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelWithDuplicateProperties { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/ModelWithEnum.ts): ./test/result/v2/typescript/models/ModelWithEnum.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a model with one enum - */ -export interface ModelWithEnum { - /** - * This is a simple enum with strings - */ - test?: ModelWithEnum.test; -} - -export namespace ModelWithEnum { - - /** - * This is a simple enum with strings - */ - export enum test { - SUCCESS = 'Success', - WARNING = 'Warning', - ERROR = 'Error' - } - - export const schema: yup.ObjectSchema = ( - yup.object().shape({ - test: yup.lazy(() => yup.mixed().oneOf([ - test.SUCCESS, - test.WARNING, - test.ERROR - ]).default(undefined)) - }).noUnknown() - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelWithEnum { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/ModelWithEnumFromDescription.ts): ./test/result/v2/typescript/models/ModelWithEnumFromDescription.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a model with one enum - */ -export interface ModelWithEnumFromDescription { - /** - * Success=1,Warning=2,Error=3 - */ - test?: ModelWithEnumFromDescription.test; -} - -export namespace ModelWithEnumFromDescription { - - /** - * Success=1,Warning=2,Error=3 - */ - export enum test { - SUCCESS = 1, - WARNING = 2, - ERROR = 3 - } - - export const schema: yup.ObjectSchema = ( - yup.object().shape({ - test: yup.lazy(() => yup.mixed().oneOf([ - test.SUCCESS, - test.WARNING, - test.ERROR - ]).default(undefined)) - }).noUnknown() - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelWithEnumFromDescription { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/ModelWithInteger.ts): ./test/result/v2/typescript/models/ModelWithInteger.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a model with one number property - */ -export interface ModelWithInteger { - /** - * This is a simple number property - */ - prop?: number; -} - -export namespace ModelWithInteger { - - export const schema: yup.ObjectSchema = ( - yup.object().shape({ - prop: yup.lazy(() => yup.number().default(undefined)) - }).noUnknown() - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelWithInteger { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/ModelWithLink.ts): ./test/result/v2/typescript/models/ModelWithLink.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelLink } from '../models/ModelLink'; -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a model that can have a template?? - */ -export interface ModelWithLink { - prop?: ModelLink; -} - -export namespace ModelWithLink { - - export const schema: yup.ObjectSchema = ( - yup.object().shape({ - prop: yup.lazy(() => ModelLink.schema.default(undefined)) - }).noUnknown() - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelWithLink { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/ModelWithNestedEnums.ts): ./test/result/v2/typescript/models/ModelWithNestedEnums.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { array } from '../models/array'; -import { Dictionary } from '../models/Dictionary'; -import * as yup from 'yup'; - -/** - * This is a model with nested enums - */ -export interface ModelWithNestedEnums { - arrayWithDescription?: array; - arrayWithEnum?: array; - dictionaryWithEnum?: Dictionary<('Success' | 'Warning' | 'Error')>; - dictionaryWithEnumFromDescription?: Dictionary<(1 | 2 | 3)>; -} - -export namespace ModelWithNestedEnums { - - export const schema: yup.ObjectSchema = ( - yup.object().shape({ - arrayWithDescription: yup.lazy(() => yup.mixed().default(undefined)), - arrayWithEnum: yup.lazy(() => yup.mixed().default(undefined)), - dictionaryWithEnum: yup.lazy(() => yup.lazy>(value => { - return yup.object>().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: yup.mixed().oneOf([ - 'Success', - 'Warning', - 'Error' - ]) - }), {}) - ); - }).default(undefined)), - dictionaryWithEnumFromDescription: yup.lazy(() => yup.lazy>(value => { - return yup.object>().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: yup.mixed().oneOf([ - 1, - 2, - 3 - ]) - }), {}) - ); - }).default(undefined)) - }).noUnknown() - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelWithNestedEnums { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/ModelWithNestedProperties.ts): ./test/result/v2/typescript/models/ModelWithNestedProperties.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a model with one nested property - */ -export interface ModelWithNestedProperties { - readonly first: { - readonly second: { - readonly third: string - } - }; -} - -export namespace ModelWithNestedProperties { - - export const schema: yup.ObjectSchema = ( - yup.object().shape({ - first: yup.lazy(() => ( - yup.object().shape({ - second: yup.lazy(() => ( - yup.object().shape({ - third: yup.lazy(() => yup.string().default(undefined).required()) - }).noUnknown() - ).default(undefined).required()) - }).noUnknown() - ).default(undefined).required()) - }).noUnknown() - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelWithNestedProperties { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/ModelWithProperties.ts): ./test/result/v2/typescript/models/ModelWithProperties.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a model with one nested property - */ -export interface ModelWithProperties { - boolean?: boolean; - number?: number; - reference?: ModelWithString; - required: string; - readonly requiredAndreadOnly: string; - string?: string; -} - -export namespace ModelWithProperties { - - export const schema: yup.ObjectSchema = ( - yup.object().shape({ - boolean: yup.lazy(() => yup.boolean().default(undefined)), - number: yup.lazy(() => yup.number().default(undefined)), - reference: yup.lazy(() => ModelWithString.schema.default(undefined)), - required: yup.lazy(() => yup.string().default(undefined).required()), - requiredAndreadOnly: yup.lazy(() => yup.string().default(undefined).required()), - string: yup.lazy(() => yup.string().default(undefined)) - }).noUnknown() - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelWithProperties { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/ModelWithReference.ts): ./test/result/v2/typescript/models/ModelWithReference.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a model with one property containing a reference - */ -export interface ModelWithReference { - prop?: ModelWithString; -} - -export namespace ModelWithReference { - - export const schema: yup.ObjectSchema = ( - yup.object().shape({ - prop: yup.lazy(() => ModelWithString.schema.default(undefined)) - }).noUnknown() - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelWithReference { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/ModelWithString.ts): ./test/result/v2/typescript/models/ModelWithString.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a model with one string property - */ -export interface ModelWithString { - /** - * This is a simple string property - */ - prop?: string; -} - -export namespace ModelWithString { - - export const schema: yup.ObjectSchema = ( - yup.object().shape({ - prop: yup.lazy(() => yup.string().default(undefined)) - }).noUnknown() - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelWithString { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/SimpleBoolean.ts): ./test/result/v2/typescript/models/SimpleBoolean.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple boolean - */ -export type SimpleBoolean = boolean; - -export namespace SimpleBoolean { - - export const schema = yup.boolean(); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): SimpleBoolean { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/SimpleFile.ts): ./test/result/v2/typescript/models/SimpleFile.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple file - */ -export type SimpleFile = File; - -export namespace SimpleFile { - - export const schema = yup.mixed(); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): SimpleFile { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/SimpleInteger.ts): ./test/result/v2/typescript/models/SimpleInteger.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple number - */ -export type SimpleInteger = number; - -export namespace SimpleInteger { - - export const schema = yup.number(); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): SimpleInteger { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/SimpleReference.ts): ./test/result/v2/typescript/models/SimpleReference.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a simple reference - */ -export type SimpleReference = ModelWithString; - -export namespace SimpleReference { - - export const schema = ModelWithString.schema; - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): SimpleReference { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/models/SimpleString.ts): ./test/result/v2/typescript/models/SimpleString.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple string - */ -export type SimpleString = string; - -export namespace SimpleString { - - export const schema = yup.string(); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): SimpleString { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/services/ComplexService.ts): ./test/result/v2/typescript/services/ComplexService.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import { ApiError, catchGenericError } from '../core/ApiError'; -import { request } from '../core/request'; -import { OpenAPI } from '../core/OpenAPI'; - -export class ComplexService { - - /** - * @param parameterObject Parameter containing object - * @param parameterReference Parameter containing reference - * @result ModelWithString Successful response - * @throws ApiError - */ - public static async complexTypes( - parameterObject: { - first?: { - second?: { - third?: string - } - } - }, - parameterReference: ModelWithString - ): Promise> { - - const result = await request({ - method: 'get', - path: \`/api/v\${OpenAPI.VERSION}/complex\`, - query: { - 'parameterObject': parameterObject, - 'parameterReference': parameterReference - } - }); - - if (!result.ok) { - switch (result.status) { - case 400: throw new ApiError(result, \`400 server error\`); - case 500: throw new ApiError(result, \`500 server error\`); - } - } - - catchGenericError(result); - - return result.body; - } - -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/services/ParametersService.ts): ./test/result/v2/typescript/services/ParametersService.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ApiError, catchGenericError } from '../core/ApiError'; -import { request } from '../core/request'; -import { OpenAPI } from '../core/OpenAPI'; - -export class ParametersService { - - /** - * @param parameterHeader This is the parameter that goes into the request header - * @param parameterQuery This is the parameter that goes into the request query params - * @param parameterForm This is the parameter that goes into the request form data - * @param parameterBody This is the parameter that is send as request body - * @throws ApiError - */ - public static async callWithParameters( - parameterHeader: string, - parameterQuery: string, - parameterForm: string, - parameterBody: string - ): Promise { - - const result = await request({ - method: 'get', - path: \`/api/v\${OpenAPI.VERSION}/parameters\`, - query: { - 'parameterQuery': parameterQuery - }, - formData: { - 'parameterForm': parameterForm - }, - body: parameterBody - }); - - catchGenericError(result); - - return result.body; - } - -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/services/ResponseService.ts): ./test/result/v2/typescript/services/ResponseService.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelThatExtends } from '../models/ModelThatExtends'; -import { ModelThatExtendsExtends } from '../models/ModelThatExtendsExtends'; -import { ModelWithString } from '../models/ModelWithString'; -import { ApiError, catchGenericError } from '../core/ApiError'; -import { request } from '../core/request'; -import { OpenAPI } from '../core/OpenAPI'; - -export class ResponseService { - - /** - * @result ModelWithString Message for default response - * @throws ApiError - */ - public static async callWithDuplicateResponses(): Promise { - - const result = await request({ - method: 'post', - path: \`/api/v\${OpenAPI.VERSION}/response\` - }); - - if (!result.ok) { - switch (result.status) { - case 500: throw new ApiError(result, \`Message for 500 error\`); - case 501: throw new ApiError(result, \`Message for 501 error\`); - case 502: throw new ApiError(result, \`Message for 502 error\`); - } - } - - catchGenericError(result); - - return result.body; - } - - /** - * @result ModelWithString Message for default response - * @throws ApiError - */ - public static async callWithResponse(): Promise { - - const result = await request({ - method: 'get', - path: \`/api/v\${OpenAPI.VERSION}/response\` - }); - - catchGenericError(result); - - return result.body; - } - - /** - * @result ModelWithString Message for default response - * @result ModelThatExtends Message for 201 response - * @result ModelThatExtendsExtends Message for 202 response - * @throws ApiError - */ - public static async callWithResponses(): Promise { - - const result = await request({ - method: 'put', - path: \`/api/v\${OpenAPI.VERSION}/response\` - }); - - if (!result.ok) { - switch (result.status) { - case 500: throw new ApiError(result, \`Message for 500 error\`); - case 501: throw new ApiError(result, \`Message for 501 error\`); - case 502: throw new ApiError(result, \`Message for 502 error\`); - } - } - - catchGenericError(result); - - return result.body; - } - -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/services/SimpleService.ts): ./test/result/v2/typescript/services/SimpleService.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ApiError, catchGenericError } from '../core/ApiError'; -import { request } from '../core/request'; -import { OpenAPI } from '../core/OpenAPI'; - -export class SimpleService { - - /** - * @throws ApiError - */ - public static async deleteCallWithoutParametersAndResponse(): Promise { - - const result = await request({ - method: 'delete', - path: \`/api/v\${OpenAPI.VERSION}/simple\` - }); - - catchGenericError(result); - - return result.body; - } - - /** - * @throws ApiError - */ - public static async getCallWithoutParametersAndResponse(): Promise { - - const result = await request({ - method: 'get', - path: \`/api/v\${OpenAPI.VERSION}/simple\` - }); - - catchGenericError(result); - - return result.body; - } - - /** - * @throws ApiError - */ - public static async headCallWithoutParametersAndResponse(): Promise { - - const result = await request({ - method: 'head', - path: \`/api/v\${OpenAPI.VERSION}/simple\` - }); - - catchGenericError(result); - - return result.body; - } - - /** - * @throws ApiError - */ - public static async optionsCallWithoutParametersAndResponse(): Promise { - - const result = await request({ - method: 'options', - path: \`/api/v\${OpenAPI.VERSION}/simple\` - }); - - catchGenericError(result); - - return result.body; - } - - /** - * @throws ApiError - */ - public static async patchCallWithoutParametersAndResponse(): Promise { - - const result = await request({ - method: 'patch', - path: \`/api/v\${OpenAPI.VERSION}/simple\` - }); - - catchGenericError(result); - - return result.body; - } - - /** - * @throws ApiError - */ - public static async postCallWithoutParametersAndResponse(): Promise { - - const result = await request({ - method: 'post', - path: \`/api/v\${OpenAPI.VERSION}/simple\` - }); - - catchGenericError(result); - - return result.body; - } - - /** - * @throws ApiError - */ - public static async putCallWithoutParametersAndResponse(): Promise { - - const result = await request({ - method: 'put', - path: \`/api/v\${OpenAPI.VERSION}/simple\` - }); - - catchGenericError(result); - - return result.body; - } - -}" -`; - -exports[`generation v2 typescript file(./test/result/v2/typescript/services/TypesService.ts): ./test/result/v2/typescript/services/TypesService.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { Dictionary } from '../models/Dictionary'; -import { ApiError, catchGenericError } from '../core/ApiError'; -import { request } from '../core/request'; -import { OpenAPI } from '../core/OpenAPI'; - -export class TypesService { - - /** - * @param parameterNumber This is a number parameter - * @param parameterString This is a string parameter - * @param parameterBoolean This is a boolean parameter - * @param parameterObject This is an object parameter - * @param parameterArray This is an array parameter - * @param parameterDictionary This is a dictionary parameter - * @param parameterEnum This is an enum parameter - * @param id This is a number parameter - * @result number Response is a simple number - * @result string Response is a simple string - * @result boolean Response is a simple boolean - * @result any Response is a simple object - * @throws ApiError - */ - public static async types( - parameterNumber: number = 123, - parameterString: string = 'default', - parameterBoolean: boolean = true, - parameterObject: any = null, - parameterArray: Array, - parameterDictionary: Dictionary, - parameterEnum: ('Success' | 'Warning' | 'Error'), - id?: number - ): Promise { - - const result = await request({ - method: 'get', - path: \`/api/v\${OpenAPI.VERSION}/types\`, - query: { - 'parameterNumber': parameterNumber, - 'parameterString': parameterString, - 'parameterBoolean': parameterBoolean, - 'parameterObject': parameterObject, - 'parameterArray': parameterArray, - 'parameterDictionary': parameterDictionary, - 'parameterEnum': parameterEnum - } - }); - - catchGenericError(result); - - return result.body; - } - -}" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/core/ApiError.js): ./test/result/v3/javascript/core/ApiError.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { isSuccess } from \\"./isSuccess\\"; - -export class ApiError extends Error { - - constructor(result, message) { - super(message); - - this.url = result.url; - this.status = result.status; - this.statusText = result.statusText; - this.body = result.body; - } -} - -(function (ApiError) { - let Message; - (function (Message) { - Message.BAD_REQUEST = 'Bad Request'; - Message.UNAUTHORIZED = 'Unauthorized'; - Message.FORBIDDEN = 'Forbidden'; - Message.NOT_FOUND = 'Not Found'; - Message.INTERNAL_SERVER_ERROR = 'Internal Server Error'; - Message.BAD_GATEWAY = 'Bad Gateway'; - Message.SERVICE_UNAVAILABLE = 'Service Unavailable'; - Message.GENERIC_ERROR = 'Generic Error'; - })(Message = ApiError.Message || (ApiError.Message = {})); -})(ApiError || (ApiError = {})); - -/** - * Catch common errors (based on status code). - * @param result - */ -export function catchGenericError(result) { - - switch (result.status) { - case 400: throw new ApiError(result, ApiError.Message.BAD_REQUEST); - case 401: throw new ApiError(result, ApiError.Message.UNAUTHORIZED); - case 403: throw new ApiError(result, ApiError.Message.FORBIDDEN); - case 404: throw new ApiError(result, ApiError.Message.NOT_FOUND); - case 500: throw new ApiError(result, ApiError.Message.INTERNAL_SERVER_ERROR); - case 502: throw new ApiError(result, ApiError.Message.BAD_GATEWAY); - case 503: throw new ApiError(result, ApiError.Message.SERVICE_UNAVAILABLE); - } - - if (!isSuccess(result.status)) { - throw new ApiError(result, ApiError.Message.GENERIC_ERROR); - } -} -" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/core/OpenAPI.js): ./test/result/v3/javascript/core/OpenAPI.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -export let OpenAPI; -(function (OpenAPI) { - OpenAPI.BASE = '/api'; - OpenAPI.VERSION = '1'; - OpenAPI.CLIENT = 'xhr'; - OpenAPI.TOKEN = ''; -})(OpenAPI || (OpenAPI = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/core/getFormData.js): ./test/result/v3/javascript/core/getFormData.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -/** - * Get FormData from object. This method is needed to upload - * multipart form data to the REST API. - * @param params Key value based object. - */ -export function getFormData(params) { - const formData = new FormData(); - for (const key in params) { - if (typeof params[key] !== 'undefined') { - const value = params[key]; - if (value !== undefined && value !== null) { - formData.append(key, value); - } - } - } - return formData; -} -" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/core/getQueryString.js): ./test/result/v3/javascript/core/getQueryString.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -/** - * Get query string from query parameters object. This method also - * supports multi-value items by creating a key for each item. - * @param params Key value based object. - */ -export function getQueryString(params) { - const qs = []; - for (const key in params) { - if (typeof params[key] !== 'undefined') { - const value = params[key]; - if (value !== undefined && value !== null) { - if (Array.isArray(value)) { - value.forEach(value => { - qs.push(\`\${encodeURIComponent(key)}=\${encodeURIComponent(String(value))}\`); - }); - } else { - qs.push(\`\${encodeURIComponent(key)}=\${encodeURIComponent(String(value))}\`); - } - } - } - } - if (qs.length > 0) { - return \`?\${qs.join('&')}\`; - } - return ''; -} -" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/core/isSuccess.js): ./test/result/v3/javascript/core/isSuccess.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -/** - * Check success response code. - * @param status Status code - */ -export function isSuccess(status) { - return status >= 200 && status < 300; -} -" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/core/request.js): ./test/result/v3/javascript/core/request.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import {getFormData} from './getFormData'; -import {getQueryString} from './getQueryString'; -import {OpenAPI} from './OpenAPI'; -import {requestUsingFetch} from './requestUsingFetch'; -import {requestUsingXHR} from './requestUsingXHR'; - -/** - * Create the request. - * @param options Request method options. - * @returns Result object (see above) - */ -export async function request(options) { - - // Create the request URL - let url = \`\${OpenAPI.BASE}\${options.path}\`; - - // Create request headers - const headers = new Headers({ - ...options.headers, - Accept: 'application/json' - }); - - // Create request settings - const request = { - headers, - method: options.method, - credentials: 'same-origin' - }; - - // If we have a bearer token then we set the authentication header. - if (OpenAPI.TOKEN !== null && OpenAPI.TOKEN !== '') { - headers.append('Authorization', \`Bearer \${OpenAPI.TOKEN}\`); - } - - // Add the query parameters (if defined). - if (options.query) { - url += getQueryString(options.query); - } - - // Append formData as body - if (options.formData) { - request.body = getFormData(options.formData); - } else if (options.body) { - - // If this is blob data, then pass it directly to the body and set content type. - // Otherwise we just convert request data to JSON string (needed for fetch api) - if (options.body instanceof Blob) { - request.body = options.body; - if (options.body.type) { - headers.append('Content-Type', options.body.type); - } - } else { - request.body = JSON.stringify(options.body); - headers.append('Content-Type', 'application/json'); - } - } - - try { - switch (OpenAPI.CLIENT) { - case 'xhr': - return await requestUsingXHR(url, request); - default: - return await requestUsingFetch(url, request); - } - } catch (error) { - return { - url, - ok: false, - status: 0, - statusText: '', - body: error - }; - } -} -" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/core/requestUsingFetch.js): ./test/result/v3/javascript/core/requestUsingFetch.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -/** - * Request content using the new Fetch API. This is the default API that is used and - * is create for all JSON, XML and text objects. However it is limited to UTF-8. - * This is a problem for some of the Docs content, since that requires UTF-16! - * @param url The url to request. - * @param request The request object, containing method, headers, body, etc. - */ -export async function requestUsingFetch(url, request) { - - // Fetch response using fetch API. - const response = await fetch(url, request); - - // Create result object. - const result = { - url, - ok: response.ok, - status: response.status, - statusText: response.statusText, - body: null - }; - - // Try to parse the content for any response status code. - // We check the \\"Content-Type\\" header to see if we need to parse the - // content as json or as plain text. - const contentType = response.headers.get('Content-Type'); - if (contentType) { - switch (contentType.toLowerCase()) { - case 'application/json': - case 'application/json; charset=utf-8': - result.body = await response.json(); - break; - - case 'text/plain': - case 'text/xml': - case 'text/xml; charset=utf-8': - case 'text/xml; charset=utf-16': - result.body = await response.text(); - break; - } - } - - return result; -} -" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/core/requestUsingXHR.js): ./test/result/v3/javascript/core/requestUsingXHR.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { isSuccess } from './isSuccess'; - -/** - * Request content using the new legacy XMLHttpRequest API. This method is useful - * when we want to request UTF-16 content, since it natively supports loading UTF-16. - * We could do the same with the Fetch API, but then we will need to convert the - * content using JavaScript... And that is very very slow. - * @param url The url to request. - * @param request The request object, containing method, headers, body, etc. - */ -export async function requestUsingXHR(url, request) { - return new Promise(resolve => { - const xhr = new XMLHttpRequest(); - - // Open the request, remember to do this before adding any headers, - // because the request needs to be initialized! - xhr.open(request.method, url, true); - - // Add the headers (required when dealing with JSON) - const headers = request.headers as Headers; - headers.forEach((value, key) => { - xhr.setRequestHeader(key, value); - }); - - // Register the readystate handler, this will fire when the request is done. - xhr.onreadystatechange = () => { - if (xhr.readyState === XMLHttpRequest.DONE) { - - // Create result object. - const result = { - url, - ok: isSuccess(xhr.status), - status: xhr.status, - statusText: xhr.statusText, - body: null - }; - - // Try to parse the content for any response status code. - // We check the \\"Content-Type\\" header to see if we need to parse the - // content as json or as plain text. - const contentType = xhr.getResponseHeader('Content-Type'); - if (contentType) { - switch (contentType.toLowerCase()) { - case 'application/json': - case 'application/json; charset=utf-8': - result.body = JSON.parse(xhr.responseText); - break; - - case 'text/plain': - case 'text/xml': - case 'text/xml; charset=utf-8': - case 'text/xml; charset=utf-16': - result.body = xhr.responseText; - break; - } - } - - // Done! - resolve(result); - } - }; - - // Start the request! - xhr.send(request.body); - }); -} -" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/index.js): ./test/result/v3/javascript/index.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -export { ApiError } from './core/ApiError'; -export { isSuccess } from './core/isSuccess'; -export { OpenAPI } from './core/OpenAPI'; - -export { ArrayWithArray } from './models/ArrayWithArray'; -export { ArrayWithBooleans } from './models/ArrayWithBooleans'; -export { ArrayWithNumbers } from './models/ArrayWithNumbers'; -export { ArrayWithProperties } from './models/ArrayWithProperties'; -export { ArrayWithReferences } from './models/ArrayWithReferences'; -export { ArrayWithStrings } from './models/ArrayWithStrings'; - -export { DictionaryWithArray } from './models/DictionaryWithArray'; -export { DictionaryWithDictionary } from './models/DictionaryWithDictionary'; -export { DictionaryWithProperties } from './models/DictionaryWithProperties'; -export { DictionaryWithReference } from './models/DictionaryWithReference'; -export { DictionaryWithString } from './models/DictionaryWithString'; -export { EnumFromDescription } from './models/EnumFromDescription'; -export { EnumWithNumbers } from './models/EnumWithNumbers'; -export { EnumWithStrings } from './models/EnumWithStrings'; -export { ModelLink } from './models/ModelLink'; -export { ModelThatExtends } from './models/ModelThatExtends'; -export { ModelThatExtendsExtends } from './models/ModelThatExtendsExtends'; -export { ModelWithArray } from './models/ModelWithArray'; -export { ModelWithBoolean } from './models/ModelWithBoolean'; -export { ModelWithCircularReference } from './models/ModelWithCircularReference'; -export { ModelWithDictionary } from './models/ModelWithDictionary'; -export { ModelWithDuplicateImports } from './models/ModelWithDuplicateImports'; -export { ModelWithDuplicateProperties } from './models/ModelWithDuplicateProperties'; -export { ModelWithEnum } from './models/ModelWithEnum'; -export { ModelWithEnumFromDescription } from './models/ModelWithEnumFromDescription'; -export { ModelWithInteger } from './models/ModelWithInteger'; -export { ModelWithLink } from './models/ModelWithLink'; -export { ModelWithNestedEnums } from './models/ModelWithNestedEnums'; -export { ModelWithNestedProperties } from './models/ModelWithNestedProperties'; -export { ModelWithProperties } from './models/ModelWithProperties'; -export { ModelWithReference } from './models/ModelWithReference'; -export { ModelWithString } from './models/ModelWithString'; -export { SimpleBoolean } from './models/SimpleBoolean'; -export { SimpleFile } from './models/SimpleFile'; -export { SimpleInteger } from './models/SimpleInteger'; -export { SimpleReference } from './models/SimpleReference'; -export { SimpleString } from './models/SimpleString'; - -export { ComplexService } from './services/ComplexService'; -export { ParametersService } from './services/ParametersService'; -export { ResponseService } from './services/ResponseService'; -export { SimpleService } from './services/SimpleService'; -export { TypesService } from './services/TypesService'; -" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/ArrayWithArray.js): ./test/result/v3/javascript/models/ArrayWithArray.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a simple array containing an array - */ -export let ArrayWithArray; -(function (ArrayWithArray) { - - ArrayWithArray.schema = yup.array().of(yup.array().of(ModelWithString.schema)); - - ArrayWithArray.validate = async function(value) { - return ArrayWithArray.schema.validate(value, { strict: true }); - }; - - ArrayWithArray.validateSync = function(value) { - return ArrayWithArray.schema.validateSync(value, { strict: true }); - }; - -})(ArrayWithArray || (ArrayWithArray = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/ArrayWithBooleans.js): ./test/result/v3/javascript/models/ArrayWithBooleans.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple array with booleans - */ -export let ArrayWithBooleans; -(function (ArrayWithBooleans) { - - ArrayWithBooleans.schema = yup.array().of(yup.boolean()); - - ArrayWithBooleans.validate = async function(value) { - return ArrayWithBooleans.schema.validate(value, { strict: true }); - }; - - ArrayWithBooleans.validateSync = function(value) { - return ArrayWithBooleans.schema.validateSync(value, { strict: true }); - }; - -})(ArrayWithBooleans || (ArrayWithBooleans = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/ArrayWithNumbers.js): ./test/result/v3/javascript/models/ArrayWithNumbers.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple array with numbers - */ -export let ArrayWithNumbers; -(function (ArrayWithNumbers) { - - ArrayWithNumbers.schema = yup.array().of(yup.number()); - - ArrayWithNumbers.validate = async function(value) { - return ArrayWithNumbers.schema.validate(value, { strict: true }); - }; - - ArrayWithNumbers.validateSync = function(value) { - return ArrayWithNumbers.schema.validateSync(value, { strict: true }); - }; - -})(ArrayWithNumbers || (ArrayWithNumbers = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/ArrayWithProperties.js): ./test/result/v3/javascript/models/ArrayWithProperties.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple array with properties - */ -export let ArrayWithProperties; -(function (ArrayWithProperties) { - - ArrayWithProperties.schema = yup.array().of(( - yup.object().shape({ - foo: yup.lazy(() => yup.string().default(undefined)), - bar: yup.lazy(() => yup.string().default(undefined)) - }).noUnknown() - )); - - ArrayWithProperties.validate = async function(value) { - return ArrayWithProperties.schema.validate(value, { strict: true }); - }; - - ArrayWithProperties.validateSync = function(value) { - return ArrayWithProperties.schema.validateSync(value, { strict: true }); - }; - -})(ArrayWithProperties || (ArrayWithProperties = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/ArrayWithReferences.js): ./test/result/v3/javascript/models/ArrayWithReferences.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a simple array with references - */ -export let ArrayWithReferences; -(function (ArrayWithReferences) { - - ArrayWithReferences.schema = yup.array().of(ModelWithString.schema); - - ArrayWithReferences.validate = async function(value) { - return ArrayWithReferences.schema.validate(value, { strict: true }); - }; - - ArrayWithReferences.validateSync = function(value) { - return ArrayWithReferences.schema.validateSync(value, { strict: true }); - }; - -})(ArrayWithReferences || (ArrayWithReferences = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/ArrayWithStrings.js): ./test/result/v3/javascript/models/ArrayWithStrings.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple array with strings - */ -export let ArrayWithStrings; -(function (ArrayWithStrings) { - - ArrayWithStrings.schema = yup.array().of(yup.string()); - - ArrayWithStrings.validate = async function(value) { - return ArrayWithStrings.schema.validate(value, { strict: true }); - }; - - ArrayWithStrings.validateSync = function(value) { - return ArrayWithStrings.schema.validateSync(value, { strict: true }); - }; - -})(ArrayWithStrings || (ArrayWithStrings = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/DictionaryWithArray.js): ./test/result/v3/javascript/models/DictionaryWithArray.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a complex dictionary - */ -export let DictionaryWithArray; -(function (DictionaryWithArray) { - - DictionaryWithArray.schema = yup.lazy(value => { - return yup.object().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: yup.array().of(ModelWithString.schema) - }), {}) - ); - }); - - DictionaryWithArray.validate = async function(value) { - return DictionaryWithArray.schema.validate(value, { strict: true }); - }; - - DictionaryWithArray.validateSync = function(value) { - return DictionaryWithArray.schema.validateSync(value, { strict: true }); - }; - -})(DictionaryWithArray || (DictionaryWithArray = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/DictionaryWithDictionary.js): ./test/result/v3/javascript/models/DictionaryWithDictionary.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - - -import * as yup from 'yup'; - -/** - * This is a string dictionary - */ -export let DictionaryWithDictionary; -(function (DictionaryWithDictionary) { - - DictionaryWithDictionary.schema = yup.lazy(value => { - return yup.object().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: yup.lazy(value => { - return yup.object().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: yup.string() - }), {}) - ); - }) - }), {}) - ); - }); - - DictionaryWithDictionary.validate = async function(value) { - return DictionaryWithDictionary.schema.validate(value, { strict: true }); - }; - - DictionaryWithDictionary.validateSync = function(value) { - return DictionaryWithDictionary.schema.validateSync(value, { strict: true }); - }; - -})(DictionaryWithDictionary || (DictionaryWithDictionary = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/DictionaryWithProperties.js): ./test/result/v3/javascript/models/DictionaryWithProperties.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - - -import * as yup from 'yup'; - -/** - * This is a complex dictionary - */ -export let DictionaryWithProperties; -(function (DictionaryWithProperties) { - - DictionaryWithProperties.schema = yup.lazy(value => { - return yup.object().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: ( - yup.object().shape({ - foo: yup.lazy(() => yup.string().default(undefined)), - bar: yup.lazy(() => yup.string().default(undefined)) - }).noUnknown() - ) - }), {}) - ); - }); - - DictionaryWithProperties.validate = async function(value) { - return DictionaryWithProperties.schema.validate(value, { strict: true }); - }; - - DictionaryWithProperties.validateSync = function(value) { - return DictionaryWithProperties.schema.validateSync(value, { strict: true }); - }; - -})(DictionaryWithProperties || (DictionaryWithProperties = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/DictionaryWithReference.js): ./test/result/v3/javascript/models/DictionaryWithReference.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a string reference - */ -export let DictionaryWithReference; -(function (DictionaryWithReference) { - - DictionaryWithReference.schema = yup.lazy(value => { - return yup.object().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: ModelWithString.schema - }), {}) - ); - }); - - DictionaryWithReference.validate = async function(value) { - return DictionaryWithReference.schema.validate(value, { strict: true }); - }; - - DictionaryWithReference.validateSync = function(value) { - return DictionaryWithReference.schema.validateSync(value, { strict: true }); - }; - -})(DictionaryWithReference || (DictionaryWithReference = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/DictionaryWithString.js): ./test/result/v3/javascript/models/DictionaryWithString.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - - -import * as yup from 'yup'; - -/** - * This is a string dictionary - */ -export let DictionaryWithString; -(function (DictionaryWithString) { - - DictionaryWithString.schema = yup.lazy(value => { - return yup.object().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: yup.string() - }), {}) - ); - }); - - DictionaryWithString.validate = async function(value) { - return DictionaryWithString.schema.validate(value, { strict: true }); - }; - - DictionaryWithString.validateSync = function(value) { - return DictionaryWithString.schema.validateSync(value, { strict: true }); - }; - -})(DictionaryWithString || (DictionaryWithString = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/EnumFromDescription.js): ./test/result/v3/javascript/models/EnumFromDescription.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * Success=1,Warning=2,Error=3 - */ -export let EnumFromDescription; -(function (EnumFromDescription) { - - EnumFromDescription.ERROR = 3; - EnumFromDescription.SUCCESS = 1; - EnumFromDescription.WARNING = 2; - - EnumFromDescription.schema = yup.mixed().oneOf([ - 3, - 1, - 2 - ]); - - EnumFromDescription.validate = async function(value) { - return EnumFromDescription.schema.validate(value, { strict: true }); - }; - - EnumFromDescription.validateSync = function(value) { - return EnumFromDescription.schema.validateSync(value, { strict: true }); - }; - -})(EnumFromDescription || (EnumFromDescription = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/EnumWithNumbers.js): ./test/result/v3/javascript/models/EnumWithNumbers.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple enum with numbers - */ -export let EnumWithNumbers; -(function (EnumWithNumbers) { - - EnumWithNumbers.NUM_1 = 1; - EnumWithNumbers.NUM_2 = 2; - EnumWithNumbers.NUM_3 = 3; - - EnumWithNumbers.schema = yup.mixed().oneOf([ - 1, - 2, - 3 - ]); - - EnumWithNumbers.validate = async function(value) { - return EnumWithNumbers.schema.validate(value, { strict: true }); - }; - - EnumWithNumbers.validateSync = function(value) { - return EnumWithNumbers.schema.validateSync(value, { strict: true }); - }; - -})(EnumWithNumbers || (EnumWithNumbers = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/EnumWithStrings.js): ./test/result/v3/javascript/models/EnumWithStrings.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple enum with strings - */ -export let EnumWithStrings; -(function (EnumWithStrings) { - - EnumWithStrings.ERROR = 'Error'; - EnumWithStrings.SUCCESS = 'Success'; - EnumWithStrings.WARNING = 'Warning'; - - EnumWithStrings.schema = yup.mixed().oneOf([ - 'Error', - 'Success', - 'Warning' - ]); - - EnumWithStrings.validate = async function(value) { - return EnumWithStrings.schema.validate(value, { strict: true }); - }; - - EnumWithStrings.validateSync = function(value) { - return EnumWithStrings.schema.validateSync(value, { strict: true }); - }; - -})(EnumWithStrings || (EnumWithStrings = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/ModelLink.js): ./test/result/v3/javascript/models/ModelLink.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a model that can have a template?? - */ -export let ModelLink; -(function (ModelLink) { - - ModelLink.schema = ( - yup.object().shape({ - id: yup.lazy(() => yup.string().default(undefined)) - }).noUnknown() - ); - - ModelLink.validate = async function(value) { - return ModelLink.schema.validate(value, { strict: true }); - }; - - ModelLink.validateSync = function(value) { - return ModelLink.schema.validateSync(value, { strict: true }); - }; - -})(ModelLink || (ModelLink = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/ModelThatExtends.js): ./test/result/v3/javascript/models/ModelThatExtends.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a model that extends another model - */ -export let ModelThatExtends; -(function (ModelThatExtends) { - - ModelThatExtends.schema = ( - ModelWithString.schema.concat( - yup.object().shape({ - propExtendsA: yup.lazy(() => yup.string().default(undefined)), - propExtendsB: yup.lazy(() => ModelWithString.schema.default(undefined)) - }).noUnknown() - ) - ); - - ModelThatExtends.validate = async function(value) { - return ModelThatExtends.schema.validate(value, { strict: true }); - }; - - ModelThatExtends.validateSync = function(value) { - return ModelThatExtends.schema.validateSync(value, { strict: true }); - }; - -})(ModelThatExtends || (ModelThatExtends = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/ModelThatExtendsExtends.js): ./test/result/v3/javascript/models/ModelThatExtendsExtends.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelThatExtends } from '../models/ModelThatExtends'; -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a model that extends another model - */ -export let ModelThatExtendsExtends; -(function (ModelThatExtendsExtends) { - - ModelThatExtendsExtends.schema = ( - ModelWithString.schema.concat( - ModelThatExtends.schema.concat( - yup.object().shape({ - propExtendsC: yup.lazy(() => yup.string().default(undefined)), - propExtendsD: yup.lazy(() => ModelWithString.schema.default(undefined)) - }).noUnknown() - ) - ) - ); - - ModelThatExtendsExtends.validate = async function(value) { - return ModelThatExtendsExtends.schema.validate(value, { strict: true }); - }; - - ModelThatExtendsExtends.validateSync = function(value) { - return ModelThatExtendsExtends.schema.validateSync(value, { strict: true }); - }; - -})(ModelThatExtendsExtends || (ModelThatExtendsExtends = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/ModelWithArray.js): ./test/result/v3/javascript/models/ModelWithArray.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a model with one property containing an array - */ -export let ModelWithArray; -(function (ModelWithArray) { - - ModelWithArray.schema = ( - yup.object().shape({ - prop: yup.lazy(() => yup.array().of(ModelWithString.schema).default(undefined)) - }).noUnknown() - ); - - ModelWithArray.validate = async function(value) { - return ModelWithArray.schema.validate(value, { strict: true }); - }; - - ModelWithArray.validateSync = function(value) { - return ModelWithArray.schema.validateSync(value, { strict: true }); - }; - -})(ModelWithArray || (ModelWithArray = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/ModelWithBoolean.js): ./test/result/v3/javascript/models/ModelWithBoolean.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a model with one boolean property - */ -export let ModelWithBoolean; -(function (ModelWithBoolean) { - - ModelWithBoolean.schema = ( - yup.object().shape({ - prop: yup.lazy(() => yup.boolean().default(undefined)) - }).noUnknown() - ); - - ModelWithBoolean.validate = async function(value) { - return ModelWithBoolean.schema.validate(value, { strict: true }); - }; - - ModelWithBoolean.validateSync = function(value) { - return ModelWithBoolean.schema.validateSync(value, { strict: true }); - }; - -})(ModelWithBoolean || (ModelWithBoolean = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/ModelWithCircularReference.js): ./test/result/v3/javascript/models/ModelWithCircularReference.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a model with one property containing a circular reference - */ -export let ModelWithCircularReference; -(function (ModelWithCircularReference) { - - ModelWithCircularReference.schema = ( - yup.object().shape({ - prop: yup.lazy(() => ModelWithCircularReference.schema.default(undefined)) - }).noUnknown() - ); - - ModelWithCircularReference.validate = async function(value) { - return ModelWithCircularReference.schema.validate(value, { strict: true }); - }; - - ModelWithCircularReference.validateSync = function(value) { - return ModelWithCircularReference.schema.validateSync(value, { strict: true }); - }; - -})(ModelWithCircularReference || (ModelWithCircularReference = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/ModelWithDictionary.js): ./test/result/v3/javascript/models/ModelWithDictionary.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - - -import * as yup from 'yup'; - -/** - * This is a model with one property containing a dictionary - */ -export let ModelWithDictionary; -(function (ModelWithDictionary) { - - ModelWithDictionary.schema = ( - yup.object().shape({ - prop: yup.lazy(() => yup.lazy(value => { - return yup.object().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: yup.string() - }), {}) - ); - }).default(undefined)) - }).noUnknown() - ); - - ModelWithDictionary.validate = async function(value) { - return ModelWithDictionary.schema.validate(value, { strict: true }); - }; - - ModelWithDictionary.validateSync = function(value) { - return ModelWithDictionary.schema.validateSync(value, { strict: true }); - }; - -})(ModelWithDictionary || (ModelWithDictionary = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/ModelWithDuplicateImports.js): ./test/result/v3/javascript/models/ModelWithDuplicateImports.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a model with duplicated imports - */ -export let ModelWithDuplicateImports; -(function (ModelWithDuplicateImports) { - - ModelWithDuplicateImports.schema = ( - yup.object().shape({ - propA: yup.lazy(() => ModelWithString.schema.default(undefined)), - propB: yup.lazy(() => ModelWithString.schema.default(undefined)), - propC: yup.lazy(() => ModelWithString.schema.default(undefined)) - }).noUnknown() - ); - - ModelWithDuplicateImports.validate = async function(value) { - return ModelWithDuplicateImports.schema.validate(value, { strict: true }); - }; - - ModelWithDuplicateImports.validateSync = function(value) { - return ModelWithDuplicateImports.schema.validateSync(value, { strict: true }); - }; - -})(ModelWithDuplicateImports || (ModelWithDuplicateImports = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/ModelWithDuplicateProperties.js): ./test/result/v3/javascript/models/ModelWithDuplicateProperties.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a model with duplicated properties - */ -export let ModelWithDuplicateProperties; -(function (ModelWithDuplicateProperties) { - - ModelWithDuplicateProperties.schema = ( - yup.object().shape({ - prop: yup.lazy(() => ModelWithString.schema.default(undefined)) - }).noUnknown() - ); - - ModelWithDuplicateProperties.validate = async function(value) { - return ModelWithDuplicateProperties.schema.validate(value, { strict: true }); - }; - - ModelWithDuplicateProperties.validateSync = function(value) { - return ModelWithDuplicateProperties.schema.validateSync(value, { strict: true }); - }; - -})(ModelWithDuplicateProperties || (ModelWithDuplicateProperties = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/ModelWithEnum.js): ./test/result/v3/javascript/models/ModelWithEnum.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a model with one enum - */ -export let ModelWithEnum; -(function (ModelWithEnum) { - - /** - * This is a simple enum with strings - */ - ModelWithEnum.Test = { - SUCCESS: 'Success', - WARNING: 'Warning', - ERROR: 'Error' - }; - - ModelWithEnum.schema = ( - yup.object().shape({ - Test: yup.lazy(() => yup.mixed().oneOf([ - Test.SUCCESS, - Test.WARNING, - Test.ERROR - ]).default(undefined)) - }).noUnknown() - ); - - ModelWithEnum.validate = async function(value) { - return ModelWithEnum.schema.validate(value, { strict: true }); - }; - - ModelWithEnum.validateSync = function(value) { - return ModelWithEnum.schema.validateSync(value, { strict: true }); - }; - -})(ModelWithEnum || (ModelWithEnum = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/ModelWithEnumFromDescription.js): ./test/result/v3/javascript/models/ModelWithEnumFromDescription.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a model with one enum - */ -export let ModelWithEnumFromDescription; -(function (ModelWithEnumFromDescription) { - - /** - * Success=1,Warning=2,Error=3 - */ - ModelWithEnumFromDescription.Test = { - SUCCESS: 1, - WARNING: 2, - ERROR: 3 - }; - - ModelWithEnumFromDescription.schema = ( - yup.object().shape({ - Test: yup.lazy(() => yup.mixed().oneOf([ - Test.SUCCESS, - Test.WARNING, - Test.ERROR - ]).default(undefined)) - }).noUnknown() - ); - - ModelWithEnumFromDescription.validate = async function(value) { - return ModelWithEnumFromDescription.schema.validate(value, { strict: true }); - }; - - ModelWithEnumFromDescription.validateSync = function(value) { - return ModelWithEnumFromDescription.schema.validateSync(value, { strict: true }); - }; - -})(ModelWithEnumFromDescription || (ModelWithEnumFromDescription = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/ModelWithInteger.js): ./test/result/v3/javascript/models/ModelWithInteger.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a model with one number property - */ -export let ModelWithInteger; -(function (ModelWithInteger) { - - ModelWithInteger.schema = ( - yup.object().shape({ - prop: yup.lazy(() => yup.number().default(undefined)) - }).noUnknown() - ); - - ModelWithInteger.validate = async function(value) { - return ModelWithInteger.schema.validate(value, { strict: true }); - }; - - ModelWithInteger.validateSync = function(value) { - return ModelWithInteger.schema.validateSync(value, { strict: true }); - }; - -})(ModelWithInteger || (ModelWithInteger = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/ModelWithLink.js): ./test/result/v3/javascript/models/ModelWithLink.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelLink } from '../models/ModelLink'; -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a model that can have a template?? - */ -export let ModelWithLink; -(function (ModelWithLink) { - - ModelWithLink.schema = ( - yup.object().shape({ - prop: yup.lazy(() => ModelLink.schema.default(undefined)) - }).noUnknown() - ); - - ModelWithLink.validate = async function(value) { - return ModelWithLink.schema.validate(value, { strict: true }); - }; - - ModelWithLink.validateSync = function(value) { - return ModelWithLink.schema.validateSync(value, { strict: true }); - }; - -})(ModelWithLink || (ModelWithLink = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/ModelWithNestedEnums.js): ./test/result/v3/javascript/models/ModelWithNestedEnums.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { array } from '../models/array'; - -import * as yup from 'yup'; - -/** - * This is a model with nested enums - */ -export let ModelWithNestedEnums; -(function (ModelWithNestedEnums) { - - ModelWithNestedEnums.schema = ( - yup.object().shape({ - arrayWithDescription: yup.lazy(() => yup.mixed().default(undefined)), - arrayWithEnum: yup.lazy(() => yup.mixed().default(undefined)), - dictionaryWithEnum: yup.lazy(() => yup.lazy(value => { - return yup.object().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: yup.mixed().oneOf([ - 'Success', - 'Warning', - 'Error' - ]) - }), {}) - ); - }).default(undefined)), - dictionaryWithEnumFromDescription: yup.lazy(() => yup.lazy(value => { - return yup.object().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: yup.mixed().oneOf([ - 1, - 2, - 3 - ]) - }), {}) - ); - }).default(undefined)) - }).noUnknown() - ); - - ModelWithNestedEnums.validate = async function(value) { - return ModelWithNestedEnums.schema.validate(value, { strict: true }); - }; - - ModelWithNestedEnums.validateSync = function(value) { - return ModelWithNestedEnums.schema.validateSync(value, { strict: true }); - }; - -})(ModelWithNestedEnums || (ModelWithNestedEnums = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/ModelWithNestedProperties.js): ./test/result/v3/javascript/models/ModelWithNestedProperties.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a model with one nested property - */ -export let ModelWithNestedProperties; -(function (ModelWithNestedProperties) { - - ModelWithNestedProperties.schema = ( - yup.object().shape({ - first: yup.lazy(() => ( - yup.object().shape({ - second: yup.lazy(() => ( - yup.object().shape({ - third: yup.lazy(() => yup.string().default(undefined).isNullable()).isRequired() - }).noUnknown() - ).default(undefined).isNullable()).isRequired() - }).noUnknown() - ).default(undefined).isNullable()).isRequired() - }).noUnknown() - ); - - ModelWithNestedProperties.validate = async function(value) { - return ModelWithNestedProperties.schema.validate(value, { strict: true }); - }; - - ModelWithNestedProperties.validateSync = function(value) { - return ModelWithNestedProperties.schema.validateSync(value, { strict: true }); - }; - -})(ModelWithNestedProperties || (ModelWithNestedProperties = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/ModelWithProperties.js): ./test/result/v3/javascript/models/ModelWithProperties.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a model with one nested property - */ -export let ModelWithProperties; -(function (ModelWithProperties) { - - ModelWithProperties.schema = ( - yup.object().shape({ - boolean: yup.lazy(() => yup.boolean().default(undefined)), - number: yup.lazy(() => yup.number().default(undefined)), - reference: yup.lazy(() => ModelWithString.schema.default(undefined)), - required: yup.lazy(() => yup.string().default(undefined)).isRequired(), - requiredAndNullable: yup.lazy(() => yup.string().default(undefined).isNullable()).isRequired(), - requiredAndReadOnly: yup.lazy(() => yup.string().default(undefined)).isRequired(), - string: yup.lazy(() => yup.string().default(undefined)) - }).noUnknown() - ); - - ModelWithProperties.validate = async function(value) { - return ModelWithProperties.schema.validate(value, { strict: true }); - }; - - ModelWithProperties.validateSync = function(value) { - return ModelWithProperties.schema.validateSync(value, { strict: true }); - }; - -})(ModelWithProperties || (ModelWithProperties = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/ModelWithReference.js): ./test/result/v3/javascript/models/ModelWithReference.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a model with one property containing a reference - */ -export let ModelWithReference; -(function (ModelWithReference) { - - ModelWithReference.schema = ( - yup.object().shape({ - prop: yup.lazy(() => ModelWithString.schema.default(undefined)) - }).noUnknown() - ); - - ModelWithReference.validate = async function(value) { - return ModelWithReference.schema.validate(value, { strict: true }); - }; - - ModelWithReference.validateSync = function(value) { - return ModelWithReference.schema.validateSync(value, { strict: true }); - }; - -})(ModelWithReference || (ModelWithReference = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/ModelWithString.js): ./test/result/v3/javascript/models/ModelWithString.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a model with one string property - */ -export let ModelWithString; -(function (ModelWithString) { - - ModelWithString.schema = ( - yup.object().shape({ - prop: yup.lazy(() => yup.string().default(undefined)) - }).noUnknown() - ); - - ModelWithString.validate = async function(value) { - return ModelWithString.schema.validate(value, { strict: true }); - }; - - ModelWithString.validateSync = function(value) { - return ModelWithString.schema.validateSync(value, { strict: true }); - }; - -})(ModelWithString || (ModelWithString = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/SimpleBoolean.js): ./test/result/v3/javascript/models/SimpleBoolean.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple boolean - */ -export let SimpleBoolean; -(function (SimpleBoolean) { - - SimpleBoolean.schema = yup.boolean(); - - SimpleBoolean.validate = async function(value) { - return SimpleBoolean.schema.validate(value, { strict: true }); - }; - - SimpleBoolean.validateSync = function(value) { - return SimpleBoolean.schema.validateSync(value, { strict: true }); - }; - -})(SimpleBoolean || (SimpleBoolean = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/SimpleFile.js): ./test/result/v3/javascript/models/SimpleFile.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple file - */ -export let SimpleFile; -(function (SimpleFile) { - - SimpleFile.schema = yup.mixed(); - - SimpleFile.validate = async function(value) { - return SimpleFile.schema.validate(value, { strict: true }); - }; - - SimpleFile.validateSync = function(value) { - return SimpleFile.schema.validateSync(value, { strict: true }); - }; - -})(SimpleFile || (SimpleFile = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/SimpleInteger.js): ./test/result/v3/javascript/models/SimpleInteger.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple number - */ -export let SimpleInteger; -(function (SimpleInteger) { - - SimpleInteger.schema = yup.number(); - - SimpleInteger.validate = async function(value) { - return SimpleInteger.schema.validate(value, { strict: true }); - }; - - SimpleInteger.validateSync = function(value) { - return SimpleInteger.schema.validateSync(value, { strict: true }); - }; - -})(SimpleInteger || (SimpleInteger = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/SimpleReference.js): ./test/result/v3/javascript/models/SimpleReference.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a simple reference - */ -export let SimpleReference; -(function (SimpleReference) { - - SimpleReference.schema = ModelWithString.schema; - - SimpleReference.validate = async function(value) { - return SimpleReference.schema.validate(value, { strict: true }); - }; - - SimpleReference.validateSync = function(value) { - return SimpleReference.schema.validateSync(value, { strict: true }); - }; - -})(SimpleReference || (SimpleReference = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/models/SimpleString.js): ./test/result/v3/javascript/models/SimpleString.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple string - */ -export let SimpleString; -(function (SimpleString) { - - SimpleString.schema = yup.string(); - - SimpleString.validate = async function(value) { - return SimpleString.schema.validate(value, { strict: true }); - }; - - SimpleString.validateSync = function(value) { - return SimpleString.schema.validateSync(value, { strict: true }); - }; - -})(SimpleString || (SimpleString = {}));" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/services/ComplexService.js): ./test/result/v3/javascript/services/ComplexService.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ApiError, catchGenericError } from '../core/ApiError'; -import { request } from '../core/request'; -import { OpenAPI } from '../core/OpenAPI'; - -export class ComplexService { - - /** - * @param parameterObject Parameter containing object - * @param parameterReference Parameter containing reference - * @result ModelWithString Successful response - * @throws ApiError - */ - static async complexTypes( - parameterObject, - parameterReference - ) { - - const result = await request({ - method: 'get', - path: \`/api/v\${OpenAPI.VERSION}/complex\`, - query: { - 'parameterObject': parameterObject, - 'parameterReference': parameterReference - } - }); - - if (!result.ok) { - switch (result.status) { - case 400: throw new ApiError(result, \`400 server error\`); - case 500: throw new ApiError(result, \`500 server error\`); - } - } - - catchGenericError(result); - - return result.body; - } - -}" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/services/ParametersService.js): ./test/result/v3/javascript/services/ParametersService.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ApiError, catchGenericError } from '../core/ApiError'; -import { request } from '../core/request'; -import { OpenAPI } from '../core/OpenAPI'; - -export class ParametersService { - - /** - * @param parameterHeader This is the parameter that goes into the request header - * @param parameterQuery This is the parameter that goes into the request query params - * @param parameterForm This is the parameter that goes into the request form data - * @param parameterCookie This is the parameter that goes into the cookie - * @param requestBody This is the parameter that goes into the body - * @throws ApiError - */ - static async callWithParameters( - parameterHeader, - parameterQuery, - parameterForm, - parameterCookie, - requestBody - ) { - - const result = await request({ - method: 'get', - path: \`/api/v\${OpenAPI.VERSION}/parameters\`, - cookies: { - 'parameterCookie': parameterCookie - }, - headers: { - 'parameterHeader': parameterHeader - }, - query: { - 'parameterQuery': parameterQuery - }, - formData: { - 'parameterForm': parameterForm - }, - body: requestBody - }); - - catchGenericError(result); - - return result.body; - } - -}" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/services/ResponseService.js): ./test/result/v3/javascript/services/ResponseService.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ApiError, catchGenericError } from '../core/ApiError'; -import { request } from '../core/request'; -import { OpenAPI } from '../core/OpenAPI'; - -export class ResponseService { - - /** - * @result ModelWithString Message for default response - * @throws ApiError - */ - static async callWithDuplicateResponses() { - - const result = await request({ - method: 'post', - path: \`/api/v\${OpenAPI.VERSION}/response\` - }); - - if (!result.ok) { - switch (result.status) { - case 500: throw new ApiError(result, \`Message for 500 error\`); - case 501: throw new ApiError(result, \`Message for 501 error\`); - case 502: throw new ApiError(result, \`Message for 502 error\`); - } - } - - catchGenericError(result); - - return result.body; - } - - /** - * @result ModelWithString - * @throws ApiError - */ - static async callWithResponse() { - - const result = await request({ - method: 'get', - path: \`/api/v\${OpenAPI.VERSION}/response\` - }); - - catchGenericError(result); - - return result.body; - } - - /** - * @result ModelWithString Message for default response - * @result ModelThatExtends Message for 201 response - * @result ModelThatExtendsExtends Message for 202 response - * @throws ApiError - */ - static async callWithResponses() { - - const result = await request({ - method: 'put', - path: \`/api/v\${OpenAPI.VERSION}/response\` - }); - - if (!result.ok) { - switch (result.status) { - case 500: throw new ApiError(result, \`Message for 500 error\`); - case 501: throw new ApiError(result, \`Message for 501 error\`); - case 502: throw new ApiError(result, \`Message for 502 error\`); - } - } - - catchGenericError(result); - - return result.body; - } - -}" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/services/SimpleService.js): ./test/result/v3/javascript/services/SimpleService.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ApiError, catchGenericError } from '../core/ApiError'; -import { request } from '../core/request'; -import { OpenAPI } from '../core/OpenAPI'; - -export class SimpleService { - - /** - * @throws ApiError - */ - static async deleteCallWithoutParametersAndResponse() { - - const result = await request({ - method: 'delete', - path: \`/api/v\${OpenAPI.VERSION}/simple\` - }); - - catchGenericError(result); - - return result.body; - } - - /** - * @throws ApiError - */ - static async getCallWithoutParametersAndResponse() { - - const result = await request({ - method: 'get', - path: \`/api/v\${OpenAPI.VERSION}/simple\` - }); - - catchGenericError(result); - - return result.body; - } - - /** - * @throws ApiError - */ - static async headCallWithoutParametersAndResponse() { - - const result = await request({ - method: 'head', - path: \`/api/v\${OpenAPI.VERSION}/simple\` - }); - - catchGenericError(result); - - return result.body; - } - - /** - * @throws ApiError - */ - static async optionsCallWithoutParametersAndResponse() { - - const result = await request({ - method: 'options', - path: \`/api/v\${OpenAPI.VERSION}/simple\` - }); - - catchGenericError(result); - - return result.body; - } - - /** - * @throws ApiError - */ - static async patchCallWithoutParametersAndResponse() { - - const result = await request({ - method: 'patch', - path: \`/api/v\${OpenAPI.VERSION}/simple\` - }); - - catchGenericError(result); - - return result.body; - } - - /** - * @throws ApiError - */ - static async postCallWithoutParametersAndResponse() { - - const result = await request({ - method: 'post', - path: \`/api/v\${OpenAPI.VERSION}/simple\` - }); - - catchGenericError(result); - - return result.body; - } - - /** - * @throws ApiError - */ - static async putCallWithoutParametersAndResponse() { - - const result = await request({ - method: 'put', - path: \`/api/v\${OpenAPI.VERSION}/simple\` - }); - - catchGenericError(result); - - return result.body; - } - -}" -`; - -exports[`generation v3 javascript file(./test/result/v3/javascript/services/TypesService.js): ./test/result/v3/javascript/services/TypesService.js 1`] = ` -"/* istanbul ignore file */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ApiError, catchGenericError } from '../core/ApiError'; -import { request } from '../core/request'; -import { OpenAPI } from '../core/OpenAPI'; - -export class TypesService { - - /** - * @param parameterNumber This is a number parameter - * @param parameterString This is a string parameter - * @param parameterBoolean This is a boolean parameter - * @param parameterObject This is an object parameter - * @param parameterArray This is an array parameter - * @param parameterDictionary This is a dictionary parameter - * @param parameterEnum This is an enum parameter - * @param id This is a number parameter - * @result number Response is a simple number - * @result string Response is a simple string - * @result boolean Response is a simple boolean - * @result any Response is a simple object - * @throws ApiError - */ - static async types( - parameterNumber, - parameterString, - parameterBoolean, - parameterObject, - parameterArray, - parameterDictionary, - parameterEnum, - id - ) { - - const result = await request({ - method: 'get', - path: \`/api/v\${OpenAPI.VERSION}/types\`, - query: { - 'parameterNumber': parameterNumber, - 'parameterString': parameterString, - 'parameterBoolean': parameterBoolean, - 'parameterObject': parameterObject, - 'parameterArray': parameterArray, - 'parameterDictionary': parameterDictionary, - 'parameterEnum': parameterEnum - } - }); - - catchGenericError(result); - - return result.body; - } - -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/core/ApiError.ts): ./test/result/v3/typescript/core/ApiError.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { isSuccess } from './isSuccess'; -import { Result } from './Result'; - -export class ApiError extends Error { - - public readonly url: string; - public readonly status: number; - public readonly statusText: string; - public readonly body: any; - - constructor(result: Readonly, message: string) { - super(message); - - this.url = result.url; - this.status = result.status; - this.statusText = result.statusText; - this.body = result.body; - } -} - -export namespace ApiError { - export enum Message { - BAD_REQUEST = 'Bad Request', - UNAUTHORIZED = 'Unauthorized', - FORBIDDEN = 'Forbidden', - NOT_FOUND = 'Not Found', - INTERNAL_SERVER_ERROR = 'Internal Server Error', - BAD_GATEWAY = 'Bad Gateway', - SERVICE_UNAVAILABLE = 'Service Unavailable', - GENERIC_ERROR = 'Generic Error', - } -} - -/** - * Catch common errors (based on status code). - * @param result - */ -export function catchGenericError(result: Result): void { - switch (result.status) { - case 400: throw new ApiError(result, ApiError.Message.BAD_REQUEST); - case 401: throw new ApiError(result, ApiError.Message.UNAUTHORIZED); - case 403: throw new ApiError(result, ApiError.Message.FORBIDDEN); - case 404: throw new ApiError(result, ApiError.Message.NOT_FOUND); - case 500: throw new ApiError(result, ApiError.Message.INTERNAL_SERVER_ERROR); - case 502: throw new ApiError(result, ApiError.Message.BAD_GATEWAY); - case 503: throw new ApiError(result, ApiError.Message.SERVICE_UNAVAILABLE); - } - - if (!isSuccess(result.status)) { - throw new ApiError(result, ApiError.Message.GENERIC_ERROR); - } -} -" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/core/OpenAPI.ts): ./test/result/v3/typescript/core/OpenAPI.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -export namespace OpenAPI { - export let BASE = '/api'; - export let VERSION = '1'; - export let CLIENT = 'fetch'; - export let TOKEN = ''; -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/core/RequestOptions.ts): ./test/result/v3/typescript/core/RequestOptions.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -export interface RequestOptions { - method: 'get' | 'put' | 'post' | 'delete' | 'options' | 'head' | 'patch'; - path: string; - cookies?: { [key: string]: any }; - headers?: { [key: string]: any }; - query?: { [key: string]: any }; - formData?: { [key: string]: any }; - body?: any; -} -" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/core/Result.ts): ./test/result/v3/typescript/core/Result.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -export interface Result { - url: string; - ok: boolean; - status: number; - statusText: string; - body: any; -} -" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/core/getFormData.ts): ./test/result/v3/typescript/core/getFormData.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -/** - * Get FormData from object. This method is needed to upload - * multipart form data to the REST API. - * @param params Key value based object. - */ -export function getFormData(params: { [key: string]: any }): FormData { - const formData = new FormData(); - for (const key in params) { - if (typeof params[key] !== 'undefined') { - const value: any = params[key]; - if (value !== undefined && value !== null) { - formData.append(key, value); - } - } - } - return formData; -} -" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/core/getQueryString.ts): ./test/result/v3/typescript/core/getQueryString.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -/** - * Get query string from query parameters object. This method also - * supports multi-value items by creating a key for each item. - * @param params Key value based object. - */ -export function getQueryString(params: { [key: string]: any }): string { - const qs: string[] = []; - for (const key in params) { - if (typeof params[key] !== 'undefined') { - const value: any = params[key]; - if (value !== undefined && value !== null) { - if (Array.isArray(value)) { - value.forEach(value => { - qs.push(\`\${encodeURIComponent(key)}=\${encodeURIComponent(String(value))}\`); - }); - } else { - qs.push(\`\${encodeURIComponent(key)}=\${encodeURIComponent(String(value))}\`); - } - } - } - } - if (qs.length > 0) { - return \`?\${qs.join('&')}\`; - } - return ''; -} -" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/core/isSuccess.ts): ./test/result/v3/typescript/core/isSuccess.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -/** - * Check success response code. - * @param status Status code - */ -export function isSuccess(status: number): boolean { - return status >= 200 && status < 300; -} -" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/core/request.ts): ./test/result/v3/typescript/core/request.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import {getFormData} from './getFormData'; -import {getQueryString} from './getQueryString'; -import {OpenAPI} from './OpenAPI'; -import {RequestOptions} from './RequestOptions'; -import {requestUsingFetch} from './requestUsingFetch'; -import {requestUsingXHR} from './requestUsingXHR'; -import {Result} from './Result'; - -/** - * Create the request. - * @param options Request method options. - * @returns Result object (see above) - */ -export async function request(options: Readonly): Promise { - - // Create the request URL - let url = \`\${OpenAPI.BASE}\${options.path}\`; - - // Create request headers - const headers = new Headers({ - ...options.headers, - Accept: 'application/json' - }); - - // Create request settings - const request: RequestInit = { - headers, - method: options.method, - credentials: 'same-origin' - }; - - // If we have a bearer token then we set the authentication header. - if (OpenAPI.TOKEN !== null && OpenAPI.TOKEN !== '') { - headers.append('Authorization', \`Bearer \${OpenAPI.TOKEN}\`); - } - - // Add the query parameters (if defined). - if (options.query) { - url += getQueryString(options.query); - } - - // Append formData as body - if (options.formData) { - request.body = getFormData(options.formData); - } else if (options.body) { - - // If this is blob data, then pass it directly to the body and set content type. - // Otherwise we just convert request data to JSON string (needed for fetch api) - if (options.body instanceof Blob) { - request.body = options.body; - if (options.body.type) { - headers.append('Content-Type', options.body.type); - } - } else { - request.body = JSON.stringify(options.body); - headers.append('Content-Type', 'application/json'); - } - } - - try { - switch (OpenAPI.CLIENT) { - case 'xhr': - return await requestUsingXHR(url, request); - default: - return await requestUsingFetch(url, request); - } - } catch (error) { - return { - url, - ok: false, - status: 0, - statusText: '', - body: error - }; - } -} -" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/core/requestUsingFetch.ts): ./test/result/v3/typescript/core/requestUsingFetch.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { Result } from './Result'; - -/** - * Request content using the new Fetch API. This is the default API that is used and - * is create for all JSON, XML and text objects. However it is limited to UTF-8. - * This is a problem for some of the Docs content, since that requires UTF-16! - * @param url The url to request. - * @param request The request object, containing method, headers, body, etc. - */ -export async function requestUsingFetch(url: string, request: Readonly): Promise { - - // Fetch response using fetch API. - const response = await fetch(url, request); - - // Create result object. - const result: Result = { - url, - ok: response.ok, - status: response.status, - statusText: response.statusText, - body: null - }; - - // Try to parse the content for any response status code. - // We check the \\"Content-Type\\" header to see if we need to parse the - // content as json or as plain text. - const contentType = response.headers.get('Content-Type'); - if (contentType) { - switch (contentType.toLowerCase()) { - case 'application/json': - case 'application/json; charset=utf-8': - result.body = await response.json(); - break; - - case 'text/plain': - case 'text/xml': - case 'text/xml; charset=utf-8': - case 'text/xml; charset=utf-16': - result.body = await response.text(); - break; - } - } - - return result; -} -" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/core/requestUsingXHR.ts): ./test/result/v3/typescript/core/requestUsingXHR.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { Result } from './Result'; -import { isSuccess } from './isSuccess'; - -/** - * Request content using the new legacy XMLHttpRequest API. This method is useful - * when we want to request UTF-16 content, since it natively supports loading UTF-16. - * We could do the same with the Fetch API, but then we will need to convert the - * content using JavaScript... And that is very very slow. - * @param url The url to request. - * @param request The request object, containing method, headers, body, etc. - */ -export async function requestUsingXHR(url: string, request: Readonly): Promise { - return new Promise(resolve => { - const xhr = new XMLHttpRequest(); - - // Open the request, remember to do this before adding any headers, - // because the request needs to be initialized! - xhr.open(request.method!, url, true); - - // Add the headers (required when dealing with JSON) - const headers = request.headers as Headers; - headers.forEach((value: string, key: string): void => { - xhr.setRequestHeader(key, value); - }); - - // Register the readystate handler, this will fire when the request is done. - xhr.onreadystatechange = () => { - if (xhr.readyState === XMLHttpRequest.DONE) { - - // Create result object. - const result: Result = { - url, - ok: isSuccess(xhr.status), - status: xhr.status, - statusText: xhr.statusText, - body: null - }; - - // Try to parse the content for any response status code. - // We check the \\"Content-Type\\" header to see if we need to parse the - // content as json or as plain text. - const contentType = xhr.getResponseHeader('Content-Type'); - if (contentType) { - switch (contentType.toLowerCase()) { - case 'application/json': - case 'application/json; charset=utf-8': - result.body = JSON.parse(xhr.responseText); - break; - - case 'text/plain': - case 'text/xml': - case 'text/xml; charset=utf-8': - case 'text/xml; charset=utf-16': - result.body = xhr.responseText; - break; - } - } - - // Done! - resolve(result); - } - }; - - // Start the request! - xhr.send(request.body); - }); -} -" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/index.ts): ./test/result/v3/typescript/index.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -export { ApiError } from './core/ApiError'; -export { isSuccess } from './core/isSuccess'; -export { OpenAPI } from './core/OpenAPI'; - -export { ArrayWithArray } from './models/ArrayWithArray'; -export { ArrayWithBooleans } from './models/ArrayWithBooleans'; -export { ArrayWithNumbers } from './models/ArrayWithNumbers'; -export { ArrayWithProperties } from './models/ArrayWithProperties'; -export { ArrayWithReferences } from './models/ArrayWithReferences'; -export { ArrayWithStrings } from './models/ArrayWithStrings'; -export { Dictionary } from './models/Dictionary'; -export { DictionaryWithArray } from './models/DictionaryWithArray'; -export { DictionaryWithDictionary } from './models/DictionaryWithDictionary'; -export { DictionaryWithProperties } from './models/DictionaryWithProperties'; -export { DictionaryWithReference } from './models/DictionaryWithReference'; -export { DictionaryWithString } from './models/DictionaryWithString'; -export { EnumFromDescription } from './models/EnumFromDescription'; -export { EnumWithNumbers } from './models/EnumWithNumbers'; -export { EnumWithStrings } from './models/EnumWithStrings'; -export { ModelLink } from './models/ModelLink'; -export { ModelThatExtends } from './models/ModelThatExtends'; -export { ModelThatExtendsExtends } from './models/ModelThatExtendsExtends'; -export { ModelWithArray } from './models/ModelWithArray'; -export { ModelWithBoolean } from './models/ModelWithBoolean'; -export { ModelWithCircularReference } from './models/ModelWithCircularReference'; -export { ModelWithDictionary } from './models/ModelWithDictionary'; -export { ModelWithDuplicateImports } from './models/ModelWithDuplicateImports'; -export { ModelWithDuplicateProperties } from './models/ModelWithDuplicateProperties'; -export { ModelWithEnum } from './models/ModelWithEnum'; -export { ModelWithEnumFromDescription } from './models/ModelWithEnumFromDescription'; -export { ModelWithInteger } from './models/ModelWithInteger'; -export { ModelWithLink } from './models/ModelWithLink'; -export { ModelWithNestedEnums } from './models/ModelWithNestedEnums'; -export { ModelWithNestedProperties } from './models/ModelWithNestedProperties'; -export { ModelWithProperties } from './models/ModelWithProperties'; -export { ModelWithReference } from './models/ModelWithReference'; -export { ModelWithString } from './models/ModelWithString'; -export { SimpleBoolean } from './models/SimpleBoolean'; -export { SimpleFile } from './models/SimpleFile'; -export { SimpleInteger } from './models/SimpleInteger'; -export { SimpleReference } from './models/SimpleReference'; -export { SimpleString } from './models/SimpleString'; - -export { ComplexService } from './services/ComplexService'; -export { ParametersService } from './services/ParametersService'; -export { ResponseService } from './services/ResponseService'; -export { SimpleService } from './services/SimpleService'; -export { TypesService } from './services/TypesService'; -" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/ArrayWithArray.ts): ./test/result/v3/typescript/models/ArrayWithArray.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a simple array containing an array - */ -export type ArrayWithArray = Array>; - -export namespace ArrayWithArray { - - export const schema = yup.array>().of(yup.array().of(ModelWithString.schema)); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ArrayWithArray { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/ArrayWithBooleans.ts): ./test/result/v3/typescript/models/ArrayWithBooleans.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple array with booleans - */ -export type ArrayWithBooleans = Array; - -export namespace ArrayWithBooleans { - - export const schema = yup.array().of(yup.boolean()); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ArrayWithBooleans { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/ArrayWithNumbers.ts): ./test/result/v3/typescript/models/ArrayWithNumbers.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple array with numbers - */ -export type ArrayWithNumbers = Array; - -export namespace ArrayWithNumbers { - - export const schema = yup.array().of(yup.number()); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ArrayWithNumbers { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/ArrayWithProperties.ts): ./test/result/v3/typescript/models/ArrayWithProperties.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple array with properties - */ -export type ArrayWithProperties = Array<{ - foo?: string, - bar?: string -}>; - -export namespace ArrayWithProperties { - - export const schema = yup.array<{ - foo?: string, - bar?: string - }>().of(( - yup.object().shape({ - foo: yup.lazy(() => yup.string().default(undefined)), - bar: yup.lazy(() => yup.string().default(undefined)) - }).noUnknown() - )); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ArrayWithProperties { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/ArrayWithReferences.ts): ./test/result/v3/typescript/models/ArrayWithReferences.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a simple array with references - */ -export type ArrayWithReferences = Array; - -export namespace ArrayWithReferences { - - export const schema = yup.array().of(ModelWithString.schema); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ArrayWithReferences { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/ArrayWithStrings.ts): ./test/result/v3/typescript/models/ArrayWithStrings.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple array with strings - */ -export type ArrayWithStrings = Array; - -export namespace ArrayWithStrings { - - export const schema = yup.array().of(yup.string()); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ArrayWithStrings { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/Dictionary.ts): ./test/result/v3/typescript/models/Dictionary.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -export interface Dictionary { - [key: string]: T; -} -" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/DictionaryWithArray.ts): ./test/result/v3/typescript/models/DictionaryWithArray.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { Dictionary } from '../models/Dictionary'; -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a complex dictionary - */ -export type DictionaryWithArray = Dictionary>; - -export namespace DictionaryWithArray { - - export const schema = yup.lazy>>(value => { - return yup.object>>().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: yup.array().of(ModelWithString.schema) - }), {}) - ); - }); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): DictionaryWithArray { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/DictionaryWithDictionary.ts): ./test/result/v3/typescript/models/DictionaryWithDictionary.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { Dictionary } from '../models/Dictionary'; -import * as yup from 'yup'; - -/** - * This is a string dictionary - */ -export type DictionaryWithDictionary = Dictionary>; - -export namespace DictionaryWithDictionary { - - export const schema = yup.lazy>>(value => { - return yup.object>>().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: yup.lazy>(value => { - return yup.object>().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: yup.string() - }), {}) - ); - }) - }), {}) - ); - }); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): DictionaryWithDictionary { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/DictionaryWithProperties.ts): ./test/result/v3/typescript/models/DictionaryWithProperties.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { Dictionary } from '../models/Dictionary'; -import * as yup from 'yup'; - -/** - * This is a complex dictionary - */ -export type DictionaryWithProperties = Dictionary<{ - foo?: string, - bar?: string -}>; - -export namespace DictionaryWithProperties { - - export const schema = yup.lazy>(value => { - return yup.object>().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: ( - yup.object().shape({ - foo: yup.lazy(() => yup.string().default(undefined)), - bar: yup.lazy(() => yup.string().default(undefined)) - }).noUnknown() - ) - }), {}) - ); - }); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): DictionaryWithProperties { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/DictionaryWithReference.ts): ./test/result/v3/typescript/models/DictionaryWithReference.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { Dictionary } from '../models/Dictionary'; -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a string reference - */ -export type DictionaryWithReference = Dictionary; - -export namespace DictionaryWithReference { - - export const schema = yup.lazy>(value => { - return yup.object>().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: ModelWithString.schema - }), {}) - ); - }); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): DictionaryWithReference { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/DictionaryWithString.ts): ./test/result/v3/typescript/models/DictionaryWithString.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { Dictionary } from '../models/Dictionary'; -import * as yup from 'yup'; - -/** - * This is a string dictionary - */ -export type DictionaryWithString = Dictionary; - -export namespace DictionaryWithString { - - export const schema = yup.lazy>(value => { - return yup.object>().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: yup.string() - }), {}) - ); - }); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): DictionaryWithString { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/EnumFromDescription.ts): ./test/result/v3/typescript/models/EnumFromDescription.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * Success=1,Warning=2,Error=3 - */ -export enum EnumFromDescription { - ERROR = 3, - SUCCESS = 1, - WARNING = 2 -} - -export namespace EnumFromDescription { - - export const schema = yup.mixed().oneOf([ - EnumFromDescription.ERROR, - EnumFromDescription.SUCCESS, - EnumFromDescription.WARNING - ]); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): EnumFromDescription { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/EnumWithNumbers.ts): ./test/result/v3/typescript/models/EnumWithNumbers.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple enum with numbers - */ -export enum EnumWithNumbers { - NUM_1 = 1, - NUM_2 = 2, - NUM_3 = 3 -} - -export namespace EnumWithNumbers { - - export const schema = yup.mixed().oneOf([ - EnumWithNumbers.NUM_1, - EnumWithNumbers.NUM_2, - EnumWithNumbers.NUM_3 - ]); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): EnumWithNumbers { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/EnumWithStrings.ts): ./test/result/v3/typescript/models/EnumWithStrings.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple enum with strings - */ -export enum EnumWithStrings { - ERROR = 'Error', - SUCCESS = 'Success', - WARNING = 'Warning' -} - -export namespace EnumWithStrings { - - export const schema = yup.mixed().oneOf([ - EnumWithStrings.ERROR, - EnumWithStrings.SUCCESS, - EnumWithStrings.WARNING - ]); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): EnumWithStrings { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/ModelLink.ts): ./test/result/v3/typescript/models/ModelLink.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a model that can have a template?? - */ -export interface ModelLink { - id?: string; -} - -export namespace ModelLink { - - export const schema: yup.ObjectSchema = ( - yup.object().shape({ - id: yup.lazy(() => yup.string().default(undefined)) - }).noUnknown() - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelLink { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/ModelThatExtends.ts): ./test/result/v3/typescript/models/ModelThatExtends.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a model that extends another model - */ -export interface ModelThatExtends extends ModelWithString { - propExtendsA?: string; - propExtendsB?: ModelWithString; -} - -export namespace ModelThatExtends { - - export const schema: yup.ObjectSchema = ( - ModelWithString.schema.concat( - yup.object().shape({ - propExtendsA: yup.lazy(() => yup.string().default(undefined)), - propExtendsB: yup.lazy(() => ModelWithString.schema.default(undefined)) - }).noUnknown() - ) - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelThatExtends { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/ModelThatExtendsExtends.ts): ./test/result/v3/typescript/models/ModelThatExtendsExtends.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelThatExtends } from '../models/ModelThatExtends'; -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a model that extends another model - */ -export interface ModelThatExtendsExtends extends ModelWithString, ModelThatExtends { - propExtendsC?: string; - propExtendsD?: ModelWithString; -} - -export namespace ModelThatExtendsExtends { - - export const schema: yup.ObjectSchema = ( - ModelWithString.schema.concat( - ModelThatExtends.schema.concat( - yup.object().shape({ - propExtendsC: yup.lazy(() => yup.string().default(undefined)), - propExtendsD: yup.lazy(() => ModelWithString.schema.default(undefined)) - }).noUnknown() - ) - ) - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelThatExtendsExtends { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/ModelWithArray.ts): ./test/result/v3/typescript/models/ModelWithArray.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a model with one property containing an array - */ -export interface ModelWithArray { - prop?: Array; -} - -export namespace ModelWithArray { - - export const schema: yup.ObjectSchema = ( - yup.object().shape({ - prop: yup.lazy(() => yup.array().of(ModelWithString.schema).default(undefined)) - }).noUnknown() - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelWithArray { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/ModelWithBoolean.ts): ./test/result/v3/typescript/models/ModelWithBoolean.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a model with one boolean property - */ -export interface ModelWithBoolean { - /** - * This is a simple boolean property - */ - prop?: boolean; -} - -export namespace ModelWithBoolean { - - export const schema: yup.ObjectSchema = ( - yup.object().shape({ - prop: yup.lazy(() => yup.boolean().default(undefined)) - }).noUnknown() - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelWithBoolean { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/ModelWithCircularReference.ts): ./test/result/v3/typescript/models/ModelWithCircularReference.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a model with one property containing a circular reference - */ -export interface ModelWithCircularReference { - prop?: ModelWithCircularReference; -} - -export namespace ModelWithCircularReference { - - export const schema: yup.ObjectSchema = ( - yup.object().shape({ - prop: yup.lazy(() => ModelWithCircularReference.schema.default(undefined)) - }).noUnknown() - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelWithCircularReference { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/ModelWithDictionary.ts): ./test/result/v3/typescript/models/ModelWithDictionary.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { Dictionary } from '../models/Dictionary'; -import * as yup from 'yup'; - -/** - * This is a model with one property containing a dictionary - */ -export interface ModelWithDictionary { - prop?: Dictionary; -} - -export namespace ModelWithDictionary { - - export const schema: yup.ObjectSchema = ( - yup.object().shape({ - prop: yup.lazy(() => yup.lazy>(value => { - return yup.object>().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: yup.string() - }), {}) - ); - }).default(undefined)) - }).noUnknown() - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelWithDictionary { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/ModelWithDuplicateImports.ts): ./test/result/v3/typescript/models/ModelWithDuplicateImports.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a model with duplicated imports - */ -export interface ModelWithDuplicateImports { - propA?: ModelWithString; - propB?: ModelWithString; - propC?: ModelWithString; -} - -export namespace ModelWithDuplicateImports { - - export const schema: yup.ObjectSchema = ( - yup.object().shape({ - propA: yup.lazy(() => ModelWithString.schema.default(undefined)), - propB: yup.lazy(() => ModelWithString.schema.default(undefined)), - propC: yup.lazy(() => ModelWithString.schema.default(undefined)) - }).noUnknown() - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelWithDuplicateImports { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/ModelWithDuplicateProperties.ts): ./test/result/v3/typescript/models/ModelWithDuplicateProperties.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a model with duplicated properties - */ -export interface ModelWithDuplicateProperties { - prop?: ModelWithString; -} - -export namespace ModelWithDuplicateProperties { - - export const schema: yup.ObjectSchema = ( - yup.object().shape({ - prop: yup.lazy(() => ModelWithString.schema.default(undefined)) - }).noUnknown() - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelWithDuplicateProperties { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/ModelWithEnum.ts): ./test/result/v3/typescript/models/ModelWithEnum.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a model with one enum - */ -export interface ModelWithEnum { - /** - * This is a simple enum with strings - */ - Test?: ModelWithEnum.Test; -} - -export namespace ModelWithEnum { - - /** - * This is a simple enum with strings - */ - export enum Test { - SUCCESS = 'Success', - WARNING = 'Warning', - ERROR = 'Error' - } - - export const schema: yup.ObjectSchema = ( - yup.object().shape({ - Test: yup.lazy(() => yup.mixed().oneOf([ - Test.SUCCESS, - Test.WARNING, - Test.ERROR - ]).default(undefined)) - }).noUnknown() - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelWithEnum { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/ModelWithEnumFromDescription.ts): ./test/result/v3/typescript/models/ModelWithEnumFromDescription.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a model with one enum - */ -export interface ModelWithEnumFromDescription { - /** - * Success=1,Warning=2,Error=3 - */ - Test?: ModelWithEnumFromDescription.Test; -} - -export namespace ModelWithEnumFromDescription { - - /** - * Success=1,Warning=2,Error=3 - */ - export enum Test { - SUCCESS = 1, - WARNING = 2, - ERROR = 3 - } - - export const schema: yup.ObjectSchema = ( - yup.object().shape({ - Test: yup.lazy(() => yup.mixed().oneOf([ - Test.SUCCESS, - Test.WARNING, - Test.ERROR - ]).default(undefined)) - }).noUnknown() - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelWithEnumFromDescription { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/ModelWithInteger.ts): ./test/result/v3/typescript/models/ModelWithInteger.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a model with one number property - */ -export interface ModelWithInteger { - /** - * This is a simple number property - */ - prop?: number; -} - -export namespace ModelWithInteger { - - export const schema: yup.ObjectSchema = ( - yup.object().shape({ - prop: yup.lazy(() => yup.number().default(undefined)) - }).noUnknown() - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelWithInteger { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/ModelWithLink.ts): ./test/result/v3/typescript/models/ModelWithLink.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelLink } from '../models/ModelLink'; -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a model that can have a template?? - */ -export interface ModelWithLink { - prop?: ModelLink; -} - -export namespace ModelWithLink { - - export const schema: yup.ObjectSchema = ( - yup.object().shape({ - prop: yup.lazy(() => ModelLink.schema.default(undefined)) - }).noUnknown() - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelWithLink { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/ModelWithNestedEnums.ts): ./test/result/v3/typescript/models/ModelWithNestedEnums.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { array } from '../models/array'; -import { Dictionary } from '../models/Dictionary'; -import * as yup from 'yup'; - -/** - * This is a model with nested enums - */ -export interface ModelWithNestedEnums { - arrayWithDescription?: array; - arrayWithEnum?: array; - dictionaryWithEnum?: Dictionary<('Success' | 'Warning' | 'Error')>; - dictionaryWithEnumFromDescription?: Dictionary<(1 | 2 | 3)>; -} - -export namespace ModelWithNestedEnums { - - export const schema: yup.ObjectSchema = ( - yup.object().shape({ - arrayWithDescription: yup.lazy(() => yup.mixed().default(undefined)), - arrayWithEnum: yup.lazy(() => yup.mixed().default(undefined)), - dictionaryWithEnum: yup.lazy(() => yup.lazy>(value => { - return yup.object>().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: yup.mixed().oneOf([ - 'Success', - 'Warning', - 'Error' - ]) - }), {}) - ); - }).default(undefined)), - dictionaryWithEnumFromDescription: yup.lazy(() => yup.lazy>(value => { - return yup.object>().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: yup.mixed().oneOf([ - 1, - 2, - 3 - ]) - }), {}) - ); - }).default(undefined)) - }).noUnknown() - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelWithNestedEnums { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/ModelWithNestedProperties.ts): ./test/result/v3/typescript/models/ModelWithNestedProperties.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a model with one nested property - */ -export interface ModelWithNestedProperties { - readonly first: { - readonly second: { - readonly third: string | null - } | null - } | null; -} - -export namespace ModelWithNestedProperties { - - export const schema: yup.ObjectSchema = ( - yup.object().shape({ - first: yup.lazy(() => ( - yup.object().shape({ - second: yup.lazy(() => ( - yup.object().shape({ - third: yup.lazy(() => yup.string().default(undefined).nullable().required()) - }).noUnknown() - ).default(undefined).nullable().required()) - }).noUnknown() - ).default(undefined).nullable().required()) - }).noUnknown() - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelWithNestedProperties { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/ModelWithProperties.ts): ./test/result/v3/typescript/models/ModelWithProperties.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a model with one nested property - */ -export interface ModelWithProperties { - boolean?: boolean; - number?: number; - reference?: ModelWithString; - required: string; - requiredAndNullable: string | null; - readonly requiredAndReadOnly: string; - string?: string; -} - -export namespace ModelWithProperties { - - export const schema: yup.ObjectSchema = ( - yup.object().shape({ - boolean: yup.lazy(() => yup.boolean().default(undefined)), - number: yup.lazy(() => yup.number().default(undefined)), - reference: yup.lazy(() => ModelWithString.schema.default(undefined)), - required: yup.lazy(() => yup.string().default(undefined).required()), - requiredAndNullable: yup.lazy(() => yup.string().default(undefined).nullable().required()), - requiredAndReadOnly: yup.lazy(() => yup.string().default(undefined).required()), - string: yup.lazy(() => yup.string().default(undefined)) - }).noUnknown() - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelWithProperties { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/ModelWithReference.ts): ./test/result/v3/typescript/models/ModelWithReference.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a model with one property containing a reference - */ -export interface ModelWithReference { - prop?: ModelWithString; -} - -export namespace ModelWithReference { - - export const schema: yup.ObjectSchema = ( - yup.object().shape({ - prop: yup.lazy(() => ModelWithString.schema.default(undefined)) - }).noUnknown() - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelWithReference { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/ModelWithString.ts): ./test/result/v3/typescript/models/ModelWithString.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a model with one string property - */ -export interface ModelWithString { - /** - * This is a simple string property - */ - prop?: string; -} - -export namespace ModelWithString { - - export const schema: yup.ObjectSchema = ( - yup.object().shape({ - prop: yup.lazy(() => yup.string().default(undefined)) - }).noUnknown() - ); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): ModelWithString { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/SimpleBoolean.ts): ./test/result/v3/typescript/models/SimpleBoolean.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple boolean - */ -export type SimpleBoolean = boolean; - -export namespace SimpleBoolean { - - export const schema = yup.boolean(); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): SimpleBoolean { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/SimpleFile.ts): ./test/result/v3/typescript/models/SimpleFile.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple file - */ -export type SimpleFile = File; - -export namespace SimpleFile { - - export const schema = yup.mixed(); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): SimpleFile { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/SimpleInteger.ts): ./test/result/v3/typescript/models/SimpleInteger.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple number - */ -export type SimpleInteger = number; - -export namespace SimpleInteger { - - export const schema = yup.number(); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): SimpleInteger { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/SimpleReference.ts): ./test/result/v3/typescript/models/SimpleReference.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import * as yup from 'yup'; - -/** - * This is a simple reference - */ -export type SimpleReference = ModelWithString; - -export namespace SimpleReference { - - export const schema = ModelWithString.schema; - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): SimpleReference { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/models/SimpleString.ts): ./test/result/v3/typescript/models/SimpleString.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import * as yup from 'yup'; - -/** - * This is a simple string - */ -export type SimpleString = string; - -export namespace SimpleString { - - export const schema = yup.string(); - - export async function validate(value: any): Promise { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): SimpleString { - return schema.validateSync(value, { strict: true }); - } -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/services/ComplexService.ts): ./test/result/v3/typescript/services/ComplexService.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import { ApiError, catchGenericError } from '../core/ApiError'; -import { request } from '../core/request'; -import { OpenAPI } from '../core/OpenAPI'; - -export class ComplexService { - - /** - * @param parameterObject Parameter containing object - * @param parameterReference Parameter containing reference - * @result ModelWithString Successful response - * @throws ApiError - */ - public static async complexTypes( - parameterObject: { - first?: { - second?: { - third?: string - } - } - }, - parameterReference: ModelWithString - ): Promise> { - - const result = await request({ - method: 'get', - path: \`/api/v\${OpenAPI.VERSION}/complex\`, - query: { - 'parameterObject': parameterObject, - 'parameterReference': parameterReference - } - }); - - if (!result.ok) { - switch (result.status) { - case 400: throw new ApiError(result, \`400 server error\`); - case 500: throw new ApiError(result, \`500 server error\`); - } - } - - catchGenericError(result); - - return result.body; - } - -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/services/ParametersService.ts): ./test/result/v3/typescript/services/ParametersService.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelWithString } from '../models/ModelWithString'; -import { ApiError, catchGenericError } from '../core/ApiError'; -import { request } from '../core/request'; -import { OpenAPI } from '../core/OpenAPI'; - -export class ParametersService { - - /** - * @param parameterHeader This is the parameter that goes into the request header - * @param parameterQuery This is the parameter that goes into the request query params - * @param parameterForm This is the parameter that goes into the request form data - * @param parameterCookie This is the parameter that goes into the cookie - * @param requestBody This is the parameter that goes into the body - * @throws ApiError - */ - public static async callWithParameters( - parameterHeader: string | null, - parameterQuery: string | null, - parameterForm: string | null, - parameterCookie: string | null, - requestBody?: ModelWithString - ): Promise { - - const result = await request({ - method: 'get', - path: \`/api/v\${OpenAPI.VERSION}/parameters\`, - cookies: { - 'parameterCookie': parameterCookie - }, - headers: { - 'parameterHeader': parameterHeader - }, - query: { - 'parameterQuery': parameterQuery - }, - formData: { - 'parameterForm': parameterForm - }, - body: requestBody - }); - - catchGenericError(result); - - return result.body; - } - -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/services/ResponseService.ts): ./test/result/v3/typescript/services/ResponseService.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ModelThatExtends } from '../models/ModelThatExtends'; -import { ModelThatExtendsExtends } from '../models/ModelThatExtendsExtends'; -import { ModelWithString } from '../models/ModelWithString'; -import { ApiError, catchGenericError } from '../core/ApiError'; -import { request } from '../core/request'; -import { OpenAPI } from '../core/OpenAPI'; - -export class ResponseService { - - /** - * @result ModelWithString Message for default response - * @throws ApiError - */ - public static async callWithDuplicateResponses(): Promise { - - const result = await request({ - method: 'post', - path: \`/api/v\${OpenAPI.VERSION}/response\` - }); - - if (!result.ok) { - switch (result.status) { - case 500: throw new ApiError(result, \`Message for 500 error\`); - case 501: throw new ApiError(result, \`Message for 501 error\`); - case 502: throw new ApiError(result, \`Message for 502 error\`); - } - } - - catchGenericError(result); - - return result.body; - } - - /** - * @result ModelWithString - * @throws ApiError - */ - public static async callWithResponse(): Promise { - - const result = await request({ - method: 'get', - path: \`/api/v\${OpenAPI.VERSION}/response\` - }); - - catchGenericError(result); - - return result.body; - } - - /** - * @result ModelWithString Message for default response - * @result ModelThatExtends Message for 201 response - * @result ModelThatExtendsExtends Message for 202 response - * @throws ApiError - */ - public static async callWithResponses(): Promise { - - const result = await request({ - method: 'put', - path: \`/api/v\${OpenAPI.VERSION}/response\` - }); - - if (!result.ok) { - switch (result.status) { - case 500: throw new ApiError(result, \`Message for 500 error\`); - case 501: throw new ApiError(result, \`Message for 501 error\`); - case 502: throw new ApiError(result, \`Message for 502 error\`); - } - } - - catchGenericError(result); - - return result.body; - } - -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/services/SimpleService.ts): ./test/result/v3/typescript/services/SimpleService.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ApiError, catchGenericError } from '../core/ApiError'; -import { request } from '../core/request'; -import { OpenAPI } from '../core/OpenAPI'; - -export class SimpleService { - - /** - * @throws ApiError - */ - public static async deleteCallWithoutParametersAndResponse(): Promise { - - const result = await request({ - method: 'delete', - path: \`/api/v\${OpenAPI.VERSION}/simple\` - }); - - catchGenericError(result); - - return result.body; - } - - /** - * @throws ApiError - */ - public static async getCallWithoutParametersAndResponse(): Promise { - - const result = await request({ - method: 'get', - path: \`/api/v\${OpenAPI.VERSION}/simple\` - }); - - catchGenericError(result); - - return result.body; - } - - /** - * @throws ApiError - */ - public static async headCallWithoutParametersAndResponse(): Promise { - - const result = await request({ - method: 'head', - path: \`/api/v\${OpenAPI.VERSION}/simple\` - }); - - catchGenericError(result); - - return result.body; - } - - /** - * @throws ApiError - */ - public static async optionsCallWithoutParametersAndResponse(): Promise { - - const result = await request({ - method: 'options', - path: \`/api/v\${OpenAPI.VERSION}/simple\` - }); - - catchGenericError(result); - - return result.body; - } - - /** - * @throws ApiError - */ - public static async patchCallWithoutParametersAndResponse(): Promise { - - const result = await request({ - method: 'patch', - path: \`/api/v\${OpenAPI.VERSION}/simple\` - }); - - catchGenericError(result); - - return result.body; - } - - /** - * @throws ApiError - */ - public static async postCallWithoutParametersAndResponse(): Promise { - - const result = await request({ - method: 'post', - path: \`/api/v\${OpenAPI.VERSION}/simple\` - }); - - catchGenericError(result); - - return result.body; - } - - /** - * @throws ApiError - */ - public static async putCallWithoutParametersAndResponse(): Promise { - - const result = await request({ - method: 'put', - path: \`/api/v\${OpenAPI.VERSION}/simple\` - }); - - catchGenericError(result); - - return result.body; - } - -}" -`; - -exports[`generation v3 typescript file(./test/result/v3/typescript/services/TypesService.ts): ./test/result/v3/typescript/services/TypesService.ts 1`] = ` -"/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -import { ApiError, catchGenericError } from '../core/ApiError'; -import { request } from '../core/request'; -import { OpenAPI } from '../core/OpenAPI'; - -export class TypesService { - - /** - * @param parameterNumber This is a number parameter - * @param parameterString This is a string parameter - * @param parameterBoolean This is a boolean parameter - * @param parameterObject This is an object parameter - * @param parameterArray This is an array parameter - * @param parameterDictionary This is a dictionary parameter - * @param parameterEnum This is an enum parameter - * @param id This is a number parameter - * @result number Response is a simple number - * @result string Response is a simple string - * @result boolean Response is a simple boolean - * @result any Response is a simple object - * @throws ApiError - */ - public static async types( - parameterNumber: number, - parameterString: string | null, - parameterBoolean: boolean | null, - parameterObject: any | null, - parameterArray: Array | null, - parameterDictionary: any | null, - parameterEnum: ('Success' | 'Warning' | 'Error') | null, - id?: number - ): Promise { - - const result = await request({ - method: 'get', - path: \`/api/v\${OpenAPI.VERSION}/types\`, - query: { - 'parameterNumber': parameterNumber, - 'parameterString': parameterString, - 'parameterBoolean': parameterBoolean, - 'parameterObject': parameterObject, - 'parameterArray': parameterArray, - 'parameterDictionary': parameterDictionary, - 'parameterEnum': parameterEnum - } - }); - - catchGenericError(result); - - return result.body; - } - -}" -`; diff --git a/test/__snapshots__/index.spec.ts.snap b/test/__snapshots__/index.spec.ts.snap new file mode 100644 index 000000000..265625f57 --- /dev/null +++ b/test/__snapshots__/index.spec.ts.snap @@ -0,0 +1,7386 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`v2 should generate: test/generated/v2/core/ApiError.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ApiRequestOptions } from './ApiRequestOptions'; +import type { ApiResult } from './ApiResult'; + +export class ApiError extends Error { + public readonly url: string; + public readonly status: number; + public readonly statusText: string; + public readonly body: any; + public readonly request: ApiRequestOptions; + + constructor(request: ApiRequestOptions, response: ApiResult, message: string) { + super(message); + + this.name = 'ApiError'; + this.url = response.url; + this.status = response.status; + this.statusText = response.statusText; + this.body = response.body; + this.request = request; + } +} +" +`; + +exports[`v2 should generate: test/generated/v2/core/ApiRequestOptions.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type ApiRequestOptions = { + readonly method: 'GET' | 'PUT' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD' | 'PATCH'; + readonly url: string; + readonly path?: Record; + readonly cookies?: Record; + readonly headers?: Record; + readonly query?: Record; + readonly formData?: Record; + readonly body?: any; + readonly mediaType?: string; + readonly responseHeader?: string; + readonly errors?: Record; +}; +" +`; + +exports[`v2 should generate: test/generated/v2/core/ApiResult.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type ApiResult = { + readonly url: string; + readonly ok: boolean; + readonly status: number; + readonly statusText: string; + readonly body: any; +}; +" +`; + +exports[`v2 should generate: test/generated/v2/core/CancelablePromise.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export class CancelError extends Error { + + constructor(message: string) { + super(message); + this.name = 'CancelError'; + } + + public get isCancelled(): boolean { + return true; + } +} + +export interface OnCancel { + readonly isResolved: boolean; + readonly isRejected: boolean; + readonly isCancelled: boolean; + + (cancelHandler: () => void): void; +} + +export class CancelablePromise implements Promise { + #isResolved: boolean; + #isRejected: boolean; + #isCancelled: boolean; + readonly #cancelHandlers: (() => void)[]; + readonly #promise: Promise; + #resolve?: (value: T | PromiseLike) => void; + #reject?: (reason?: any) => void; + + constructor( + executor: ( + resolve: (value: T | PromiseLike) => void, + reject: (reason?: any) => void, + onCancel: OnCancel + ) => void + ) { + this.#isResolved = false; + this.#isRejected = false; + this.#isCancelled = false; + this.#cancelHandlers = []; + this.#promise = new Promise((resolve, reject) => { + this.#resolve = resolve; + this.#reject = reject; + + const onResolve = (value: T | PromiseLike): void => { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { + return; + } + this.#isResolved = true; + if (this.#resolve) this.#resolve(value); + }; + + const onReject = (reason?: any): void => { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { + return; + } + this.#isRejected = true; + if (this.#reject) this.#reject(reason); + }; + + const onCancel = (cancelHandler: () => void): void => { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { + return; + } + this.#cancelHandlers.push(cancelHandler); + }; + + Object.defineProperty(onCancel, 'isResolved', { + get: (): boolean => this.#isResolved, + }); + + Object.defineProperty(onCancel, 'isRejected', { + get: (): boolean => this.#isRejected, + }); + + Object.defineProperty(onCancel, 'isCancelled', { + get: (): boolean => this.#isCancelled, + }); + + return executor(onResolve, onReject, onCancel as OnCancel); + }); + } + + get [Symbol.toStringTag]() { + return "Cancellable Promise"; + } + + public then( + onFulfilled?: ((value: T) => TResult1 | PromiseLike) | null, + onRejected?: ((reason: any) => TResult2 | PromiseLike) | null + ): Promise { + return this.#promise.then(onFulfilled, onRejected); + } + + public catch( + onRejected?: ((reason: any) => TResult | PromiseLike) | null + ): Promise { + return this.#promise.catch(onRejected); + } + + public finally(onFinally?: (() => void) | null): Promise { + return this.#promise.finally(onFinally); + } + + public cancel(): void { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { + return; + } + this.#isCancelled = true; + if (this.#cancelHandlers.length) { + try { + for (const cancelHandler of this.#cancelHandlers) { + cancelHandler(); + } + } catch (error) { + console.warn('Cancellation threw an error', error); + return; + } + } + this.#cancelHandlers.length = 0; + if (this.#reject) this.#reject(new CancelError('Request aborted')); + } + + public get isCancelled(): boolean { + return this.#isCancelled; + } +} +" +`; + +exports[`v2 should generate: test/generated/v2/core/OpenAPI.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ApiRequestOptions } from './ApiRequestOptions'; + +type Resolver = (options: ApiRequestOptions) => Promise; +type Headers = Record; + +export type OpenAPIConfig = { + BASE: string; + VERSION: string; + WITH_CREDENTIALS: boolean; + CREDENTIALS: 'include' | 'omit' | 'same-origin'; + TOKEN?: string | Resolver | undefined; + USERNAME?: string | Resolver | undefined; + PASSWORD?: string | Resolver | undefined; + HEADERS?: Headers | Resolver | undefined; + ENCODE_PATH?: ((path: string) => string) | undefined; +}; + +export const OpenAPI: OpenAPIConfig = { + BASE: 'http://localhost:3000/base', + VERSION: '1.0', + WITH_CREDENTIALS: false, + CREDENTIALS: 'include', + TOKEN: undefined, + USERNAME: undefined, + PASSWORD: undefined, + HEADERS: undefined, + ENCODE_PATH: undefined, +}; +" +`; + +exports[`v2 should generate: test/generated/v2/core/request.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import { ApiError } from './ApiError'; +import type { ApiRequestOptions } from './ApiRequestOptions'; +import type { ApiResult } from './ApiResult'; +import { CancelablePromise } from './CancelablePromise'; +import type { OnCancel } from './CancelablePromise'; +import type { OpenAPIConfig } from './OpenAPI'; + +export const isDefined = (value: T | null | undefined): value is Exclude => { + return value !== undefined && value !== null; +}; + +export const isString = (value: any): value is string => { + return typeof value === 'string'; +}; + +export const isStringWithValue = (value: any): value is string => { + return isString(value) && value !== ''; +}; + +export const isBlob = (value: any): value is Blob => { + return ( + typeof value === 'object' && + typeof value.type === 'string' && + typeof value.stream === 'function' && + typeof value.arrayBuffer === 'function' && + typeof value.constructor === 'function' && + typeof value.constructor.name === 'string' && + /^(Blob|File)$/.test(value.constructor.name) && + /^(Blob|File)$/.test(value[Symbol.toStringTag]) + ); +}; + +export const isFormData = (value: any): value is FormData => { + return value instanceof FormData; +}; + +export const base64 = (str: string): string => { + try { + return btoa(str); + } catch (err) { + // @ts-ignore + return Buffer.from(str).toString('base64'); + } +}; + +export const getQueryString = (params: Record): string => { + const qs: string[] = []; + + const append = (key: string, value: any) => { + qs.push(\`\${encodeURIComponent(key)}=\${encodeURIComponent(String(value))}\`); + }; + + const process = (key: string, value: any) => { + if (isDefined(value)) { + if (Array.isArray(value)) { + value.forEach(v => { + process(key, v); + }); + } else if (typeof value === 'object') { + Object.entries(value).forEach(([k, v]) => { + process(\`\${key}[\${k}]\`, v); + }); + } else { + append(key, value); + } + } + }; + + Object.entries(params).forEach(([key, value]) => { + process(key, value); + }); + + if (qs.length > 0) { + return \`?\${qs.join('&')}\`; + } + + return ''; +}; + +const getUrl = (config: OpenAPIConfig, options: ApiRequestOptions): string => { + const encoder = config.ENCODE_PATH || encodeURI; + + const path = options.url + .replace('{api-version}', config.VERSION) + .replace(/{(.*?)}/g, (substring: string, group: string) => { + if (options.path?.hasOwnProperty(group)) { + return encoder(String(options.path[group])); + } + return substring; + }); + + const url = \`\${config.BASE}\${path}\`; + if (options.query) { + return \`\${url}\${getQueryString(options.query)}\`; + } + return url; +}; + +export const getFormData = (options: ApiRequestOptions): FormData | undefined => { + if (options.formData) { + const formData = new FormData(); + + const process = (key: string, value: any) => { + if (isString(value) || isBlob(value)) { + formData.append(key, value); + } else { + formData.append(key, JSON.stringify(value)); + } + }; + + Object.entries(options.formData) + .filter(([_, value]) => isDefined(value)) + .forEach(([key, value]) => { + if (Array.isArray(value)) { + value.forEach(v => process(key, v)); + } else { + process(key, value); + } + }); + + return formData; + } + return undefined; +}; + +type Resolver = (options: ApiRequestOptions) => Promise; + +export const resolve = async (options: ApiRequestOptions, resolver?: T | Resolver): Promise => { + if (typeof resolver === 'function') { + return (resolver as Resolver)(options); + } + return resolver; +}; + +export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions): Promise => { + const [token, username, password, additionalHeaders] = await Promise.all([ + resolve(options, config.TOKEN), + resolve(options, config.USERNAME), + resolve(options, config.PASSWORD), + resolve(options, config.HEADERS), + ]); + + const headers = Object.entries({ + Accept: 'application/json', + ...additionalHeaders, + ...options.headers, + }) + .filter(([_, value]) => isDefined(value)) + .reduce((headers, [key, value]) => ({ + ...headers, + [key]: String(value), + }), {} as Record); + + if (isStringWithValue(token)) { + headers['Authorization'] = \`Bearer \${token}\`; + } + + if (isStringWithValue(username) && isStringWithValue(password)) { + const credentials = base64(\`\${username}:\${password}\`); + headers['Authorization'] = \`Basic \${credentials}\`; + } + + if (options.body !== undefined) { + if (options.mediaType) { + headers['Content-Type'] = options.mediaType; + } else if (isBlob(options.body)) { + headers['Content-Type'] = options.body.type || 'application/octet-stream'; + } else if (isString(options.body)) { + headers['Content-Type'] = 'text/plain'; + } else if (!isFormData(options.body)) { + headers['Content-Type'] = 'application/json'; + } + } + + return new Headers(headers); +}; + +export const getRequestBody = (options: ApiRequestOptions): any => { + if (options.body !== undefined) { + if (options.mediaType?.includes('/json')) { + return JSON.stringify(options.body) + } else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) { + return options.body; + } else { + return JSON.stringify(options.body); + } + } + return undefined; +}; + +export const sendRequest = async ( + config: OpenAPIConfig, + options: ApiRequestOptions, + url: string, + body: any, + formData: FormData | undefined, + headers: Headers, + onCancel: OnCancel +): Promise => { + const controller = new AbortController(); + + const request: RequestInit = { + headers, + body: body ?? formData, + method: options.method, + signal: controller.signal, + }; + + if (config.WITH_CREDENTIALS) { + request.credentials = config.CREDENTIALS; + } + + onCancel(() => controller.abort()); + + return await fetch(url, request); +}; + +export const getResponseHeader = (response: Response, responseHeader?: string): string | undefined => { + if (responseHeader) { + const content = response.headers.get(responseHeader); + if (isString(content)) { + return content; + } + } + return undefined; +}; + +export const getResponseBody = async (response: Response): Promise => { + if (response.status !== 204) { + try { + const contentType = response.headers.get('Content-Type'); + if (contentType) { + const jsonTypes = ['application/json', 'application/problem+json'] + const isJSON = jsonTypes.some(type => contentType.toLowerCase().startsWith(type)); + if (isJSON) { + return await response.json(); + } else { + return await response.text(); + } + } + } catch (error) { + console.error(error); + } + } + return undefined; +}; + +export const catchErrorCodes = (options: ApiRequestOptions, result: ApiResult): void => { + const errors: Record = { + 400: 'Bad Request', + 401: 'Unauthorized', + 403: 'Forbidden', + 404: 'Not Found', + 500: 'Internal Server Error', + 502: 'Bad Gateway', + 503: 'Service Unavailable', + ...options.errors, + } + + const error = errors[result.status]; + if (error) { + throw new ApiError(options, result, error); + } + + if (!result.ok) { + const errorStatus = result.status ?? 'unknown'; + const errorStatusText = result.statusText ?? 'unknown'; + const errorBody = (() => { + try { + return JSON.stringify(result.body, null, 2); + } catch (e) { + return undefined; + } + })(); + + throw new ApiError(options, result, + \`Generic Error: status: \${errorStatus}; status text: \${errorStatusText}; body: \${errorBody}\` + ); + } +}; + +/** + * Request method + * @param config The OpenAPI configuration object + * @param options The request options from the service + * @returns CancelablePromise + * @throws ApiError + */ +export const request = (config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise => { + return new CancelablePromise(async (resolve, reject, onCancel) => { + try { + const url = getUrl(config, options); + const formData = getFormData(options); + const body = getRequestBody(options); + const headers = await getHeaders(config, options); + + if (!onCancel.isCancelled) { + const response = await sendRequest(config, options, url, body, formData, headers, onCancel); + const responseBody = await getResponseBody(response); + const responseHeader = getResponseHeader(response, options.responseHeader); + + const result: ApiResult = { + url, + ok: response.ok, + status: response.status, + statusText: response.statusText, + body: responseHeader ?? responseBody, + }; + + catchErrorCodes(options, result); + + resolve(result.body); + } + } catch (error) { + reject(error); + } + }); +}; +" +`; + +exports[`v2 should generate: test/generated/v2/index.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export { ApiError } from './core/ApiError'; +export { CancelablePromise, CancelError } from './core/CancelablePromise'; +export { OpenAPI } from './core/OpenAPI'; +export type { OpenAPIConfig } from './core/OpenAPI'; + +export type { _default } from './models/_default'; +export type { ArrayWithArray } from './models/ArrayWithArray'; +export type { ArrayWithBooleans } from './models/ArrayWithBooleans'; +export type { ArrayWithNumbers } from './models/ArrayWithNumbers'; +export type { ArrayWithProperties } from './models/ArrayWithProperties'; +export type { ArrayWithReferences } from './models/ArrayWithReferences'; +export type { ArrayWithStrings } from './models/ArrayWithStrings'; +export type { CommentWithBackticks } from './models/CommentWithBackticks'; +export type { CommentWithBreaks } from './models/CommentWithBreaks'; +export type { CommentWithExpressionPlaceholders } from './models/CommentWithExpressionPlaceholders'; +export type { CommentWithQuotes } from './models/CommentWithQuotes'; +export type { CommentWithReservedCharacters } from './models/CommentWithReservedCharacters'; +export type { CommentWithSlashes } from './models/CommentWithSlashes'; +export type { Date } from './models/Date'; +export type { DictionaryWithArray } from './models/DictionaryWithArray'; +export type { DictionaryWithDictionary } from './models/DictionaryWithDictionary'; +export type { DictionaryWithProperties } from './models/DictionaryWithProperties'; +export type { DictionaryWithReference } from './models/DictionaryWithReference'; +export type { DictionaryWithString } from './models/DictionaryWithString'; +export type { EnumFromDescription } from './models/EnumFromDescription'; +export { EnumWithExtensions } from './models/EnumWithExtensions'; +export { EnumWithNumbers } from './models/EnumWithNumbers'; +export { EnumWithStrings } from './models/EnumWithStrings'; +export type { ModelThatExtends } from './models/ModelThatExtends'; +export type { ModelThatExtendsExtends } from './models/ModelThatExtendsExtends'; +export type { ModelWithArray } from './models/ModelWithArray'; +export type { ModelWithBoolean } from './models/ModelWithBoolean'; +export type { ModelWithCircularReference } from './models/ModelWithCircularReference'; +export type { ModelWithDictionary } from './models/ModelWithDictionary'; +export type { ModelWithDuplicateImports } from './models/ModelWithDuplicateImports'; +export type { ModelWithDuplicateProperties } from './models/ModelWithDuplicateProperties'; +export { ModelWithEnum } from './models/ModelWithEnum'; +export type { ModelWithEnumFromDescription } from './models/ModelWithEnumFromDescription'; +export type { ModelWithInteger } from './models/ModelWithInteger'; +export type { ModelWithNestedEnums } from './models/ModelWithNestedEnums'; +export type { ModelWithNestedProperties } from './models/ModelWithNestedProperties'; +export type { ModelWithNullableString } from './models/ModelWithNullableString'; +export type { ModelWithOrderedProperties } from './models/ModelWithOrderedProperties'; +export type { ModelWithPattern } from './models/ModelWithPattern'; +export type { ModelWithProperties } from './models/ModelWithProperties'; +export type { ModelWithReference } from './models/ModelWithReference'; +export type { ModelWithString } from './models/ModelWithString'; +export type { SimpleBoolean } from './models/SimpleBoolean'; +export type { SimpleFile } from './models/SimpleFile'; +export type { SimpleInteger } from './models/SimpleInteger'; +export type { SimpleReference } from './models/SimpleReference'; +export type { SimpleString } from './models/SimpleString'; +export type { SimpleStringWithPattern } from './models/SimpleStringWithPattern'; + +export { $_default } from './schemas/$_default'; +export { $ArrayWithArray } from './schemas/$ArrayWithArray'; +export { $ArrayWithBooleans } from './schemas/$ArrayWithBooleans'; +export { $ArrayWithNumbers } from './schemas/$ArrayWithNumbers'; +export { $ArrayWithProperties } from './schemas/$ArrayWithProperties'; +export { $ArrayWithReferences } from './schemas/$ArrayWithReferences'; +export { $ArrayWithStrings } from './schemas/$ArrayWithStrings'; +export { $CommentWithBackticks } from './schemas/$CommentWithBackticks'; +export { $CommentWithBreaks } from './schemas/$CommentWithBreaks'; +export { $CommentWithExpressionPlaceholders } from './schemas/$CommentWithExpressionPlaceholders'; +export { $CommentWithQuotes } from './schemas/$CommentWithQuotes'; +export { $CommentWithReservedCharacters } from './schemas/$CommentWithReservedCharacters'; +export { $CommentWithSlashes } from './schemas/$CommentWithSlashes'; +export { $Date } from './schemas/$Date'; +export { $DictionaryWithArray } from './schemas/$DictionaryWithArray'; +export { $DictionaryWithDictionary } from './schemas/$DictionaryWithDictionary'; +export { $DictionaryWithProperties } from './schemas/$DictionaryWithProperties'; +export { $DictionaryWithReference } from './schemas/$DictionaryWithReference'; +export { $DictionaryWithString } from './schemas/$DictionaryWithString'; +export { $EnumFromDescription } from './schemas/$EnumFromDescription'; +export { $EnumWithExtensions } from './schemas/$EnumWithExtensions'; +export { $EnumWithNumbers } from './schemas/$EnumWithNumbers'; +export { $EnumWithStrings } from './schemas/$EnumWithStrings'; +export { $ModelThatExtends } from './schemas/$ModelThatExtends'; +export { $ModelThatExtendsExtends } from './schemas/$ModelThatExtendsExtends'; +export { $ModelWithArray } from './schemas/$ModelWithArray'; +export { $ModelWithBoolean } from './schemas/$ModelWithBoolean'; +export { $ModelWithCircularReference } from './schemas/$ModelWithCircularReference'; +export { $ModelWithDictionary } from './schemas/$ModelWithDictionary'; +export { $ModelWithDuplicateImports } from './schemas/$ModelWithDuplicateImports'; +export { $ModelWithDuplicateProperties } from './schemas/$ModelWithDuplicateProperties'; +export { $ModelWithEnum } from './schemas/$ModelWithEnum'; +export { $ModelWithEnumFromDescription } from './schemas/$ModelWithEnumFromDescription'; +export { $ModelWithInteger } from './schemas/$ModelWithInteger'; +export { $ModelWithNestedEnums } from './schemas/$ModelWithNestedEnums'; +export { $ModelWithNestedProperties } from './schemas/$ModelWithNestedProperties'; +export { $ModelWithNullableString } from './schemas/$ModelWithNullableString'; +export { $ModelWithOrderedProperties } from './schemas/$ModelWithOrderedProperties'; +export { $ModelWithPattern } from './schemas/$ModelWithPattern'; +export { $ModelWithProperties } from './schemas/$ModelWithProperties'; +export { $ModelWithReference } from './schemas/$ModelWithReference'; +export { $ModelWithString } from './schemas/$ModelWithString'; +export { $SimpleBoolean } from './schemas/$SimpleBoolean'; +export { $SimpleFile } from './schemas/$SimpleFile'; +export { $SimpleInteger } from './schemas/$SimpleInteger'; +export { $SimpleReference } from './schemas/$SimpleReference'; +export { $SimpleString } from './schemas/$SimpleString'; +export { $SimpleStringWithPattern } from './schemas/$SimpleStringWithPattern'; + +export { CollectionFormatService } from './services/CollectionFormatService'; +export { ComplexService } from './services/ComplexService'; +export { DefaultService } from './services/DefaultService'; +export { DefaultsService } from './services/DefaultsService'; +export { DescriptionsService } from './services/DescriptionsService'; +export { DuplicateService } from './services/DuplicateService'; +export { ErrorService } from './services/ErrorService'; +export { HeaderService } from './services/HeaderService'; +export { MultipleTags1Service } from './services/MultipleTags1Service'; +export { MultipleTags2Service } from './services/MultipleTags2Service'; +export { MultipleTags3Service } from './services/MultipleTags3Service'; +export { NoContentService } from './services/NoContentService'; +export { ParametersService } from './services/ParametersService'; +export { ResponseService } from './services/ResponseService'; +export { SimpleService } from './services/SimpleService'; +export { TypesService } from './services/TypesService'; +" +`; + +exports[`v2 should generate: test/generated/v2/models/_default.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type _default = { + name?: string; +}; + +" +`; + +exports[`v2 should generate: test/generated/v2/models/ArrayWithArray.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithString } from './ModelWithString'; +/** + * This is a simple array containing an array + */ +export type ArrayWithArray = Array>; +" +`; + +exports[`v2 should generate: test/generated/v2/models/ArrayWithBooleans.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a simple array with booleans + */ +export type ArrayWithBooleans = Array; +" +`; + +exports[`v2 should generate: test/generated/v2/models/ArrayWithNumbers.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a simple array with numbers + */ +export type ArrayWithNumbers = Array; +" +`; + +exports[`v2 should generate: test/generated/v2/models/ArrayWithProperties.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a simple array with properties + */ +export type ArrayWithProperties = Array<{ + foo?: string; + bar?: string; +}>; +" +`; + +exports[`v2 should generate: test/generated/v2/models/ArrayWithReferences.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithString } from './ModelWithString'; +/** + * This is a simple array with references + */ +export type ArrayWithReferences = Array; +" +`; + +exports[`v2 should generate: test/generated/v2/models/ArrayWithStrings.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a simple array with strings + */ +export type ArrayWithStrings = Array; +" +`; + +exports[`v2 should generate: test/generated/v2/models/CommentWithBackticks.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Testing backticks in string: \`backticks\` and \`\`\`multiple backticks\`\`\` should work + */ +export type CommentWithBackticks = number; +" +`; + +exports[`v2 should generate: test/generated/v2/models/CommentWithBreaks.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Testing multiline comments in string: First line + * Second line + * + * Fourth line + */ +export type CommentWithBreaks = number; +" +`; + +exports[`v2 should generate: test/generated/v2/models/CommentWithExpressionPlaceholders.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Testing expression placeholders in string: \${expression} should work + */ +export type CommentWithExpressionPlaceholders = number; +" +`; + +exports[`v2 should generate: test/generated/v2/models/CommentWithQuotes.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Testing quotes in string: 'single quote''' and "double quotes""" should work + */ +export type CommentWithQuotes = number; +" +`; + +exports[`v2 should generate: test/generated/v2/models/CommentWithReservedCharacters.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Testing reserved characters in string: * inline * and ** inline ** should work + */ +export type CommentWithReservedCharacters = number; +" +`; + +exports[`v2 should generate: test/generated/v2/models/CommentWithSlashes.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Testing slashes in string: \\backwards\\\\\\ and /forwards/// should work + */ +export type CommentWithSlashes = number; +" +`; + +exports[`v2 should generate: test/generated/v2/models/Date.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a type-only model that defines Date as a string + */ +export type Date = string; +" +`; + +exports[`v2 should generate: test/generated/v2/models/DictionaryWithArray.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithString } from './ModelWithString'; +/** + * This is a complex dictionary + */ +export type DictionaryWithArray = Record>; +" +`; + +exports[`v2 should generate: test/generated/v2/models/DictionaryWithDictionary.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a string dictionary + */ +export type DictionaryWithDictionary = Record>; +" +`; + +exports[`v2 should generate: test/generated/v2/models/DictionaryWithProperties.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a complex dictionary + */ +export type DictionaryWithProperties = Record; +" +`; + +exports[`v2 should generate: test/generated/v2/models/DictionaryWithReference.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithString } from './ModelWithString'; +/** + * This is a string reference + */ +export type DictionaryWithReference = Record; +" +`; + +exports[`v2 should generate: test/generated/v2/models/DictionaryWithString.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a string dictionary + */ +export type DictionaryWithString = Record; +" +`; + +exports[`v2 should generate: test/generated/v2/models/EnumFromDescription.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Success=1,Warning=2,Error=3 + */ +export type EnumFromDescription = number; +" +`; + +exports[`v2 should generate: test/generated/v2/models/EnumWithExtensions.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a simple enum with numbers + */ +export enum EnumWithExtensions { + /** + * Used when the status of something is successful + */ + CUSTOM_SUCCESS = 200, + /** + * Used when the status of something has a warning + */ + CUSTOM_WARNING = 400, + /** + * Used when the status of something has an error + */ + CUSTOM_ERROR = 500, +} +" +`; + +exports[`v2 should generate: test/generated/v2/models/EnumWithNumbers.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a simple enum with numbers + */ +export enum EnumWithNumbers { + '_1' = 1, + '_2' = 2, + '_3' = 3, + '_1.1' = 1.1, + '_1.2' = 1.2, + '_1.3' = 1.3, + '_100' = 100, + '_200' = 200, + '_300' = 300, + '_-100' = -100, + '_-200' = -200, + '_-300' = -300, + '_-1.1' = -1.1, + '_-1.2' = -1.2, + '_-1.3' = -1.3, +} +" +`; + +exports[`v2 should generate: test/generated/v2/models/EnumWithStrings.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a simple enum with strings + */ +export enum EnumWithStrings { + SUCCESS = 'Success', + WARNING = 'Warning', + ERROR = 'Error', + _SINGLE_QUOTE_ = '\\'Single Quote\\'', + _DOUBLE_QUOTES_ = '"Double Quotes"', +} +" +`; + +exports[`v2 should generate: test/generated/v2/models/ModelThatExtends.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithString } from './ModelWithString'; +/** + * This is a model that extends another model + */ +export type ModelThatExtends = (ModelWithString & { + propExtendsA?: string; + propExtendsB?: ModelWithString; +}); + +" +`; + +exports[`v2 should generate: test/generated/v2/models/ModelThatExtendsExtends.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelThatExtends } from './ModelThatExtends'; +import type { ModelWithString } from './ModelWithString'; +/** + * This is a model that extends another model + */ +export type ModelThatExtendsExtends = (ModelWithString & ModelThatExtends & { + propExtendsC?: string; + propExtendsD?: ModelWithString; +}); + +" +`; + +exports[`v2 should generate: test/generated/v2/models/ModelWithArray.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithString } from './ModelWithString'; +/** + * This is a model with one property containing an array + */ +export type ModelWithArray = { + prop?: Array; + propWithFile?: Array; + propWithNumber?: Array; +}; + +" +`; + +exports[`v2 should generate: test/generated/v2/models/ModelWithBoolean.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a model with one boolean property + */ +export type ModelWithBoolean = { + /** + * This is a simple boolean property + */ + prop?: boolean; +}; + +" +`; + +exports[`v2 should generate: test/generated/v2/models/ModelWithCircularReference.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a model with one property containing a circular reference + */ +export type ModelWithCircularReference = { + prop?: ModelWithCircularReference; +}; + +" +`; + +exports[`v2 should generate: test/generated/v2/models/ModelWithDictionary.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a model with one property containing a dictionary + */ +export type ModelWithDictionary = { + prop?: Record; +}; + +" +`; + +exports[`v2 should generate: test/generated/v2/models/ModelWithDuplicateImports.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithString } from './ModelWithString'; +/** + * This is a model with duplicated imports + */ +export type ModelWithDuplicateImports = { + propA?: ModelWithString; + propB?: ModelWithString; + propC?: ModelWithString; +}; + +" +`; + +exports[`v2 should generate: test/generated/v2/models/ModelWithDuplicateProperties.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithString } from './ModelWithString'; +/** + * This is a model with duplicated properties + */ +export type ModelWithDuplicateProperties = { + prop?: ModelWithString; +}; + +" +`; + +exports[`v2 should generate: test/generated/v2/models/ModelWithEnum.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a model with one enum + */ +export type ModelWithEnum = { + /** + * This is a simple enum with strings + */ + test?: ModelWithEnum.test; + /** + * These are the HTTP error code enums + */ + statusCode?: ModelWithEnum.statusCode; + /** + * Simple boolean enum + */ + bool?: boolean; +}; +export namespace ModelWithEnum { + /** + * This is a simple enum with strings + */ + export enum test { + SUCCESS = 'Success', + WARNING = 'Warning', + ERROR = 'Error', + } + /** + * These are the HTTP error code enums + */ + export enum statusCode { + _100 = '100', + _200_FOO = '200 FOO', + _300_FOO_BAR = '300 FOO_BAR', + _400_FOO_BAR = '400 foo-bar', + _500_FOO_BAR = '500 foo.bar', + _600_FOO_BAR = '600 foo&bar', + } +} + +" +`; + +exports[`v2 should generate: test/generated/v2/models/ModelWithEnumFromDescription.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a model with one enum + */ +export type ModelWithEnumFromDescription = { + /** + * Success=1,Warning=2,Error=3 + */ + test?: number; +}; + +" +`; + +exports[`v2 should generate: test/generated/v2/models/ModelWithInteger.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a model with one number property + */ +export type ModelWithInteger = { + /** + * This is a simple number property + */ + prop?: number; +}; + +" +`; + +exports[`v2 should generate: test/generated/v2/models/ModelWithNestedEnums.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a model with nested enums + */ +export type ModelWithNestedEnums = { + dictionaryWithEnum?: Record; + dictionaryWithEnumFromDescription?: Record; + arrayWithEnum?: Array<'Success' | 'Warning' | 'Error'>; + arrayWithDescription?: Array; +}; + +" +`; + +exports[`v2 should generate: test/generated/v2/models/ModelWithNestedProperties.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a model with one nested property + */ +export type ModelWithNestedProperties = { + readonly first: { + readonly second: { + readonly third: string; + }; + }; +}; + +" +`; + +exports[`v2 should generate: test/generated/v2/models/ModelWithNullableString.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a model with one string property + */ +export type ModelWithNullableString = { + /** + * This is a simple string property + */ + nullableProp?: string | null; + /** + * This is a simple string property + */ + nullableRequiredProp: string | null; +}; + +" +`; + +exports[`v2 should generate: test/generated/v2/models/ModelWithOrderedProperties.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a model with ordered properties + */ +export type ModelWithOrderedProperties = { + zebra?: string; + apple?: string; + hawaii?: string; +}; + +" +`; + +exports[`v2 should generate: test/generated/v2/models/ModelWithPattern.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a model that contains a some patterns + */ +export type ModelWithPattern = { + key: string; + name: string; + readonly enabled?: boolean; + readonly modified?: string; + id?: string; + text?: string; + patternWithSingleQuotes?: string; +}; + +" +`; + +exports[`v2 should generate: test/generated/v2/models/ModelWithProperties.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithString } from './ModelWithString'; +/** + * This is a model with one nested property + */ +export type ModelWithProperties = { + required: string; + readonly requiredAndReadOnly: string; + string?: string; + number?: number; + boolean?: boolean; + reference?: ModelWithString; + 'property with space'?: string; + default?: string; + try?: string; + readonly '@namespace.string'?: string; + readonly '@namespace.integer'?: number; +}; + +" +`; + +exports[`v2 should generate: test/generated/v2/models/ModelWithReference.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithProperties } from './ModelWithProperties'; +/** + * This is a model with one property containing a reference + */ +export type ModelWithReference = { + prop?: ModelWithProperties; +}; + +" +`; + +exports[`v2 should generate: test/generated/v2/models/ModelWithString.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a model with one string property + */ +export type ModelWithString = { + /** + * This is a simple string property + */ + prop?: string; +}; + +" +`; + +exports[`v2 should generate: test/generated/v2/models/SimpleBoolean.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a simple boolean + */ +export type SimpleBoolean = boolean; +" +`; + +exports[`v2 should generate: test/generated/v2/models/SimpleFile.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a simple file + */ +export type SimpleFile = Blob; +" +`; + +exports[`v2 should generate: test/generated/v2/models/SimpleInteger.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a simple number + */ +export type SimpleInteger = number; +" +`; + +exports[`v2 should generate: test/generated/v2/models/SimpleReference.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithString } from './ModelWithString'; +/** + * This is a simple reference + */ +export type SimpleReference = ModelWithString; +" +`; + +exports[`v2 should generate: test/generated/v2/models/SimpleString.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a simple string + */ +export type SimpleString = string; +" +`; + +exports[`v2 should generate: test/generated/v2/models/SimpleStringWithPattern.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a simple string + */ +export type SimpleStringWithPattern = string; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$_default.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $_default = { + properties: { + name: { + type: 'string', + }, + }, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$ArrayWithArray.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ArrayWithArray = { + type: 'array', + contains: { + type: 'array', + contains: { + type: 'ModelWithString', + }, + }, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$ArrayWithBooleans.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ArrayWithBooleans = { + type: 'array', + contains: { + type: 'boolean', + }, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$ArrayWithNumbers.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ArrayWithNumbers = { + type: 'array', + contains: { + type: 'number', + }, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$ArrayWithProperties.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ArrayWithProperties = { + type: 'array', + contains: { + properties: { + foo: { + type: 'string', + }, + bar: { + type: 'string', + }, + }, + }, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$ArrayWithReferences.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ArrayWithReferences = { + type: 'array', + contains: { + type: 'ModelWithString', + }, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$ArrayWithStrings.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ArrayWithStrings = { + type: 'array', + contains: { + type: 'string', + }, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$CommentWithBackticks.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $CommentWithBackticks = { + type: 'number', + description: \`Testing backticks in string: \\\`backticks\\\` and \\\`\\\`\\\`multiple backticks\\\`\\\`\\\` should work\`, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$CommentWithBreaks.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $CommentWithBreaks = { + type: 'number', + description: \`Testing multiline comments in string: First line + Second line + Fourth line\`, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$CommentWithExpressionPlaceholders.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $CommentWithExpressionPlaceholders = { + type: 'number', + description: \`Testing expression placeholders in string: \\\${expression} should work\`, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$CommentWithQuotes.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $CommentWithQuotes = { + type: 'number', + description: \`Testing quotes in string: 'single quote''' and "double quotes""" should work\`, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$CommentWithReservedCharacters.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $CommentWithReservedCharacters = { + type: 'number', + description: \`Testing reserved characters in string: /* inline */ and /** inline **/ should work\`, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$CommentWithSlashes.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $CommentWithSlashes = { + type: 'number', + description: \`Testing slashes in string: \\\\backwards\\\\\\\\\\\\ and /forwards/// should work\`, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$Date.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $Date = { + type: 'string', + description: \`This is a type-only model that defines Date as a string\`, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$DictionaryWithArray.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $DictionaryWithArray = { + type: 'dictionary', + contains: { + type: 'array', + contains: { + type: 'ModelWithString', + }, + }, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$DictionaryWithDictionary.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $DictionaryWithDictionary = { + type: 'dictionary', + contains: { + type: 'dictionary', + contains: { + type: 'string', + }, + }, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$DictionaryWithProperties.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $DictionaryWithProperties = { + type: 'dictionary', + contains: { + properties: { + foo: { + type: 'string', + }, + bar: { + type: 'string', + }, + }, + }, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$DictionaryWithReference.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $DictionaryWithReference = { + type: 'dictionary', + contains: { + type: 'ModelWithString', + }, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$DictionaryWithString.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $DictionaryWithString = { + type: 'dictionary', + contains: { + type: 'string', + }, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$EnumFromDescription.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $EnumFromDescription = { + type: 'number', + description: \`Success=1,Warning=2,Error=3\`, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$EnumWithExtensions.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $EnumWithExtensions = { + type: 'Enum', +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$EnumWithNumbers.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $EnumWithNumbers = { + type: 'Enum', +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$EnumWithStrings.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $EnumWithStrings = { + type: 'Enum', +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$ModelThatExtends.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelThatExtends = { + type: 'all-of', + description: \`This is a model that extends another model\`, + contains: [{ + type: 'ModelWithString', + }, { + properties: { + propExtendsA: { + type: 'string', + }, + propExtendsB: { + type: 'ModelWithString', + }, + }, + }], +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$ModelThatExtendsExtends.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelThatExtendsExtends = { + type: 'all-of', + description: \`This is a model that extends another model\`, + contains: [{ + type: 'ModelWithString', + }, { + type: 'ModelThatExtends', + }, { + properties: { + propExtendsC: { + type: 'string', + }, + propExtendsD: { + type: 'ModelWithString', + }, + }, + }], +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$ModelWithArray.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelWithArray = { + description: \`This is a model with one property containing an array\`, + properties: { + prop: { + type: 'array', + contains: { + type: 'ModelWithString', + }, + }, + propWithFile: { + type: 'array', + contains: { + type: 'binary', + }, + }, + propWithNumber: { + type: 'array', + contains: { + type: 'number', + }, + }, + }, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$ModelWithBoolean.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelWithBoolean = { + description: \`This is a model with one boolean property\`, + properties: { + prop: { + type: 'boolean', + description: \`This is a simple boolean property\`, + }, + }, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$ModelWithCircularReference.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelWithCircularReference = { + description: \`This is a model with one property containing a circular reference\`, + properties: { + prop: { + type: 'ModelWithCircularReference', + }, + }, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$ModelWithDictionary.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelWithDictionary = { + description: \`This is a model with one property containing a dictionary\`, + properties: { + prop: { + type: 'dictionary', + contains: { + type: 'string', + }, + }, + }, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$ModelWithDuplicateImports.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelWithDuplicateImports = { + description: \`This is a model with duplicated imports\`, + properties: { + propA: { + type: 'ModelWithString', + }, + propB: { + type: 'ModelWithString', + }, + propC: { + type: 'ModelWithString', + }, + }, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$ModelWithDuplicateProperties.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelWithDuplicateProperties = { + description: \`This is a model with duplicated properties\`, + properties: { + prop: { + type: 'ModelWithString', + }, + }, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$ModelWithEnum.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelWithEnum = { + description: \`This is a model with one enum\`, + properties: { + test: { + type: 'Enum', + }, + statusCode: { + type: 'Enum', + }, + bool: { + type: 'boolean', + description: \`Simple boolean enum\`, + }, + }, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$ModelWithEnumFromDescription.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelWithEnumFromDescription = { + description: \`This is a model with one enum\`, + properties: { + test: { + type: 'number', + description: \`Success=1,Warning=2,Error=3\`, + }, + }, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$ModelWithInteger.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelWithInteger = { + description: \`This is a model with one number property\`, + properties: { + prop: { + type: 'number', + description: \`This is a simple number property\`, + }, + }, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$ModelWithNestedEnums.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelWithNestedEnums = { + description: \`This is a model with nested enums\`, + properties: { + dictionaryWithEnum: { + type: 'dictionary', + contains: { + type: 'Enum', + }, + }, + dictionaryWithEnumFromDescription: { + type: 'dictionary', + contains: { + type: 'number', + description: \`Success=1,Warning=2,Error=3\`, + }, + }, + arrayWithEnum: { + type: 'array', + contains: { + type: 'Enum', + }, + }, + arrayWithDescription: { + type: 'array', + contains: { + type: 'number', + description: \`Success=1,Warning=2,Error=3\`, + }, + }, + }, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$ModelWithNestedProperties.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelWithNestedProperties = { + description: \`This is a model with one nested property\`, + properties: { + first: { + properties: { + second: { + properties: { + third: { + type: 'string', + isReadOnly: true, + isRequired: true, + }, + }, + isReadOnly: true, + isRequired: true, + }, + }, + isReadOnly: true, + isRequired: true, + }, + }, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$ModelWithNullableString.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelWithNullableString = { + description: \`This is a model with one string property\`, + properties: { + nullableProp: { + type: 'string', + description: \`This is a simple string property\`, + isNullable: true, + }, + nullableRequiredProp: { + type: 'string', + description: \`This is a simple string property\`, + isRequired: true, + isNullable: true, + }, + }, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$ModelWithOrderedProperties.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelWithOrderedProperties = { + description: \`This is a model with ordered properties\`, + properties: { + zebra: { + type: 'string', + }, + apple: { + type: 'string', + }, + hawaii: { + type: 'string', + }, + }, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$ModelWithPattern.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelWithPattern = { + description: \`This is a model that contains a some patterns\`, + properties: { + key: { + type: 'string', + isRequired: true, + maxLength: 64, + pattern: '^[a-zA-Z0-9_]*$', + }, + name: { + type: 'string', + isRequired: true, + maxLength: 255, + }, + enabled: { + type: 'boolean', + isReadOnly: true, + }, + modified: { + type: 'string', + isReadOnly: true, + format: 'date-time', + }, + id: { + type: 'string', + pattern: '^\\\\d{2}-\\\\d{3}-\\\\d{4}$', + }, + text: { + type: 'string', + pattern: '^\\\\w+$', + }, + patternWithSingleQuotes: { + type: 'string', + pattern: '^[a-zA-Z0-9\\']*$', + }, + }, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$ModelWithProperties.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelWithProperties = { + description: \`This is a model with one nested property\`, + properties: { + required: { + type: 'string', + isRequired: true, + }, + requiredAndReadOnly: { + type: 'string', + isReadOnly: true, + isRequired: true, + }, + string: { + type: 'string', + }, + number: { + type: 'number', + }, + boolean: { + type: 'boolean', + }, + reference: { + type: 'ModelWithString', + }, + 'property with space': { + type: 'string', + }, + default: { + type: 'string', + }, + try: { + type: 'string', + }, + '@namespace.string': { + type: 'string', + isReadOnly: true, + }, + '@namespace.integer': { + type: 'number', + isReadOnly: true, + }, + }, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$ModelWithReference.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelWithReference = { + description: \`This is a model with one property containing a reference\`, + properties: { + prop: { + type: 'ModelWithProperties', + }, + }, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$ModelWithString.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelWithString = { + description: \`This is a model with one string property\`, + properties: { + prop: { + type: 'string', + description: \`This is a simple string property\`, + }, + }, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$SimpleBoolean.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $SimpleBoolean = { + type: 'boolean', + description: \`This is a simple boolean\`, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$SimpleFile.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $SimpleFile = { + type: 'binary', + description: \`This is a simple file\`, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$SimpleInteger.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $SimpleInteger = { + type: 'number', + description: \`This is a simple number\`, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$SimpleReference.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $SimpleReference = { + type: 'ModelWithString', + description: \`This is a simple reference\`, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$SimpleString.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $SimpleString = { + type: 'string', + description: \`This is a simple string\`, +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/schemas/$SimpleStringWithPattern.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $SimpleStringWithPattern = { + type: 'string', + description: \`This is a simple string\`, + maxLength: 64, + pattern: '^[a-zA-Z0-9_]*$', +} as const; +" +`; + +exports[`v2 should generate: test/generated/v2/services/CollectionFormatService.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class CollectionFormatService { + /** + * @param parameterArrayCsv This is an array parameter that is sent as csv format (comma-separated values) + * @param parameterArraySsv This is an array parameter that is sent as ssv format (space-separated values) + * @param parameterArrayTsv This is an array parameter that is sent as tsv format (tab-separated values) + * @param parameterArrayPipes This is an array parameter that is sent as pipes format (pipe-separated values) + * @param parameterArrayMulti This is an array parameter that is sent as multi format (multiple parameter instances) + * @throws ApiError + */ + public static collectionFormat( + parameterArrayCsv: Array, + parameterArraySsv: Array, + parameterArrayTsv: Array, + parameterArrayPipes: Array, + parameterArrayMulti: Array, + ): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v{api-version}/collectionFormat', + query: { + 'parameterArrayCSV': parameterArrayCsv, + 'parameterArraySSV': parameterArraySsv, + 'parameterArrayTSV': parameterArrayTsv, + 'parameterArrayPipes': parameterArrayPipes, + 'parameterArrayMulti': parameterArrayMulti, + }, + }); + } +} +" +`; + +exports[`v2 should generate: test/generated/v2/services/ComplexService.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithString } from '../models/ModelWithString'; +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class ComplexService { + /** + * @param parameterObject Parameter containing object + * @param parameterReference Parameter containing reference + * @returns ModelWithString Successful response + * @throws ApiError + */ + public static complexTypes( + parameterObject: { + first?: { + second?: { + third?: string; + }; + }; + }, + parameterReference: ModelWithString, + ): CancelablePromise> { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v{api-version}/complex', + query: { + 'parameterObject': parameterObject, + 'parameterReference': parameterReference, + }, + errors: { + 400: \`400 server error\`, + 500: \`500 server error\`, + }, + }); + } +} +" +`; + +exports[`v2 should generate: test/generated/v2/services/DefaultService.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class DefaultService { + /** + * @throws ApiError + */ + public static serviceWithEmptyTag(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v{api-version}/no-tag', + }); + } +} +" +`; + +exports[`v2 should generate: test/generated/v2/services/DefaultsService.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithString } from '../models/ModelWithString'; +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class DefaultsService { + /** + * @param parameterString This is a simple string with default value + * @param parameterNumber This is a simple number with default value + * @param parameterBoolean This is a simple boolean with default value + * @param parameterEnum This is a simple enum with default value + * @param parameterModel This is a simple model with default value + * @throws ApiError + */ + public static callWithDefaultParameters( + parameterString: string = 'Hello World!', + parameterNumber: number = 123, + parameterBoolean: boolean = true, + parameterEnum: 'Success' | 'Warning' | 'Error' = 'Success', + parameterModel: ModelWithString = { + "prop": "Hello World!" + }, + ): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v{api-version}/defaults', + query: { + 'parameterString': parameterString, + 'parameterNumber': parameterNumber, + 'parameterBoolean': parameterBoolean, + 'parameterEnum': parameterEnum, + 'parameterModel': parameterModel, + }, + }); + } + /** + * @param parameterString This is a simple string that is optional with default value + * @param parameterNumber This is a simple number that is optional with default value + * @param parameterBoolean This is a simple boolean that is optional with default value + * @param parameterEnum This is a simple enum that is optional with default value + * @param parameterModel This is a simple model that is optional with default value + * @throws ApiError + */ + public static callWithDefaultOptionalParameters( + parameterString: string = 'Hello World!', + parameterNumber: number = 123, + parameterBoolean: boolean = true, + parameterEnum: 'Success' | 'Warning' | 'Error' = 'Success', + parameterModel: ModelWithString = { + "prop": "Hello World!" + }, + ): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/api/v{api-version}/defaults', + query: { + 'parameterString': parameterString, + 'parameterNumber': parameterNumber, + 'parameterBoolean': parameterBoolean, + 'parameterEnum': parameterEnum, + 'parameterModel': parameterModel, + }, + }); + } + /** + * @param parameterStringWithNoDefault This is a string with no default + * @param parameterOptionalStringWithDefault This is a optional string with default + * @param parameterOptionalStringWithEmptyDefault This is a optional string with empty default + * @param parameterOptionalStringWithNoDefault This is a optional string with no default + * @param parameterStringWithDefault This is a string with default + * @param parameterStringWithEmptyDefault This is a string with empty default + * @param parameterStringNullableWithNoDefault This is a string that can be null with no default + * @param parameterStringNullableWithDefault This is a string that can be null with default + * @throws ApiError + */ + public static callToTestOrderOfParams( + parameterStringWithNoDefault: string, + parameterOptionalStringWithDefault: string = 'Hello World!', + parameterOptionalStringWithEmptyDefault: string = '', + parameterOptionalStringWithNoDefault?: string, + parameterStringWithDefault: string = 'Hello World!', + parameterStringWithEmptyDefault: string = '', + parameterStringNullableWithNoDefault?: string | null, + parameterStringNullableWithDefault: string | null = null, + ): CancelablePromise { + return __request(OpenAPI, { + method: 'PUT', + url: '/api/v{api-version}/defaults', + query: { + 'parameterOptionalStringWithDefault': parameterOptionalStringWithDefault, + 'parameterOptionalStringWithEmptyDefault': parameterOptionalStringWithEmptyDefault, + 'parameterOptionalStringWithNoDefault': parameterOptionalStringWithNoDefault, + 'parameterStringWithDefault': parameterStringWithDefault, + 'parameterStringWithEmptyDefault': parameterStringWithEmptyDefault, + 'parameterStringWithNoDefault': parameterStringWithNoDefault, + 'parameterStringNullableWithNoDefault': parameterStringNullableWithNoDefault, + 'parameterStringNullableWithDefault': parameterStringNullableWithDefault, + }, + }); + } +} +" +`; + +exports[`v2 should generate: test/generated/v2/services/DescriptionsService.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class DescriptionsService { + /** + * @param parameterWithBreaks Testing multiline comments in string: First line + * Second line + * + * Fourth line + * @param parameterWithBackticks Testing backticks in string: \`backticks\` and \`\`\`multiple backticks\`\`\` should work + * @param parameterWithSlashes Testing slashes in string: \\backwards\\\\\\ and /forwards/// should work + * @param parameterWithExpressionPlaceholders Testing expression placeholders in string: \${expression} should work + * @param parameterWithQuotes Testing quotes in string: 'single quote''' and "double quotes""" should work + * @param parameterWithReservedCharacters Testing reserved characters in string: * inline * and ** inline ** should work + * @throws ApiError + */ + public static callWithDescriptions( + parameterWithBreaks?: string, + parameterWithBackticks?: string, + parameterWithSlashes?: string, + parameterWithExpressionPlaceholders?: string, + parameterWithQuotes?: string, + parameterWithReservedCharacters?: string, + ): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/api/v{api-version}/descriptions/', + query: { + 'parameterWithBreaks': parameterWithBreaks, + 'parameterWithBackticks': parameterWithBackticks, + 'parameterWithSlashes': parameterWithSlashes, + 'parameterWithExpressionPlaceholders': parameterWithExpressionPlaceholders, + 'parameterWithQuotes': parameterWithQuotes, + 'parameterWithReservedCharacters': parameterWithReservedCharacters, + }, + }); + } +} +" +`; + +exports[`v2 should generate: test/generated/v2/services/DuplicateService.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class DuplicateService { + /** + * @throws ApiError + */ + public static duplicateName(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v{api-version}/duplicate', + }); + } + /** + * @throws ApiError + */ + public static duplicateName1(): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/api/v{api-version}/duplicate', + }); + } + /** + * @throws ApiError + */ + public static duplicateName2(): CancelablePromise { + return __request(OpenAPI, { + method: 'PUT', + url: '/api/v{api-version}/duplicate', + }); + } + /** + * @throws ApiError + */ + public static duplicateName3(): CancelablePromise { + return __request(OpenAPI, { + method: 'DELETE', + url: '/api/v{api-version}/duplicate', + }); + } +} +" +`; + +exports[`v2 should generate: test/generated/v2/services/ErrorService.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class ErrorService { + /** + * @param status Status code to return + * @returns any Custom message: Successful response + * @throws ApiError + */ + public static testErrorCode( + status: string, + ): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/api/v{api-version}/error', + query: { + 'status': status, + }, + errors: { + 500: \`Custom message: Internal Server Error\`, + 501: \`Custom message: Not Implemented\`, + 502: \`Custom message: Bad Gateway\`, + 503: \`Custom message: Service Unavailable\`, + }, + }); + } +} +" +`; + +exports[`v2 should generate: test/generated/v2/services/HeaderService.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class HeaderService { + /** + * @returns string Successful response + * @throws ApiError + */ + public static callWithResultFromHeader(): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/api/v{api-version}/header', + responseHeader: 'operation-location', + errors: { + 400: \`400 server error\`, + 500: \`500 server error\`, + }, + }); + } +} +" +`; + +exports[`v2 should generate: test/generated/v2/services/MultipleTags1Service.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class MultipleTags1Service { + /** + * @returns void + * @throws ApiError + */ + public static dummyA(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v{api-version}/multiple-tags/a', + }); + } + /** + * @returns void + * @throws ApiError + */ + public static dummyB(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v{api-version}/multiple-tags/b', + }); + } +} +" +`; + +exports[`v2 should generate: test/generated/v2/services/MultipleTags2Service.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class MultipleTags2Service { + /** + * @returns void + * @throws ApiError + */ + public static dummyA(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v{api-version}/multiple-tags/a', + }); + } + /** + * @returns void + * @throws ApiError + */ + public static dummyB(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v{api-version}/multiple-tags/b', + }); + } +} +" +`; + +exports[`v2 should generate: test/generated/v2/services/MultipleTags3Service.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class MultipleTags3Service { + /** + * @returns void + * @throws ApiError + */ + public static dummyB(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v{api-version}/multiple-tags/b', + }); + } +} +" +`; + +exports[`v2 should generate: test/generated/v2/services/NoContentService.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class NoContentService { + /** + * @returns void + * @throws ApiError + */ + public static callWithNoContentResponse(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v{api-version}/no-content', + }); + } +} +" +`; + +exports[`v2 should generate: test/generated/v2/services/ParametersService.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class ParametersService { + /** + * @param parameterHeader This is the parameter that goes into the header + * @param parameterQuery This is the parameter that goes into the query params + * @param parameterForm This is the parameter that goes into the form data + * @param parameterBody This is the parameter that is sent as request body + * @param parameterPath This is the parameter that goes into the path + * @throws ApiError + */ + public static callWithParameters( + parameterHeader: string, + parameterQuery: string, + parameterForm: string, + parameterBody: string, + parameterPath: string, + ): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/api/v{api-version}/parameters/{parameterPath}', + path: { + 'parameterPath': parameterPath, + }, + headers: { + 'parameterHeader': parameterHeader, + }, + query: { + 'parameterQuery': parameterQuery, + }, + formData: { + 'parameterForm': parameterForm, + }, + body: parameterBody, + }); + } + /** + * @param parameterHeader This is the parameter that goes into the request header + * @param parameterQuery This is the parameter that goes into the request query params + * @param parameterForm This is the parameter that goes into the request form data + * @param parameterBody This is the parameter that is sent as request body + * @param parameterPath1 This is the parameter that goes into the path + * @param parameterPath2 This is the parameter that goes into the path + * @param parameterPath3 This is the parameter that goes into the path + * @param _default This is the parameter with a reserved keyword + * @throws ApiError + */ + public static callWithWeirdParameterNames( + parameterHeader: string, + parameterQuery: string, + parameterForm: string, + parameterBody: string, + parameterPath1?: string, + parameterPath2?: string, + parameterPath3?: string, + _default?: string, + ): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/api/v{api-version}/parameters/{parameter.path.1}/{parameter-path-2}/{PARAMETER-PATH-3}', + path: { + 'parameter.path.1': parameterPath1, + 'parameter-path-2': parameterPath2, + 'PARAMETER-PATH-3': parameterPath3, + }, + headers: { + 'parameter.header': parameterHeader, + }, + query: { + 'default': _default, + 'parameter-query': parameterQuery, + }, + formData: { + 'parameter_form': parameterForm, + }, + body: parameterBody, + }); + } +} +" +`; + +exports[`v2 should generate: test/generated/v2/services/ResponseService.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelThatExtends } from '../models/ModelThatExtends'; +import type { ModelThatExtendsExtends } from '../models/ModelThatExtendsExtends'; +import type { ModelWithString } from '../models/ModelWithString'; +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class ResponseService { + /** + * @returns ModelWithString Message for default response + * @throws ApiError + */ + public static callWithResponse(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v{api-version}/response', + }); + } + /** + * @returns ModelWithString Message for default response + * @throws ApiError + */ + public static callWithDuplicateResponses(): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/api/v{api-version}/response', + errors: { + 500: \`Message for 500 error\`, + 501: \`Message for 501 error\`, + 502: \`Message for 502 error\`, + }, + }); + } + /** + * @returns any Message for 200 response + * @returns ModelWithString Message for default response + * @returns ModelThatExtends Message for 201 response + * @returns ModelThatExtendsExtends Message for 202 response + * @throws ApiError + */ + public static callWithResponses(): CancelablePromise<{ + readonly '@namespace.string'?: string; + readonly '@namespace.integer'?: number; + readonly value?: Array; + } | ModelWithString | ModelThatExtends | ModelThatExtendsExtends> { + return __request(OpenAPI, { + method: 'PUT', + url: '/api/v{api-version}/response', + errors: { + 500: \`Message for 500 error\`, + 501: \`Message for 501 error\`, + 502: \`Message for 502 error\`, + }, + }); + } +} +" +`; + +exports[`v2 should generate: test/generated/v2/services/SimpleService.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class SimpleService { + /** + * @throws ApiError + */ + public static getCallWithoutParametersAndResponse(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v{api-version}/simple', + }); + } + /** + * @throws ApiError + */ + public static putCallWithoutParametersAndResponse(): CancelablePromise { + return __request(OpenAPI, { + method: 'PUT', + url: '/api/v{api-version}/simple', + }); + } + /** + * @throws ApiError + */ + public static postCallWithoutParametersAndResponse(): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/api/v{api-version}/simple', + }); + } + /** + * @throws ApiError + */ + public static deleteCallWithoutParametersAndResponse(): CancelablePromise { + return __request(OpenAPI, { + method: 'DELETE', + url: '/api/v{api-version}/simple', + }); + } + /** + * @throws ApiError + */ + public static optionsCallWithoutParametersAndResponse(): CancelablePromise { + return __request(OpenAPI, { + method: 'OPTIONS', + url: '/api/v{api-version}/simple', + }); + } + /** + * @throws ApiError + */ + public static headCallWithoutParametersAndResponse(): CancelablePromise { + return __request(OpenAPI, { + method: 'HEAD', + url: '/api/v{api-version}/simple', + }); + } + /** + * @throws ApiError + */ + public static patchCallWithoutParametersAndResponse(): CancelablePromise { + return __request(OpenAPI, { + method: 'PATCH', + url: '/api/v{api-version}/simple', + }); + } +} +" +`; + +exports[`v2 should generate: test/generated/v2/services/TypesService.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class TypesService { + /** + * @param parameterArray This is an array parameter + * @param parameterDictionary This is a dictionary parameter + * @param parameterEnum This is an enum parameter + * @param parameterNumber This is a number parameter + * @param parameterString This is a string parameter + * @param parameterBoolean This is a boolean parameter + * @param parameterObject This is an object parameter + * @param id This is a number parameter + * @returns number Response is a simple number + * @returns string Response is a simple string + * @returns boolean Response is a simple boolean + * @returns any Response is a simple object + * @throws ApiError + */ + public static types( + parameterArray: Array, + parameterDictionary: Record, + parameterEnum: 'Success' | 'Warning' | 'Error', + parameterNumber: number = 123, + parameterString: string = 'default', + parameterBoolean: boolean = true, + parameterObject: any = null, + id?: number, + ): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v{api-version}/types', + path: { + 'id': id, + }, + query: { + 'parameterNumber': parameterNumber, + 'parameterString': parameterString, + 'parameterBoolean': parameterBoolean, + 'parameterObject': parameterObject, + 'parameterArray': parameterArray, + 'parameterDictionary': parameterDictionary, + 'parameterEnum': parameterEnum, + }, + }); + } +} +" +`; + +exports[`v3 should generate: test/generated/v3/core/ApiError.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ApiRequestOptions } from './ApiRequestOptions'; +import type { ApiResult } from './ApiResult'; + +export class ApiError extends Error { + public readonly url: string; + public readonly status: number; + public readonly statusText: string; + public readonly body: any; + public readonly request: ApiRequestOptions; + + constructor(request: ApiRequestOptions, response: ApiResult, message: string) { + super(message); + + this.name = 'ApiError'; + this.url = response.url; + this.status = response.status; + this.statusText = response.statusText; + this.body = response.body; + this.request = request; + } +} +" +`; + +exports[`v3 should generate: test/generated/v3/core/ApiRequestOptions.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type ApiRequestOptions = { + readonly method: 'GET' | 'PUT' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD' | 'PATCH'; + readonly url: string; + readonly path?: Record; + readonly cookies?: Record; + readonly headers?: Record; + readonly query?: Record; + readonly formData?: Record; + readonly body?: any; + readonly mediaType?: string; + readonly responseHeader?: string; + readonly errors?: Record; +}; +" +`; + +exports[`v3 should generate: test/generated/v3/core/ApiResult.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type ApiResult = { + readonly url: string; + readonly ok: boolean; + readonly status: number; + readonly statusText: string; + readonly body: any; +}; +" +`; + +exports[`v3 should generate: test/generated/v3/core/CancelablePromise.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export class CancelError extends Error { + + constructor(message: string) { + super(message); + this.name = 'CancelError'; + } + + public get isCancelled(): boolean { + return true; + } +} + +export interface OnCancel { + readonly isResolved: boolean; + readonly isRejected: boolean; + readonly isCancelled: boolean; + + (cancelHandler: () => void): void; +} + +export class CancelablePromise implements Promise { + #isResolved: boolean; + #isRejected: boolean; + #isCancelled: boolean; + readonly #cancelHandlers: (() => void)[]; + readonly #promise: Promise; + #resolve?: (value: T | PromiseLike) => void; + #reject?: (reason?: any) => void; + + constructor( + executor: ( + resolve: (value: T | PromiseLike) => void, + reject: (reason?: any) => void, + onCancel: OnCancel + ) => void + ) { + this.#isResolved = false; + this.#isRejected = false; + this.#isCancelled = false; + this.#cancelHandlers = []; + this.#promise = new Promise((resolve, reject) => { + this.#resolve = resolve; + this.#reject = reject; + + const onResolve = (value: T | PromiseLike): void => { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { + return; + } + this.#isResolved = true; + if (this.#resolve) this.#resolve(value); + }; + + const onReject = (reason?: any): void => { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { + return; + } + this.#isRejected = true; + if (this.#reject) this.#reject(reason); + }; + + const onCancel = (cancelHandler: () => void): void => { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { + return; + } + this.#cancelHandlers.push(cancelHandler); + }; + + Object.defineProperty(onCancel, 'isResolved', { + get: (): boolean => this.#isResolved, + }); + + Object.defineProperty(onCancel, 'isRejected', { + get: (): boolean => this.#isRejected, + }); + + Object.defineProperty(onCancel, 'isCancelled', { + get: (): boolean => this.#isCancelled, + }); + + return executor(onResolve, onReject, onCancel as OnCancel); + }); + } + + get [Symbol.toStringTag]() { + return "Cancellable Promise"; + } + + public then( + onFulfilled?: ((value: T) => TResult1 | PromiseLike) | null, + onRejected?: ((reason: any) => TResult2 | PromiseLike) | null + ): Promise { + return this.#promise.then(onFulfilled, onRejected); + } + + public catch( + onRejected?: ((reason: any) => TResult | PromiseLike) | null + ): Promise { + return this.#promise.catch(onRejected); + } + + public finally(onFinally?: (() => void) | null): Promise { + return this.#promise.finally(onFinally); + } + + public cancel(): void { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { + return; + } + this.#isCancelled = true; + if (this.#cancelHandlers.length) { + try { + for (const cancelHandler of this.#cancelHandlers) { + cancelHandler(); + } + } catch (error) { + console.warn('Cancellation threw an error', error); + return; + } + } + this.#cancelHandlers.length = 0; + if (this.#reject) this.#reject(new CancelError('Request aborted')); + } + + public get isCancelled(): boolean { + return this.#isCancelled; + } +} +" +`; + +exports[`v3 should generate: test/generated/v3/core/OpenAPI.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ApiRequestOptions } from './ApiRequestOptions'; + +type Resolver = (options: ApiRequestOptions) => Promise; +type Headers = Record; + +export type OpenAPIConfig = { + BASE: string; + VERSION: string; + WITH_CREDENTIALS: boolean; + CREDENTIALS: 'include' | 'omit' | 'same-origin'; + TOKEN?: string | Resolver | undefined; + USERNAME?: string | Resolver | undefined; + PASSWORD?: string | Resolver | undefined; + HEADERS?: Headers | Resolver | undefined; + ENCODE_PATH?: ((path: string) => string) | undefined; +}; + +export const OpenAPI: OpenAPIConfig = { + BASE: 'http://localhost:3000/base', + VERSION: '1.0', + WITH_CREDENTIALS: false, + CREDENTIALS: 'include', + TOKEN: undefined, + USERNAME: undefined, + PASSWORD: undefined, + HEADERS: undefined, + ENCODE_PATH: undefined, +}; +" +`; + +exports[`v3 should generate: test/generated/v3/core/request.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import { ApiError } from './ApiError'; +import type { ApiRequestOptions } from './ApiRequestOptions'; +import type { ApiResult } from './ApiResult'; +import { CancelablePromise } from './CancelablePromise'; +import type { OnCancel } from './CancelablePromise'; +import type { OpenAPIConfig } from './OpenAPI'; + +export const isDefined = (value: T | null | undefined): value is Exclude => { + return value !== undefined && value !== null; +}; + +export const isString = (value: any): value is string => { + return typeof value === 'string'; +}; + +export const isStringWithValue = (value: any): value is string => { + return isString(value) && value !== ''; +}; + +export const isBlob = (value: any): value is Blob => { + return ( + typeof value === 'object' && + typeof value.type === 'string' && + typeof value.stream === 'function' && + typeof value.arrayBuffer === 'function' && + typeof value.constructor === 'function' && + typeof value.constructor.name === 'string' && + /^(Blob|File)$/.test(value.constructor.name) && + /^(Blob|File)$/.test(value[Symbol.toStringTag]) + ); +}; + +export const isFormData = (value: any): value is FormData => { + return value instanceof FormData; +}; + +export const base64 = (str: string): string => { + try { + return btoa(str); + } catch (err) { + // @ts-ignore + return Buffer.from(str).toString('base64'); + } +}; + +export const getQueryString = (params: Record): string => { + const qs: string[] = []; + + const append = (key: string, value: any) => { + qs.push(\`\${encodeURIComponent(key)}=\${encodeURIComponent(String(value))}\`); + }; + + const process = (key: string, value: any) => { + if (isDefined(value)) { + if (Array.isArray(value)) { + value.forEach(v => { + process(key, v); + }); + } else if (typeof value === 'object') { + Object.entries(value).forEach(([k, v]) => { + process(\`\${key}[\${k}]\`, v); + }); + } else { + append(key, value); + } + } + }; + + Object.entries(params).forEach(([key, value]) => { + process(key, value); + }); + + if (qs.length > 0) { + return \`?\${qs.join('&')}\`; + } + + return ''; +}; + +const getUrl = (config: OpenAPIConfig, options: ApiRequestOptions): string => { + const encoder = config.ENCODE_PATH || encodeURI; + + const path = options.url + .replace('{api-version}', config.VERSION) + .replace(/{(.*?)}/g, (substring: string, group: string) => { + if (options.path?.hasOwnProperty(group)) { + return encoder(String(options.path[group])); + } + return substring; + }); + + const url = \`\${config.BASE}\${path}\`; + if (options.query) { + return \`\${url}\${getQueryString(options.query)}\`; + } + return url; +}; + +export const getFormData = (options: ApiRequestOptions): FormData | undefined => { + if (options.formData) { + const formData = new FormData(); + + const process = (key: string, value: any) => { + if (isString(value) || isBlob(value)) { + formData.append(key, value); + } else { + formData.append(key, JSON.stringify(value)); + } + }; + + Object.entries(options.formData) + .filter(([_, value]) => isDefined(value)) + .forEach(([key, value]) => { + if (Array.isArray(value)) { + value.forEach(v => process(key, v)); + } else { + process(key, value); + } + }); + + return formData; + } + return undefined; +}; + +type Resolver = (options: ApiRequestOptions) => Promise; + +export const resolve = async (options: ApiRequestOptions, resolver?: T | Resolver): Promise => { + if (typeof resolver === 'function') { + return (resolver as Resolver)(options); + } + return resolver; +}; + +export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions): Promise => { + const [token, username, password, additionalHeaders] = await Promise.all([ + resolve(options, config.TOKEN), + resolve(options, config.USERNAME), + resolve(options, config.PASSWORD), + resolve(options, config.HEADERS), + ]); + + const headers = Object.entries({ + Accept: 'application/json', + ...additionalHeaders, + ...options.headers, + }) + .filter(([_, value]) => isDefined(value)) + .reduce((headers, [key, value]) => ({ + ...headers, + [key]: String(value), + }), {} as Record); + + if (isStringWithValue(token)) { + headers['Authorization'] = \`Bearer \${token}\`; + } + + if (isStringWithValue(username) && isStringWithValue(password)) { + const credentials = base64(\`\${username}:\${password}\`); + headers['Authorization'] = \`Basic \${credentials}\`; + } + + if (options.body !== undefined) { + if (options.mediaType) { + headers['Content-Type'] = options.mediaType; + } else if (isBlob(options.body)) { + headers['Content-Type'] = options.body.type || 'application/octet-stream'; + } else if (isString(options.body)) { + headers['Content-Type'] = 'text/plain'; + } else if (!isFormData(options.body)) { + headers['Content-Type'] = 'application/json'; + } + } + + return new Headers(headers); +}; + +export const getRequestBody = (options: ApiRequestOptions): any => { + if (options.body !== undefined) { + if (options.mediaType?.includes('/json')) { + return JSON.stringify(options.body) + } else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) { + return options.body; + } else { + return JSON.stringify(options.body); + } + } + return undefined; +}; + +export const sendRequest = async ( + config: OpenAPIConfig, + options: ApiRequestOptions, + url: string, + body: any, + formData: FormData | undefined, + headers: Headers, + onCancel: OnCancel +): Promise => { + const controller = new AbortController(); + + const request: RequestInit = { + headers, + body: body ?? formData, + method: options.method, + signal: controller.signal, + }; + + if (config.WITH_CREDENTIALS) { + request.credentials = config.CREDENTIALS; + } + + onCancel(() => controller.abort()); + + return await fetch(url, request); +}; + +export const getResponseHeader = (response: Response, responseHeader?: string): string | undefined => { + if (responseHeader) { + const content = response.headers.get(responseHeader); + if (isString(content)) { + return content; + } + } + return undefined; +}; + +export const getResponseBody = async (response: Response): Promise => { + if (response.status !== 204) { + try { + const contentType = response.headers.get('Content-Type'); + if (contentType) { + const jsonTypes = ['application/json', 'application/problem+json'] + const isJSON = jsonTypes.some(type => contentType.toLowerCase().startsWith(type)); + if (isJSON) { + return await response.json(); + } else { + return await response.text(); + } + } + } catch (error) { + console.error(error); + } + } + return undefined; +}; + +export const catchErrorCodes = (options: ApiRequestOptions, result: ApiResult): void => { + const errors: Record = { + 400: 'Bad Request', + 401: 'Unauthorized', + 403: 'Forbidden', + 404: 'Not Found', + 500: 'Internal Server Error', + 502: 'Bad Gateway', + 503: 'Service Unavailable', + ...options.errors, + } + + const error = errors[result.status]; + if (error) { + throw new ApiError(options, result, error); + } + + if (!result.ok) { + const errorStatus = result.status ?? 'unknown'; + const errorStatusText = result.statusText ?? 'unknown'; + const errorBody = (() => { + try { + return JSON.stringify(result.body, null, 2); + } catch (e) { + return undefined; + } + })(); + + throw new ApiError(options, result, + \`Generic Error: status: \${errorStatus}; status text: \${errorStatusText}; body: \${errorBody}\` + ); + } +}; + +/** + * Request method + * @param config The OpenAPI configuration object + * @param options The request options from the service + * @returns CancelablePromise + * @throws ApiError + */ +export const request = (config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise => { + return new CancelablePromise(async (resolve, reject, onCancel) => { + try { + const url = getUrl(config, options); + const formData = getFormData(options); + const body = getRequestBody(options); + const headers = await getHeaders(config, options); + + if (!onCancel.isCancelled) { + const response = await sendRequest(config, options, url, body, formData, headers, onCancel); + const responseBody = await getResponseBody(response); + const responseHeader = getResponseHeader(response, options.responseHeader); + + const result: ApiResult = { + url, + ok: response.ok, + status: response.status, + statusText: response.statusText, + body: responseHeader ?? responseBody, + }; + + catchErrorCodes(options, result); + + resolve(result.body); + } + } catch (error) { + reject(error); + } + }); +}; +" +`; + +exports[`v3 should generate: test/generated/v3/index.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export { ApiError } from './core/ApiError'; +export { CancelablePromise, CancelError } from './core/CancelablePromise'; +export { OpenAPI } from './core/OpenAPI'; +export type { OpenAPIConfig } from './core/OpenAPI'; + +export type { _default } from './models/_default'; +export type { ArrayWithArray } from './models/ArrayWithArray'; +export type { ArrayWithBooleans } from './models/ArrayWithBooleans'; +export type { ArrayWithNumbers } from './models/ArrayWithNumbers'; +export type { ArrayWithProperties } from './models/ArrayWithProperties'; +export type { ArrayWithReferences } from './models/ArrayWithReferences'; +export type { ArrayWithStrings } from './models/ArrayWithStrings'; +export type { CommentWithBackticks } from './models/CommentWithBackticks'; +export type { CommentWithBreaks } from './models/CommentWithBreaks'; +export type { CommentWithExpressionPlaceholders } from './models/CommentWithExpressionPlaceholders'; +export type { CommentWithQuotes } from './models/CommentWithQuotes'; +export type { CommentWithReservedCharacters } from './models/CommentWithReservedCharacters'; +export type { CommentWithSlashes } from './models/CommentWithSlashes'; +export type { CompositionBaseModel } from './models/CompositionBaseModel'; +export type { CompositionExtendedModel } from './models/CompositionExtendedModel'; +export type { CompositionWithAllOfAndNullable } from './models/CompositionWithAllOfAndNullable'; +export type { CompositionWithAnyOf } from './models/CompositionWithAnyOf'; +export type { CompositionWithAnyOfAndNullable } from './models/CompositionWithAnyOfAndNullable'; +export type { CompositionWithAnyOfAnonymous } from './models/CompositionWithAnyOfAnonymous'; +export type { CompositionWithOneOf } from './models/CompositionWithOneOf'; +export type { CompositionWithOneOfAndComplexArrayDictionary } from './models/CompositionWithOneOfAndComplexArrayDictionary'; +export type { CompositionWithOneOfAndNullable } from './models/CompositionWithOneOfAndNullable'; +export type { CompositionWithOneOfAndSimpleArrayDictionary } from './models/CompositionWithOneOfAndSimpleArrayDictionary'; +export type { CompositionWithOneOfAndSimpleDictionary } from './models/CompositionWithOneOfAndSimpleDictionary'; +export type { CompositionWithOneOfAnonymous } from './models/CompositionWithOneOfAnonymous'; +export type { CompositionWithOneOfDiscriminator } from './models/CompositionWithOneOfDiscriminator'; +export type { DeprecatedModel } from './models/DeprecatedModel'; +export type { DictionaryWithArray } from './models/DictionaryWithArray'; +export type { DictionaryWithDictionary } from './models/DictionaryWithDictionary'; +export type { DictionaryWithProperties } from './models/DictionaryWithProperties'; +export type { DictionaryWithReference } from './models/DictionaryWithReference'; +export type { DictionaryWithString } from './models/DictionaryWithString'; +export type { EnumFromDescription } from './models/EnumFromDescription'; +export { EnumWithExtensions } from './models/EnumWithExtensions'; +export { EnumWithNumbers } from './models/EnumWithNumbers'; +export { EnumWithStrings } from './models/EnumWithStrings'; +export type { File } from './models/File'; +export type { FreeFormObjectWithAdditionalPropertiesEqEmptyObject } from './models/FreeFormObjectWithAdditionalPropertiesEqEmptyObject'; +export type { FreeFormObjectWithAdditionalPropertiesEqTrue } from './models/FreeFormObjectWithAdditionalPropertiesEqTrue'; +export type { FreeFormObjectWithoutAdditionalProperties } from './models/FreeFormObjectWithoutAdditionalProperties'; +export type { ModelCircle } from './models/ModelCircle'; +export type { ModelSquare } from './models/ModelSquare'; +export type { ModelThatExtends } from './models/ModelThatExtends'; +export type { ModelThatExtendsExtends } from './models/ModelThatExtendsExtends'; +export type { ModelWithArray } from './models/ModelWithArray'; +export type { ModelWithBoolean } from './models/ModelWithBoolean'; +export type { ModelWithCircularReference } from './models/ModelWithCircularReference'; +export type { ModelWithDictionary } from './models/ModelWithDictionary'; +export type { ModelWithDuplicateImports } from './models/ModelWithDuplicateImports'; +export type { ModelWithDuplicateProperties } from './models/ModelWithDuplicateProperties'; +export { ModelWithEnum } from './models/ModelWithEnum'; +export type { ModelWithEnumFromDescription } from './models/ModelWithEnumFromDescription'; +export type { ModelWithInteger } from './models/ModelWithInteger'; +export type { ModelWithNestedEnums } from './models/ModelWithNestedEnums'; +export type { ModelWithNestedProperties } from './models/ModelWithNestedProperties'; +export type { ModelWithNullableString } from './models/ModelWithNullableString'; +export type { ModelWithOrderedProperties } from './models/ModelWithOrderedProperties'; +export type { ModelWithPattern } from './models/ModelWithPattern'; +export type { ModelWithProperties } from './models/ModelWithProperties'; +export type { ModelWithReference } from './models/ModelWithReference'; +export type { ModelWithString } from './models/ModelWithString'; +export type { Pageable } from './models/Pageable'; +export type { SimpleBoolean } from './models/SimpleBoolean'; +export type { SimpleFile } from './models/SimpleFile'; +export type { SimpleInteger } from './models/SimpleInteger'; +export type { SimpleParameter } from './models/SimpleParameter'; +export type { SimpleReference } from './models/SimpleReference'; +export type { SimpleString } from './models/SimpleString'; +export type { SimpleStringWithPattern } from './models/SimpleStringWithPattern'; + +export { $_default } from './schemas/$_default'; +export { $ArrayWithArray } from './schemas/$ArrayWithArray'; +export { $ArrayWithBooleans } from './schemas/$ArrayWithBooleans'; +export { $ArrayWithNumbers } from './schemas/$ArrayWithNumbers'; +export { $ArrayWithProperties } from './schemas/$ArrayWithProperties'; +export { $ArrayWithReferences } from './schemas/$ArrayWithReferences'; +export { $ArrayWithStrings } from './schemas/$ArrayWithStrings'; +export { $CommentWithBackticks } from './schemas/$CommentWithBackticks'; +export { $CommentWithBreaks } from './schemas/$CommentWithBreaks'; +export { $CommentWithExpressionPlaceholders } from './schemas/$CommentWithExpressionPlaceholders'; +export { $CommentWithQuotes } from './schemas/$CommentWithQuotes'; +export { $CommentWithReservedCharacters } from './schemas/$CommentWithReservedCharacters'; +export { $CommentWithSlashes } from './schemas/$CommentWithSlashes'; +export { $CompositionBaseModel } from './schemas/$CompositionBaseModel'; +export { $CompositionExtendedModel } from './schemas/$CompositionExtendedModel'; +export { $CompositionWithAllOfAndNullable } from './schemas/$CompositionWithAllOfAndNullable'; +export { $CompositionWithAnyOf } from './schemas/$CompositionWithAnyOf'; +export { $CompositionWithAnyOfAndNullable } from './schemas/$CompositionWithAnyOfAndNullable'; +export { $CompositionWithAnyOfAnonymous } from './schemas/$CompositionWithAnyOfAnonymous'; +export { $CompositionWithOneOf } from './schemas/$CompositionWithOneOf'; +export { $CompositionWithOneOfAndComplexArrayDictionary } from './schemas/$CompositionWithOneOfAndComplexArrayDictionary'; +export { $CompositionWithOneOfAndNullable } from './schemas/$CompositionWithOneOfAndNullable'; +export { $CompositionWithOneOfAndSimpleArrayDictionary } from './schemas/$CompositionWithOneOfAndSimpleArrayDictionary'; +export { $CompositionWithOneOfAndSimpleDictionary } from './schemas/$CompositionWithOneOfAndSimpleDictionary'; +export { $CompositionWithOneOfAnonymous } from './schemas/$CompositionWithOneOfAnonymous'; +export { $CompositionWithOneOfDiscriminator } from './schemas/$CompositionWithOneOfDiscriminator'; +export { $DeprecatedModel } from './schemas/$DeprecatedModel'; +export { $DictionaryWithArray } from './schemas/$DictionaryWithArray'; +export { $DictionaryWithDictionary } from './schemas/$DictionaryWithDictionary'; +export { $DictionaryWithProperties } from './schemas/$DictionaryWithProperties'; +export { $DictionaryWithReference } from './schemas/$DictionaryWithReference'; +export { $DictionaryWithString } from './schemas/$DictionaryWithString'; +export { $EnumFromDescription } from './schemas/$EnumFromDescription'; +export { $EnumWithExtensions } from './schemas/$EnumWithExtensions'; +export { $EnumWithNumbers } from './schemas/$EnumWithNumbers'; +export { $EnumWithStrings } from './schemas/$EnumWithStrings'; +export { $File } from './schemas/$File'; +export { $FreeFormObjectWithAdditionalPropertiesEqEmptyObject } from './schemas/$FreeFormObjectWithAdditionalPropertiesEqEmptyObject'; +export { $FreeFormObjectWithAdditionalPropertiesEqTrue } from './schemas/$FreeFormObjectWithAdditionalPropertiesEqTrue'; +export { $FreeFormObjectWithoutAdditionalProperties } from './schemas/$FreeFormObjectWithoutAdditionalProperties'; +export { $ModelCircle } from './schemas/$ModelCircle'; +export { $ModelSquare } from './schemas/$ModelSquare'; +export { $ModelThatExtends } from './schemas/$ModelThatExtends'; +export { $ModelThatExtendsExtends } from './schemas/$ModelThatExtendsExtends'; +export { $ModelWithArray } from './schemas/$ModelWithArray'; +export { $ModelWithBoolean } from './schemas/$ModelWithBoolean'; +export { $ModelWithCircularReference } from './schemas/$ModelWithCircularReference'; +export { $ModelWithDictionary } from './schemas/$ModelWithDictionary'; +export { $ModelWithDuplicateImports } from './schemas/$ModelWithDuplicateImports'; +export { $ModelWithDuplicateProperties } from './schemas/$ModelWithDuplicateProperties'; +export { $ModelWithEnum } from './schemas/$ModelWithEnum'; +export { $ModelWithEnumFromDescription } from './schemas/$ModelWithEnumFromDescription'; +export { $ModelWithInteger } from './schemas/$ModelWithInteger'; +export { $ModelWithNestedEnums } from './schemas/$ModelWithNestedEnums'; +export { $ModelWithNestedProperties } from './schemas/$ModelWithNestedProperties'; +export { $ModelWithNullableString } from './schemas/$ModelWithNullableString'; +export { $ModelWithOrderedProperties } from './schemas/$ModelWithOrderedProperties'; +export { $ModelWithPattern } from './schemas/$ModelWithPattern'; +export { $ModelWithProperties } from './schemas/$ModelWithProperties'; +export { $ModelWithReference } from './schemas/$ModelWithReference'; +export { $ModelWithString } from './schemas/$ModelWithString'; +export { $Pageable } from './schemas/$Pageable'; +export { $SimpleBoolean } from './schemas/$SimpleBoolean'; +export { $SimpleFile } from './schemas/$SimpleFile'; +export { $SimpleInteger } from './schemas/$SimpleInteger'; +export { $SimpleParameter } from './schemas/$SimpleParameter'; +export { $SimpleReference } from './schemas/$SimpleReference'; +export { $SimpleString } from './schemas/$SimpleString'; +export { $SimpleStringWithPattern } from './schemas/$SimpleStringWithPattern'; + +export { CollectionFormatService } from './services/CollectionFormatService'; +export { ComplexService } from './services/ComplexService'; +export { DefaultService } from './services/DefaultService'; +export { DefaultsService } from './services/DefaultsService'; +export { DeprecatedService } from './services/DeprecatedService'; +export { DescriptionsService } from './services/DescriptionsService'; +export { DuplicateService } from './services/DuplicateService'; +export { ErrorService } from './services/ErrorService'; +export { FormDataService } from './services/FormDataService'; +export { HeaderService } from './services/HeaderService'; +export { MultipartService } from './services/MultipartService'; +export { MultipleTags1Service } from './services/MultipleTags1Service'; +export { MultipleTags2Service } from './services/MultipleTags2Service'; +export { MultipleTags3Service } from './services/MultipleTags3Service'; +export { NoContentService } from './services/NoContentService'; +export { ParametersService } from './services/ParametersService'; +export { RequestBodyService } from './services/RequestBodyService'; +export { ResponseService } from './services/ResponseService'; +export { SimpleService } from './services/SimpleService'; +export { TypesService } from './services/TypesService'; +export { UploadService } from './services/UploadService'; +" +`; + +exports[`v3 should generate: test/generated/v3/models/_default.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type _default = { + name?: string; +}; + +" +`; + +exports[`v3 should generate: test/generated/v3/models/ArrayWithArray.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithString } from './ModelWithString'; +/** + * This is a simple array containing an array + */ +export type ArrayWithArray = Array>; +" +`; + +exports[`v3 should generate: test/generated/v3/models/ArrayWithBooleans.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a simple array with booleans + */ +export type ArrayWithBooleans = Array; +" +`; + +exports[`v3 should generate: test/generated/v3/models/ArrayWithNumbers.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a simple array with numbers + */ +export type ArrayWithNumbers = Array; +" +`; + +exports[`v3 should generate: test/generated/v3/models/ArrayWithProperties.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a simple array with properties + */ +export type ArrayWithProperties = Array<{ + foo?: string; + bar?: string; +}>; +" +`; + +exports[`v3 should generate: test/generated/v3/models/ArrayWithReferences.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithString } from './ModelWithString'; +/** + * This is a simple array with references + */ +export type ArrayWithReferences = Array; +" +`; + +exports[`v3 should generate: test/generated/v3/models/ArrayWithStrings.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a simple array with strings + */ +export type ArrayWithStrings = Array; +" +`; + +exports[`v3 should generate: test/generated/v3/models/CommentWithBackticks.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Testing backticks in string: \`backticks\` and \`\`\`multiple backticks\`\`\` should work + */ +export type CommentWithBackticks = number; +" +`; + +exports[`v3 should generate: test/generated/v3/models/CommentWithBreaks.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Testing multiline comments in string: First line + * Second line + * + * Fourth line + */ +export type CommentWithBreaks = number; +" +`; + +exports[`v3 should generate: test/generated/v3/models/CommentWithExpressionPlaceholders.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Testing expression placeholders in string: \${expression} should work + */ +export type CommentWithExpressionPlaceholders = number; +" +`; + +exports[`v3 should generate: test/generated/v3/models/CommentWithQuotes.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Testing quotes in string: 'single quote''' and "double quotes""" should work + */ +export type CommentWithQuotes = number; +" +`; + +exports[`v3 should generate: test/generated/v3/models/CommentWithReservedCharacters.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Testing reserved characters in string: * inline * and ** inline ** should work + */ +export type CommentWithReservedCharacters = number; +" +`; + +exports[`v3 should generate: test/generated/v3/models/CommentWithSlashes.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Testing slashes in string: \\backwards\\\\\\ and /forwards/// should work + */ +export type CommentWithSlashes = number; +" +`; + +exports[`v3 should generate: test/generated/v3/models/CompositionBaseModel.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a base model with two simple optional properties + */ +export type CompositionBaseModel = { + firstName?: string; + lastname?: string; +}; + +" +`; + +exports[`v3 should generate: test/generated/v3/models/CompositionExtendedModel.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { CompositionBaseModel } from './CompositionBaseModel'; +/** + * This is a model that extends the base model + */ +export type CompositionExtendedModel = (CompositionBaseModel & { + firstName: string; + lastname: string; + age: number; +}); + +" +`; + +exports[`v3 should generate: test/generated/v3/models/CompositionWithAllOfAndNullable.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithArray } from './ModelWithArray'; +import type { ModelWithDictionary } from './ModelWithDictionary'; +import type { ModelWithEnum } from './ModelWithEnum'; +/** + * This is a model with one property with a 'all of' relationship + */ +export type CompositionWithAllOfAndNullable = { + propA?: ({ + boolean?: boolean; + } & ModelWithEnum & ModelWithArray & ModelWithDictionary) | null; +}; + +" +`; + +exports[`v3 should generate: test/generated/v3/models/CompositionWithAnyOf.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithArray } from './ModelWithArray'; +import type { ModelWithDictionary } from './ModelWithDictionary'; +import type { ModelWithEnum } from './ModelWithEnum'; +import type { ModelWithString } from './ModelWithString'; +/** + * This is a model with one property with a 'any of' relationship + */ +export type CompositionWithAnyOf = { + propA?: (ModelWithString | ModelWithEnum | ModelWithArray | ModelWithDictionary); +}; + +" +`; + +exports[`v3 should generate: test/generated/v3/models/CompositionWithAnyOfAndNullable.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithArray } from './ModelWithArray'; +import type { ModelWithDictionary } from './ModelWithDictionary'; +import type { ModelWithEnum } from './ModelWithEnum'; +/** + * This is a model with one property with a 'any of' relationship + */ +export type CompositionWithAnyOfAndNullable = { + propA?: ({ + boolean?: boolean; + } | ModelWithEnum | ModelWithArray | ModelWithDictionary) | null; +}; + +" +`; + +exports[`v3 should generate: test/generated/v3/models/CompositionWithAnyOfAnonymous.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a model with one property with a 'any of' relationship where the options are not $ref + */ +export type CompositionWithAnyOfAnonymous = { + propA?: ({ + propA?: string; + } | string | number); +}; + +" +`; + +exports[`v3 should generate: test/generated/v3/models/CompositionWithOneOf.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithArray } from './ModelWithArray'; +import type { ModelWithDictionary } from './ModelWithDictionary'; +import type { ModelWithEnum } from './ModelWithEnum'; +import type { ModelWithString } from './ModelWithString'; +/** + * This is a model with one property with a 'one of' relationship + */ +export type CompositionWithOneOf = { + propA?: (ModelWithString | ModelWithEnum | ModelWithArray | ModelWithDictionary); +}; + +" +`; + +exports[`v3 should generate: test/generated/v3/models/CompositionWithOneOfAndComplexArrayDictionary.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a model that contains a dictionary of complex arrays (composited) within composition + */ +export type CompositionWithOneOfAndComplexArrayDictionary = { + propA?: (boolean | Record>); +}; + +" +`; + +exports[`v3 should generate: test/generated/v3/models/CompositionWithOneOfAndNullable.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithArray } from './ModelWithArray'; +import type { ModelWithDictionary } from './ModelWithDictionary'; +import type { ModelWithEnum } from './ModelWithEnum'; +/** + * This is a model with one property with a 'one of' relationship + */ +export type CompositionWithOneOfAndNullable = { + propA?: ({ + boolean?: boolean; + } | ModelWithEnum | ModelWithArray | ModelWithDictionary) | null; +}; + +" +`; + +exports[`v3 should generate: test/generated/v3/models/CompositionWithOneOfAndSimpleArrayDictionary.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a model that contains a dictionary of simple arrays within composition + */ +export type CompositionWithOneOfAndSimpleArrayDictionary = { + propA?: (boolean | Record>); +}; + +" +`; + +exports[`v3 should generate: test/generated/v3/models/CompositionWithOneOfAndSimpleDictionary.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a model that contains a simple dictionary within composition + */ +export type CompositionWithOneOfAndSimpleDictionary = { + propA?: (boolean | Record); +}; + +" +`; + +exports[`v3 should generate: test/generated/v3/models/CompositionWithOneOfAnonymous.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a model with one property with a 'one of' relationship where the options are not $ref + */ +export type CompositionWithOneOfAnonymous = { + propA?: ({ + propA?: string; + } | string | number); +}; + +" +`; + +exports[`v3 should generate: test/generated/v3/models/CompositionWithOneOfDiscriminator.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelCircle } from './ModelCircle'; +import type { ModelSquare } from './ModelSquare'; +/** + * This is a model with one property with a 'one of' relationship where the options are not $ref + */ +export type CompositionWithOneOfDiscriminator = (ModelCircle | ModelSquare); + +" +`; + +exports[`v3 should generate: test/generated/v3/models/DeprecatedModel.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a deprecated model with a deprecated property + * @deprecated + */ +export type DeprecatedModel = { + /** + * This is a deprecated property + * @deprecated + */ + prop?: string; +}; + +" +`; + +exports[`v3 should generate: test/generated/v3/models/DictionaryWithArray.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithString } from './ModelWithString'; +/** + * This is a complex dictionary + */ +export type DictionaryWithArray = Record>; +" +`; + +exports[`v3 should generate: test/generated/v3/models/DictionaryWithDictionary.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a string dictionary + */ +export type DictionaryWithDictionary = Record>; +" +`; + +exports[`v3 should generate: test/generated/v3/models/DictionaryWithProperties.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a complex dictionary + */ +export type DictionaryWithProperties = Record; +" +`; + +exports[`v3 should generate: test/generated/v3/models/DictionaryWithReference.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithString } from './ModelWithString'; +/** + * This is a string reference + */ +export type DictionaryWithReference = Record; +" +`; + +exports[`v3 should generate: test/generated/v3/models/DictionaryWithString.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a string dictionary + */ +export type DictionaryWithString = Record; +" +`; + +exports[`v3 should generate: test/generated/v3/models/EnumFromDescription.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Success=1,Warning=2,Error=3 + */ +export type EnumFromDescription = number; +" +`; + +exports[`v3 should generate: test/generated/v3/models/EnumWithExtensions.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a simple enum with numbers + */ +export enum EnumWithExtensions { + /** + * Used when the status of something is successful + */ + CUSTOM_SUCCESS = 200, + /** + * Used when the status of something has a warning + */ + CUSTOM_WARNING = 400, + /** + * Used when the status of something has an error + */ + CUSTOM_ERROR = 500, +} +" +`; + +exports[`v3 should generate: test/generated/v3/models/EnumWithNumbers.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a simple enum with numbers + */ +export enum EnumWithNumbers { + '_1' = 1, + '_2' = 2, + '_3' = 3, + '_1.1' = 1.1, + '_1.2' = 1.2, + '_1.3' = 1.3, + '_100' = 100, + '_200' = 200, + '_300' = 300, + '_-100' = -100, + '_-200' = -200, + '_-300' = -300, + '_-1.1' = -1.1, + '_-1.2' = -1.2, + '_-1.3' = -1.3, +} +" +`; + +exports[`v3 should generate: test/generated/v3/models/EnumWithStrings.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a simple enum with strings + */ +export enum EnumWithStrings { + SUCCESS = 'Success', + WARNING = 'Warning', + ERROR = 'Error', + _SINGLE_QUOTE_ = '\\'Single Quote\\'', + _DOUBLE_QUOTES_ = '"Double Quotes"', +} +" +`; + +exports[`v3 should generate: test/generated/v3/models/File.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type File = { + readonly id?: string; + readonly updated_at?: string; + readonly created_at?: string; + mime: string; + readonly file?: string; +}; + +" +`; + +exports[`v3 should generate: test/generated/v3/models/FreeFormObjectWithAdditionalPropertiesEqEmptyObject.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a free-form object with additionalProperties: {}. + */ +export type FreeFormObjectWithAdditionalPropertiesEqEmptyObject = Record; +" +`; + +exports[`v3 should generate: test/generated/v3/models/FreeFormObjectWithAdditionalPropertiesEqTrue.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a free-form object with additionalProperties: true. + */ +export type FreeFormObjectWithAdditionalPropertiesEqTrue = Record; +" +`; + +exports[`v3 should generate: test/generated/v3/models/FreeFormObjectWithoutAdditionalProperties.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a free-form object without additionalProperties. + */ +export type FreeFormObjectWithoutAdditionalProperties = Record; +" +`; + +exports[`v3 should generate: test/generated/v3/models/ModelCircle.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Circle + */ +export type ModelCircle = { + kind: 'circle'; + radius?: number; +}; + +" +`; + +exports[`v3 should generate: test/generated/v3/models/ModelSquare.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Square + */ +export type ModelSquare = { + kind: 'square'; + sideLength?: number; +}; + +" +`; + +exports[`v3 should generate: test/generated/v3/models/ModelThatExtends.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithString } from './ModelWithString'; +/** + * This is a model that extends another model + */ +export type ModelThatExtends = (ModelWithString & { + propExtendsA?: string; + propExtendsB?: ModelWithString; +}); + +" +`; + +exports[`v3 should generate: test/generated/v3/models/ModelThatExtendsExtends.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelThatExtends } from './ModelThatExtends'; +import type { ModelWithString } from './ModelWithString'; +/** + * This is a model that extends another model + */ +export type ModelThatExtendsExtends = (ModelWithString & ModelThatExtends & { + propExtendsC?: string; + propExtendsD?: ModelWithString; +}); + +" +`; + +exports[`v3 should generate: test/generated/v3/models/ModelWithArray.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithString } from './ModelWithString'; +/** + * This is a model with one property containing an array + */ +export type ModelWithArray = { + prop?: Array; + propWithFile?: Array; + propWithNumber?: Array; +}; + +" +`; + +exports[`v3 should generate: test/generated/v3/models/ModelWithBoolean.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a model with one boolean property + */ +export type ModelWithBoolean = { + /** + * This is a simple boolean property + */ + prop?: boolean; +}; + +" +`; + +exports[`v3 should generate: test/generated/v3/models/ModelWithCircularReference.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a model with one property containing a circular reference + */ +export type ModelWithCircularReference = { + prop?: ModelWithCircularReference; +}; + +" +`; + +exports[`v3 should generate: test/generated/v3/models/ModelWithDictionary.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a model with one property containing a dictionary + */ +export type ModelWithDictionary = { + prop?: Record; +}; + +" +`; + +exports[`v3 should generate: test/generated/v3/models/ModelWithDuplicateImports.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithString } from './ModelWithString'; +/** + * This is a model with duplicated imports + */ +export type ModelWithDuplicateImports = { + propA?: ModelWithString; + propB?: ModelWithString; + propC?: ModelWithString; +}; + +" +`; + +exports[`v3 should generate: test/generated/v3/models/ModelWithDuplicateProperties.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithString } from './ModelWithString'; +/** + * This is a model with duplicated properties + */ +export type ModelWithDuplicateProperties = { + prop?: ModelWithString; +}; + +" +`; + +exports[`v3 should generate: test/generated/v3/models/ModelWithEnum.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a model with one enum + */ +export type ModelWithEnum = { + /** + * This is a simple enum with strings + */ + test?: ModelWithEnum.test; + /** + * These are the HTTP error code enums + */ + statusCode?: ModelWithEnum.statusCode; + /** + * Simple boolean enum + */ + bool?: boolean; +}; +export namespace ModelWithEnum { + /** + * This is a simple enum with strings + */ + export enum test { + SUCCESS = 'Success', + WARNING = 'Warning', + ERROR = 'Error', + } + /** + * These are the HTTP error code enums + */ + export enum statusCode { + _100 = '100', + _200_FOO = '200 FOO', + _300_FOO_BAR = '300 FOO_BAR', + _400_FOO_BAR = '400 foo-bar', + _500_FOO_BAR = '500 foo.bar', + _600_FOO_BAR = '600 foo&bar', + } +} + +" +`; + +exports[`v3 should generate: test/generated/v3/models/ModelWithEnumFromDescription.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a model with one enum + */ +export type ModelWithEnumFromDescription = { + /** + * Success=1,Warning=2,Error=3 + */ + test?: number; +}; + +" +`; + +exports[`v3 should generate: test/generated/v3/models/ModelWithInteger.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a model with one number property + */ +export type ModelWithInteger = { + /** + * This is a simple number property + */ + prop?: number; +}; + +" +`; + +exports[`v3 should generate: test/generated/v3/models/ModelWithNestedEnums.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a model with nested enums + */ +export type ModelWithNestedEnums = { + dictionaryWithEnum?: Record; + dictionaryWithEnumFromDescription?: Record; + arrayWithEnum?: Array<'Success' | 'Warning' | 'Error'>; + arrayWithDescription?: Array; +}; + +" +`; + +exports[`v3 should generate: test/generated/v3/models/ModelWithNestedProperties.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a model with one nested property + */ +export type ModelWithNestedProperties = { + readonly first: { + readonly second: { + readonly third: string | null; + } | null; + } | null; +}; + +" +`; + +exports[`v3 should generate: test/generated/v3/models/ModelWithNullableString.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a model with one string property + */ +export type ModelWithNullableString = { + /** + * This is a simple string property + */ + nullableProp1?: string | null; + /** + * This is a simple string property + */ + nullableRequiredProp1: string | null; + /** + * This is a simple string property + */ + nullableProp2?: string | null; + /** + * This is a simple string property + */ + nullableRequiredProp2: string | null; +}; + +" +`; + +exports[`v3 should generate: test/generated/v3/models/ModelWithOrderedProperties.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a model with ordered properties + */ +export type ModelWithOrderedProperties = { + zebra?: string; + apple?: string; + hawaii?: string; +}; + +" +`; + +exports[`v3 should generate: test/generated/v3/models/ModelWithPattern.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a model that contains a some patterns + */ +export type ModelWithPattern = { + key: string; + name: string; + readonly enabled?: boolean; + readonly modified?: string; + id?: string; + text?: string; + patternWithSingleQuotes?: string; +}; + +" +`; + +exports[`v3 should generate: test/generated/v3/models/ModelWithProperties.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithString } from './ModelWithString'; +/** + * This is a model with one nested property + */ +export type ModelWithProperties = { + required: string; + readonly requiredAndReadOnly: string; + requiredAndNullable: string | null; + string?: string; + number?: number; + boolean?: boolean; + reference?: ModelWithString; + 'property with space'?: string; + default?: string; + try?: string; + readonly '@namespace.string'?: string; + readonly '@namespace.integer'?: number; +}; + +" +`; + +exports[`v3 should generate: test/generated/v3/models/ModelWithReference.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithProperties } from './ModelWithProperties'; +/** + * This is a model with one property containing a reference + */ +export type ModelWithReference = { + prop?: ModelWithProperties; +}; + +" +`; + +exports[`v3 should generate: test/generated/v3/models/ModelWithString.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a model with one string property + */ +export type ModelWithString = { + /** + * This is a simple string property + */ + prop?: string; +}; + +" +`; + +exports[`v3 should generate: test/generated/v3/models/Pageable.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type Pageable = { + page?: number; + size?: number; + sort?: Array; +}; + +" +`; + +exports[`v3 should generate: test/generated/v3/models/SimpleBoolean.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a simple boolean + */ +export type SimpleBoolean = boolean; +" +`; + +exports[`v3 should generate: test/generated/v3/models/SimpleFile.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a simple file + */ +export type SimpleFile = Blob; +" +`; + +exports[`v3 should generate: test/generated/v3/models/SimpleInteger.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a simple number + */ +export type SimpleInteger = number; +" +`; + +exports[`v3 should generate: test/generated/v3/models/SimpleParameter.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a reusable parameter + */ +export type SimpleParameter = string; +" +`; + +exports[`v3 should generate: test/generated/v3/models/SimpleReference.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithString } from './ModelWithString'; +/** + * This is a simple reference + */ +export type SimpleReference = ModelWithString; +" +`; + +exports[`v3 should generate: test/generated/v3/models/SimpleString.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a simple string + */ +export type SimpleString = string; +" +`; + +exports[`v3 should generate: test/generated/v3/models/SimpleStringWithPattern.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This is a simple string + */ +export type SimpleStringWithPattern = string | null; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$_default.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $_default = { + properties: { + name: { + type: 'string', + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$ArrayWithArray.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ArrayWithArray = { + type: 'array', + contains: { + type: 'array', + contains: { + type: 'ModelWithString', + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$ArrayWithBooleans.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ArrayWithBooleans = { + type: 'array', + contains: { + type: 'boolean', + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$ArrayWithNumbers.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ArrayWithNumbers = { + type: 'array', + contains: { + type: 'number', + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$ArrayWithProperties.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ArrayWithProperties = { + type: 'array', + contains: { + properties: { + foo: { + type: 'string', + }, + bar: { + type: 'string', + }, + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$ArrayWithReferences.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ArrayWithReferences = { + type: 'array', + contains: { + type: 'ModelWithString', + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$ArrayWithStrings.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ArrayWithStrings = { + type: 'array', + contains: { + type: 'string', + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$CommentWithBackticks.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $CommentWithBackticks = { + type: 'number', + description: \`Testing backticks in string: \\\`backticks\\\` and \\\`\\\`\\\`multiple backticks\\\`\\\`\\\` should work\`, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$CommentWithBreaks.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $CommentWithBreaks = { + type: 'number', + description: \`Testing multiline comments in string: First line + Second line + Fourth line\`, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$CommentWithExpressionPlaceholders.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $CommentWithExpressionPlaceholders = { + type: 'number', + description: \`Testing expression placeholders in string: \\\${expression} should work\`, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$CommentWithQuotes.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $CommentWithQuotes = { + type: 'number', + description: \`Testing quotes in string: 'single quote''' and "double quotes""" should work\`, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$CommentWithReservedCharacters.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $CommentWithReservedCharacters = { + type: 'number', + description: \`Testing reserved characters in string: /* inline */ and /** inline **/ should work\`, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$CommentWithSlashes.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $CommentWithSlashes = { + type: 'number', + description: \`Testing slashes in string: \\\\backwards\\\\\\\\\\\\ and /forwards/// should work\`, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$CompositionBaseModel.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $CompositionBaseModel = { + description: \`This is a base model with two simple optional properties\`, + properties: { + firstName: { + type: 'string', + }, + lastname: { + type: 'string', + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$CompositionExtendedModel.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $CompositionExtendedModel = { + type: 'all-of', + description: \`This is a model that extends the base model\`, + contains: [{ + type: 'CompositionBaseModel', + }, { + properties: { + firstName: { + type: 'string', + isRequired: true, + }, + lastname: { + type: 'string', + isRequired: true, + }, + age: { + type: 'number', + isRequired: true, + }, + }, + }], +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$CompositionWithAllOfAndNullable.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $CompositionWithAllOfAndNullable = { + description: \`This is a model with one property with a 'all of' relationship\`, + properties: { + propA: { + type: 'all-of', + contains: [{ + properties: { + boolean: { + type: 'boolean', + }, + }, + }, { + type: 'ModelWithEnum', + }, { + type: 'ModelWithArray', + }, { + type: 'ModelWithDictionary', + }], + isNullable: true, + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$CompositionWithAnyOf.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $CompositionWithAnyOf = { + description: \`This is a model with one property with a 'any of' relationship\`, + properties: { + propA: { + type: 'any-of', + contains: [{ + type: 'ModelWithString', + }, { + type: 'ModelWithEnum', + }, { + type: 'ModelWithArray', + }, { + type: 'ModelWithDictionary', + }], + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$CompositionWithAnyOfAndNullable.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $CompositionWithAnyOfAndNullable = { + description: \`This is a model with one property with a 'any of' relationship\`, + properties: { + propA: { + type: 'any-of', + contains: [{ + properties: { + boolean: { + type: 'boolean', + }, + }, + }, { + type: 'ModelWithEnum', + }, { + type: 'ModelWithArray', + }, { + type: 'ModelWithDictionary', + }], + isNullable: true, + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$CompositionWithAnyOfAnonymous.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $CompositionWithAnyOfAnonymous = { + description: \`This is a model with one property with a 'any of' relationship where the options are not $ref\`, + properties: { + propA: { + type: 'any-of', + contains: [{ + description: \`Anonymous object type\`, + properties: { + propA: { + type: 'string', + }, + }, + }, { + type: 'string', + description: \`Anonymous string type\`, + }, { + type: 'number', + description: \`Anonymous integer type\`, + }], + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$CompositionWithOneOf.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $CompositionWithOneOf = { + description: \`This is a model with one property with a 'one of' relationship\`, + properties: { + propA: { + type: 'one-of', + contains: [{ + type: 'ModelWithString', + }, { + type: 'ModelWithEnum', + }, { + type: 'ModelWithArray', + }, { + type: 'ModelWithDictionary', + }], + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$CompositionWithOneOfAndComplexArrayDictionary.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $CompositionWithOneOfAndComplexArrayDictionary = { + description: \`This is a model that contains a dictionary of complex arrays (composited) within composition\`, + properties: { + propA: { + type: 'one-of', + contains: [{ + type: 'boolean', + }, { + type: 'dictionary', + contains: { + type: 'array', + contains: { + type: 'one-of', + contains: [{ + type: 'number', + }, { + type: 'string', + }], + }, + }, + }], + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$CompositionWithOneOfAndNullable.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $CompositionWithOneOfAndNullable = { + description: \`This is a model with one property with a 'one of' relationship\`, + properties: { + propA: { + type: 'one-of', + contains: [{ + properties: { + boolean: { + type: 'boolean', + }, + }, + }, { + type: 'ModelWithEnum', + }, { + type: 'ModelWithArray', + }, { + type: 'ModelWithDictionary', + }], + isNullable: true, + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$CompositionWithOneOfAndSimpleArrayDictionary.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $CompositionWithOneOfAndSimpleArrayDictionary = { + description: \`This is a model that contains a dictionary of simple arrays within composition\`, + properties: { + propA: { + type: 'one-of', + contains: [{ + type: 'boolean', + }, { + type: 'dictionary', + contains: { + type: 'array', + contains: { + type: 'boolean', + }, + }, + }], + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$CompositionWithOneOfAndSimpleDictionary.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $CompositionWithOneOfAndSimpleDictionary = { + description: \`This is a model that contains a simple dictionary within composition\`, + properties: { + propA: { + type: 'one-of', + contains: [{ + type: 'boolean', + }, { + type: 'dictionary', + contains: { + type: 'number', + }, + }], + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$CompositionWithOneOfAnonymous.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $CompositionWithOneOfAnonymous = { + description: \`This is a model with one property with a 'one of' relationship where the options are not $ref\`, + properties: { + propA: { + type: 'one-of', + contains: [{ + description: \`Anonymous object type\`, + properties: { + propA: { + type: 'string', + }, + }, + }, { + type: 'string', + description: \`Anonymous string type\`, + }, { + type: 'number', + description: \`Anonymous integer type\`, + }], + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$CompositionWithOneOfDiscriminator.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $CompositionWithOneOfDiscriminator = { + type: 'one-of', + description: \`This is a model with one property with a 'one of' relationship where the options are not $ref\`, + contains: [{ + type: 'ModelCircle', + }, { + type: 'ModelSquare', + }], +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$DeprecatedModel.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $DeprecatedModel = { + description: \`This is a deprecated model with a deprecated property\`, + properties: { + prop: { + type: 'string', + description: \`This is a deprecated property\`, + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$DictionaryWithArray.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $DictionaryWithArray = { + type: 'dictionary', + contains: { + type: 'array', + contains: { + type: 'ModelWithString', + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$DictionaryWithDictionary.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $DictionaryWithDictionary = { + type: 'dictionary', + contains: { + type: 'dictionary', + contains: { + type: 'string', + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$DictionaryWithProperties.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $DictionaryWithProperties = { + type: 'dictionary', + contains: { + properties: { + foo: { + type: 'string', + }, + bar: { + type: 'string', + }, + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$DictionaryWithReference.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $DictionaryWithReference = { + type: 'dictionary', + contains: { + type: 'ModelWithString', + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$DictionaryWithString.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $DictionaryWithString = { + type: 'dictionary', + contains: { + type: 'string', + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$EnumFromDescription.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $EnumFromDescription = { + type: 'number', + description: \`Success=1,Warning=2,Error=3\`, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$EnumWithExtensions.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $EnumWithExtensions = { + type: 'Enum', +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$EnumWithNumbers.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $EnumWithNumbers = { + type: 'Enum', +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$EnumWithStrings.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $EnumWithStrings = { + type: 'Enum', +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$File.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $File = { + properties: { + id: { + type: 'string', + isReadOnly: true, + minLength: 1, + }, + updated_at: { + type: 'string', + isReadOnly: true, + format: 'date-time', + }, + created_at: { + type: 'string', + isReadOnly: true, + format: 'date-time', + }, + mime: { + type: 'string', + isRequired: true, + maxLength: 24, + minLength: 1, + }, + file: { + type: 'string', + isReadOnly: true, + format: 'uri', + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$FreeFormObjectWithAdditionalPropertiesEqEmptyObject.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $FreeFormObjectWithAdditionalPropertiesEqEmptyObject = { + type: 'dictionary', + contains: { + properties: { + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$FreeFormObjectWithAdditionalPropertiesEqTrue.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $FreeFormObjectWithAdditionalPropertiesEqTrue = { + type: 'dictionary', + contains: { + properties: { + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$FreeFormObjectWithoutAdditionalProperties.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $FreeFormObjectWithoutAdditionalProperties = { + type: 'dictionary', + contains: { + properties: { + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$ModelCircle.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelCircle = { + description: \`Circle\`, + properties: { + kind: { + type: 'string', + isRequired: true, + }, + radius: { + type: 'number', + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$ModelSquare.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelSquare = { + description: \`Square\`, + properties: { + kind: { + type: 'string', + isRequired: true, + }, + sideLength: { + type: 'number', + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$ModelThatExtends.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelThatExtends = { + type: 'all-of', + description: \`This is a model that extends another model\`, + contains: [{ + type: 'ModelWithString', + }, { + properties: { + propExtendsA: { + type: 'string', + }, + propExtendsB: { + type: 'ModelWithString', + }, + }, + }], +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$ModelThatExtendsExtends.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelThatExtendsExtends = { + type: 'all-of', + description: \`This is a model that extends another model\`, + contains: [{ + type: 'ModelWithString', + }, { + type: 'ModelThatExtends', + }, { + properties: { + propExtendsC: { + type: 'string', + }, + propExtendsD: { + type: 'ModelWithString', + }, + }, + }], +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$ModelWithArray.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelWithArray = { + description: \`This is a model with one property containing an array\`, + properties: { + prop: { + type: 'array', + contains: { + type: 'ModelWithString', + }, + }, + propWithFile: { + type: 'array', + contains: { + type: 'binary', + }, + }, + propWithNumber: { + type: 'array', + contains: { + type: 'number', + }, + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$ModelWithBoolean.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelWithBoolean = { + description: \`This is a model with one boolean property\`, + properties: { + prop: { + type: 'boolean', + description: \`This is a simple boolean property\`, + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$ModelWithCircularReference.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelWithCircularReference = { + description: \`This is a model with one property containing a circular reference\`, + properties: { + prop: { + type: 'ModelWithCircularReference', + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$ModelWithDictionary.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelWithDictionary = { + description: \`This is a model with one property containing a dictionary\`, + properties: { + prop: { + type: 'dictionary', + contains: { + type: 'string', + }, + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$ModelWithDuplicateImports.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelWithDuplicateImports = { + description: \`This is a model with duplicated imports\`, + properties: { + propA: { + type: 'ModelWithString', + }, + propB: { + type: 'ModelWithString', + }, + propC: { + type: 'ModelWithString', + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$ModelWithDuplicateProperties.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelWithDuplicateProperties = { + description: \`This is a model with duplicated properties\`, + properties: { + prop: { + type: 'ModelWithString', + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$ModelWithEnum.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelWithEnum = { + description: \`This is a model with one enum\`, + properties: { + test: { + type: 'Enum', + }, + statusCode: { + type: 'Enum', + }, + bool: { + type: 'boolean', + description: \`Simple boolean enum\`, + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$ModelWithEnumFromDescription.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelWithEnumFromDescription = { + description: \`This is a model with one enum\`, + properties: { + test: { + type: 'number', + description: \`Success=1,Warning=2,Error=3\`, + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$ModelWithInteger.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelWithInteger = { + description: \`This is a model with one number property\`, + properties: { + prop: { + type: 'number', + description: \`This is a simple number property\`, + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$ModelWithNestedEnums.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelWithNestedEnums = { + description: \`This is a model with nested enums\`, + properties: { + dictionaryWithEnum: { + type: 'dictionary', + contains: { + type: 'Enum', + }, + }, + dictionaryWithEnumFromDescription: { + type: 'dictionary', + contains: { + type: 'number', + description: \`Success=1,Warning=2,Error=3\`, + }, + }, + arrayWithEnum: { + type: 'array', + contains: { + type: 'Enum', + }, + }, + arrayWithDescription: { + type: 'array', + contains: { + type: 'number', + description: \`Success=1,Warning=2,Error=3\`, + }, + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$ModelWithNestedProperties.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelWithNestedProperties = { + description: \`This is a model with one nested property\`, + properties: { + first: { + properties: { + second: { + properties: { + third: { + type: 'string', + isReadOnly: true, + isRequired: true, + isNullable: true, + }, + }, + isReadOnly: true, + isRequired: true, + isNullable: true, + }, + }, + isReadOnly: true, + isRequired: true, + isNullable: true, + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$ModelWithNullableString.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelWithNullableString = { + description: \`This is a model with one string property\`, + properties: { + nullableProp1: { + type: 'string', + description: \`This is a simple string property\`, + isNullable: true, + }, + nullableRequiredProp1: { + type: 'string', + description: \`This is a simple string property\`, + isRequired: true, + isNullable: true, + }, + nullableProp2: { + type: 'string', + description: \`This is a simple string property\`, + isNullable: true, + }, + nullableRequiredProp2: { + type: 'string', + description: \`This is a simple string property\`, + isRequired: true, + isNullable: true, + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$ModelWithOrderedProperties.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelWithOrderedProperties = { + description: \`This is a model with ordered properties\`, + properties: { + zebra: { + type: 'string', + }, + apple: { + type: 'string', + }, + hawaii: { + type: 'string', + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$ModelWithPattern.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelWithPattern = { + description: \`This is a model that contains a some patterns\`, + properties: { + key: { + type: 'string', + isRequired: true, + maxLength: 64, + pattern: '^[a-zA-Z0-9_]*$', + }, + name: { + type: 'string', + isRequired: true, + maxLength: 255, + }, + enabled: { + type: 'boolean', + isReadOnly: true, + }, + modified: { + type: 'string', + isReadOnly: true, + format: 'date-time', + }, + id: { + type: 'string', + pattern: '^\\\\d{2}-\\\\d{3}-\\\\d{4}$', + }, + text: { + type: 'string', + pattern: '^\\\\w+$', + }, + patternWithSingleQuotes: { + type: 'string', + pattern: '^[a-zA-Z0-9\\']*$', + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$ModelWithProperties.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelWithProperties = { + description: \`This is a model with one nested property\`, + properties: { + required: { + type: 'string', + isRequired: true, + }, + requiredAndReadOnly: { + type: 'string', + isReadOnly: true, + isRequired: true, + }, + requiredAndNullable: { + type: 'string', + isRequired: true, + isNullable: true, + }, + string: { + type: 'string', + }, + number: { + type: 'number', + }, + boolean: { + type: 'boolean', + }, + reference: { + type: 'ModelWithString', + }, + 'property with space': { + type: 'string', + }, + default: { + type: 'string', + }, + try: { + type: 'string', + }, + '@namespace.string': { + type: 'string', + isReadOnly: true, + }, + '@namespace.integer': { + type: 'number', + isReadOnly: true, + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$ModelWithReference.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelWithReference = { + description: \`This is a model with one property containing a reference\`, + properties: { + prop: { + type: 'ModelWithProperties', + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$ModelWithString.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ModelWithString = { + description: \`This is a model with one string property\`, + properties: { + prop: { + type: 'string', + description: \`This is a simple string property\`, + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$Pageable.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $Pageable = { + properties: { + page: { + type: 'number', + format: 'int32', + }, + size: { + type: 'number', + format: 'int32', + minimum: 1, + }, + sort: { + type: 'array', + contains: { + type: 'string', + }, + }, + }, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$SimpleBoolean.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $SimpleBoolean = { + type: 'boolean', + description: \`This is a simple boolean\`, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$SimpleFile.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $SimpleFile = { + type: 'binary', + description: \`This is a simple file\`, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$SimpleInteger.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $SimpleInteger = { + type: 'number', + description: \`This is a simple number\`, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$SimpleParameter.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $SimpleParameter = { + type: 'string', + description: \`This is a reusable parameter\`, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$SimpleReference.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $SimpleReference = { + type: 'ModelWithString', + description: \`This is a simple reference\`, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$SimpleString.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $SimpleString = { + type: 'string', + description: \`This is a simple string\`, +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/schemas/$SimpleStringWithPattern.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $SimpleStringWithPattern = { + type: 'string', + description: \`This is a simple string\`, + isNullable: true, + maxLength: 64, + pattern: '^[a-zA-Z0-9_]*$', +} as const; +" +`; + +exports[`v3 should generate: test/generated/v3/services/CollectionFormatService.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class CollectionFormatService { + /** + * @param parameterArrayCsv This is an array parameter that is sent as csv format (comma-separated values) + * @param parameterArraySsv This is an array parameter that is sent as ssv format (space-separated values) + * @param parameterArrayTsv This is an array parameter that is sent as tsv format (tab-separated values) + * @param parameterArrayPipes This is an array parameter that is sent as pipes format (pipe-separated values) + * @param parameterArrayMulti This is an array parameter that is sent as multi format (multiple parameter instances) + * @throws ApiError + */ + public static collectionFormat( + parameterArrayCsv: Array | null, + parameterArraySsv: Array | null, + parameterArrayTsv: Array | null, + parameterArrayPipes: Array | null, + parameterArrayMulti: Array | null, + ): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v{api-version}/collectionFormat', + query: { + 'parameterArrayCSV': parameterArrayCsv, + 'parameterArraySSV': parameterArraySsv, + 'parameterArrayTSV': parameterArrayTsv, + 'parameterArrayPipes': parameterArrayPipes, + 'parameterArrayMulti': parameterArrayMulti, + }, + }); + } +} +" +`; + +exports[`v3 should generate: test/generated/v3/services/ComplexService.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithArray } from '../models/ModelWithArray'; +import type { ModelWithDictionary } from '../models/ModelWithDictionary'; +import type { ModelWithEnum } from '../models/ModelWithEnum'; +import type { ModelWithString } from '../models/ModelWithString'; +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class ComplexService { + /** + * @param parameterObject Parameter containing object + * @param parameterReference Parameter containing reference + * @returns ModelWithString Successful response + * @throws ApiError + */ + public static complexTypes( + parameterObject: { + first?: { + second?: { + third?: string; + }; + }; + }, + parameterReference: ModelWithString, + ): CancelablePromise> { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v{api-version}/complex', + query: { + 'parameterObject': parameterObject, + 'parameterReference': parameterReference, + }, + errors: { + 400: \`400 server error\`, + 500: \`500 server error\`, + }, + }); + } + /** + * @param id + * @param requestBody + * @returns ModelWithString Success + * @throws ApiError + */ + public static complexParams( + id: number, + requestBody?: { + readonly key: string | null; + name: string | null; + enabled?: boolean; + readonly type: 'Monkey' | 'Horse' | 'Bird'; + listOfModels?: Array | null; + listOfStrings?: Array | null; + parameters: (ModelWithString | ModelWithEnum | ModelWithArray | ModelWithDictionary); + readonly user?: { + readonly id?: number; + readonly name?: string | null; + }; + }, + ): CancelablePromise { + return __request(OpenAPI, { + method: 'PUT', + url: '/api/v{api-version}/complex/{id}', + path: { + 'id': id, + }, + body: requestBody, + mediaType: 'application/json-patch+json', + }); + } +} +" +`; + +exports[`v3 should generate: test/generated/v3/services/DefaultService.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class DefaultService { + /** + * @throws ApiError + */ + public static serviceWithEmptyTag(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v{api-version}/no-tag', + }); + } +} +" +`; + +exports[`v3 should generate: test/generated/v3/services/DefaultsService.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithString } from '../models/ModelWithString'; +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class DefaultsService { + /** + * @param parameterString This is a simple string with default value + * @param parameterNumber This is a simple number with default value + * @param parameterBoolean This is a simple boolean with default value + * @param parameterEnum This is a simple enum with default value + * @param parameterModel This is a simple model with default value + * @throws ApiError + */ + public static callWithDefaultParameters( + parameterString: string | null = 'Hello World!', + parameterNumber: number | null = 123, + parameterBoolean: boolean | null = true, + parameterEnum: 'Success' | 'Warning' | 'Error' = 'Success', + parameterModel: ModelWithString | null = { + "prop": "Hello World!" + }, + ): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v{api-version}/defaults', + query: { + 'parameterString': parameterString, + 'parameterNumber': parameterNumber, + 'parameterBoolean': parameterBoolean, + 'parameterEnum': parameterEnum, + 'parameterModel': parameterModel, + }, + }); + } + /** + * @param parameterString This is a simple string that is optional with default value + * @param parameterNumber This is a simple number that is optional with default value + * @param parameterBoolean This is a simple boolean that is optional with default value + * @param parameterEnum This is a simple enum that is optional with default value + * @param parameterModel This is a simple model that is optional with default value + * @throws ApiError + */ + public static callWithDefaultOptionalParameters( + parameterString: string = 'Hello World!', + parameterNumber: number = 123, + parameterBoolean: boolean = true, + parameterEnum: 'Success' | 'Warning' | 'Error' = 'Success', + parameterModel: ModelWithString = { + "prop": "Hello World!" + }, + ): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/api/v{api-version}/defaults', + query: { + 'parameterString': parameterString, + 'parameterNumber': parameterNumber, + 'parameterBoolean': parameterBoolean, + 'parameterEnum': parameterEnum, + 'parameterModel': parameterModel, + }, + }); + } + /** + * @param parameterStringWithNoDefault This is a string with no default + * @param parameterOptionalStringWithDefault This is a optional string with default + * @param parameterOptionalStringWithEmptyDefault This is a optional string with empty default + * @param parameterOptionalStringWithNoDefault This is a optional string with no default + * @param parameterStringWithDefault This is a string with default + * @param parameterStringWithEmptyDefault This is a string with empty default + * @param parameterStringNullableWithNoDefault This is a string that can be null with no default + * @param parameterStringNullableWithDefault This is a string that can be null with default + * @throws ApiError + */ + public static callToTestOrderOfParams( + parameterStringWithNoDefault: string, + parameterOptionalStringWithDefault: string = 'Hello World!', + parameterOptionalStringWithEmptyDefault: string = '', + parameterOptionalStringWithNoDefault?: string, + parameterStringWithDefault: string = 'Hello World!', + parameterStringWithEmptyDefault: string = '', + parameterStringNullableWithNoDefault?: string | null, + parameterStringNullableWithDefault: string | null = null, + ): CancelablePromise { + return __request(OpenAPI, { + method: 'PUT', + url: '/api/v{api-version}/defaults', + query: { + 'parameterOptionalStringWithDefault': parameterOptionalStringWithDefault, + 'parameterOptionalStringWithEmptyDefault': parameterOptionalStringWithEmptyDefault, + 'parameterOptionalStringWithNoDefault': parameterOptionalStringWithNoDefault, + 'parameterStringWithDefault': parameterStringWithDefault, + 'parameterStringWithEmptyDefault': parameterStringWithEmptyDefault, + 'parameterStringWithNoDefault': parameterStringWithNoDefault, + 'parameterStringNullableWithNoDefault': parameterStringNullableWithNoDefault, + 'parameterStringNullableWithDefault': parameterStringNullableWithDefault, + }, + }); + } +} +" +`; + +exports[`v3 should generate: test/generated/v3/services/DeprecatedService.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { DeprecatedModel } from '../models/DeprecatedModel'; +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class DeprecatedService { + /** + * @deprecated + * @param parameter This parameter is deprecated + * @throws ApiError + */ + public static deprecatedCall( + parameter: DeprecatedModel | null, + ): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/api/v{api-version}/parameters/deprecated', + headers: { + 'parameter': parameter, + }, + }); + } +} +" +`; + +exports[`v3 should generate: test/generated/v3/services/DescriptionsService.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class DescriptionsService { + /** + * @param parameterWithBreaks Testing multiline comments in string: First line + * Second line + * + * Fourth line + * @param parameterWithBackticks Testing backticks in string: \`backticks\` and \`\`\`multiple backticks\`\`\` should work + * @param parameterWithSlashes Testing slashes in string: \\backwards\\\\\\ and /forwards/// should work + * @param parameterWithExpressionPlaceholders Testing expression placeholders in string: \${expression} should work + * @param parameterWithQuotes Testing quotes in string: 'single quote''' and "double quotes""" should work + * @param parameterWithReservedCharacters Testing reserved characters in string: * inline * and ** inline ** should work + * @throws ApiError + */ + public static callWithDescriptions( + parameterWithBreaks?: any, + parameterWithBackticks?: any, + parameterWithSlashes?: any, + parameterWithExpressionPlaceholders?: any, + parameterWithQuotes?: any, + parameterWithReservedCharacters?: any, + ): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/api/v{api-version}/descriptions/', + query: { + 'parameterWithBreaks': parameterWithBreaks, + 'parameterWithBackticks': parameterWithBackticks, + 'parameterWithSlashes': parameterWithSlashes, + 'parameterWithExpressionPlaceholders': parameterWithExpressionPlaceholders, + 'parameterWithQuotes': parameterWithQuotes, + 'parameterWithReservedCharacters': parameterWithReservedCharacters, + }, + }); + } +} +" +`; + +exports[`v3 should generate: test/generated/v3/services/DuplicateService.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class DuplicateService { + /** + * @throws ApiError + */ + public static duplicateName(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v{api-version}/duplicate', + }); + } + /** + * @throws ApiError + */ + public static duplicateName1(): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/api/v{api-version}/duplicate', + }); + } + /** + * @throws ApiError + */ + public static duplicateName2(): CancelablePromise { + return __request(OpenAPI, { + method: 'PUT', + url: '/api/v{api-version}/duplicate', + }); + } + /** + * @throws ApiError + */ + public static duplicateName3(): CancelablePromise { + return __request(OpenAPI, { + method: 'DELETE', + url: '/api/v{api-version}/duplicate', + }); + } +} +" +`; + +exports[`v3 should generate: test/generated/v3/services/ErrorService.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class ErrorService { + /** + * @param status Status code to return + * @returns any Custom message: Successful response + * @throws ApiError + */ + public static testErrorCode( + status: number, + ): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/api/v{api-version}/error', + query: { + 'status': status, + }, + errors: { + 500: \`Custom message: Internal Server Error\`, + 501: \`Custom message: Not Implemented\`, + 502: \`Custom message: Bad Gateway\`, + 503: \`Custom message: Service Unavailable\`, + }, + }); + } +} +" +`; + +exports[`v3 should generate: test/generated/v3/services/FormDataService.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithString } from '../models/ModelWithString'; +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class FormDataService { + /** + * @param parameter This is a reusable parameter + * @param formData A reusable request body + * @throws ApiError + */ + public static postApiFormData( + parameter?: string, + formData?: ModelWithString, + ): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/api/v{api-version}/formData/', + query: { + 'parameter': parameter, + }, + formData: formData, + mediaType: 'multipart/form-data', + }); + } +} +" +`; + +exports[`v3 should generate: test/generated/v3/services/HeaderService.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class HeaderService { + /** + * @returns string Successful response + * @throws ApiError + */ + public static callWithResultFromHeader(): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/api/v{api-version}/header', + responseHeader: 'operation-location', + errors: { + 400: \`400 server error\`, + 500: \`500 server error\`, + }, + }); + } +} +" +`; + +exports[`v3 should generate: test/generated/v3/services/MultipartService.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithString } from '../models/ModelWithString'; +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class MultipartService { + /** + * @param formData + * @throws ApiError + */ + public static multipartRequest( + formData?: { + content?: Blob; + data?: ModelWithString | null; + }, + ): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/api/v{api-version}/multipart', + formData: formData, + mediaType: 'multipart/form-data', + }); + } + /** + * @returns any OK + * @throws ApiError + */ + public static multipartResponse(): CancelablePromise<{ + file?: Blob; + metadata?: { + foo?: string; + bar?: string; + }; + }> { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v{api-version}/multipart', + }); + } +} +" +`; + +exports[`v3 should generate: test/generated/v3/services/MultipleTags1Service.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class MultipleTags1Service { + /** + * @returns void + * @throws ApiError + */ + public static dummyA(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v{api-version}/multiple-tags/a', + }); + } + /** + * @returns void + * @throws ApiError + */ + public static dummyB(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v{api-version}/multiple-tags/b', + }); + } +} +" +`; + +exports[`v3 should generate: test/generated/v3/services/MultipleTags2Service.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class MultipleTags2Service { + /** + * @returns void + * @throws ApiError + */ + public static dummyA(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v{api-version}/multiple-tags/a', + }); + } + /** + * @returns void + * @throws ApiError + */ + public static dummyB(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v{api-version}/multiple-tags/b', + }); + } +} +" +`; + +exports[`v3 should generate: test/generated/v3/services/MultipleTags3Service.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class MultipleTags3Service { + /** + * @returns void + * @throws ApiError + */ + public static dummyB(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v{api-version}/multiple-tags/b', + }); + } +} +" +`; + +exports[`v3 should generate: test/generated/v3/services/NoContentService.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class NoContentService { + /** + * @returns void + * @throws ApiError + */ + public static callWithNoContentResponse(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v{api-version}/no-content', + }); + } +} +" +`; + +exports[`v3 should generate: test/generated/v3/services/ParametersService.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithString } from '../models/ModelWithString'; +import type { Pageable } from '../models/Pageable'; +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class ParametersService { + /** + * @param parameterHeader This is the parameter that goes into the header + * @param parameterQuery This is the parameter that goes into the query params + * @param parameterForm This is the parameter that goes into the form data + * @param parameterCookie This is the parameter that goes into the cookie + * @param parameterPath This is the parameter that goes into the path + * @param requestBody This is the parameter that goes into the body + * @throws ApiError + */ + public static callWithParameters( + parameterHeader: string | null, + parameterQuery: string | null, + parameterForm: string | null, + parameterCookie: string | null, + parameterPath: string | null, + requestBody: ModelWithString | null, + ): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/api/v{api-version}/parameters/{parameterPath}', + path: { + 'parameterPath': parameterPath, + }, + cookies: { + 'parameterCookie': parameterCookie, + }, + headers: { + 'parameterHeader': parameterHeader, + }, + query: { + 'parameterQuery': parameterQuery, + }, + formData: { + 'parameterForm': parameterForm, + }, + body: requestBody, + mediaType: 'application/json', + }); + } + /** + * @param parameterHeader This is the parameter that goes into the request header + * @param parameterQuery This is the parameter that goes into the request query params + * @param parameterForm This is the parameter that goes into the request form data + * @param parameterCookie This is the parameter that goes into the cookie + * @param requestBody This is the parameter that goes into the body + * @param parameterPath1 This is the parameter that goes into the path + * @param parameterPath2 This is the parameter that goes into the path + * @param parameterPath3 This is the parameter that goes into the path + * @param _default This is the parameter with a reserved keyword + * @throws ApiError + */ + public static callWithWeirdParameterNames( + parameterHeader: string | null, + parameterQuery: string | null, + parameterForm: string | null, + parameterCookie: string | null, + requestBody: ModelWithString | null, + parameterPath1?: string, + parameterPath2?: string, + parameterPath3?: string, + _default?: string, + ): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/api/v{api-version}/parameters/{parameter.path.1}/{parameter-path-2}/{PARAMETER-PATH-3}', + path: { + 'parameter.path.1': parameterPath1, + 'parameter-path-2': parameterPath2, + 'PARAMETER-PATH-3': parameterPath3, + }, + cookies: { + 'PARAMETER-COOKIE': parameterCookie, + }, + headers: { + 'parameter.header': parameterHeader, + }, + query: { + 'default': _default, + 'parameter-query': parameterQuery, + }, + formData: { + 'parameter_form': parameterForm, + }, + body: requestBody, + mediaType: 'application/json', + }); + } + /** + * @param requestBody This is a required parameter + * @param parameter This is an optional parameter + * @throws ApiError + */ + public static getCallWithOptionalParam( + requestBody: ModelWithString, + parameter?: string, + ): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v{api-version}/parameters/', + query: { + 'parameter': parameter, + }, + body: requestBody, + mediaType: 'application/json', + }); + } + /** + * @param parameter This is a required parameter + * @param requestBody This is an optional parameter + * @throws ApiError + */ + public static postCallWithOptionalParam( + parameter: Pageable, + requestBody?: ModelWithString, + ): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/api/v{api-version}/parameters/', + query: { + 'parameter': parameter, + }, + body: requestBody, + mediaType: 'application/json', + }); + } +} +" +`; + +exports[`v3 should generate: test/generated/v3/services/RequestBodyService.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelWithString } from '../models/ModelWithString'; +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class RequestBodyService { + /** + * @param parameter This is a reusable parameter + * @param requestBody A reusable request body + * @throws ApiError + */ + public static postApiRequestBody( + parameter?: string, + requestBody?: ModelWithString, + ): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/api/v{api-version}/requestBody/', + query: { + 'parameter': parameter, + }, + body: requestBody, + mediaType: 'application/json', + }); + } +} +" +`; + +exports[`v3 should generate: test/generated/v3/services/ResponseService.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ModelThatExtends } from '../models/ModelThatExtends'; +import type { ModelThatExtendsExtends } from '../models/ModelThatExtendsExtends'; +import type { ModelWithString } from '../models/ModelWithString'; +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class ResponseService { + /** + * @returns ModelWithString + * @throws ApiError + */ + public static callWithResponse(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v{api-version}/response', + }); + } + /** + * @returns ModelWithString Message for default response + * @throws ApiError + */ + public static callWithDuplicateResponses(): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/api/v{api-version}/response', + errors: { + 500: \`Message for 500 error\`, + 501: \`Message for 501 error\`, + 502: \`Message for 502 error\`, + }, + }); + } + /** + * @returns any Message for 200 response + * @returns ModelWithString Message for default response + * @returns ModelThatExtends Message for 201 response + * @returns ModelThatExtendsExtends Message for 202 response + * @throws ApiError + */ + public static callWithResponses(): CancelablePromise<{ + readonly '@namespace.string'?: string; + readonly '@namespace.integer'?: number; + readonly value?: Array; + } | ModelWithString | ModelThatExtends | ModelThatExtendsExtends> { + return __request(OpenAPI, { + method: 'PUT', + url: '/api/v{api-version}/response', + errors: { + 500: \`Message for 500 error\`, + 501: \`Message for 501 error\`, + 502: \`Message for 502 error\`, + }, + }); + } +} +" +`; + +exports[`v3 should generate: test/generated/v3/services/SimpleService.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class SimpleService { + /** + * @throws ApiError + */ + public static getCallWithoutParametersAndResponse(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v{api-version}/simple', + }); + } + /** + * @throws ApiError + */ + public static putCallWithoutParametersAndResponse(): CancelablePromise { + return __request(OpenAPI, { + method: 'PUT', + url: '/api/v{api-version}/simple', + }); + } + /** + * @throws ApiError + */ + public static postCallWithoutParametersAndResponse(): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/api/v{api-version}/simple', + }); + } + /** + * @throws ApiError + */ + public static deleteCallWithoutParametersAndResponse(): CancelablePromise { + return __request(OpenAPI, { + method: 'DELETE', + url: '/api/v{api-version}/simple', + }); + } + /** + * @throws ApiError + */ + public static optionsCallWithoutParametersAndResponse(): CancelablePromise { + return __request(OpenAPI, { + method: 'OPTIONS', + url: '/api/v{api-version}/simple', + }); + } + /** + * @throws ApiError + */ + public static headCallWithoutParametersAndResponse(): CancelablePromise { + return __request(OpenAPI, { + method: 'HEAD', + url: '/api/v{api-version}/simple', + }); + } + /** + * @throws ApiError + */ + public static patchCallWithoutParametersAndResponse(): CancelablePromise { + return __request(OpenAPI, { + method: 'PATCH', + url: '/api/v{api-version}/simple', + }); + } +} +" +`; + +exports[`v3 should generate: test/generated/v3/services/TypesService.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class TypesService { + /** + * @param parameterArray This is an array parameter + * @param parameterDictionary This is a dictionary parameter + * @param parameterEnum This is an enum parameter + * @param parameterNumber This is a number parameter + * @param parameterString This is a string parameter + * @param parameterBoolean This is a boolean parameter + * @param parameterObject This is an object parameter + * @param id This is a number parameter + * @returns number Response is a simple number + * @returns string Response is a simple string + * @returns boolean Response is a simple boolean + * @returns any Response is a simple object + * @throws ApiError + */ + public static types( + parameterArray: Array | null, + parameterDictionary: Record | null, + parameterEnum: 'Success' | 'Warning' | 'Error' | null, + parameterNumber: number = 123, + parameterString: string | null = 'default', + parameterBoolean: boolean | null = true, + parameterObject: Record | null = null, + id?: number, + ): CancelablePromise> { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v{api-version}/types', + path: { + 'id': id, + }, + query: { + 'parameterNumber': parameterNumber, + 'parameterString': parameterString, + 'parameterBoolean': parameterBoolean, + 'parameterObject': parameterObject, + 'parameterArray': parameterArray, + 'parameterDictionary': parameterDictionary, + 'parameterEnum': parameterEnum, + }, + }); + } +} +" +`; + +exports[`v3 should generate: test/generated/v3/services/UploadService.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class UploadService { + /** + * @param file Supply a file reference for upload + * @returns boolean + * @throws ApiError + */ + public static uploadFile( + file: Blob, + ): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/api/v{api-version}/upload', + formData: { + 'file': file, + }, + }); + } +} +" +`; diff --git a/test/custom/request.ts b/test/custom/request.ts new file mode 100644 index 000000000..8252ea396 --- /dev/null +++ b/test/custom/request.ts @@ -0,0 +1,31 @@ +import type { ApiRequestOptions } from './ApiRequestOptions'; +import { CancelablePromise } from './CancelablePromise'; +import type { OpenAPIConfig } from './OpenAPI'; + +export const request = (config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise => { + return new CancelablePromise((resolve, reject, onCancel) => { + const url = `${config.BASE}${options.path}`.replace('{api-version}', config.VERSION); + + try { + // Do your request... + const timeout = setTimeout(() => { + resolve({ + url, + ok: true, + status: 200, + statusText: 'dummy', + body: { + ...options, + }, + }); + }, 500); + + // Cancel your request... + onCancel(() => { + clearTimeout(timeout); + }); + } catch (e) { + reject(e); + } + }); +}; diff --git a/test/e2e/assets/index.html b/test/e2e/assets/index.html new file mode 100644 index 000000000..ff6dd5554 --- /dev/null +++ b/test/e2e/assets/index.html @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/test/e2e/assets/main-angular-module.ts b/test/e2e/assets/main-angular-module.ts new file mode 100644 index 000000000..f6529550e --- /dev/null +++ b/test/e2e/assets/main-angular-module.ts @@ -0,0 +1,76 @@ +import { HttpClientModule } from '@angular/common/http'; +import { Component, NgModule } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { ApiModule } from './ApiModule'; +import { OpenAPI } from './core/OpenAPI'; +import { CollectionFormatService } from './services/CollectionFormatService'; +import { ComplexService } from './services/ComplexService'; +import { DefaultService } from './services/DefaultService'; +import { DefaultsService } from './services/DefaultsService'; +import { DuplicateService } from './services/DuplicateService'; +import { ErrorService } from './services/ErrorService'; +import { HeaderService } from './services/HeaderService'; +import { MultipleTags1Service } from './services/MultipleTags1Service'; +import { MultipleTags2Service } from './services/MultipleTags2Service'; +import { MultipleTags3Service } from './services/MultipleTags3Service'; +import { NoContentService } from './services/NoContentService'; +import { ParametersService } from './services/ParametersService'; +import { ResponseService } from './services/ResponseService'; +import { SimpleService } from './services/SimpleService'; +import { TypesService } from './services/TypesService'; + +@Component({ + selector: 'app-root', + template: `
Angular is ready
`, +}) +export class AppComponent { + constructor( + private readonly collectionFormatService: CollectionFormatService, + private readonly complexService: ComplexService, + private readonly defaultService: DefaultService, + private readonly defaultsService: DefaultsService, + private readonly duplicateService: DuplicateService, + private readonly errorService: ErrorService, + private readonly headerService: HeaderService, + private readonly multipleTags1Service: MultipleTags1Service, + private readonly multipleTags2Service: MultipleTags2Service, + private readonly multipleTags3Service: MultipleTags3Service, + private readonly noContentService: NoContentService, + private readonly parametersService: ParametersService, + private readonly responseService: ResponseService, + private readonly simpleService: SimpleService, + private readonly typesService: TypesService + ) { + (window as any).api = { + OpenAPI, + ApiModule, + CollectionFormatService: this.collectionFormatService, + ComplexService: this.complexService, + DefaultService: this.defaultService, + DefaultsService: this.defaultsService, + DuplicateService: this.duplicateService, + ErrorService: this.errorService, + HeaderService: this.headerService, + MultipleTags1Service: this.multipleTags1Service, + MultipleTags2Service: this.multipleTags2Service, + MultipleTags3Service: this.multipleTags3Service, + NoContentService: this.noContentService, + ParametersService: this.parametersService, + ResponseService: this.responseService, + SimpleService: this.simpleService, + TypesService: this.typesService, + }; + } +} + +@NgModule({ + imports: [BrowserModule, HttpClientModule, ApiModule], + bootstrap: [AppComponent], +}) +export class AppModule {} + +platformBrowserDynamic() + .bootstrapModule(AppModule) + .catch(err => console.error(err)); diff --git a/test/e2e/assets/main-angular.ts b/test/e2e/assets/main-angular.ts new file mode 100644 index 000000000..1ed564d2f --- /dev/null +++ b/test/e2e/assets/main-angular.ts @@ -0,0 +1,91 @@ +import { HttpClientModule } from '@angular/common/http'; +import { Component, NgModule } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { OpenAPI } from './core/OpenAPI'; +import { CollectionFormatService } from './services/CollectionFormatService'; +import { ComplexService } from './services/ComplexService'; +import { DefaultService } from './services/DefaultService'; +import { DefaultsService } from './services/DefaultsService'; +import { DuplicateService } from './services/DuplicateService'; +import { ErrorService } from './services/ErrorService'; +import { HeaderService } from './services/HeaderService'; +import { MultipleTags1Service } from './services/MultipleTags1Service'; +import { MultipleTags2Service } from './services/MultipleTags2Service'; +import { MultipleTags3Service } from './services/MultipleTags3Service'; +import { NoContentService } from './services/NoContentService'; +import { ParametersService } from './services/ParametersService'; +import { ResponseService } from './services/ResponseService'; +import { SimpleService } from './services/SimpleService'; +import { TypesService } from './services/TypesService'; + +@Component({ + selector: 'app-root', + template: `
Angular is ready
`, +}) +export class AppComponent { + constructor( + private readonly collectionFormatService: CollectionFormatService, + private readonly complexService: ComplexService, + private readonly defaultService: DefaultService, + private readonly defaultsService: DefaultsService, + private readonly duplicateService: DuplicateService, + private readonly errorService: ErrorService, + private readonly headerService: HeaderService, + private readonly multipleTags1Service: MultipleTags1Service, + private readonly multipleTags2Service: MultipleTags2Service, + private readonly multipleTags3Service: MultipleTags3Service, + private readonly noContentService: NoContentService, + private readonly parametersService: ParametersService, + private readonly responseService: ResponseService, + private readonly simpleService: SimpleService, + private readonly typesService: TypesService + ) { + (window as any).api = { + OpenAPI, + CollectionFormatService: this.collectionFormatService, + ComplexService: this.complexService, + DefaultService: this.defaultService, + DefaultsService: this.defaultsService, + DuplicateService: this.duplicateService, + ErrorService: this.errorService, + HeaderService: this.headerService, + MultipleTags1Service: this.multipleTags1Service, + MultipleTags2Service: this.multipleTags2Service, + MultipleTags3Service: this.multipleTags3Service, + NoContentService: this.noContentService, + ParametersService: this.parametersService, + ResponseService: this.responseService, + SimpleService: this.simpleService, + TypesService: this.typesService, + }; + } +} + +@NgModule({ + imports: [BrowserModule, HttpClientModule], + providers: [ + CollectionFormatService, + ComplexService, + DefaultService, + DefaultsService, + DuplicateService, + ErrorService, + HeaderService, + MultipleTags1Service, + MultipleTags2Service, + MultipleTags3Service, + NoContentService, + ParametersService, + ResponseService, + SimpleService, + TypesService, + ], + bootstrap: [AppComponent], +}) +export class AppModule {} + +platformBrowserDynamic() + .bootstrapModule(AppModule) + .catch(err => console.error(err)); diff --git a/test/e2e/assets/main.ts b/test/e2e/assets/main.ts new file mode 100644 index 000000000..4bbf7cd3b --- /dev/null +++ b/test/e2e/assets/main.ts @@ -0,0 +1,3 @@ +import * as api from './index'; + +(window as any).api = api; diff --git a/test/e2e/client.angular.spec.ts b/test/e2e/client.angular.spec.ts new file mode 100644 index 000000000..6edcc2196 --- /dev/null +++ b/test/e2e/client.angular.spec.ts @@ -0,0 +1,158 @@ +import browser from './scripts/browser'; +import { buildAngularProject } from './scripts/buildAngularProject'; +import { cleanup } from './scripts/cleanup'; +import { copyAsset } from './scripts/copyAsset'; +import { createAngularProject } from './scripts/createAngularProject'; +import { generateClient } from './scripts/generateClient'; +import server from './scripts/server'; + +describe('client.angular', () => { + beforeAll(async () => { + cleanup('client/angular'); + createAngularProject('client/angular', 'app'); + await generateClient('client/angular/app/src', 'v3', 'angular', false, false, 'ApiModule'); + copyAsset('main-angular-module.ts', 'client/angular/app/src/main.ts'); + buildAngularProject('client/angular', 'app', 'dist'); + await server.start('client/angular/app/dist/browser'); + await browser.start(); + }, 30000); + + afterAll(async () => { + await browser.stop(); + await server.stop(); + }); + + it('requests token', async () => { + await browser.exposeFunction('tokenRequest', jest.fn().mockResolvedValue('MY_TOKEN')); + const result = await browser.evaluate(async () => { + return await new Promise(resolve => { + const { SimpleService } = (window as any).api; + SimpleService.httpRequest.config.TOKEN = (window as any).tokenRequest; + SimpleService.httpRequest.config.USERNAME = undefined; + SimpleService.httpRequest.config.PASSWORD = undefined; + SimpleService.getCallWithoutParametersAndResponse().subscribe(resolve); + }); + }); + expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + }); + + it('uses credentials', async () => { + const result = await browser.evaluate(async () => { + return await new Promise(resolve => { + const { SimpleService } = (window as any).api; + SimpleService.httpRequest.config.TOKEN = undefined; + SimpleService.httpRequest.config.USERNAME = 'username'; + SimpleService.httpRequest.config.PASSWORD = 'password'; + SimpleService.getCallWithoutParametersAndResponse().subscribe(resolve); + }); + }); + expect(result.headers.authorization).toBe('Basic dXNlcm5hbWU6cGFzc3dvcmQ='); + }); + + it('supports complex params', async () => { + const result = await browser.evaluate(async () => { + return await new Promise(resolve => { + const { ComplexService } = (window as any).api; + ComplexService.complexTypes({ + first: { + second: { + third: 'Hello World!', + }, + }, + }).subscribe(resolve); + }); + }); + expect(result).toBeDefined(); + }); + + it('support form data', async () => { + const result = await browser.evaluate(async () => { + return await new Promise(resolve => { + const { ParametersService } = (window as any).api; + ParametersService.callWithParameters( + 'valueHeader', + 'valueQuery', + 'valueForm', + 'valueCookie', + 'valuePath', + { + prop: 'valueBody', + } + ).subscribe(resolve); + }); + }); + expect(result).toBeDefined(); + }); + + it('should throw known error (500)', async () => { + const error = await browser.evaluate(async () => { + return await new Promise(resolve => { + const { ErrorService } = (window as any).api; + ErrorService.testErrorCode(500).subscribe({ + error: (e: any) => { + resolve( + JSON.stringify({ + name: e.name, + message: e.message, + url: e.url, + status: e.status, + statusText: e.statusText, + body: e.body, + }) + ); + }, + }); + }); + }); + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: 'Custom message: Internal Server Error', + url: 'http://localhost:3000/base/api/v1.0/error?status=500', + status: 500, + statusText: 'Internal Server Error', + body: { + status: 500, + message: 'hello world', + }, + }) + ); + }); + + it('should throw unknown error (409)', async () => { + const error = await browser.evaluate(async () => { + return await new Promise(resolve => { + const { ErrorService } = (window as any).api; + ErrorService.testErrorCode(409).subscribe({ + error: (e: any) => { + resolve( + JSON.stringify({ + name: e.name, + message: e.message, + url: e.url, + status: e.status, + statusText: e.statusText, + body: e.body, + }) + ); + }, + }); + }); + }); + + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: + 'Generic Error: status: 409; status text: Conflict; body: {\n "status": 409,\n "message": "hello world"\n}', + url: 'http://localhost:3000/base/api/v1.0/error?status=409', + status: 409, + statusText: 'Conflict', + body: { + status: 409, + message: 'hello world', + }, + }) + ); + }); +}); diff --git a/test/e2e/client.axios.spec.ts b/test/e2e/client.axios.spec.ts new file mode 100644 index 000000000..a0ba54750 --- /dev/null +++ b/test/e2e/client.axios.spec.ts @@ -0,0 +1,151 @@ +import { cleanup } from './scripts/cleanup'; +import { compileWithTypescript } from './scripts/compileWithTypescript'; +import { generateClient } from './scripts/generateClient'; +import server from './scripts/server'; + +describe('client.axios', () => { + beforeAll(async () => { + cleanup('client/axios'); + await generateClient('client/axios', 'v3', 'axios', false, false, 'ApiClient'); + compileWithTypescript('client/axios'); + await server.start('client/axios'); + }, 30000); + + afterAll(async () => { + await server.stop(); + }); + + it('requests token', async () => { + const { ApiClient } = require('./generated/client/axios/index.js'); + const tokenRequest = jest.fn().mockResolvedValue('MY_TOKEN'); + const client = new ApiClient({ + TOKEN: tokenRequest, + USERNAME: undefined, + PASSWORD: undefined, + }); + const result = await client.simple.getCallWithoutParametersAndResponse(); + expect(tokenRequest.mock.calls.length).toBe(1); + expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + }); + + it('uses credentials', async () => { + const { ApiClient } = require('./generated/client/axios/index.js'); + const client = new ApiClient({ + TOKEN: undefined, + USERNAME: 'username', + PASSWORD: 'password', + }); + const result = await client.simple.getCallWithoutParametersAndResponse(); + expect(result.headers.authorization).toBe('Basic dXNlcm5hbWU6cGFzc3dvcmQ='); + }); + + it('supports complex params', async () => { + const { ApiClient } = require('./generated/client/axios/index.js'); + const client = new ApiClient(); + const result = await client.complex.complexTypes({ + first: { + second: { + third: 'Hello World!', + }, + }, + }); + expect(result).toBeDefined(); + }); + + it('supports form data', async () => { + const { ApiClient } = require('./generated/client/axios/index.js'); + const client = new ApiClient(); + const result = await client.parameters.callWithParameters( + 'valueHeader', + 'valueQuery', + 'valueForm', + 'valueCookie', + 'valuePath', + { + prop: 'valueBody', + } + ); + expect(result).toBeDefined(); + }); + + it('can abort the request', async () => { + let error; + try { + const { ApiClient } = require('./generated/client/axios/index.js'); + const client = new ApiClient(); + const promise = client.simple.getCallWithoutParametersAndResponse(); + setTimeout(() => { + promise.cancel(); + }, 10); + await promise; + } catch (e) { + error = (e as Error).message; + } + expect(error).toContain('Request aborted'); + }); + + it('should throw known error (500)', async () => { + let error; + try { + const { ApiClient } = require('./generated/client/axios/index.js'); + const client = new ApiClient(); + await client.error.testErrorCode(500); + } catch (e) { + const err = e as any; + error = JSON.stringify({ + name: err.name, + message: err.message, + url: err.url, + status: err.status, + statusText: err.statusText, + body: err.body, + }); + } + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: 'Custom message: Internal Server Error', + url: 'http://localhost:3000/base/api/v1.0/error?status=500', + status: 500, + statusText: 'Internal Server Error', + body: { + status: 500, + message: 'hello world', + }, + }) + ); + }); + + it('should throw unknown error (409)', async () => { + let error; + try { + const { ApiClient } = require('./generated/client/axios/index.js'); + const client = new ApiClient(); + await client.error.testErrorCode(409); + } catch (e) { + const err = e as any; + error = JSON.stringify({ + name: err.name, + message: err.message, + url: err.url, + status: err.status, + statusText: err.statusText, + body: err.body, + }); + } + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: + 'Generic Error: status: 409; status text: Conflict; body: {\n "status": 409,\n "message": "hello world"\n}', + url: 'http://localhost:3000/base/api/v1.0/error?status=409', + status: 409, + statusText: 'Conflict', + body: { + status: 409, + message: 'hello world', + }, + }) + ); + }); +}); diff --git a/test/e2e/client.babel.spec.ts b/test/e2e/client.babel.spec.ts new file mode 100644 index 000000000..82320d1f9 --- /dev/null +++ b/test/e2e/client.babel.spec.ts @@ -0,0 +1,176 @@ +import browser from './scripts/browser'; +import { cleanup } from './scripts/cleanup'; +import { compileWithBabel } from './scripts/compileWithBabel'; +import { copyAsset } from './scripts/copyAsset'; +import { generateClient } from './scripts/generateClient'; +import server from './scripts/server'; + +describe('client.babel', () => { + beforeAll(async () => { + cleanup('client/babel'); + await generateClient('client/babel', 'v3', 'fetch', true, true, 'ApiClient'); + copyAsset('index.html', 'client/babel/index.html'); + copyAsset('main.ts', 'client/babel/main.ts'); + compileWithBabel('client/babel'); + await server.start('client/babel'); + await browser.start(); + }, 30000); + + afterAll(async () => { + await browser.stop(); + await server.stop(); + }); + + it('requests token', async () => { + await browser.exposeFunction('tokenRequest', jest.fn().mockResolvedValue('MY_TOKEN')); + const result = await browser.evaluate(async () => { + const { ApiClient } = (window as any).api; + const client = new ApiClient({ + TOKEN: (window as any).tokenRequest, + USERNAME: undefined, + PASSWORD: undefined, + }); + return await client.simple.getCallWithoutParametersAndResponse(); + }); + expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + }); + + it('uses credentials', async () => { + const result = await browser.evaluate(async () => { + const { ApiClient } = (window as any).api; + const client = new ApiClient({ + TOKEN: undefined, + USERNAME: 'username', + PASSWORD: 'password', + }); + return await client.simple.getCallWithoutParametersAndResponse(); + }); + expect(result.headers.authorization).toBe('Basic dXNlcm5hbWU6cGFzc3dvcmQ='); + }); + + it('supports complex params', async () => { + const result = await browser.evaluate(async () => { + const { ApiClient } = (window as any).api; + const client = new ApiClient(); + return await client.complex.complexTypes({ + parameterObject: { + first: { + second: { + third: 'Hello World!', + }, + }, + }, + }); + }); + expect(result).toBeDefined(); + }); + + it('support form data', async () => { + const result = await browser.evaluate(async () => { + const { ApiClient } = (window as any).api; + const client = new ApiClient(); + return await client.parameters.callWithParameters({ + parameterHeader: 'valueHeader', + parameterQuery: 'valueQuery', + parameterForm: 'valueForm', + parameterCookie: 'valueCookie', + parameterPath: 'valuePath', + requestBody: { + prop: 'valueBody', + }, + }); + }); + expect(result).toBeDefined(); + }); + + it('can abort the request', async () => { + let error; + try { + await browser.evaluate(async () => { + const { ApiClient } = (window as any).api; + const client = new ApiClient(); + const promise = client.simple.getCallWithoutParametersAndResponse(); + setTimeout(() => { + promise.cancel(); + }, 10); + await promise; + }); + } catch (e) { + error = (e as Error).message; + } + expect(error).toContain('Request aborted'); + }); + + it('should throw known error (500)', async () => { + const error = await browser.evaluate(async () => { + try { + const { ApiClient } = (window as any).api; + const client = new ApiClient(); + await client.error.testErrorCode({ + status: 500, + }); + } catch (e) { + const error = e as any; + return JSON.stringify({ + name: error.name, + message: error.message, + url: error.url, + status: error.status, + statusText: error.statusText, + body: error.body, + }); + } + return; + }); + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: 'Custom message: Internal Server Error', + url: 'http://localhost:3000/base/api/v1.0/error?status=500', + status: 500, + statusText: 'Internal Server Error', + body: { + status: 500, + message: 'hello world', + }, + }) + ); + }); + + it('should throw unknown error (409)', async () => { + const error = await browser.evaluate(async () => { + try { + const { ApiClient } = (window as any).api; + const client = new ApiClient(); + await client.error.testErrorCode({ + status: 409, + }); + } catch (e) { + const error = e as any; + return JSON.stringify({ + name: error.name, + message: error.message, + url: error.url, + status: error.status, + statusText: error.statusText, + body: error.body, + }); + } + return; + }); + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: + 'Generic Error: status: 409; status text: Conflict; body: {\n "status": 409,\n "message": "hello world"\n}', + url: 'http://localhost:3000/base/api/v1.0/error?status=409', + status: 409, + statusText: 'Conflict', + body: { + status: 409, + message: 'hello world', + }, + }) + ); + }); +}); diff --git a/test/e2e/client.fetch.spec.ts b/test/e2e/client.fetch.spec.ts new file mode 100644 index 000000000..9a64284bd --- /dev/null +++ b/test/e2e/client.fetch.spec.ts @@ -0,0 +1,171 @@ +import browser from './scripts/browser'; +import { cleanup } from './scripts/cleanup'; +import { compileWithTypescript } from './scripts/compileWithTypescript'; +import { copyAsset } from './scripts/copyAsset'; +import { generateClient } from './scripts/generateClient'; +import server from './scripts/server'; + +describe('client.fetch', () => { + beforeAll(async () => { + cleanup('client/fetch'); + await generateClient('client/fetch', 'v3', 'fetch', false, false, 'ApiClient'); + copyAsset('index.html', 'client/fetch/index.html'); + copyAsset('main.ts', 'client/fetch/main.ts'); + compileWithTypescript('client/fetch'); + await server.start('client/fetch'); + await browser.start(); + }, 30000); + + afterAll(async () => { + await browser.stop(); + await server.stop(); + }); + + it('requests token', async () => { + await browser.exposeFunction('tokenRequest', jest.fn().mockResolvedValue('MY_TOKEN')); + const result = await browser.evaluate(async () => { + const { ApiClient } = (window as any).api; + const client = new ApiClient({ + TOKEN: (window as any).tokenRequest, + USERNAME: undefined, + PASSWORD: undefined, + }); + return await client.simple.getCallWithoutParametersAndResponse(); + }); + expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + }); + + it('uses credentials', async () => { + const result = await browser.evaluate(async () => { + const { ApiClient } = (window as any).api; + const client = new ApiClient({ + TOKEN: undefined, + USERNAME: 'username', + PASSWORD: 'password', + }); + return await client.simple.getCallWithoutParametersAndResponse(); + }); + expect(result.headers.authorization).toBe('Basic dXNlcm5hbWU6cGFzc3dvcmQ='); + }); + + it('supports complex params', async () => { + const result = await browser.evaluate(async () => { + const { ApiClient } = (window as any).api; + const client = new ApiClient(); + return await client.complex.complexTypes({ + first: { + second: { + third: 'Hello World!', + }, + }, + }); + }); + expect(result).toBeDefined(); + }); + + it('support form data', async () => { + const result = await browser.evaluate(async () => { + const { ApiClient } = (window as any).api; + const client = new ApiClient(); + return await client.parameters.callWithParameters( + 'valueHeader', + 'valueQuery', + 'valueForm', + 'valueCookie', + 'valuePath', + { + prop: 'valueBody', + } + ); + }); + expect(result).toBeDefined(); + }); + + it('can abort the request', async () => { + let error; + try { + await browser.evaluate(async () => { + const { ApiClient } = (window as any).api; + const client = new ApiClient(); + const promise = client.simple.getCallWithoutParametersAndResponse(); + setTimeout(() => { + promise.cancel(); + }, 10); + await promise; + }); + } catch (e) { + error = (e as Error).message; + } + expect(error).toContain('Request aborted'); + }); + + it('should throw known error (500)', async () => { + const error = await browser.evaluate(async () => { + try { + const { ApiClient } = (window as any).api; + const client = new ApiClient(); + await client.error.testErrorCode(500); + } catch (e) { + const error = e as any; + return JSON.stringify({ + name: error.name, + message: error.message, + url: error.url, + status: error.status, + statusText: error.statusText, + body: error.body, + }); + } + return; + }); + + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: 'Custom message: Internal Server Error', + url: 'http://localhost:3000/base/api/v1.0/error?status=500', + status: 500, + statusText: 'Internal Server Error', + body: { + status: 500, + message: 'hello world', + }, + }) + ); + }); + + it('should throw unknown error (409)', async () => { + const error = await browser.evaluate(async () => { + try { + const { ApiClient } = (window as any).api; + const client = new ApiClient(); + await client.error.testErrorCode(409); + } catch (e) { + const error = e as any; + return JSON.stringify({ + name: error.name, + message: error.message, + url: error.url, + status: error.status, + statusText: error.statusText, + body: error.body, + }); + } + return; + }); + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: + 'Generic Error: status: 409; status text: Conflict; body: {\n "status": 409,\n "message": "hello world"\n}', + url: 'http://localhost:3000/base/api/v1.0/error?status=409', + status: 409, + statusText: 'Conflict', + body: { + status: 409, + message: 'hello world', + }, + }) + ); + }); +}); diff --git a/test/e2e/client.node.spec.ts b/test/e2e/client.node.spec.ts new file mode 100644 index 000000000..0d915919b --- /dev/null +++ b/test/e2e/client.node.spec.ts @@ -0,0 +1,151 @@ +import { cleanup } from './scripts/cleanup'; +import { compileWithTypescript } from './scripts/compileWithTypescript'; +import { generateClient } from './scripts/generateClient'; +import server from './scripts/server'; + +describe('client.node', () => { + beforeAll(async () => { + cleanup('client/node'); + await generateClient('client/node', 'v3', 'node', false, false, 'ApiClient'); + compileWithTypescript('client/node'); + await server.start('client/node'); + }, 30000); + + afterAll(async () => { + await server.stop(); + }); + + it('requests token', async () => { + const { ApiClient } = require('./generated/client/node/index.js'); + const tokenRequest = jest.fn().mockResolvedValue('MY_TOKEN'); + const client = new ApiClient({ + TOKEN: tokenRequest, + USERNAME: undefined, + PASSWORD: undefined, + }); + const result = await client.simple.getCallWithoutParametersAndResponse(); + expect(tokenRequest.mock.calls.length).toBe(1); + expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + }); + + it('uses credentials', async () => { + const { ApiClient } = require('./generated/client/node/index.js'); + const client = new ApiClient({ + TOKEN: undefined, + USERNAME: 'username', + PASSWORD: 'password', + }); + const result = await client.simple.getCallWithoutParametersAndResponse(); + expect(result.headers.authorization).toBe('Basic dXNlcm5hbWU6cGFzc3dvcmQ='); + }); + + it('supports complex params', async () => { + const { ApiClient } = require('./generated/client/node/index.js'); + const client = new ApiClient(); + const result = await client.complex.complexTypes({ + first: { + second: { + third: 'Hello World!', + }, + }, + }); + expect(result).toBeDefined(); + }); + + it('support form data', async () => { + const { ApiClient } = require('./generated/client/node/index.js'); + const client = new ApiClient(); + const result = await client.parameters.callWithParameters( + 'valueHeader', + 'valueQuery', + 'valueForm', + 'valueCookie', + 'valuePath', + { + prop: 'valueBody', + } + ); + expect(result).toBeDefined(); + }); + + it('can abort the request', async () => { + let error; + try { + const { ApiClient } = require('./generated/client/node/index.js'); + const client = new ApiClient(); + const promise = client.simple.getCallWithoutParametersAndResponse(); + setTimeout(() => { + promise.cancel(); + }, 10); + await promise; + } catch (e) { + error = (e as Error).message; + } + expect(error).toContain('Request aborted'); + }); + + it('should throw known error (500)', async () => { + let error; + try { + const { ApiClient } = require('./generated/client/node/index.js'); + const client = new ApiClient(); + await client.error.testErrorCode(500); + } catch (e) { + const err = e as any; + error = JSON.stringify({ + name: err.name, + message: err.message, + url: err.url, + status: err.status, + statusText: err.statusText, + body: err.body, + }); + } + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: 'Custom message: Internal Server Error', + url: 'http://localhost:3000/base/api/v1.0/error?status=500', + status: 500, + statusText: 'Internal Server Error', + body: { + status: 500, + message: 'hello world', + }, + }) + ); + }); + + it('should throw unknown error (409)', async () => { + let error; + try { + const { ApiClient } = require('./generated/client/node/index.js'); + const client = new ApiClient(); + await client.error.testErrorCode(409); + } catch (e) { + const err = e as any; + error = JSON.stringify({ + name: err.name, + message: err.message, + url: err.url, + status: err.status, + statusText: err.statusText, + body: err.body, + }); + } + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: + 'Generic Error: status: 409; status text: Conflict; body: {\n "status": 409,\n "message": "hello world"\n}', + url: 'http://localhost:3000/base/api/v1.0/error?status=409', + status: 409, + statusText: 'Conflict', + body: { + status: 409, + message: 'hello world', + }, + }) + ); + }); +}); diff --git a/test/e2e/client.xhr.spec.ts b/test/e2e/client.xhr.spec.ts new file mode 100644 index 000000000..e0b516f39 --- /dev/null +++ b/test/e2e/client.xhr.spec.ts @@ -0,0 +1,170 @@ +import browser from './scripts/browser'; +import { cleanup } from './scripts/cleanup'; +import { compileWithTypescript } from './scripts/compileWithTypescript'; +import { copyAsset } from './scripts/copyAsset'; +import { generateClient } from './scripts/generateClient'; +import server from './scripts/server'; + +describe('client.xhr', () => { + beforeAll(async () => { + cleanup('client/xhr'); + await generateClient('client/xhr', 'v3', 'xhr', false, false, 'ApiClient'); + copyAsset('index.html', 'client/xhr/index.html'); + copyAsset('main.ts', 'client/xhr/main.ts'); + compileWithTypescript('client/xhr'); + await server.start('client/xhr'); + await browser.start(); + }, 30000); + + afterAll(async () => { + await browser.stop(); + await server.stop(); + }); + + it('requests token', async () => { + await browser.exposeFunction('tokenRequest', jest.fn().mockResolvedValue('MY_TOKEN')); + const result = await browser.evaluate(async () => { + const { ApiClient } = (window as any).api; + const client = new ApiClient({ + TOKEN: (window as any).tokenRequest, + USERNAME: undefined, + PASSWORD: undefined, + }); + return await client.simple.getCallWithoutParametersAndResponse(); + }); + expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + }); + + it('uses credentials', async () => { + const result = await browser.evaluate(async () => { + const { ApiClient } = (window as any).api; + const client = new ApiClient({ + TOKEN: undefined, + USERNAME: 'username', + PASSWORD: 'password', + }); + return await client.simple.getCallWithoutParametersAndResponse(); + }); + expect(result.headers.authorization).toBe('Basic dXNlcm5hbWU6cGFzc3dvcmQ='); + }); + + it('supports complex params', async () => { + const result = await browser.evaluate(async () => { + const { ApiClient } = (window as any).api; + const client = new ApiClient(); + return await client.complex.complexTypes({ + first: { + second: { + third: 'Hello World!', + }, + }, + }); + }); + expect(result).toBeDefined(); + }); + + it('support form data', async () => { + const result = await browser.evaluate(async () => { + const { ApiClient } = (window as any).api; + const client = new ApiClient(); + return await client.parameters.callWithParameters( + 'valueHeader', + 'valueQuery', + 'valueForm', + 'valueCookie', + 'valuePath', + { + prop: 'valueBody', + } + ); + }); + expect(result).toBeDefined(); + }); + + it('can abort the request', async () => { + let error; + try { + await browser.evaluate(async () => { + const { ApiClient } = (window as any).api; + const client = new ApiClient(); + const promise = client.simple.getCallWithoutParametersAndResponse(); + setTimeout(() => { + promise.cancel(); + }, 10); + await promise; + }); + } catch (e) { + error = (e as Error).message; + } + expect(error).toContain('Request aborted'); + }); + + it('should throw known error (500)', async () => { + const error = await browser.evaluate(async () => { + try { + const { ApiClient } = (window as any).api; + const client = new ApiClient(); + await client.error.testErrorCode(500); + } catch (e) { + const error = e as any; + return JSON.stringify({ + name: error.name, + message: error.message, + url: error.url, + status: error.status, + statusText: error.statusText, + body: error.body, + }); + } + return; + }); + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: 'Custom message: Internal Server Error', + url: 'http://localhost:3000/base/api/v1.0/error?status=500', + status: 500, + statusText: 'Internal Server Error', + body: { + status: 500, + message: 'hello world', + }, + }) + ); + }); + + it('should throw unknown error (409)', async () => { + const error = await browser.evaluate(async () => { + try { + const { ApiClient } = (window as any).api; + const client = new ApiClient(); + await client.error.testErrorCode(409); + } catch (e) { + const error = e as any; + return JSON.stringify({ + name: error.name, + message: error.message, + url: error.url, + status: error.status, + statusText: error.statusText, + body: error.body, + }); + } + return; + }); + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: + 'Generic Error: status: 409; status text: Conflict; body: {\n "status": 409,\n "message": "hello world"\n}', + url: 'http://localhost:3000/base/api/v1.0/error?status=409', + status: 409, + statusText: 'Conflict', + body: { + status: 409, + message: 'hello world', + }, + }) + ); + }); +}); diff --git a/test/e2e/scripts/browser.ts b/test/e2e/scripts/browser.ts new file mode 100644 index 000000000..ab0b96bc5 --- /dev/null +++ b/test/e2e/scripts/browser.ts @@ -0,0 +1,40 @@ +import puppeteer, { Browser, EvaluateFn, Page } from 'puppeteer'; + +let _browser: Browser; +let _page: Page; + +const start = async () => { + // This starts a new puppeteer browser (Chrome) + // and load the localhost page, this page will load the + // javascript modules (see server.js for more info) + _browser = await puppeteer.launch({ + headless: 'new', + args: ['--no-sandbox', '--disable-setuid-sandbox'], + }); + _page = await _browser.newPage(); + // _page.on('console', msg => console.log(msg.text())); + await _page.goto(`http://localhost:3000/`, { + waitUntil: 'networkidle0', + }); +}; + +const stop = async () => { + await _page.close(); + await _browser.close(); +}; + +const evaluate = async (fn: EvaluateFn) => { + return await _page.evaluate(fn); +}; + +// eslint-disable-next-line @typescript-eslint/ban-types +const exposeFunction = async (name: string, fn: Function) => { + return await _page.exposeFunction(name, fn); +}; + +export default { + start, + stop, + evaluate, + exposeFunction, +}; diff --git a/test/e2e/scripts/buildAngularProject.ts b/test/e2e/scripts/buildAngularProject.ts new file mode 100644 index 000000000..43060756b --- /dev/null +++ b/test/e2e/scripts/buildAngularProject.ts @@ -0,0 +1,24 @@ +import { sync } from 'cross-spawn'; +import { resolve as resolvePath } from 'path'; + +export const buildAngularProject = (dir: string, name: string, output: string) => { + const cwd = `./test/e2e/generated/${dir}/${name}/`; + sync( + 'ng', + [ + 'build', + '--output-path', + output, + '--optimization', + 'false', + '--configuration', + 'development', + '--source-map', + 'false', + ], + { + cwd: resolvePath(cwd), + stdio: 'inherit', + } + ); +}; diff --git a/test/e2e/scripts/cleanup.ts b/test/e2e/scripts/cleanup.ts new file mode 100644 index 000000000..d3d9d896b --- /dev/null +++ b/test/e2e/scripts/cleanup.ts @@ -0,0 +1,8 @@ +import { rmSync } from 'fs'; + +export const cleanup = (dir: string) => { + rmSync(`./test/e2e/generated/${dir}/`, { + force: true, + recursive: true, + }); +}; diff --git a/test/e2e/scripts/compileWithBabel.ts b/test/e2e/scripts/compileWithBabel.ts new file mode 100644 index 000000000..5421934f2 --- /dev/null +++ b/test/e2e/scripts/compileWithBabel.ts @@ -0,0 +1,37 @@ +import { transformSync } from '@babel/core'; +import { readFileSync, writeFileSync } from 'fs'; +import { sync } from 'glob'; + +export const compileWithBabel = (dir: string) => { + sync(`./test/e2e/generated/${dir}/**/*.ts`).forEach(file => { + try { + const content = readFileSync(file, 'utf8').toString(); + const result = transformSync(content, { + filename: file, + presets: [ + [ + '@babel/preset-env', + { + modules: false, + targets: { + node: true, + }, + }, + ], + [ + '@babel/preset-typescript', + { + onlyRemoveTypeImports: true, + }, + ], + ], + }); + if (result?.code) { + const out = file.replace(/\.ts$/, '.js'); + writeFileSync(out, result.code); + } + } catch (error) { + console.error(error); + } + }); +}; diff --git a/test/e2e/scripts/compileWithTypescript.ts b/test/e2e/scripts/compileWithTypescript.ts new file mode 100644 index 000000000..4a8ab1de5 --- /dev/null +++ b/test/e2e/scripts/compileWithTypescript.ts @@ -0,0 +1,58 @@ +import { EOL } from 'os'; +import { resolve } from 'path'; +import { + createCompilerHost, + createProgram, + formatDiagnosticsWithColorAndContext, + getPreEmitDiagnostics, + parseConfigFileTextToJson, + parseJsonConfigFileContent, + sys, +} from 'typescript'; + +export const compileWithTypescript = (dir: string) => { + const cwd = `./test/e2e/generated/${dir}/`; + const tsconfig = { + compilerOptions: { + target: 'es2020', + module: 'es2020', + moduleResolution: 'node', + lib: ['es2020', 'dom'], + declaration: false, + declarationMap: false, + sourceMap: false, + noImplicitReturns: true, + noImplicitThis: true, + noImplicitAny: true, + strict: true, + skipLibCheck: true, + allowSyntheticDefaultImports: true, + experimentalDecorators: true, + }, + include: ['**/*.ts'], + }; + + // Compile files to JavaScript (ES6 modules) + const configFile = parseConfigFileTextToJson('tsconfig.json', JSON.stringify(tsconfig)); + const configFileResult = parseJsonConfigFileContent( + configFile.config, + sys, + resolve(process.cwd(), cwd), + undefined, + 'tsconfig.json' + ); + const compilerHost = createCompilerHost(configFileResult.options); + const compiler = createProgram(configFileResult.fileNames, configFileResult.options, compilerHost); + const result = compiler.emit(); + + // Show errors or warnings (if any) + const diagnostics = getPreEmitDiagnostics(compiler).concat(result.diagnostics); + if (diagnostics.length) { + const message = formatDiagnosticsWithColorAndContext(diagnostics, { + getCurrentDirectory: () => sys.getCurrentDirectory(), + getCanonicalFileName: f => f, + getNewLine: () => EOL, + }); + console.log(message); + } +}; diff --git a/test/e2e/scripts/copyAsset.ts b/test/e2e/scripts/copyAsset.ts new file mode 100644 index 000000000..166aecc6d --- /dev/null +++ b/test/e2e/scripts/copyAsset.ts @@ -0,0 +1,5 @@ +import { copyFileSync } from 'fs'; + +export const copyAsset = (fileNameIn: string, fileNameOut: string) => { + copyFileSync(`./test/e2e/assets/${fileNameIn}`, `./test/e2e/generated/${fileNameOut}`); +}; diff --git a/test/e2e/scripts/createAngularProject.ts b/test/e2e/scripts/createAngularProject.ts new file mode 100644 index 000000000..23d108004 --- /dev/null +++ b/test/e2e/scripts/createAngularProject.ts @@ -0,0 +1,51 @@ +import { sync } from 'cross-spawn'; +import { mkdirSync, rmSync } from 'fs'; +import { resolve as resolvePath } from 'path'; + +export const createAngularProject = (dir: string, name: string) => { + const cwd = `./test/e2e/generated/${dir}/`; + mkdirSync(cwd, { + recursive: true, + }); + + sync('ng', ['analytics', 'off', '--global'], { + cwd: resolvePath(cwd), + stdio: 'inherit', + }); + + sync( + 'ng', + [ + 'new', + name, + '--minimal', + 'true', + '--style', + 'css', + '--inline-style', + 'true', + '--inline-template', + 'true', + '--routing', + 'false', + '--ssr', + 'false', + '--skip-tests', + 'true', + '--skip-install', + 'true', + '--skip-git', + 'true', + '--commit', + 'false', + '--force', + ], + { + cwd: resolvePath(cwd), + stdio: 'inherit', + } + ); + rmSync(`${cwd}/${name}/src/app/`, { + recursive: true, + }); +}; diff --git a/test/e2e/scripts/generateClient.ts b/test/e2e/scripts/generateClient.ts new file mode 100644 index 000000000..9c0402528 --- /dev/null +++ b/test/e2e/scripts/generateClient.ts @@ -0,0 +1,19 @@ +import { generate as __generate } from '../../../'; + +export const generateClient = async ( + dir: string, + version: string, + client: 'fetch' | 'xhr' | 'node' | 'axios' | 'angular', + useOptions: boolean = false, + useUnionTypes: boolean = false, + clientName?: string +) => { + await __generate({ + input: `./test/spec/${version}.json`, + output: `./test/e2e/generated/${dir}/`, + httpClient: client, + useOptions, + useUnionTypes, + clientName, + }); +}; diff --git a/test/e2e/scripts/server.ts b/test/e2e/scripts/server.ts new file mode 100644 index 000000000..37a41907d --- /dev/null +++ b/test/e2e/scripts/server.ts @@ -0,0 +1,103 @@ +import express, { Express } from 'express'; +import { Server } from 'http'; +import { resolve as resolvePath } from 'path'; + +let _app: Express; +let _server: Server; + +const start = async (dir: string) => { + return new Promise(resolve => { + _app = express(); + + // Serve the JavaScript files from the specific folder, since we are using browser + // based ES6 modules, this also means that we can just request the js/index.js file + // and all other relative paths are resolved from that file. + _app.use( + '/js', + express.static(`./test/e2e/generated/${dir}/`, { + extensions: ['', 'js'], + index: 'index.js', + }) + ); + + _app.use( + '/js', + express.static(`./test/e2e/generated/${dir}/`, { + extensions: ['', 'js'], + index: 'index.js', + }) + ); + + // Serve static assets + _app.get('/runtime.js', (req, res) => { + res.sendFile(resolvePath(`./test/e2e/generated/${dir}/runtime.js`)); + }); + _app.get('/polyfills.js', (req, res) => { + res.sendFile(resolvePath(`./test/e2e/generated/${dir}/polyfills.js`)); + }); + _app.get('/vendor.js', (req, res) => { + res.sendFile(resolvePath(`./test/e2e/generated/${dir}/vendor.js`)); + }); + _app.get('/main.js', (req, res) => { + res.sendFile(resolvePath(`./test/e2e/generated/${dir}/main.js`)); + }); + _app.get('/styles.css', (req, res) => { + res.sendFile(resolvePath(`./test/e2e/generated/${dir}/styles.css`)); + }); + _app.get('/favicon.ico', (req, res) => { + res.sendFile(resolvePath(`./test/e2e/generated/${dir}/favicon.ico`)); + }); + _app.get('/', (req, res) => { + res.sendFile(resolvePath(`./test/e2e/generated/${dir}/index.html`)); + }); + + // Register an 'echo' server for testing error codes. This will just grab the + // status code from the query and return the default response (and text) from Express. + // See the spec files for more information. + _app.all('/base/api/v1.0/error', (req, res) => { + const status = parseInt(String(req.query.status)); + res.status(status).json({ + status, + message: 'hello world', + }); + }); + + // Register an 'echo' server that just returns all data from the API calls. + // Although this might not be a 'correct' response, we can use this to test + // the majority of API calls. + _app.all('/base/api/v1.0/*', (req, res) => { + setTimeout(() => { + res.json({ + method: req.method, + protocol: req.protocol, + hostname: req.hostname, + path: req.path, + url: req.url, + query: req.query, + body: req.body, + headers: req.headers, + }); + }, 100); + }); + _server = _app.listen(3000, () => { + resolve(); + }); + }); +}; + +const stop = async () => { + return new Promise((resolve, reject) => { + _server.close(err => { + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); +}; + +export default { + start, + stop, +}; diff --git a/test/e2e/v2.angular.spec.ts b/test/e2e/v2.angular.spec.ts new file mode 100644 index 000000000..f9d761b9b --- /dev/null +++ b/test/e2e/v2.angular.spec.ts @@ -0,0 +1,52 @@ +import browser from './scripts/browser'; +import { buildAngularProject } from './scripts/buildAngularProject'; +import { cleanup } from './scripts/cleanup'; +import { copyAsset } from './scripts/copyAsset'; +import { createAngularProject } from './scripts/createAngularProject'; +import { generateClient } from './scripts/generateClient'; +import server from './scripts/server'; + +describe('v2.angular', () => { + beforeAll(async () => { + cleanup('v2/angular'); + createAngularProject('v2/angular', 'app'); + await generateClient('v2/angular/app/src', 'v2', 'angular'); + copyAsset('main-angular.ts', 'v2/angular/app/src/main.ts'); + buildAngularProject('v2/angular', 'app', 'dist'); + await server.start('v2/angular/app/dist/browser'); + await browser.start(); + }, 30000); + + afterAll(async () => { + await browser.stop(); + await server.stop(); + }); + + it('requests token', async () => { + await browser.exposeFunction('tokenRequest', jest.fn().mockResolvedValue('MY_TOKEN')); + const result = await browser.evaluate(async () => { + return await new Promise(resolve => { + const { OpenAPI, SimpleService } = (window as any).api; + OpenAPI.TOKEN = (window as any).tokenRequest; + SimpleService.getCallWithoutParametersAndResponse().subscribe(resolve); + }); + }); + expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + }); + + it('supports complex params', async () => { + const result = await browser.evaluate(async () => { + return await new Promise(resolve => { + const { ComplexService } = (window as any).api; + ComplexService.complexTypes({ + first: { + second: { + third: 'Hello World!', + }, + }, + }).subscribe(resolve); + }); + }); + expect(result).toBeDefined(); + }); +}); diff --git a/test/e2e/v2.axios.spec.ts b/test/e2e/v2.axios.spec.ts new file mode 100644 index 000000000..940c740dd --- /dev/null +++ b/test/e2e/v2.axios.spec.ts @@ -0,0 +1,38 @@ +import { cleanup } from './scripts/cleanup'; +import { compileWithTypescript } from './scripts/compileWithTypescript'; +import { generateClient } from './scripts/generateClient'; +import server from './scripts/server'; + +describe('v2.axios', () => { + beforeAll(async () => { + cleanup('v2/axios'); + await generateClient('v2/axios', 'v2', 'axios'); + compileWithTypescript('v2/axios'); + await server.start('v2/axios'); + }, 30000); + + afterAll(async () => { + await server.stop(); + }); + + it('requests token', async () => { + const { OpenAPI, SimpleService } = require('./generated/v2/axios/index.js'); + const tokenRequest = jest.fn().mockResolvedValue('MY_TOKEN'); + OpenAPI.TOKEN = tokenRequest; + const result = await SimpleService.getCallWithoutParametersAndResponse(); + expect(tokenRequest.mock.calls.length).toBe(1); + expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + }); + + it('supports complex params', async () => { + const { ComplexService } = require('./generated/v2/axios/index.js'); + const result = await ComplexService.complexTypes({ + first: { + second: { + third: 'Hello World!', + }, + }, + }); + expect(result).toBeDefined(); + }); +}); diff --git a/test/e2e/v2.babel.spec.ts b/test/e2e/v2.babel.spec.ts new file mode 100644 index 000000000..63f7461c4 --- /dev/null +++ b/test/e2e/v2.babel.spec.ts @@ -0,0 +1,49 @@ +import browser from './scripts/browser'; +import { cleanup } from './scripts/cleanup'; +import { compileWithBabel } from './scripts/compileWithBabel'; +import { copyAsset } from './scripts/copyAsset'; +import { generateClient } from './scripts/generateClient'; +import server from './scripts/server'; + +describe('v2.babel', () => { + beforeAll(async () => { + cleanup('v2/babel'); + await generateClient('v2/babel', 'v2', 'fetch', true, true); + copyAsset('index.html', 'v2/babel/index.html'); + copyAsset('main.ts', 'v2/babel/main.ts'); + compileWithBabel('v2/babel'); + await server.start('v2/babel'); + await browser.start(); + }, 30000); + + afterAll(async () => { + await browser.stop(); + await server.stop(); + }); + + it('requests token', async () => { + await browser.exposeFunction('tokenRequest', jest.fn().mockResolvedValue('MY_TOKEN')); + const result = await browser.evaluate(async () => { + const { OpenAPI, SimpleService } = (window as any).api; + OpenAPI.TOKEN = (window as any).tokenRequest; + return await SimpleService.getCallWithoutParametersAndResponse(); + }); + expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + }); + + it('supports complex params', async () => { + const result = await browser.evaluate(async () => { + const { ComplexService } = (window as any).api; + return await ComplexService.complexTypes({ + parameterObject: { + first: { + second: { + third: 'Hello World!', + }, + }, + }, + }); + }); + expect(result).toBeDefined(); + }); +}); diff --git a/test/e2e/v2.fetch.spec.ts b/test/e2e/v2.fetch.spec.ts new file mode 100644 index 000000000..54c6311a4 --- /dev/null +++ b/test/e2e/v2.fetch.spec.ts @@ -0,0 +1,47 @@ +import browser from './scripts/browser'; +import { cleanup } from './scripts/cleanup'; +import { compileWithTypescript } from './scripts/compileWithTypescript'; +import { copyAsset } from './scripts/copyAsset'; +import { generateClient } from './scripts/generateClient'; +import server from './scripts/server'; + +describe('v2.fetch', () => { + beforeAll(async () => { + cleanup('v2/fetch'); + await generateClient('v2/fetch', 'v2', 'fetch'); + copyAsset('index.html', 'v2/fetch/index.html'); + copyAsset('main.ts', 'v2/fetch/main.ts'); + compileWithTypescript('v2/fetch'); + await server.start('v2/fetch'); + await browser.start(); + }, 30000); + + afterAll(async () => { + await browser.stop(); + await server.stop(); + }); + + it('requests token', async () => { + await browser.exposeFunction('tokenRequest', jest.fn().mockResolvedValue('MY_TOKEN')); + const result = await browser.evaluate(async () => { + const { OpenAPI, SimpleService } = (window as any).api; + OpenAPI.TOKEN = (window as any).tokenRequest; + return await SimpleService.getCallWithoutParametersAndResponse(); + }); + expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + }); + + it('supports complex params', async () => { + const result = await browser.evaluate(async () => { + const { ComplexService } = (window as any).api; + return await ComplexService.complexTypes({ + first: { + second: { + third: 'Hello World!', + }, + }, + }); + }); + expect(result).toBeDefined(); + }); +}); diff --git a/test/e2e/v2.node.spec.ts b/test/e2e/v2.node.spec.ts new file mode 100644 index 000000000..e38176ee5 --- /dev/null +++ b/test/e2e/v2.node.spec.ts @@ -0,0 +1,53 @@ +import { cleanup } from './scripts/cleanup'; +import { compileWithTypescript } from './scripts/compileWithTypescript'; +import { generateClient } from './scripts/generateClient'; +import server from './scripts/server'; + +describe('v2.node', () => { + beforeAll(async () => { + cleanup('v2/node'); + await generateClient('v2/node', 'v2', 'node'); + compileWithTypescript('v2/node'); + await server.start('v2/node'); + }, 30000); + + afterAll(async () => { + await server.stop(); + }); + + it('requests token', async () => { + const { OpenAPI, SimpleService } = require('./generated/v2/node/index.js'); + const tokenRequest = jest.fn().mockResolvedValue('MY_TOKEN'); + OpenAPI.TOKEN = tokenRequest; + const result = await SimpleService.getCallWithoutParametersAndResponse(); + expect(tokenRequest.mock.calls.length).toBe(1); + expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + }); + + it('supports complex params', async () => { + const { ComplexService } = require('./generated/v2/node/index.js'); + const result = await ComplexService.complexTypes({ + first: { + second: { + third: 'Hello World!', + }, + }, + }); + expect(result).toBeDefined(); + }); + + it('can abort the request', async () => { + let error; + try { + const { SimpleService } = require('./generated/v2/node/index.js'); + const promise = SimpleService.getCallWithoutParametersAndResponse(); + setTimeout(() => { + promise.cancel(); + }, 10); + await promise; + } catch (e) { + error = (e as Error).message; + } + expect(error).toContain('Request aborted'); + }); +}); diff --git a/test/e2e/v2.xhr.spec.ts b/test/e2e/v2.xhr.spec.ts new file mode 100644 index 000000000..d6149757e --- /dev/null +++ b/test/e2e/v2.xhr.spec.ts @@ -0,0 +1,47 @@ +import browser from './scripts/browser'; +import { cleanup } from './scripts/cleanup'; +import { compileWithTypescript } from './scripts/compileWithTypescript'; +import { copyAsset } from './scripts/copyAsset'; +import { generateClient } from './scripts/generateClient'; +import server from './scripts/server'; + +describe('v2.xhr', () => { + beforeAll(async () => { + cleanup('v2/xhr'); + await generateClient('v2/xhr', 'v2', 'xhr'); + copyAsset('index.html', 'v2/xhr/index.html'); + copyAsset('main.ts', 'v2/xhr/main.ts'); + compileWithTypescript('v2/xhr'); + await server.start('v2/xhr'); + await browser.start(); + }, 30000); + + afterAll(async () => { + await browser.stop(); + await server.stop(); + }); + + it('requests token', async () => { + await browser.exposeFunction('tokenRequest', jest.fn().mockResolvedValue('MY_TOKEN')); + const result = await browser.evaluate(async () => { + const { OpenAPI, SimpleService } = (window as any).api; + OpenAPI.TOKEN = (window as any).tokenRequest; + return await SimpleService.getCallWithoutParametersAndResponse(); + }); + expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + }); + + it('supports complex params', async () => { + const result = await browser.evaluate(async () => { + const { ComplexService } = (window as any).api; + return await ComplexService.complexTypes({ + first: { + second: { + third: 'Hello World!', + }, + }, + }); + }); + expect(result).toBeDefined(); + }); +}); diff --git a/test/e2e/v3.angular.spec.ts b/test/e2e/v3.angular.spec.ts new file mode 100644 index 000000000..b0d0fb104 --- /dev/null +++ b/test/e2e/v3.angular.spec.ts @@ -0,0 +1,159 @@ +import browser from './scripts/browser'; +import { buildAngularProject } from './scripts/buildAngularProject'; +import { cleanup } from './scripts/cleanup'; +import { copyAsset } from './scripts/copyAsset'; +import { createAngularProject } from './scripts/createAngularProject'; +import { generateClient } from './scripts/generateClient'; +import server from './scripts/server'; + +describe('v3.angular', () => { + beforeAll(async () => { + cleanup('v3/angular'); + createAngularProject('v3/angular', 'app'); + await generateClient('v3/angular/app/src', 'v3', 'angular'); + copyAsset('main-angular.ts', 'v3/angular/app/src/main.ts'); + buildAngularProject('v3/angular', 'app', 'dist'); + await server.start('v3/angular/app/dist/browser'); + await browser.start(); + }, 30000); + + afterAll(async () => { + await browser.stop(); + await server.stop(); + }); + + it('requests token', async () => { + await browser.exposeFunction('tokenRequest', jest.fn().mockResolvedValue('MY_TOKEN')); + const result = await browser.evaluate(async () => { + return await new Promise(resolve => { + const { OpenAPI, SimpleService } = (window as any).api; + OpenAPI.TOKEN = (window as any).tokenRequest; + OpenAPI.USERNAME = undefined; + OpenAPI.PASSWORD = undefined; + SimpleService.getCallWithoutParametersAndResponse().subscribe(resolve); + }); + }); + expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + }); + + it('uses credentials', async () => { + const result = await browser.evaluate(async () => { + return await new Promise(resolve => { + const { OpenAPI, SimpleService } = (window as any).api; + OpenAPI.TOKEN = undefined; + OpenAPI.USERNAME = 'username'; + OpenAPI.PASSWORD = 'password'; + SimpleService.getCallWithoutParametersAndResponse().subscribe(resolve); + }); + }); + expect(result.headers.authorization).toBe('Basic dXNlcm5hbWU6cGFzc3dvcmQ='); + }); + + it('supports complex params', async () => { + const result = await browser.evaluate(async () => { + return await new Promise(resolve => { + const { ComplexService } = (window as any).api; + ComplexService.complexTypes({ + first: { + second: { + third: 'Hello World!', + }, + }, + }).subscribe(resolve); + }); + }); + expect(result).toBeDefined(); + }); + + it('support form data', async () => { + const result = await browser.evaluate(async () => { + return await new Promise(resolve => { + const { ParametersService } = (window as any).api; + ParametersService.callWithParameters( + 'valueHeader', + 'valueQuery', + 'valueForm', + 'valueCookie', + 'valuePath', + { + prop: 'valueBody', + } + ).subscribe(resolve); + }); + }); + expect(result).toBeDefined(); + }); + + it('should throw known error (500)', async () => { + const error = await browser.evaluate(async () => { + try { + await new Promise((resolve, reject) => { + const { ErrorService } = (window as any).api; + ErrorService.testErrorCode(500).subscribe(resolve, reject); + }); + } catch (e) { + const error = e as any; + return JSON.stringify({ + name: error.name, + message: error.message, + url: error.url, + status: error.status, + statusText: error.statusText, + body: error.body, + }); + } + return; + }); + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: 'Custom message: Internal Server Error', + url: 'http://localhost:3000/base/api/v1.0/error?status=500', + status: 500, + statusText: 'Internal Server Error', + body: { + status: 500, + message: 'hello world', + }, + }) + ); + }); + + it('should throw unknown error (409)', async () => { + const error = await browser.evaluate(async () => { + const { ErrorService } = (window as any).api; + ErrorService.testErrorCode(409).subscribe(console.log, console.log); + try { + await new Promise((resolve, reject) => { + // const { ErrorService } = (window as any).api; + ErrorService.testErrorCode(409).subscribe(resolve, reject); + }); + } catch (e) { + const error = e as any; + return JSON.stringify({ + name: error.name, + message: error.message, + url: error.url, + status: error.status, + statusText: error.statusText, + body: error.body, + }); + } + return; + }); + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: + 'Generic Error: status: 409; status text: Conflict; body: {\n "status": 409,\n "message": "hello world"\n}', + url: 'http://localhost:3000/base/api/v1.0/error?status=409', + status: 409, + statusText: 'Conflict', + body: { + status: 409, + message: 'hello world', + }, + }) + ); + }); +}); diff --git a/test/e2e/v3.axios.spec.ts b/test/e2e/v3.axios.spec.ts new file mode 100644 index 000000000..56b21be3e --- /dev/null +++ b/test/e2e/v3.axios.spec.ts @@ -0,0 +1,152 @@ +import { cleanup } from './scripts/cleanup'; +import { compileWithTypescript } from './scripts/compileWithTypescript'; +import { generateClient } from './scripts/generateClient'; +import server from './scripts/server'; + +describe('v3.axios', () => { + beforeAll(async () => { + cleanup('v3/axios'); + await generateClient('v3/axios', 'v3', 'axios'); + compileWithTypescript('v3/axios'); + await server.start('v3/axios'); + }, 30000); + + afterAll(async () => { + await server.stop(); + }); + + it('requests token', async () => { + const { OpenAPI, SimpleService } = require('./generated/v3/axios/index.js'); + const tokenRequest = jest.fn().mockResolvedValue('MY_TOKEN'); + OpenAPI.TOKEN = tokenRequest; + OpenAPI.USERNAME = undefined; + OpenAPI.PASSWORD = undefined; + const result = await SimpleService.getCallWithoutParametersAndResponse(); + expect(tokenRequest.mock.calls.length).toBe(1); + expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + }); + + it('uses credentials', async () => { + const { OpenAPI, SimpleService } = require('./generated/v3/axios/index.js'); + OpenAPI.TOKEN = undefined; + OpenAPI.USERNAME = 'username'; + OpenAPI.PASSWORD = 'password'; + const result = await SimpleService.getCallWithoutParametersAndResponse(); + expect(result.headers.authorization).toBe('Basic dXNlcm5hbWU6cGFzc3dvcmQ='); + }); + + it('supports complex params', async () => { + const { ComplexService } = require('./generated/v3/axios/index.js'); + const result = await ComplexService.complexTypes({ + first: { + second: { + third: 'Hello World!', + }, + }, + }); + expect(result).toBeDefined(); + }); + + it('supports form data', async () => { + const { ParametersService } = require('./generated/v3/axios/index.js'); + const result = await ParametersService.callWithParameters( + 'valueHeader', + 'valueQuery', + 'valueForm', + 'valueCookie', + 'valuePath', + { + prop: 'valueBody', + } + ); + expect(result).toBeDefined(); + }); + + it('can abort the request', async () => { + let error; + try { + const { SimpleService } = require('./generated/v3/axios/index.js'); + const promise = SimpleService.getCallWithoutParametersAndResponse(); + setTimeout(() => { + promise.cancel(); + }, 10); + await promise; + } catch (e) { + error = (e as Error).message; + } + expect(error).toContain('Request aborted'); + }); + + it('should throw known error (500)', async () => { + let error; + try { + const { ErrorService } = require('./generated/v3/axios/index.js'); + await ErrorService.testErrorCode(500); + } catch (e) { + const err = e as any; + error = JSON.stringify({ + name: err.name, + message: err.message, + url: err.url, + status: err.status, + statusText: err.statusText, + body: err.body, + }); + } + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: 'Custom message: Internal Server Error', + url: 'http://localhost:3000/base/api/v1.0/error?status=500', + status: 500, + statusText: 'Internal Server Error', + body: { + status: 500, + message: 'hello world', + }, + }) + ); + }); + + it('should throw unknown error (409)', async () => { + let error; + try { + const { ErrorService } = require('./generated/v3/axios/index.js'); + await ErrorService.testErrorCode(409); + } catch (e) { + const err = e as any; + error = JSON.stringify({ + name: err.name, + message: err.message, + url: err.url, + status: err.status, + statusText: err.statusText, + body: err.body, + }); + } + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: + 'Generic Error: status: 409; status text: Conflict; body: {\n "status": 409,\n "message": "hello world"\n}', + url: 'http://localhost:3000/base/api/v1.0/error?status=409', + status: 409, + statusText: 'Conflict', + body: { + status: 409, + message: 'hello world', + }, + }) + ); + }); + + it('it should parse query params', async () => { + const { ParametersService } = require('./generated/v3/axios/index.js'); + const result = (await ParametersService.postCallWithOptionalParam({ + page: 0, + size: 1, + sort: ['location'], + })) as Promise; + expect((result as any).query).toStrictEqual({ parameter: { page: '0', size: '1', sort: 'location' } }); + }); +}); diff --git a/test/e2e/v3.babel.spec.ts b/test/e2e/v3.babel.spec.ts new file mode 100644 index 000000000..5ce2a366e --- /dev/null +++ b/test/e2e/v3.babel.spec.ts @@ -0,0 +1,182 @@ +import browser from './scripts/browser'; +import { cleanup } from './scripts/cleanup'; +import { compileWithBabel } from './scripts/compileWithBabel'; +import { copyAsset } from './scripts/copyAsset'; +import { generateClient } from './scripts/generateClient'; +import server from './scripts/server'; + +describe('v3.babel', () => { + beforeAll(async () => { + cleanup('v3/babel'); + await generateClient('v3/babel', 'v3', 'fetch', true, true); + copyAsset('index.html', 'v3/babel/index.html'); + copyAsset('main.ts', 'v3/babel/main.ts'); + compileWithBabel('v3/babel'); + await server.start('v3/babel'); + await browser.start(); + }, 30000); + + afterAll(async () => { + await browser.stop(); + await server.stop(); + }); + + it('requests token', async () => { + await browser.exposeFunction('tokenRequest', jest.fn().mockResolvedValue('MY_TOKEN')); + const result = await browser.evaluate(async () => { + const { OpenAPI, SimpleService } = (window as any).api; + OpenAPI.TOKEN = (window as any).tokenRequest; + OpenAPI.USERNAME = undefined; + OpenAPI.PASSWORD = undefined; + return await SimpleService.getCallWithoutParametersAndResponse(); + }); + expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + }); + + it('uses credentials', async () => { + const result = await browser.evaluate(async () => { + const { OpenAPI, SimpleService } = (window as any).api; + OpenAPI.TOKEN = undefined; + OpenAPI.USERNAME = 'username'; + OpenAPI.PASSWORD = 'password'; + return await SimpleService.getCallWithoutParametersAndResponse(); + }); + expect(result.headers.authorization).toBe('Basic dXNlcm5hbWU6cGFzc3dvcmQ='); + }); + + it('supports complex params', async () => { + const result = await browser.evaluate(async () => { + const { ComplexService } = (window as any).api; + return await ComplexService.complexTypes({ + parameterObject: { + first: { + second: { + third: 'Hello World!', + }, + }, + }, + }); + }); + expect(result).toBeDefined(); + }); + + it('support form data', async () => { + const result = await browser.evaluate(async () => { + const { ParametersService } = (window as any).api; + return await ParametersService.callWithParameters({ + parameterHeader: 'valueHeader', + parameterQuery: 'valueQuery', + parameterForm: 'valueForm', + parameterCookie: 'valueCookie', + parameterPath: 'valuePath', + requestBody: { + prop: 'valueBody', + }, + }); + }); + expect(result).toBeDefined(); + }); + + it('can abort the request', async () => { + let error; + try { + await browser.evaluate(async () => { + const { SimpleService } = (window as any).api; + const promise = SimpleService.getCallWithoutParametersAndResponse(); + setTimeout(() => { + promise.cancel(); + }, 10); + await promise; + }); + } catch (e) { + error = (e as Error).message; + } + expect(error).toContain('Request aborted'); + }); + + it('should throw known error (500)', async () => { + const error = await browser.evaluate(async () => { + try { + const { ErrorService } = (window as any).api; + await ErrorService.testErrorCode({ + status: 500, + }); + } catch (e) { + const error = e as any; + return JSON.stringify({ + name: error.name, + message: error.message, + url: error.url, + status: error.status, + statusText: error.statusText, + body: error.body, + }); + } + return; + }); + + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: 'Custom message: Internal Server Error', + url: 'http://localhost:3000/base/api/v1.0/error?status=500', + status: 500, + statusText: 'Internal Server Error', + body: { + status: 500, + message: 'hello world', + }, + }) + ); + }); + + it('should throw unknown error (409)', async () => { + const error = await browser.evaluate(async () => { + try { + const { ErrorService } = (window as any).api; + await ErrorService.testErrorCode({ + status: 409, + }); + } catch (e) { + const error = e as any; + return JSON.stringify({ + name: error.name, + message: error.message, + url: error.url, + status: error.status, + statusText: error.statusText, + body: error.body, + }); + } + return; + }); + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: + 'Generic Error: status: 409; status text: Conflict; body: {\n "status": 409,\n "message": "hello world"\n}', + url: 'http://localhost:3000/base/api/v1.0/error?status=409', + status: 409, + statusText: 'Conflict', + body: { + status: 409, + message: 'hello world', + }, + }) + ); + }); + + it('it should parse query params', async () => { + const result = await browser.evaluate(async () => { + const { ParametersService } = (window as any).api; + return (await ParametersService.postCallWithOptionalParam({ + parameter: { + page: 0, + size: 1, + sort: ['location'], + }, + })) as Promise; + }); + expect(result.query).toStrictEqual({ parameter: { page: '0', size: '1', sort: 'location' } }); + }); +}); diff --git a/test/e2e/v3.fetch.spec.ts b/test/e2e/v3.fetch.spec.ts new file mode 100644 index 000000000..547853a70 --- /dev/null +++ b/test/e2e/v3.fetch.spec.ts @@ -0,0 +1,174 @@ +import browser from './scripts/browser'; +import { cleanup } from './scripts/cleanup'; +import { compileWithTypescript } from './scripts/compileWithTypescript'; +import { copyAsset } from './scripts/copyAsset'; +import { generateClient } from './scripts/generateClient'; +import server from './scripts/server'; + +describe('v3.fetch', () => { + beforeAll(async () => { + cleanup('v3/fetch'); + await generateClient('v3/fetch', 'v3', 'fetch'); + copyAsset('index.html', 'v3/fetch/index.html'); + copyAsset('main.ts', 'v3/fetch/main.ts'); + compileWithTypescript('v3/fetch'); + await server.start('v3/fetch'); + await browser.start(); + }, 30000); + + afterAll(async () => { + await browser.stop(); + await server.stop(); + }); + + it('requests token', async () => { + await browser.exposeFunction('tokenRequest', jest.fn().mockResolvedValue('MY_TOKEN')); + const result = await browser.evaluate(async () => { + const { OpenAPI, SimpleService } = (window as any).api; + OpenAPI.TOKEN = (window as any).tokenRequest; + OpenAPI.USERNAME = undefined; + OpenAPI.PASSWORD = undefined; + return await SimpleService.getCallWithoutParametersAndResponse(); + }); + expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + }); + + it('uses credentials', async () => { + const result = await browser.evaluate(async () => { + const { OpenAPI, SimpleService } = (window as any).api; + OpenAPI.TOKEN = undefined; + OpenAPI.USERNAME = 'username'; + OpenAPI.PASSWORD = 'password'; + return await SimpleService.getCallWithoutParametersAndResponse(); + }); + expect(result.headers.authorization).toBe('Basic dXNlcm5hbWU6cGFzc3dvcmQ='); + }); + + it('supports complex params', async () => { + const result = await browser.evaluate(async () => { + const { ComplexService } = (window as any).api; + return await ComplexService.complexTypes({ + first: { + second: { + third: 'Hello World!', + }, + }, + }); + }); + expect(result).toBeDefined(); + }); + + it('support form data', async () => { + const result = await browser.evaluate(async () => { + const { ParametersService } = (window as any).api; + return await ParametersService.callWithParameters( + 'valueHeader', + 'valueQuery', + 'valueForm', + 'valueCookie', + 'valuePath', + { + prop: 'valueBody', + } + ); + }); + expect(result).toBeDefined(); + }); + + it('can abort the request', async () => { + let error; + try { + await browser.evaluate(async () => { + const { SimpleService } = (window as any).api; + const promise = SimpleService.getCallWithoutParametersAndResponse(); + setTimeout(() => { + promise.cancel(); + }, 10); + await promise; + }); + } catch (e) { + error = (e as Error).message; + } + expect(error).toContain('Request aborted'); + }); + + it('should throw known error (500)', async () => { + const error = await browser.evaluate(async () => { + try { + const { ErrorService } = (window as any).api; + await ErrorService.testErrorCode(500); + } catch (e) { + const error = e as any; + return JSON.stringify({ + name: error.name, + message: error.message, + url: error.url, + status: error.status, + statusText: error.statusText, + body: error.body, + }); + } + return; + }); + + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: 'Custom message: Internal Server Error', + url: 'http://localhost:3000/base/api/v1.0/error?status=500', + status: 500, + statusText: 'Internal Server Error', + body: { + status: 500, + message: 'hello world', + }, + }) + ); + }); + + it('should throw unknown error (409)', async () => { + const error = await browser.evaluate(async () => { + try { + const { ErrorService } = (window as any).api; + await ErrorService.testErrorCode(409); + } catch (e) { + const error = e as any; + return JSON.stringify({ + name: error.name, + message: error.message, + url: error.url, + status: error.status, + statusText: error.statusText, + body: error.body, + }); + } + return; + }); + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: + 'Generic Error: status: 409; status text: Conflict; body: {\n "status": 409,\n "message": "hello world"\n}', + url: 'http://localhost:3000/base/api/v1.0/error?status=409', + status: 409, + statusText: 'Conflict', + body: { + status: 409, + message: 'hello world', + }, + }) + ); + }); + + it('it should parse query params', async () => { + const result = await browser.evaluate(async () => { + const { ParametersService } = (window as any).api; + return (await ParametersService.postCallWithOptionalParam({ + page: 0, + size: 1, + sort: ['location'], + })) as Promise; + }); + expect(result.query).toStrictEqual({ parameter: { page: '0', size: '1', sort: 'location' } }); + }); +}); diff --git a/test/e2e/v3.node.spec.ts b/test/e2e/v3.node.spec.ts new file mode 100644 index 000000000..6d6a484ce --- /dev/null +++ b/test/e2e/v3.node.spec.ts @@ -0,0 +1,152 @@ +import { cleanup } from './scripts/cleanup'; +import { compileWithTypescript } from './scripts/compileWithTypescript'; +import { generateClient } from './scripts/generateClient'; +import server from './scripts/server'; + +describe('v3.node', () => { + beforeAll(async () => { + cleanup('v3/node'); + await generateClient('v3/node', 'v3', 'node'); + compileWithTypescript('v3/node'); + await server.start('v3/node'); + }, 30000); + + afterAll(async () => { + await server.stop(); + }); + + it('requests token', async () => { + const { OpenAPI, SimpleService } = require('./generated/v3/node/index.js'); + const tokenRequest = jest.fn().mockResolvedValue('MY_TOKEN'); + OpenAPI.TOKEN = tokenRequest; + OpenAPI.USERNAME = undefined; + OpenAPI.PASSWORD = undefined; + const result = await SimpleService.getCallWithoutParametersAndResponse(); + expect(tokenRequest.mock.calls.length).toBe(1); + expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + }); + + it('uses credentials', async () => { + const { OpenAPI, SimpleService } = require('./generated/v3/node/index.js'); + OpenAPI.TOKEN = undefined; + OpenAPI.USERNAME = 'username'; + OpenAPI.PASSWORD = 'password'; + const result = await SimpleService.getCallWithoutParametersAndResponse(); + expect(result.headers.authorization).toBe('Basic dXNlcm5hbWU6cGFzc3dvcmQ='); + }); + + it('supports complex params', async () => { + const { ComplexService } = require('./generated/v3/node/index.js'); + const result = await ComplexService.complexTypes({ + first: { + second: { + third: 'Hello World!', + }, + }, + }); + expect(result).toBeDefined(); + }); + + it('support form data', async () => { + const { ParametersService } = require('./generated/v3/node/index.js'); + const result = await ParametersService.callWithParameters( + 'valueHeader', + 'valueQuery', + 'valueForm', + 'valueCookie', + 'valuePath', + { + prop: 'valueBody', + } + ); + expect(result).toBeDefined(); + }); + + it('can abort the request', async () => { + let error; + try { + const { SimpleService } = require('./generated/v3/node/index.js'); + const promise = SimpleService.getCallWithoutParametersAndResponse(); + setTimeout(() => { + promise.cancel(); + }, 10); + await promise; + } catch (e) { + error = (e as Error).message; + } + expect(error).toContain('Request aborted'); + }); + + it('should throw known error (500)', async () => { + let error; + try { + const { ErrorService } = require('./generated/v3/node/index.js'); + await ErrorService.testErrorCode(500); + } catch (e) { + const err = e as any; + error = JSON.stringify({ + name: err.name, + message: err.message, + url: err.url, + status: err.status, + statusText: err.statusText, + body: err.body, + }); + } + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: 'Custom message: Internal Server Error', + url: 'http://localhost:3000/base/api/v1.0/error?status=500', + status: 500, + statusText: 'Internal Server Error', + body: { + status: 500, + message: 'hello world', + }, + }) + ); + }); + + it('should throw unknown error (409)', async () => { + let error; + try { + const { ErrorService } = require('./generated/v3/node/index.js'); + await ErrorService.testErrorCode(409); + } catch (e) { + const err = e as any; + error = JSON.stringify({ + name: err.name, + message: err.message, + url: err.url, + status: err.status, + statusText: err.statusText, + body: err.body, + }); + } + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: + 'Generic Error: status: 409; status text: Conflict; body: {\n "status": 409,\n "message": "hello world"\n}', + url: 'http://localhost:3000/base/api/v1.0/error?status=409', + status: 409, + statusText: 'Conflict', + body: { + status: 409, + message: 'hello world', + }, + }) + ); + }); + + it('it should parse query params', async () => { + const { ParametersService } = require('./generated/v3/node/index.js'); + const result = (await ParametersService.postCallWithOptionalParam({ + page: 0, + size: 1, + sort: ['location'], + })) as Promise; + expect((result as any).query).toStrictEqual({ parameter: { page: '0', size: '1', sort: 'location' } }); + }); +}); diff --git a/test/e2e/v3.xhr.spec.ts b/test/e2e/v3.xhr.spec.ts new file mode 100644 index 000000000..d1fac6e1c --- /dev/null +++ b/test/e2e/v3.xhr.spec.ts @@ -0,0 +1,173 @@ +import browser from './scripts/browser'; +import { cleanup } from './scripts/cleanup'; +import { compileWithTypescript } from './scripts/compileWithTypescript'; +import { copyAsset } from './scripts/copyAsset'; +import { generateClient } from './scripts/generateClient'; +import server from './scripts/server'; + +describe('v3.xhr', () => { + beforeAll(async () => { + cleanup('v3/xhr'); + await generateClient('v3/xhr', 'v3', 'xhr'); + copyAsset('index.html', 'v3/xhr/index.html'); + copyAsset('main.ts', 'v3/xhr/main.ts'); + compileWithTypescript('v3/xhr'); + await server.start('v3/xhr'); + await browser.start(); + }, 30000); + + afterAll(async () => { + await browser.stop(); + await server.stop(); + }); + + it('requests token', async () => { + await browser.exposeFunction('tokenRequest', jest.fn().mockResolvedValue('MY_TOKEN')); + const result = await browser.evaluate(async () => { + const { OpenAPI, SimpleService } = (window as any).api; + OpenAPI.TOKEN = (window as any).tokenRequest; + OpenAPI.USERNAME = undefined; + OpenAPI.PASSWORD = undefined; + return await SimpleService.getCallWithoutParametersAndResponse(); + }); + expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + }); + + it('uses credentials', async () => { + const result = await browser.evaluate(async () => { + const { OpenAPI, SimpleService } = (window as any).api; + OpenAPI.TOKEN = undefined; + OpenAPI.USERNAME = 'username'; + OpenAPI.PASSWORD = 'password'; + return await SimpleService.getCallWithoutParametersAndResponse(); + }); + expect(result.headers.authorization).toBe('Basic dXNlcm5hbWU6cGFzc3dvcmQ='); + }); + + it('supports complex params', async () => { + const result = await browser.evaluate(async () => { + const { ComplexService } = (window as any).api; + return await ComplexService.complexTypes({ + first: { + second: { + third: 'Hello World!', + }, + }, + }); + }); + expect(result).toBeDefined(); + }); + + it('support form data', async () => { + const result = await browser.evaluate(async () => { + const { ParametersService } = (window as any).api; + return await ParametersService.callWithParameters( + 'valueHeader', + 'valueQuery', + 'valueForm', + 'valueCookie', + 'valuePath', + { + prop: 'valueBody', + } + ); + }); + expect(result).toBeDefined(); + }); + + it('can abort the request', async () => { + let error; + try { + await browser.evaluate(async () => { + const { SimpleService } = (window as any).api; + const promise = SimpleService.getCallWithoutParametersAndResponse(); + setTimeout(() => { + promise.cancel(); + }, 10); + await promise; + }); + } catch (e) { + error = (e as Error).message; + } + expect(error).toContain('Request aborted'); + }); + + it('should throw known error (500)', async () => { + const error = await browser.evaluate(async () => { + try { + const { ErrorService } = (window as any).api; + await ErrorService.testErrorCode(500); + } catch (e) { + const error = e as any; + return JSON.stringify({ + name: error.name, + message: error.message, + url: error.url, + status: error.status, + statusText: error.statusText, + body: error.body, + }); + } + return; + }); + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: 'Custom message: Internal Server Error', + url: 'http://localhost:3000/base/api/v1.0/error?status=500', + status: 500, + statusText: 'Internal Server Error', + body: { + status: 500, + message: 'hello world', + }, + }) + ); + }); + + it('should throw unknown error (409)', async () => { + const error = await browser.evaluate(async () => { + try { + const { ErrorService } = (window as any).api; + await ErrorService.testErrorCode(409); + } catch (e) { + const error = e as any; + return JSON.stringify({ + name: error.name, + message: error.message, + url: error.url, + status: error.status, + statusText: error.statusText, + body: error.body, + }); + } + return; + }); + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: + 'Generic Error: status: 409; status text: Conflict; body: {\n "status": 409,\n "message": "hello world"\n}', + url: 'http://localhost:3000/base/api/v1.0/error?status=409', + status: 409, + statusText: 'Conflict', + body: { + status: 409, + message: 'hello world', + }, + }) + ); + }); + + it('it should parse query params', async () => { + const result = await browser.evaluate(async () => { + const { ParametersService } = (window as any).api; + return (await ParametersService.postCallWithOptionalParam({ + page: 0, + size: 1, + sort: ['location'], + })) as Promise; + }); + expect(result.query).toStrictEqual({ parameter: { page: '0', size: '1', sort: 'location' } }); + }); +}); diff --git a/test/index.js b/test/index.js index b87a616a0..6d276c412 100644 --- a/test/index.js +++ b/test/index.js @@ -1,32 +1,65 @@ -const OpenAPI = require('../dist'); - -OpenAPI.generate( - './test/mock/spec-v2.json', - './test/result/v2/typescript/', - OpenAPI.Language.TYPESCRIPT, - OpenAPI.HttpClient.FETCH, -); - -OpenAPI.generate( - './test/mock/spec-v2.json', - './test/result/v2/javascript/', - OpenAPI.Language.JAVASCRIPT, - OpenAPI.HttpClient.XHR, -); - -OpenAPI.generate( - './test/mock/spec-v3.json', - './test/result/v3/typescript/', - OpenAPI.Language.TYPESCRIPT, - OpenAPI.HttpClient.FETCH, -); - -OpenAPI.generate( - './test/mock/spec-v3.json', - './test/result/v3/javascript/', - OpenAPI.Language.JAVASCRIPT, - OpenAPI.HttpClient.XHR, -); - -OpenAPI.compile('./test/result/v2/typescript/'); -OpenAPI.compile('./test/result/v3/typescript/'); +'use strict'; + +const OpenAPI = require('../'); +const fetch = require('node-fetch'); + +const generate = async (input, output) => { + await OpenAPI.generate({ + input, + output, + httpClient: OpenAPI.HttpClient.FETCH, + useOptions: true, + useUnionTypes: false, + exportCore: true, + exportSchemas: true, + exportModels: true, + exportServices: true, + // clientName: 'Demo', + // indent: OpenAPI.Indent.SPACE_2, + // postfix: 'Service', + // request: './test/custom/request.ts', + }); +}; + +// eslint-disable-next-line @typescript-eslint/no-unused-vars +const generateRealWorldSpecs = async () => { + const response = await fetch('https://api.apis.guru/v2/list.json'); + + const list = await response.json(); + delete list['api.video']; + delete list['apideck.com:vault']; + delete list['amazonaws.com:mediaconvert']; + delete list['bungie.net']; + delete list['docusign.net']; + delete list['googleapis.com:adsense']; + delete list['googleapis.com:servicebroker']; + delete list['kubernetes.io']; + delete list['microsoft.com:graph']; + delete list['presalytics.io:ooxml']; + delete list['stripe.com']; + + const specs = Object.entries(list).map(([name, api]) => { + const latestVersion = api.versions[api.preferred]; + return { + name: name + .replace(/^[^a-zA-Z]+/g, '') + .replace(/[^\w\-]+/g, '-') + .trim() + .toLowerCase(), + url: latestVersion.swaggerYamlUrl || latestVersion.swaggerUrl, + }; + }); + + for (let i = 0; i < specs.length; i++) { + const spec = specs[i]; + await generate(spec.url, `./test/generated/${spec.name}/`); + } +}; + +const main = async () => { + await generate('./test/spec/v2.json', './test/generated/v2/'); + await generate('./test/spec/v3.json', './test/generated/v3/'); + // await generateRealWorldSpecs(); +}; + +main(); diff --git a/test/index.spec.js b/test/index.spec.js deleted file mode 100644 index f715293be..000000000 --- a/test/index.spec.js +++ /dev/null @@ -1,86 +0,0 @@ -const OpenAPI = require('../dist'); -const glob = require('glob'); -const fs = require('fs'); - -describe('generation', () => { - - describe('v2', () => { - - describe('typescript', () => { - - OpenAPI.generate( - './test/mock/spec-v2.json', - './test/result/v2/typescript/', - OpenAPI.Language.TYPESCRIPT, - OpenAPI.HttpClient.FETCH, - ); - - test.each(glob - .sync('./test/result/v2/typescript/**/*.ts') - .map(file => [file]) - )('file(%s)', file => { - const content = fs.readFileSync(file, 'utf8').toString(); - expect(content).toMatchSnapshot(file); - }); - }); - - describe('javascript', () => { - - OpenAPI.generate( - './test/mock/spec-v2.json', - './test/result/v2/javascript/', - OpenAPI.Language.JAVASCRIPT, - OpenAPI.HttpClient.XHR, - ); - - test.each(glob - .sync('./test/result/v2/javascript/**/*.js') - .map(file => [file]) - )('file(%s)', file => { - const content = fs.readFileSync(file, 'utf8').toString(); - expect(content).toMatchSnapshot(file); - }); - }); - }); - - describe('v3', () => { - - describe('typescript', () => { - - OpenAPI.generate( - './test/mock/spec-v3.json', - './test/result/v3/typescript/', - OpenAPI.Language.TYPESCRIPT, - OpenAPI.HttpClient.FETCH, - ); - - test.each(glob - .sync('./test/result/v3/typescript/**/*.ts') - .map(file => [file]) - )('file(%s)', file => { - const content = fs.readFileSync(file, 'utf8').toString(); - expect(content).toMatchSnapshot(file); - }); - }); - - describe('javascript', () => { - - OpenAPI.generate( - './test/mock/spec-v3.json', - './test/result/v3/javascript/', - OpenAPI.Language.JAVASCRIPT, - OpenAPI.HttpClient.XHR, - ); - - test.each(glob - .sync('./test/result/v3/javascript/**/*.js') - .map(file => [file]) - )('file(%s)', file => { - const content = fs.readFileSync(file, 'utf8').toString(); - expect(content).toMatchSnapshot(file); - }); - }); - }); -}); - - diff --git a/test/index.spec.ts b/test/index.spec.ts new file mode 100644 index 000000000..78a0197d5 --- /dev/null +++ b/test/index.spec.ts @@ -0,0 +1,46 @@ +import { readFileSync } from 'fs'; +import { sync } from 'glob'; + +import { generate, HttpClient } from '../'; + +describe('v2', () => { + it('should generate', async () => { + await generate({ + input: './test/spec/v2.json', + output: './test/generated/v2/', + httpClient: HttpClient.FETCH, + useOptions: false, + useUnionTypes: false, + exportCore: true, + exportSchemas: true, + exportModels: true, + exportServices: true, + }); + + sync('./test/generated/v2/**/*.ts').forEach(file => { + const content = readFileSync(file, 'utf8').toString(); + expect(content).toMatchSnapshot(file); + }); + }); +}); + +describe('v3', () => { + it('should generate', async () => { + await generate({ + input: './test/spec/v3.json', + output: './test/generated/v3/', + httpClient: HttpClient.FETCH, + useOptions: false, + useUnionTypes: false, + exportCore: true, + exportSchemas: true, + exportModels: true, + exportServices: true, + }); + + sync('./test/generated/v3/**/*.ts').forEach(file => { + const content = readFileSync(file, 'utf8').toString(); + expect(content).toMatchSnapshot(file); + }); + }); +}); diff --git a/test/mock/spec-v2.json b/test/mock/spec-v2.json deleted file mode 100644 index 5edbb3430..000000000 --- a/test/mock/spec-v2.json +++ /dev/null @@ -1,808 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "version": "v9.0", - "title": "swagger" - }, - "host": "localhost:8080", - "basePath": "/api", - "schemes": [ - "http" - ], - "paths": { - "/api/v{api-version}/simple": { - "get": { - "tags": [ - "Simple" - ], - "operationId": "GetCallWithoutParametersAndResponse" - }, - "put": { - "tags": [ - "Simple" - ], - "operationId": "PutCallWithoutParametersAndResponse" - }, - "post": { - "tags": [ - "Simple" - ], - "operationId": "PostCallWithoutParametersAndResponse" - }, - "delete": { - "tags": [ - "Simple" - ], - "operationId": "DeleteCallWithoutParametersAndResponse" - }, - "options": { - "tags": [ - "Simple" - ], - "operationId": "OptionsCallWithoutParametersAndResponse" - }, - "head": { - "tags": [ - "Simple" - ], - "operationId": "HeadCallWithoutParametersAndResponse" - }, - "patch": { - "tags": [ - "Simple" - ], - "operationId": "PatchCallWithoutParametersAndResponse" - } - }, - "/api/v{api-version}/parameters": { - "get": { - "tags": [ - "Parameters" - ], - "operationId": "CallWithParameters", - "parameters": [ - { - "description": "This is the parameter that goes into the request header", - "name": "parameterHeader", - "in": "header", - "type": "string", - "required": true - }, - { - "description": "This is the parameter that goes into the request query params", - "name": "parameterQuery", - "in": "query", - "type": "string", - "required": true - }, - { - "description": "This is the parameter that goes into the request form data", - "name": "parameterForm", - "in": "formData", - "type": "string", - "required": true - }, - { - "description": "This is the parameter that is send as request body", - "name": "parameterBody", - "in": "body", - "type": "string", - "required": true - }, - { - "name": "api-version", - "in": "path", - "type": "string", - "required": true - } - ] - } - }, - "/api/v{api-version}/response": { - "get": { - "tags": [ - "Response" - ], - "operationId": "CallWithResponse", - "responses": { - "default": { - "description": "Message for default response", - "schema": { - "$ref": "#/definitions/ModelWithString" - } - } - } - }, - "post": { - "tags": [ - "Response" - ], - "operationId": "CallWithDuplicateResponses", - "responses": { - "default": { - "description": "Message for default response", - "schema": { - "$ref": "#/definitions/ModelWithString" - } - }, - "201": { - "description": "Message for 201 response", - "schema": { - "$ref": "#/definitions/ModelWithString" - } - }, - "202": { - "description": "Message for 202 response", - "schema": { - "$ref": "#/definitions/ModelWithString" - } - }, - "500": { - "description": "Message for 500 error", - "schema": { - "$ref": "#/definitions/ModelWithString" - } - }, - "501": { - "description": "Message for 501 error", - "schema": { - "$ref": "#/definitions/ModelWithString" - } - }, - "502": { - "description": "Message for 502 error", - "schema": { - "$ref": "#/definitions/ModelWithString" - } - } - } - }, - "put": { - "tags": [ - "Response" - ], - "operationId": "CallWithResponses", - "responses": { - "default": { - "description": "Message for default response", - "schema": { - "$ref": "#/definitions/ModelWithString" - } - }, - "201": { - "description": "Message for 201 response", - "schema": { - "$ref": "#/definitions/ModelThatExtends" - } - }, - "202": { - "description": "Message for 202 response", - "schema": { - "$ref": "#/definitions/ModelThatExtendsExtends" - } - }, - "500": { - "description": "Message for 500 error", - "schema": { - "$ref": "#/definitions/ModelWithString" - } - }, - "501": { - "description": "Message for 501 error", - "schema": { - "$ref": "#/definitions/ModelWithString" - } - }, - "502": { - "description": "Message for 502 error", - "schema": { - "$ref": "#/definitions/ModelWithString" - } - } - } - } - }, - "/api/v{api-version}/types": { - "get": { - "tags": [ - "Types" - ], - "operationId": "Types", - "parameters": [ - { - "description": "This is a number parameter", - "name": "parameterNumber", - "in": "query", - "required": true, - "default": 123, - "type": "int" - }, - { - "description": "This is a string parameter", - "name": "parameterString", - "in": "query", - "required": true, - "default": "default", - "type": "string" - }, - { - "description": "This is a boolean parameter", - "name": "parameterBoolean", - "in": "query", - "required": true, - "default": true, - "type": "boolean" - }, - { - "description": "This is an object parameter", - "name": "parameterObject", - "in": "query", - "required": true, - "default": null, - "type": "object" - }, - { - "description": "This is an array parameter", - "name": "parameterArray", - "in": "query", - "required": true, - "type": "array", - "items": { - "type": "string" - } - }, - { - "description": "This is a dictionary parameter", - "name": "parameterDictionary", - "in": "query", - "required": true, - "type": "object", - "items": { - "type": "string" - } - }, - { - "description": "This is an enum parameter", - "name": "parameterEnum", - "in": "query", - "required": true, - "schema": { - "enum": [ - "Success", - "Warning", - "Error" - ] - } - }, - { - "description": "This is a number parameter", - "name": "id", - "in": "path", - "schema": { - "type": "integer", - "format": "int32" - } - } - ], - "responses": { - "200": { - "description": "Response is a simple number", - "schema": { - "type": "number" - } - }, - "201": { - "description": "Response is a simple string", - "schema": { - "type": "string" - } - }, - "202": { - "description": "Response is a simple boolean", - "schema": { - "type": "boolean" - } - }, - "203": { - "description": "Response is a simple object", - "default": null, - "schema": { - "type": "object" - } - } - } - } - }, - "/api/v{api-version}/complex": { - "get": { - "tags": [ - "Complex" - ], - "operationId": "ComplexTypes", - "parameters": [ - { - "description": "Parameter containing object", - "name": "parameterObject", - "in": "query", - "required": true, - "schema": { - "type": "object", - "properties": { - "first": { - "type": "object", - "properties": { - "second": { - "type": "object", - "properties": { - "third": { - "type": "string" - } - } - } - } - } - } - } - }, - { - "description": "Parameter containing reference", - "name": "parameterReference", - "in": "query", - "required": true, - "schema": { - "$ref": "#/definitions/ModelWithString" - } - } - ], - "responses": { - "200": { - "description": "Successful response", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/ModelWithString" - } - } - }, - "400": { - "description": "400 server error" - }, - "500": { - "description": "500 server error" - } - } - } - } - }, - "definitions": { - "SimpleInteger": { - "description": "This is a simple number", - "type": "integer" - }, - "SimpleBoolean": { - "description": "This is a simple boolean", - "type": "boolean" - }, - "SimpleString": { - "description": "This is a simple string", - "type": "string" - }, - "SimpleFile": { - "description": "This is a simple file", - "type": "File" - }, - "SimpleReference": { - "description": "This is a simple reference", - "$ref": "#/definitions/ModelWithString" - }, - "EnumWithStrings": { - "description": "This is a simple enum with strings", - "enum": [ - "Success", - "Warning", - "Error" - ] - }, - "EnumWithNumbers": { - "description": "This is a simple enum with numbers", - "enum": [ - 1, - 2, - 3 - ] - }, - "EnumFromDescription": { - "description": "Success=1,Warning=2,Error=3", - "type": "int" - }, - "ArrayWithNumbers": { - "description": "This is a simple array with numbers", - "type": "array", - "items": { - "type": "integer" - } - }, - "ArrayWithBooleans": { - "description": "This is a simple array with booleans", - "type": "array", - "items": { - "type": "boolean" - } - }, - "ArrayWithStrings": { - "description": "This is a simple array with strings", - "type": "array", - "items": { - "type": "string" - } - }, - "ArrayWithReferences": { - "description": "This is a simple array with references", - "type": "array", - "items": { - "$ref": "#/definitions/ModelWithString" - } - }, - "ArrayWithArray": { - "description": "This is a simple array containing an array", - "type": "array", - "items": { - "type": "array", - "items": { - "$ref": "#/definitions/ModelWithString" - } - } - }, - "ArrayWithProperties": { - "description": "This is a simple array with properties", - "type": "array", - "items": { - "type": "object", - "properties": { - "foo": { - "type": "string" - }, - "bar": { - "type": "string" - } - } - } - }, - "DictionaryWithString": { - "description": "This is a string dictionary", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "DictionaryWithReference": { - "description": "This is a string reference", - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/ModelWithString" - } - }, - "DictionaryWithArray": { - "description": "This is a complex dictionary", - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "#/definitions/ModelWithString" - } - } - }, - "DictionaryWithDictionary": { - "description": "This is a string dictionary", - "type": "object", - "additionalProperties": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "DictionaryWithProperties": { - "description": "This is a complex dictionary", - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "foo": { - "type": "string" - }, - "bar": { - "type": "string" - } - } - } - }, - "ModelWithInteger": { - "description": "This is a model with one number property", - "type": "object", - "properties": { - "prop": { - "description": "This is a simple number property", - "type": "integer" - } - } - }, - "ModelWithBoolean": { - "description": "This is a model with one boolean property", - "type": "object", - "properties": { - "prop": { - "description": "This is a simple boolean property", - "type": "boolean" - } - } - }, - "ModelWithString": { - "description": "This is a model with one string property", - "type": "object", - "properties": { - "prop": { - "description": "This is a simple string property", - "type": "string" - } - } - }, - "ModelWithEnum": { - "description": "This is a model with one enum", - "type": "object", - "properties": { - "test": { - "description": "This is a simple enum with strings", - "enum": [ - "Success", - "Warning", - "Error" - ] - } - } - }, - "ModelWithEnumFromDescription": { - "description": "This is a model with one enum", - "type": "object", - "properties": { - "test": { - "type": "integer", - "description": "Success=1,Warning=2,Error=3" - } - } - }, - "ModelWithNestedEnums": { - "description": "This is a model with nested enums", - "type": "object", - "properties": { - "dictionaryWithEnum": { - "type": "object", - "additionalProperties": { - "enum": [ - "Success", - "Warning", - "Error" - ] - } - }, - "dictionaryWithEnumFromDescription": { - "type": "object", - "additionalProperties": { - "type": "integer", - "description": "Success=1,Warning=2,Error=3" - } - }, - "arrayWithEnum": { - "type": "array", - "additionalProperties": { - "enum": [ - "Success", - "Warning", - "Error" - ] - } - }, - "arrayWithDescription": { - "type": "array", - "additionalProperties": { - "type": "integer", - "description": "Success=1,Warning=2,Error=3" - } - } - } - }, - "ModelWithReference": { - "description": "This is a model with one property containing a reference", - "type": "object", - "properties": { - "prop": { - "$ref": "#/definitions/ModelWithString" - } - } - }, - "ModelWithArray": { - "description": "This is a model with one property containing an array", - "type": "object", - "properties": { - "prop": { - "type": "array", - "items": { - "$ref": "#/definitions/ModelWithString" - } - } - } - }, - "ModelWithDictionary": { - "description": "This is a model with one property containing a dictionary", - "type": "object", - "properties": { - "prop": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - } - }, - "ModelLink": { - "description": "This is a model that can have a template??", - "type": "object", - "properties": { - "id": { - "type": "string" - } - } - }, - "ModelWithLink": { - "description": "This is a model that can have a template??", - "type": "object", - "properties": { - "prop": { - "$ref": "#/definitions/ModelLink[ModelWithString]" - } - } - }, - "ModelWithCircularReference": { - "description": "This is a model with one property containing a circular reference", - "type": "object", - "properties": { - "prop": { - "$ref": "#/definitions/ModelWithCircularReference" - } - } - }, - "ModelWithProperties": { - "description": "This is a model with one nested property", - "type": "object", - "required": [ - "required", - "requiredAndreadOnly" - ], - "properties": { - "required": { - "type": "string" - }, - "requiredAndreadOnly": { - "type": "string", - "readOnly": true - }, - "string": { - "type": "string" - }, - "number": { - "type": "number" - }, - "boolean": { - "type": "boolean" - }, - "reference": { - "$ref": "#/definitions/ModelWithString" - } - } - }, - "ModelWithNestedProperties": { - "description": "This is a model with one nested property", - "type": "object", - "required": [ - "first" - ], - "properties": { - "first": { - "type": "object", - "required": [ - "second" - ], - "readOnly": true, - "properties": { - "second": { - "type": "object", - "required": [ - "third" - ], - "readOnly": true, - "properties": { - "third": { - "type": "string", - "readOnly": true - } - } - } - } - } - } - }, - "ModelWithDuplicateProperties": { - "description": "This is a model with duplicated properties", - "type": "object", - "properties": { - "prop": { - "$ref": "#/definitions/ModelWithString" - }, - "prop": { - "$ref": "#/definitions/ModelWithString" - }, - "prop": { - "$ref": "#/definitions/ModelWithString" - } - } - }, - "ModelWithDuplicateImports": { - "description": "This is a model with duplicated imports", - "type": "object", - "properties": { - "propA": { - "$ref": "#/definitions/ModelWithString" - }, - "propB": { - "$ref": "#/definitions/ModelWithString" - }, - "propC": { - "$ref": "#/definitions/ModelWithString" - } - } - }, - "ModelThatExtends": { - "description": "This is a model that extends another model", - "type": "object", - "allOf": [ - { - "$ref": "#/definitions/ModelWithString" - }, - { - "type": "object", - "properties": { - "propExtendsA": { - "type": "string" - }, - "propExtendsB": { - "$ref": "#/definitions/ModelWithString" - } - } - } - ] - }, - "ModelThatExtendsExtends": { - "description": "This is a model that extends another model", - "type": "object", - "allOf": [ - { - "$ref": "#/definitions/ModelWithString" - }, - { - "$ref": "#/definitions/ModelThatExtends" - }, - { - "type": "object", - "properties": { - "propExtendsC": { - "type": "string" - }, - "propExtendsD": { - "$ref": "#/definitions/ModelWithString" - } - } - } - ] - } - } -} diff --git a/test/mock/spec-v3.json b/test/mock/spec-v3.json deleted file mode 100644 index 1b6d5df06..000000000 --- a/test/mock/spec-v3.json +++ /dev/null @@ -1,934 +0,0 @@ -{ - "openapi": "3.0.1", - "info": { - "title": "swagger", - "version": "v1" - }, - "servers": [ - { - "url": "/api" - } - ], - "paths": { - "/api/v{api-version}/simple": { - "get": { - "tags": [ - "Simple" - ], - "operationId": "GetCallWithoutParametersAndResponse" - }, - "put": { - "tags": [ - "Simple" - ], - "operationId": "PutCallWithoutParametersAndResponse" - }, - "post": { - "tags": [ - "Simple" - ], - "operationId": "PostCallWithoutParametersAndResponse" - }, - "delete": { - "tags": [ - "Simple" - ], - "operationId": "DeleteCallWithoutParametersAndResponse" - }, - "options": { - "tags": [ - "Simple" - ], - "operationId": "OptionsCallWithoutParametersAndResponse" - }, - "head": { - "tags": [ - "Simple" - ], - "operationId": "HeadCallWithoutParametersAndResponse" - }, - "patch": { - "tags": [ - "Simple" - ], - "operationId": "PatchCallWithoutParametersAndResponse" - } - }, - "/api/v{api-version}/parameters": { - "get": { - "tags": [ - "Parameters" - ], - "operationId": "CallWithParameters", - "parameters": [ - { - "description": "This is the parameter that goes into the request header", - "name": "parameterHeader", - "in": "header", - "required": true, - "nullable": true, - "schema": { - "type": "string" - } - }, - { - "description": "This is the parameter that goes into the request query params", - "name": "parameterQuery", - "in": "query", - "required": true, - "nullable": true, - "schema": { - "type": "string" - } - }, - { - "description": "This is the parameter that goes into the request form data", - "name": "parameterForm", - "in": "formData", - "required": true, - "nullable": true, - "schema": { - "type": "string" - } - }, - { - "description": "This is the parameter that goes into the cookie", - "name": "parameterCookie", - "in": "cookie", - "required": true, - "nullable": true, - "schema": { - "type": "string" - } - }, - { - "name": "api-version", - "in": "path", - "required": true, - "nullable": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "description": "This is the parameter that goes into the body", - "content": { - "application/json": { - "description": "Message for default response", - "schema": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } - } - } - }, - "/api/v{api-version}/response": { - "get": { - "tags": [ - "Response" - ], - "operationId": "CallWithResponse", - "responses": { - "default": { - "content": { - "application/json": { - "description": "Message for default response", - "schema": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } - } - } - }, - "post": { - "tags": [ - "Response" - ], - "operationId": "CallWithDuplicateResponses", - "responses": { - "default": { - "description": "Message for default response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } - }, - "201": { - "description": "Message for 201 response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } - }, - "202": { - "description": "Message for 202 response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } - }, - "500": { - "description": "Message for 500 error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } - }, - "501": { - "description": "Message for 501 error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } - }, - "502": { - "description": "Message for 502 error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } - } - } - }, - "put": { - "tags": [ - "Response" - ], - "operationId": "CallWithResponses", - "responses": { - "default": { - "description": "Message for default response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } - }, - "201": { - "description": "Message for 201 response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ModelThatExtends" - } - } - } - }, - "202": { - "description": "Message for 202 response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ModelThatExtendsExtends" - } - } - } - }, - "500": { - "description": "Message for 500 error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } - }, - "501": { - "description": "Message for 501 error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } - }, - "502": { - "description": "Message for 502 error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } - } - } - } - }, - "/api/v{api-version}/types": { - "get": { - "tags": [ - "Types" - ], - "operationId": "Types", - "parameters": [ - { - "description": "This is a number parameter", - "name": "parameterNumber", - "in": "query", - "required": true, - "default": 123, - "schema": { - "type": "int" - } - }, - { - "description": "This is a string parameter", - "name": "parameterString", - "in": "query", - "required": true, - "nullable": true, - "default": "default", - "schema": { - "type": "string" - } - }, - { - "description": "This is a boolean parameter", - "name": "parameterBoolean", - "in": "query", - "required": true, - "nullable": true, - "default": true, - "schema": { - "type": "boolean" - } - }, - { - "description": "This is an object parameter", - "name": "parameterObject", - "in": "query", - "required": true, - "nullable": true, - "default": null, - "schema": { - "type": "object" - } - }, - { - "description": "This is an array parameter", - "name": "parameterArray", - "in": "query", - "required": true, - "nullable": true, - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - }, - { - "description": "This is a dictionary parameter", - "name": "parameterDictionary", - "in": "query", - "required": true, - "nullable": true, - "schema": { - "type": "object", - "items": { - "type": "string" - } - } - }, - { - "description": "This is an enum parameter", - "name": "parameterEnum", - "in": "query", - "required": true, - "nullable": true, - "schema": { - "enum": [ - "Success", - "Warning", - "Error" - ] - } - }, - { - "description": "This is a number parameter", - "name": "id", - "in": "path", - "schema": { - "type": "integer", - "format": "int32" - } - } - ], - "responses": { - "200": { - "description": "Response is a simple number", - "content": { - "application/json": { - "schema": { - "type": "number" - } - } - } - }, - "201": { - "description": "Response is a simple string", - "content": { - "application/json": { - "schema": { - "type": "string" - } - } - } - }, - "202": { - "description": "Response is a simple boolean", - "content": { - "application/json": { - "schema": { - "type": "boolean" - } - } - } - }, - "203": { - "description": "Response is a simple object", - "content": { - "application/json": { - "schema": { - "type": "object" - } - } - } - } - } - } - }, - "/api/v{api-version}/complex": { - "get": { - "tags": [ - "Complex" - ], - "operationId": "ComplexTypes", - "parameters": [ - { - "description": "Parameter containing object", - "name": "parameterObject", - "in": "query", - "required": true, - "schema": { - "type": "object", - "properties": { - "first": { - "type": "object", - "properties": { - "second": { - "type": "object", - "properties": { - "third": { - "type": "string" - } - } - } - } - } - } - } - }, - { - "description": "Parameter containing reference", - "name": "parameterReference", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/ModelWithString" - } - } - ], - "responses": { - "200": { - "description": "Successful response", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } - } - }, - "400": { - "description": "400 server error" - }, - "500": { - "description": "500 server error" - } - } - } - } - }, - "components": { - "schemas": { - "SimpleInteger": { - "description": "This is a simple number", - "type": "integer" - }, - "SimpleBoolean": { - "description": "This is a simple boolean", - "type": "boolean" - }, - "SimpleString": { - "description": "This is a simple string", - "type": "string" - }, - "SimpleFile": { - "description": "This is a simple file", - "type": "File" - }, - "SimpleReference": { - "description": "This is a simple reference", - "$ref": "#/components/schemas/ModelWithString" - }, - "EnumWithStrings": { - "description": "This is a simple enum with strings", - "enum": [ - "Success", - "Warning", - "Error" - ] - }, - "EnumWithNumbers": { - "description": "This is a simple enum with numbers", - "enum": [ - 1, - 2, - 3 - ] - }, - "EnumFromDescription": { - "description": "Success=1,Warning=2,Error=3", - "type": "int" - }, - "ArrayWithNumbers": { - "description": "This is a simple array with numbers", - "type": "array", - "items": { - "type": "integer" - } - }, - "ArrayWithBooleans": { - "description": "This is a simple array with booleans", - "type": "array", - "items": { - "type": "boolean" - } - }, - "ArrayWithStrings": { - "description": "This is a simple array with strings", - "type": "array", - "items": { - "type": "string" - } - }, - "ArrayWithReferences": { - "description": "This is a simple array with references", - "type": "array", - "items": { - "$ref": "#/components/schemas/ModelWithString" - } - }, - "ArrayWithArray": { - "description": "This is a simple array containing an array", - "type": "array", - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ModelWithString" - } - } - }, - "ArrayWithProperties": { - "description": "This is a simple array with properties", - "type": "array", - "items": { - "type": "object", - "properties": { - "foo": { - "type": "string" - }, - "bar": { - "type": "string" - } - } - } - }, - "DictionaryWithString": { - "description": "This is a string dictionary", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "DictionaryWithReference": { - "description": "This is a string reference", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/ModelWithString" - } - }, - "DictionaryWithArray": { - "description": "This is a complex dictionary", - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ModelWithString" - } - } - }, - "DictionaryWithDictionary": { - "description": "This is a string dictionary", - "type": "object", - "additionalProperties": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "DictionaryWithProperties": { - "description": "This is a complex dictionary", - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "foo": { - "type": "string" - }, - "bar": { - "type": "string" - } - } - } - }, - "ModelWithInteger": { - "description": "This is a model with one number property", - "type": "object", - "properties": { - "prop": { - "description": "This is a simple number property", - "type": "integer" - } - } - }, - "ModelWithBoolean": { - "description": "This is a model with one boolean property", - "type": "object", - "properties": { - "prop": { - "description": "This is a simple boolean property", - "type": "boolean" - } - } - }, - "ModelWithString": { - "description": "This is a model with one string property", - "type": "object", - "properties": { - "prop": { - "description": "This is a simple string property", - "type": "string" - } - } - }, - "ModelWithEnum": { - "description": "This is a model with one enum", - "type": "object", - "properties": { - "Test": { - "description": "This is a simple enum with strings", - "enum": [ - "Success", - "Warning", - "Error" - ] - } - } - }, - "ModelWithEnumFromDescription": { - "description": "This is a model with one enum", - "type": "object", - "properties": { - "Test": { - "type": "integer", - "description": "Success=1,Warning=2,Error=3" - } - } - }, - "ModelWithNestedEnums": { - "description": "This is a model with nested enums", - "type": "object", - "properties": { - "dictionaryWithEnum": { - "type": "object", - "additionalProperties": { - "enum": [ - "Success", - "Warning", - "Error" - ] - } - }, - "dictionaryWithEnumFromDescription": { - "type": "object", - "additionalProperties": { - "type": "integer", - "description": "Success=1,Warning=2,Error=3" - } - }, - "arrayWithEnum": { - "type": "array", - "additionalProperties": { - "enum": [ - "Success", - "Warning", - "Error" - ] - } - }, - "arrayWithDescription": { - "type": "array", - "additionalProperties": { - "type": "integer", - "description": "Success=1,Warning=2,Error=3" - } - } - } - }, - "ModelWithReference": { - "description": "This is a model with one property containing a reference", - "type": "object", - "properties": { - "prop": { - "$ref": "#/components/schemas/ModelWithString" - } - } - }, - "ModelWithArray": { - "description": "This is a model with one property containing an array", - "type": "object", - "properties": { - "prop": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } - }, - "ModelWithDictionary": { - "description": "This is a model with one property containing a dictionary", - "type": "object", - "properties": { - "prop": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - } - }, - "ModelLink": { - "description": "This is a model that can have a template??", - "type": "object", - "properties": { - "id": { - "type": "string" - } - } - }, - "ModelWithLink": { - "description": "This is a model that can have a template??", - "type": "object", - "properties": { - "prop": { - "$ref": "#/components/schemas/ModelLink[ModelWithString]" - } - } - }, - "ModelWithCircularReference": { - "description": "This is a model with one property containing a circular reference", - "type": "object", - "properties": { - "prop": { - "$ref": "#/components/schemas/ModelWithCircularReference" - } - } - }, - "ModelWithProperties": { - "description": "This is a model with one nested property", - "type": "object", - "required": [ - "required", - "requiredAndReadOnly", - "requiredAndNullable" - ], - "properties": { - "required": { - "type": "string" - }, - "requiredAndReadOnly": { - "type": "string", - "readOnly": true - }, - "requiredAndNullable": { - "type": "string", - "nullable": true - }, - "string": { - "type": "string" - }, - "number": { - "type": "number" - }, - "boolean": { - "type": "boolean" - }, - "reference": { - "$ref": "#/components/schemas/ModelWithString" - } - } - }, - "ModelWithNestedProperties": { - "description": "This is a model with one nested property", - "type": "object", - "required": [ - "first" - ], - "properties": { - "first": { - "type": "object", - "required": [ - "second" - ], - "readOnly": true, - "nullable": true, - "properties": { - "second": { - "type": "object", - "required": [ - "third" - ], - "readOnly": true, - "nullable": true, - "properties": { - "third": { - "type": "string", - "required": true, - "readOnly": true, - "nullable": true - } - } - } - } - } - } - }, - "ModelWithDuplicateProperties": { - "description": "This is a model with duplicated properties", - "type": "object", - "properties": { - "prop": { - "$ref": "#/components/schemas/ModelWithString" - }, - "prop": { - "$ref": "#/components/schemas/ModelWithString" - }, - "prop": { - "$ref": "#/components/schemas/ModelWithString" - } - } - }, - "ModelWithDuplicateImports": { - "description": "This is a model with duplicated imports", - "type": "object", - "properties": { - "propA": { - "$ref": "#/components/schemas/ModelWithString" - }, - "propB": { - "$ref": "#/components/schemas/ModelWithString" - }, - "propC": { - "$ref": "#/components/schemas/ModelWithString" - } - } - }, - "ModelThatExtends": { - "description": "This is a model that extends another model", - "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/ModelWithString" - }, - { - "type": "object", - "properties": { - "propExtendsA": { - "type": "string" - }, - "propExtendsB": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } - ] - }, - "ModelThatExtendsExtends": { - "description": "This is a model that extends another model", - "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/ModelWithString" - }, - { - "$ref": "#/components/schemas/ModelThatExtends" - }, - { - "type": "object", - "properties": { - "propExtendsC": { - "type": "string" - }, - "propExtendsD": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } - ] - } - } - } -} diff --git a/test/spec/v2.json b/test/spec/v2.json new file mode 100644 index 000000000..e8eb19b51 --- /dev/null +++ b/test/spec/v2.json @@ -0,0 +1,1518 @@ +{ + "swagger": "2.0", + "info": { + "title": "swagger", + "version": "v1.0" + }, + "host": "localhost:3000", + "basePath": "/base", + "schemes": [ + "http" + ], + "paths": { + "/api/v{api-version}/no-tag": { + "tags": [], + "get": { + "operationId": "ServiceWithEmptyTag" + } + }, + "/api/v{api-version}/simple": { + "get": { + "tags": [ + "Simple" + ], + "operationId": "GetCallWithoutParametersAndResponse" + }, + "put": { + "tags": [ + "Simple" + ], + "operationId": "PutCallWithoutParametersAndResponse" + }, + "post": { + "tags": [ + "Simple" + ], + "operationId": "PostCallWithoutParametersAndResponse" + }, + "delete": { + "tags": [ + "Simple" + ], + "operationId": "DeleteCallWithoutParametersAndResponse" + }, + "options": { + "tags": [ + "Simple" + ], + "operationId": "OptionsCallWithoutParametersAndResponse" + }, + "head": { + "tags": [ + "Simple" + ], + "operationId": "HeadCallWithoutParametersAndResponse" + }, + "patch": { + "tags": [ + "Simple" + ], + "operationId": "PatchCallWithoutParametersAndResponse" + } + }, + "/api/v{api-version}/descriptions/": { + "post": { + "tags": [ + "Descriptions" + ], + "operationId": "CallWithDescriptions", + "parameters": [ + { + "description": "Testing multiline comments in string: First line\nSecond line\n\nFourth line", + "name": "parameterWithBreaks", + "in": "query", + "type": "string" + }, + { + "description": "Testing backticks in string: `backticks` and ```multiple backticks``` should work", + "name": "parameterWithBackticks", + "in": "query", + "type": "string" + }, + { + "description": "Testing slashes in string: \\backwards\\\\\\ and /forwards/// should work", + "name": "parameterWithSlashes", + "in": "query", + "type": "string" + }, + { + "description": "Testing expression placeholders in string: ${expression} should work", + "name": "parameterWithExpressionPlaceholders", + "in": "query", + "type": "string" + }, + { + "description": "Testing quotes in string: 'single quote''' and \"double quotes\"\"\" should work", + "name": "parameterWithQuotes", + "in": "query", + "type": "string" + }, + { + "description": "Testing reserved characters in string: /* inline */ and /** inline **/ should work", + "name": "parameterWithReservedCharacters", + "in": "query", + "type": "string" + } + ] + } + }, + "/api/v{api-version}/parameters/{parameterPath}": { + "post": { + "tags": [ + "Parameters" + ], + "operationId": "CallWithParameters", + "parameters": [ + { + "description": "This is the parameter that goes into the header", + "name": "parameterHeader", + "in": "header", + "type": "string", + "required": true + }, + { + "description": "This is the parameter that goes into the query params", + "name": "parameterQuery", + "in": "query", + "type": "string", + "required": true + }, + { + "description": "This is the parameter that goes into the form data", + "name": "parameterForm", + "in": "formData", + "type": "string", + "required": true + }, + { + "description": "This is the parameter that is sent as request body", + "name": "parameterBody", + "in": "body", + "type": "string", + "required": true + }, + { + "description": "This is the parameter that goes into the path", + "name": "parameterPath", + "in": "path", + "type": "string", + "required": true + }, + { + "name": "api-version", + "in": "path", + "type": "string", + "required": true + } + ] + } + }, + "/api/v{api-version}/parameters/{parameter.path.1}/{parameter-path-2}/{PARAMETER-PATH-3}": { + "post": { + "tags": [ + "Parameters" + ], + "operationId": "CallWithWeirdParameterNames", + "parameters": [ + { + "description": "This is the parameter that goes into the path", + "name": "parameter.path.1", + "in": "path", + "type": "string", + "required": false + }, + { + "description": "This is the parameter that goes into the path", + "name": "parameter-path-2", + "in": "path", + "type": "string", + "required": false + }, + { + "description": "This is the parameter that goes into the path", + "name": "PARAMETER-PATH-3", + "in": "path", + "type": "string", + "required": false + }, + { + "description": "This is the parameter with a reserved keyword", + "name": "default", + "in": "query", + "type": "string", + "required": false + }, + { + "description": "This is the parameter that goes into the request header", + "name": "parameter.header", + "in": "header", + "type": "string", + "required": true + }, + { + "description": "This is the parameter that goes into the request query params", + "name": "parameter-query", + "in": "query", + "type": "string", + "required": true + }, + { + "description": "This is the parameter that goes into the request form data", + "name": "parameter_form", + "in": "formData", + "type": "string", + "required": true + }, + { + "description": "This is the parameter that is sent as request body", + "name": "PARAMETER-BODY", + "in": "body", + "type": "string", + "required": true + }, + { + "name": "api-version", + "in": "path", + "type": "string", + "required": true + } + ] + } + }, + "/api/v{api-version}/defaults": { + "get": { + "tags": [ + "Defaults" + ], + "operationId": "CallWithDefaultParameters", + "parameters": [ + { + "description": "This is a simple string with default value", + "name": "parameterString", + "in": "query", + "required": true, + "default": "Hello World!", + "type": "string" + }, + { + "description": "This is a simple number with default value", + "name": "parameterNumber", + "in": "query", + "required": true, + "default": 123, + "type": "number" + }, + { + "description": "This is a simple boolean with default value", + "name": "parameterBoolean", + "in": "query", + "required": true, + "default": true, + "type": "boolean" + }, + { + "description": "This is a simple enum with default value", + "name": "parameterEnum", + "in": "query", + "required": true, + "default": 0, + "schema": { + "enum": [ + "Success", + "Warning", + "Error" + ] + } + }, + { + "description": "This is a simple model with default value", + "name": "parameterModel", + "in": "query", + "required": true, + "default": { + "prop": "Hello World!" + }, + "schema": { + "$ref": "#/definitions/ModelWithString" + } + } + ] + }, + "post": { + "tags": [ + "Defaults" + ], + "operationId": "CallWithDefaultOptionalParameters", + "parameters": [ + { + "description": "This is a simple string that is optional with default value", + "name": "parameterString", + "in": "query", + "default": "Hello World!", + "type": "string" + }, + { + "description": "This is a simple number that is optional with default value", + "name": "parameterNumber", + "in": "query", + "default": 123, + "type": "number" + }, + { + "description": "This is a simple boolean that is optional with default value", + "name": "parameterBoolean", + "in": "query", + "default": true, + "type": "boolean" + }, + { + "description": "This is a simple enum that is optional with default value", + "name": "parameterEnum", + "in": "query", + "default": 0, + "schema": { + "enum": [ + "Success", + "Warning", + "Error" + ] + } + }, + { + "description": "This is a simple model that is optional with default value", + "name": "parameterModel", + "in": "query", + "default": { + "prop": "Hello World!" + }, + "schema": { + "$ref": "#/definitions/ModelWithString" + } + } + ] + }, + "put": { + "tags": [ + "Defaults" + ], + "operationId": "CallToTestOrderOfParams", + "parameters": [ + { + "description": "This is a optional string with default", + "name": "parameterOptionalStringWithDefault", + "in": "query", + "required": false, + "default": "Hello World!", + "type": "string" + }, + { + "description": "This is a optional string with empty default", + "name": "parameterOptionalStringWithEmptyDefault", + "in": "query", + "required": false, + "default": "", + "type": "string" + }, + { + "description": "This is a optional string with no default", + "name": "parameterOptionalStringWithNoDefault", + "in": "query", + "required": false, + "type": "string" + }, + { + "description": "This is a string with default", + "name": "parameterStringWithDefault", + "in": "query", + "required": true, + "default": "Hello World!", + "type": "string" + }, + { + "description": "This is a string with empty default", + "name": "parameterStringWithEmptyDefault", + "in": "query", + "required": true, + "default": "", + "type": "string" + }, + { + "description": "This is a string with no default", + "name": "parameterStringWithNoDefault", + "in": "query", + "required": true, + "type": "string" + }, + { + "x-nullable": true, + "description": "This is a string that can be null with no default", + "name": "parameterStringNullableWithNoDefault", + "in": "query", + "required": false, + "type": "string" + }, + { + "x-nullable": true, + "description": "This is a string that can be null with default", + "name": "parameterStringNullableWithDefault", + "in": "query", + "required": false, + "type": "string", + "default": null + } + ] + } + }, + "/api/v{api-version}/duplicate": { + "get": { + "tags": [ + "Duplicate", + "Duplicate" + ], + "operationId": "DuplicateName" + }, + "post": { + "tags": [ + "Duplicate", + "Duplicate" + ], + "operationId": "DuplicateName" + }, + "put": { + "tags": [ + "Duplicate", + "Duplicate" + ], + "operationId": "DuplicateName" + }, + "delete": { + "tags": [ + "Duplicate", + "Duplicate" + ], + "operationId": "DuplicateName" + } + }, + "/api/v{api-version}/no-content": { + "get": { + "tags": [ + "NoContent" + ], + "operationId": "CallWithNoContentResponse", + "responses": { + "204": { + "description": "Success" + } + } + } + }, + "/api/v{api-version}/multiple-tags/a": { + "get": { + "tags": [ + "MultipleTags1", + "MultipleTags2" + ], + "operationId": "DummyA", + "responses": { + "204": { + "description": "Success" + } + } + } + }, + "/api/v{api-version}/multiple-tags/b": { + "get": { + "tags": [ + "MultipleTags1", + "MultipleTags2", + "MultipleTags3" + ], + "operationId": "DummyB", + "responses": { + "204": { + "description": "Success" + } + } + } + }, + "/api/v{api-version}/response": { + "get": { + "tags": [ + "Response" + ], + "operationId": "CallWithResponse", + "responses": { + "default": { + "description": "Message for default response", + "schema": { + "$ref": "#/definitions/ModelWithString" + } + } + } + }, + "post": { + "tags": [ + "Response" + ], + "operationId": "CallWithDuplicateResponses", + "responses": { + "default": { + "description": "Message for default response", + "schema": { + "$ref": "#/definitions/ModelWithString" + } + }, + "201": { + "description": "Message for 201 response", + "schema": { + "$ref": "#/definitions/ModelWithString" + } + }, + "202": { + "description": "Message for 202 response", + "schema": { + "$ref": "#/definitions/ModelWithString" + } + }, + "500": { + "description": "Message for 500 error", + "schema": { + "$ref": "#/definitions/ModelWithString" + } + }, + "501": { + "description": "Message for 501 error", + "schema": { + "$ref": "#/definitions/ModelWithString" + } + }, + "502": { + "description": "Message for 502 error", + "schema": { + "$ref": "#/definitions/ModelWithString" + } + } + } + }, + "put": { + "tags": [ + "Response" + ], + "operationId": "CallWithResponses", + "responses": { + "default": { + "description": "Message for default response", + "schema": { + "$ref": "#/definitions/ModelWithString" + } + }, + "200": { + "description": "Message for 200 response", + "schema": { + "type": "object", + "properties": { + "@namespace.string": { + "type": "string", + "readOnly": true + }, + "@namespace.integer": { + "type": "integer", + "readOnly": true + }, + "value": { + "type": "array", + "items": { + "$ref": "#/definitions/ModelWithString" + }, + "readOnly": true + } + } + } + }, + "201": { + "description": "Message for 201 response", + "schema": { + "$ref": "#/definitions/ModelThatExtends" + } + }, + "202": { + "description": "Message for 202 response", + "schema": { + "$ref": "#/definitions/ModelThatExtendsExtends" + } + }, + "500": { + "description": "Message for 500 error", + "schema": { + "$ref": "#/definitions/ModelWithString" + } + }, + "501": { + "description": "Message for 501 error", + "schema": { + "$ref": "#/definitions/ModelWithString" + } + }, + "502": { + "description": "Message for 502 error", + "schema": { + "$ref": "#/definitions/ModelWithString" + } + } + } + } + }, + "/api/v{api-version}/collectionFormat": { + "get": { + "tags": [ + "CollectionFormat" + ], + "operationId": "CollectionFormat", + "parameters": [ + { + "description": "This is an array parameter that is sent as csv format (comma-separated values)", + "name": "parameterArrayCSV", + "in": "query", + "required": true, + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "csv" + }, + { + "description": "This is an array parameter that is sent as ssv format (space-separated values)", + "name": "parameterArraySSV", + "in": "query", + "required": true, + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "ssv" + }, + { + "description": "This is an array parameter that is sent as tsv format (tab-separated values)", + "name": "parameterArrayTSV", + "in": "query", + "required": true, + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "tsv" + }, + { + "description": "This is an array parameter that is sent as pipes format (pipe-separated values)", + "name": "parameterArrayPipes", + "in": "query", + "required": true, + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "pipes" + }, + { + "description": "This is an array parameter that is sent as multi format (multiple parameter instances)", + "name": "parameterArrayMulti", + "in": "query", + "required": true, + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "multi" + } + ] + } + }, + "/api/v{api-version}/types": { + "get": { + "tags": [ + "Types" + ], + "operationId": "Types", + "parameters": [ + { + "description": "This is a number parameter", + "name": "parameterNumber", + "in": "query", + "required": true, + "default": 123, + "type": "number" + }, + { + "description": "This is a string parameter", + "name": "parameterString", + "in": "query", + "required": true, + "default": "default", + "type": "string" + }, + { + "description": "This is a boolean parameter", + "name": "parameterBoolean", + "in": "query", + "required": true, + "default": true, + "type": "boolean" + }, + { + "description": "This is an object parameter", + "name": "parameterObject", + "in": "query", + "required": true, + "default": null, + "type": "object" + }, + { + "description": "This is an array parameter", + "name": "parameterArray", + "in": "query", + "required": true, + "type": "array", + "items": { + "type": "string" + } + }, + { + "description": "This is a dictionary parameter", + "name": "parameterDictionary", + "in": "query", + "required": true, + "type": "object", + "items": { + "type": "string" + } + }, + { + "description": "This is an enum parameter", + "name": "parameterEnum", + "in": "query", + "required": true, + "schema": { + "enum": [ + "Success", + "Warning", + "Error" + ] + } + }, + { + "description": "This is a number parameter", + "name": "id", + "in": "path", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Response is a simple number", + "schema": { + "type": "number" + } + }, + "201": { + "description": "Response is a simple string", + "schema": { + "type": "string" + } + }, + "202": { + "description": "Response is a simple boolean", + "schema": { + "type": "boolean" + } + }, + "203": { + "description": "Response is a simple object", + "default": null, + "schema": { + "type": "object" + } + } + } + } + }, + "/api/v{api-version}/complex": { + "get": { + "tags": [ + "Complex" + ], + "operationId": "ComplexTypes", + "parameters": [ + { + "description": "Parameter containing object", + "name": "parameterObject", + "in": "query", + "required": true, + "schema": { + "type": "object", + "properties": { + "first": { + "type": "object", + "properties": { + "second": { + "type": "object", + "properties": { + "third": { + "type": "string" + } + } + } + } + } + } + } + }, + { + "description": "Parameter containing reference", + "name": "parameterReference", + "in": "query", + "required": true, + "schema": { + "$ref": "#/definitions/ModelWithString" + } + } + ], + "responses": { + "200": { + "description": "Successful response", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/ModelWithString" + } + } + }, + "400": { + "description": "400 server error" + }, + "500": { + "description": "500 server error" + } + } + } + }, + "/api/v{api-version}/header": { + "post": { + "tags": [ + "Header" + ], + "operationId": "CallWithResultFromHeader", + "responses": { + "200": { + "description": "Successful response", + "headers": { + "operation-location": { + "type": "string" + } + } + }, + "400": { + "description": "400 server error" + }, + "500": { + "description": "500 server error" + } + } + } + }, + "/api/v{api-version}/error": { + "post": { + "tags": [ + "Error" + ], + "operationId": "testErrorCode", + "parameters": [ + { + "description": "Status code to return", + "name": "status", + "in": "query", + "type": "string", + "required": true + } + ], + "responses": { + "200": { + "description": "Custom message: Successful response" + }, + "500": { + "description": "Custom message: Internal Server Error" + }, + "501": { + "description": "Custom message: Not Implemented" + }, + "502": { + "description": "Custom message: Bad Gateway" + }, + "503": { + "description": "Custom message: Service Unavailable" + } + } + } + } + }, + "definitions": { + "CommentWithBreaks": { + "description": "Testing multiline comments in string: First line\nSecond line\n\nFourth line", + "type": "integer" + }, + "CommentWithBackticks": { + "description": "Testing backticks in string: `backticks` and ```multiple backticks``` should work", + "type": "integer" + }, + "CommentWithSlashes": { + "description": "Testing slashes in string: \\backwards\\\\\\ and /forwards/// should work", + "type": "integer" + }, + "CommentWithExpressionPlaceholders": { + "description": "Testing expression placeholders in string: ${expression} should work", + "type": "integer" + }, + "CommentWithQuotes": { + "description": "Testing quotes in string: 'single quote''' and \"double quotes\"\"\" should work", + "type": "integer" + }, + "CommentWithReservedCharacters": { + "description": "Testing reserved characters in string: /* inline */ and /** inline **/ should work", + "type": "integer" + }, + "SimpleInteger": { + "description": "This is a simple number", + "type": "integer" + }, + "SimpleBoolean": { + "description": "This is a simple boolean", + "type": "boolean" + }, + "SimpleString": { + "description": "This is a simple string", + "type": "string" + }, + "SimpleFile": { + "description": "This is a simple file", + "type": "file" + }, + "SimpleReference": { + "description": "This is a simple reference", + "$ref": "#/definitions/ModelWithString" + }, + "SimpleStringWithPattern": { + "description": "This is a simple string", + "type": "string", + "maxLength": 64, + "pattern": "^[a-zA-Z0-9_]*$" + }, + "EnumWithStrings": { + "description": "This is a simple enum with strings", + "enum": [ + "Success", + "Warning", + "Error", + "'Single Quote'", + "\"Double Quotes\"" + ] + }, + "EnumWithNumbers": { + "description": "This is a simple enum with numbers", + "enum": [ + 1, + 2, + 3, + 1.1, + 1.20, + 1.300, + 100, + 200, + 300, + -100, + -200, + -300, + -1.1, + -1.20, + -1.300 + ] + }, + "EnumFromDescription": { + "description": "Success=1,Warning=2,Error=3", + "type": "number" + }, + "EnumWithExtensions": { + "description": "This is a simple enum with numbers", + "enum": [ + 200, + 400, + 500 + ], + "x-enum-varnames": [ + "CUSTOM_SUCCESS", + "CUSTOM_WARNING", + "CUSTOM_ERROR" + ], + "x-enum-descriptions": [ + "Used when the status of something is successful", + "Used when the status of something has a warning", + "Used when the status of something has an error" + ] + }, + "ArrayWithNumbers": { + "description": "This is a simple array with numbers", + "type": "array", + "items": { + "type": "integer" + } + }, + "ArrayWithBooleans": { + "description": "This is a simple array with booleans", + "type": "array", + "items": { + "type": "boolean" + } + }, + "ArrayWithStrings": { + "description": "This is a simple array with strings", + "type": "array", + "items": { + "type": "string" + } + }, + "ArrayWithReferences": { + "description": "This is a simple array with references", + "type": "array", + "items": { + "$ref": "#/definitions/ModelWithString" + } + }, + "ArrayWithArray": { + "description": "This is a simple array containing an array", + "type": "array", + "items": { + "type": "array", + "items": { + "$ref": "#/definitions/ModelWithString" + } + } + }, + "ArrayWithProperties": { + "description": "This is a simple array with properties", + "type": "array", + "items": { + "type": "object", + "properties": { + "foo": { + "type": "string" + }, + "bar": { + "type": "string" + } + } + } + }, + "DictionaryWithString": { + "description": "This is a string dictionary", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "DictionaryWithReference": { + "description": "This is a string reference", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/ModelWithString" + } + }, + "DictionaryWithArray": { + "description": "This is a complex dictionary", + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/ModelWithString" + } + } + }, + "DictionaryWithDictionary": { + "description": "This is a string dictionary", + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "DictionaryWithProperties": { + "description": "This is a complex dictionary", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "foo": { + "type": "string" + }, + "bar": { + "type": "string" + } + } + } + }, + "Date": { + "description": "This is a type-only model that defines Date as a string", + "type": "string" + }, + "ModelWithInteger": { + "description": "This is a model with one number property", + "type": "object", + "properties": { + "prop": { + "description": "This is a simple number property", + "type": "integer" + } + } + }, + "ModelWithBoolean": { + "description": "This is a model with one boolean property", + "type": "object", + "properties": { + "prop": { + "description": "This is a simple boolean property", + "type": "boolean" + } + } + }, + "ModelWithString": { + "description": "This is a model with one string property", + "type": "object", + "properties": { + "prop": { + "description": "This is a simple string property", + "type": "string" + } + } + }, + "ModelWithNullableString": { + "description": "This is a model with one string property", + "type": "object", + "required": [ + "nullableRequiredProp" + ], + "properties": { + "nullableProp": { + "description": "This is a simple string property", + "type": "string", + "x-nullable": true + }, + "nullableRequiredProp": { + "description": "This is a simple string property", + "type": "string", + "x-nullable": true + } + } + }, + "ModelWithEnum": { + "description": "This is a model with one enum", + "type": "object", + "properties": { + "test": { + "description": "This is a simple enum with strings", + "enum": [ + "Success", + "Warning", + "Error" + ] + }, + "statusCode": { + "description": "These are the HTTP error code enums", + "enum": [ + "100", + "200 FOO", + "300 FOO_BAR", + "400 foo-bar", + "500 foo.bar", + "600 foo&bar" + ] + }, + "bool": { + "description": "Simple boolean enum", + "type": "boolean", + "enum": [ + true + ] + } + } + }, + "ModelWithEnumFromDescription": { + "description": "This is a model with one enum", + "type": "object", + "properties": { + "test": { + "type": "integer", + "description": "Success=1,Warning=2,Error=3" + } + } + }, + "ModelWithNestedEnums": { + "description": "This is a model with nested enums", + "type": "object", + "properties": { + "dictionaryWithEnum": { + "type": "object", + "additionalProperties": { + "enum": [ + "Success", + "Warning", + "Error" + ] + } + }, + "dictionaryWithEnumFromDescription": { + "type": "object", + "additionalProperties": { + "type": "integer", + "description": "Success=1,Warning=2,Error=3" + } + }, + "arrayWithEnum": { + "type": "array", + "items": { + "enum": [ + "Success", + "Warning", + "Error" + ] + } + }, + "arrayWithDescription": { + "type": "array", + "items": { + "type": "integer", + "description": "Success=1,Warning=2,Error=3" + } + } + } + }, + "ModelWithReference": { + "description": "This is a model with one property containing a reference", + "type": "object", + "properties": { + "prop": { + "$ref": "#/definitions/ModelWithProperties" + } + } + }, + "ModelWithArray": { + "description": "This is a model with one property containing an array", + "type": "object", + "properties": { + "prop": { + "type": "array", + "items": { + "$ref": "#/definitions/ModelWithString" + } + }, + "propWithFile": { + "type": "array", + "items": { + "type": "file" + } + }, + "propWithNumber": { + "type": "array", + "items": { + "type": "number" + } + } + } + }, + "ModelWithDictionary": { + "description": "This is a model with one property containing a dictionary", + "type": "object", + "properties": { + "prop": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + }, + "ModelWithCircularReference": { + "description": "This is a model with one property containing a circular reference", + "type": "object", + "properties": { + "prop": { + "$ref": "#/definitions/ModelWithCircularReference" + } + } + }, + "ModelWithProperties": { + "description": "This is a model with one nested property", + "type": "object", + "required": [ + "required", + "requiredAndReadOnly" + ], + "properties": { + "required": { + "type": "string" + }, + "requiredAndReadOnly": { + "type": "string", + "readOnly": true + }, + "string": { + "type": "string" + }, + "number": { + "type": "number" + }, + "boolean": { + "type": "boolean" + }, + "reference": { + "$ref": "#/definitions/ModelWithString" + }, + "property with space": { + "type": "string" + }, + "default": { + "type": "string" + }, + "try": { + "type": "string" + }, + "@namespace.string": { + "type": "string", + "readOnly": true + }, + "@namespace.integer": { + "type": "integer", + "readOnly": true + } + } + }, + "ModelWithNestedProperties": { + "description": "This is a model with one nested property", + "type": "object", + "required": [ + "first" + ], + "properties": { + "first": { + "type": "object", + "required": [ + "second" + ], + "readOnly": true, + "properties": { + "second": { + "type": "object", + "required": [ + "third" + ], + "readOnly": true, + "properties": { + "third": { + "type": "string", + "readOnly": true + } + } + } + } + } + } + }, + "ModelWithDuplicateProperties": { + "description": "This is a model with duplicated properties", + "type": "object", + "properties": { + "prop": { + "$ref": "#/definitions/ModelWithString" + }, + "prop": { + "$ref": "#/definitions/ModelWithString" + }, + "prop": { + "$ref": "#/definitions/ModelWithString" + } + } + }, + "ModelWithOrderedProperties": { + "description": "This is a model with ordered properties", + "type": "object", + "properties": { + "zebra": { + "type": "string" + }, + "apple": { + "type": "string" + }, + "hawaii": { + "type": "string" + } + } + }, + "ModelWithDuplicateImports": { + "description": "This is a model with duplicated imports", + "type": "object", + "properties": { + "propA": { + "$ref": "#/definitions/ModelWithString" + }, + "propB": { + "$ref": "#/definitions/ModelWithString" + }, + "propC": { + "$ref": "#/definitions/ModelWithString" + } + } + }, + "ModelThatExtends": { + "description": "This is a model that extends another model", + "type": "object", + "allOf": [ + { + "$ref": "#/definitions/ModelWithString" + }, + { + "type": "object", + "properties": { + "propExtendsA": { + "type": "string" + }, + "propExtendsB": { + "$ref": "#/definitions/ModelWithString" + } + } + } + ] + }, + "ModelThatExtendsExtends": { + "description": "This is a model that extends another model", + "type": "object", + "allOf": [ + { + "$ref": "#/definitions/ModelWithString" + }, + { + "$ref": "#/definitions/ModelThatExtends" + }, + { + "type": "object", + "properties": { + "propExtendsC": { + "type": "string" + }, + "propExtendsD": { + "$ref": "#/definitions/ModelWithString" + } + } + } + ] + }, + "default": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + } + }, + "ModelWithPattern": { + "description": "This is a model that contains a some patterns", + "type": "object", + "required": [ + "key", + "name" + ], + "properties": { + "key": { + "maxLength": 64, + "pattern": "^[a-zA-Z0-9_]*$", + "type": "string" + }, + "name": { + "maxLength": 255, + "type": "string" + }, + "enabled": { + "type": "boolean", + "readOnly": true + }, + "modified": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "id": { + "type": "string", + "pattern": "^\\d{2}-\\d{3}-\\d{4}$" + }, + "text": { + "type": "string", + "pattern": "^\\w+$" + }, + "patternWithSingleQuotes": { + "type": "string", + "pattern": "^[a-zA-Z0-9']*$" + } + } + } + } +} diff --git a/test/spec/v3.json b/test/spec/v3.json new file mode 100644 index 000000000..cb590d0b7 --- /dev/null +++ b/test/spec/v3.json @@ -0,0 +1,2559 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "swagger", + "version": "v1.0" + }, + "servers": [ + { + "url": "http://localhost:3000/base" + } + ], + "paths": { + "/api/v{api-version}/no-tag": { + "tags": [], + "get": { + "operationId": "ServiceWithEmptyTag" + } + }, + "/api/v{api-version}/simple": { + "get": { + "tags": [ + "Simple" + ], + "operationId": "GetCallWithoutParametersAndResponse" + }, + "put": { + "tags": [ + "Simple" + ], + "operationId": "PutCallWithoutParametersAndResponse" + }, + "post": { + "tags": [ + "Simple" + ], + "operationId": "PostCallWithoutParametersAndResponse" + }, + "delete": { + "tags": [ + "Simple" + ], + "operationId": "DeleteCallWithoutParametersAndResponse" + }, + "options": { + "tags": [ + "Simple" + ], + "operationId": "OptionsCallWithoutParametersAndResponse" + }, + "head": { + "tags": [ + "Simple" + ], + "operationId": "HeadCallWithoutParametersAndResponse" + }, + "patch": { + "tags": [ + "Simple" + ], + "operationId": "PatchCallWithoutParametersAndResponse" + } + }, + "/api/v{api-version}/descriptions/": { + "post": { + "tags": [ + "Descriptions" + ], + "operationId": "CallWithDescriptions", + "parameters": [ + { + "description": "Testing multiline comments in string: First line\nSecond line\n\nFourth line", + "name": "parameterWithBreaks", + "in": "query", + "type": "string" + }, + { + "description": "Testing backticks in string: `backticks` and ```multiple backticks``` should work", + "name": "parameterWithBackticks", + "in": "query", + "type": "string" + }, + { + "description": "Testing slashes in string: \\backwards\\\\\\ and /forwards/// should work", + "name": "parameterWithSlashes", + "in": "query", + "type": "string" + }, + { + "description": "Testing expression placeholders in string: ${expression} should work", + "name": "parameterWithExpressionPlaceholders", + "in": "query", + "type": "string" + }, + { + "description": "Testing quotes in string: 'single quote''' and \"double quotes\"\"\" should work", + "name": "parameterWithQuotes", + "in": "query", + "type": "string" + }, + { + "description": "Testing reserved characters in string: /* inline */ and /** inline **/ should work", + "name": "parameterWithReservedCharacters", + "in": "query", + "type": "string" + } + ] + } + }, + "/api/v{api-version}/parameters/deprecated": { + "post": { + "tags": [ + "Deprecated" + ], + "deprecated": true, + "operationId": "DeprecatedCall", + "parameters": [ + { + "deprecated": true, + "description": "This parameter is deprecated", + "name": "parameter", + "in": "header", + "required": true, + "nullable": true, + "schema": { + "$ref": "#/components/schemas/DeprecatedModel" + } + } + ] + } + }, + "/api/v{api-version}/parameters/{parameterPath}": { + "post": { + "tags": [ + "Parameters" + ], + "operationId": "CallWithParameters", + "parameters": [ + { + "description": "This is the parameter that goes into the header", + "name": "parameterHeader", + "in": "header", + "required": true, + "nullable": true, + "schema": { + "type": "string" + } + }, + { + "description": "This is the parameter that goes into the query params", + "name": "parameterQuery", + "in": "query", + "required": true, + "nullable": true, + "schema": { + "type": "string" + } + }, + { + "description": "This is the parameter that goes into the form data", + "name": "parameterForm", + "in": "formData", + "required": true, + "nullable": true, + "schema": { + "type": "string" + } + }, + { + "description": "This is the parameter that goes into the cookie", + "name": "parameterCookie", + "in": "cookie", + "required": true, + "nullable": true, + "schema": { + "type": "string" + } + }, + { + "description": "This is the parameter that goes into the path", + "name": "parameterPath", + "in": "path", + "required": true, + "nullable": true, + "schema": { + "type": "string" + } + }, + { + "name": "api-version", + "in": "path", + "required": true, + "nullable": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "description": "This is the parameter that goes into the body", + "required": true, + "nullable": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" + } + } + } + } + } + }, + "/api/v{api-version}/parameters/{parameter.path.1}/{parameter-path-2}/{PARAMETER-PATH-3}": { + "post": { + "tags": [ + "Parameters" + ], + "operationId": "CallWithWeirdParameterNames", + "parameters": [ + { + "description": "This is the parameter that goes into the path", + "name": "parameter.path.1", + "in": "path", + "required": false, + "nullable": false, + "schema": { + "type": "string" + } + }, + { + "description": "This is the parameter that goes into the path", + "name": "parameter-path-2", + "in": "path", + "required": false, + "nullable": false, + "schema": { + "type": "string" + } + }, + { + "description": "This is the parameter that goes into the path", + "name": "PARAMETER-PATH-3", + "in": "path", + "required": false, + "nullable": false, + "schema": { + "type": "string" + } + }, + { + "description": "This is the parameter with a reserved keyword", + "name": "default", + "in": "query", + "required": false, + "nullable": false, + "schema": { + "type": "string" + } + }, + { + "description": "This is the parameter that goes into the request header", + "name": "parameter.header", + "in": "header", + "required": true, + "nullable": true, + "schema": { + "type": "string" + } + }, + { + "description": "This is the parameter that goes into the request query params", + "name": "parameter-query", + "in": "query", + "required": true, + "nullable": true, + "schema": { + "type": "string" + } + }, + { + "description": "This is the parameter that goes into the request form data", + "name": "parameter_form", + "in": "formData", + "required": true, + "nullable": true, + "schema": { + "type": "string" + } + }, + { + "description": "This is the parameter that goes into the cookie", + "name": "PARAMETER-COOKIE", + "in": "cookie", + "required": true, + "nullable": true, + "schema": { + "type": "string" + } + }, + { + "name": "api-version", + "in": "path", + "required": true, + "nullable": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "description": "This is the parameter that goes into the body", + "required": true, + "nullable": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" + } + } + } + } + } + }, + "/api/v{api-version}/parameters/": { + "get": { + "tags": [ + "Parameters" + ], + "operationId": "GetCallWithOptionalParam", + "parameters": [ + { + "description": "This is an optional parameter", + "name": "parameter", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "description": "This is a required parameter", + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" + } + } + } + } + }, + "post": { + "tags": [ + "Parameters" + ], + "operationId": "PostCallWithOptionalParam", + "parameters": [ + { + "description": "This is a required parameter", + "name": "parameter", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } + } + ], + "requestBody": { + "description": "This is an optional parameter", + "required": false, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" + } + } + } + } + } + }, + "/api/v{api-version}/requestBody/": { + "post": { + "tags": [ + "RequestBody" + ], + "parameters": [ + { + "$ref": "#/components/parameters/SimpleParameter" + } + ], + "requestBody": { + "$ref": "#/components/requestBodies/SimpleRequestBody" + } + } + }, + "/api/v{api-version}/formData/": { + "post": { + "tags": [ + "FormData" + ], + "parameters": [ + { + "$ref": "#/components/parameters/SimpleParameter" + } + ], + "requestBody": { + "$ref": "#/components/requestBodies/SimpleFormData" + } + } + }, + "/api/v{api-version}/defaults": { + "get": { + "tags": [ + "Defaults" + ], + "operationId": "CallWithDefaultParameters", + "parameters": [ + { + "description": "This is a simple string with default value", + "name": "parameterString", + "in": "query", + "nullable": true, + "schema": { + "type": "string", + "default": "Hello World!" + } + }, + { + "description": "This is a simple number with default value", + "name": "parameterNumber", + "in": "query", + "nullable": true, + "schema": { + "type": "number", + "default": 123 + } + }, + { + "description": "This is a simple boolean with default value", + "name": "parameterBoolean", + "in": "query", + "nullable": true, + "schema": { + "type": "boolean", + "default": true + } + }, + { + "description": "This is a simple enum with default value", + "name": "parameterEnum", + "in": "query", + "schema": { + "enum": [ + "Success", + "Warning", + "Error" + ], + "default": 0 + } + }, + { + "description": "This is a simple model with default value", + "name": "parameterModel", + "in": "query", + "nullable": true, + "schema": { + "$ref": "#/components/schemas/ModelWithString", + "default": { + "prop": "Hello World!" + } + } + } + ] + }, + "post": { + "tags": [ + "Defaults" + ], + "operationId": "CallWithDefaultOptionalParameters", + "parameters": [ + { + "description": "This is a simple string that is optional with default value", + "name": "parameterString", + "in": "query", + "required": false, + "schema": { + "type": "string", + "default": "Hello World!" + } + }, + { + "description": "This is a simple number that is optional with default value", + "name": "parameterNumber", + "in": "query", + "required": false, + "schema": { + "type": "number", + "default": 123 + } + }, + { + "description": "This is a simple boolean that is optional with default value", + "name": "parameterBoolean", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "default": true + } + }, + { + "description": "This is a simple enum that is optional with default value", + "name": "parameterEnum", + "in": "query", + "required": false, + "schema": { + "enum": [ + "Success", + "Warning", + "Error" + ], + "default": 0 + } + }, + { + "description": "This is a simple model that is optional with default value", + "name": "parameterModel", + "in": "query", + "required": false, + "schema": { + "$ref": "#/components/schemas/ModelWithString", + "default": { + "prop": "Hello World!" + } + } + } + ] + }, + "put": { + "tags": [ + "Defaults" + ], + "operationId": "CallToTestOrderOfParams", + "parameters": [ + { + "description": "This is a optional string with default", + "name": "parameterOptionalStringWithDefault", + "in": "query", + "required": false, + "schema": { + "type": "string", + "default": "Hello World!" + } + }, + { + "description": "This is a optional string with empty default", + "name": "parameterOptionalStringWithEmptyDefault", + "in": "query", + "required": false, + "schema": { + "type": "string", + "default": "" + } + }, + { + "description": "This is a optional string with no default", + "name": "parameterOptionalStringWithNoDefault", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "This is a string with default", + "name": "parameterStringWithDefault", + "in": "query", + "required": true, + "schema": { + "type": "string", + "default": "Hello World!" + } + }, + { + "description": "This is a string with empty default", + "name": "parameterStringWithEmptyDefault", + "in": "query", + "required": true, + "schema": { + "type": "string", + "default": "" + } + }, + { + "description": "This is a string with no default", + "name": "parameterStringWithNoDefault", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "This is a string that can be null with no default", + "name": "parameterStringNullableWithNoDefault", + "in": "query", + "required": false, + "schema": { + "type": "string", + "nullable": true + } + }, + { + "description": "This is a string that can be null with default", + "name": "parameterStringNullableWithDefault", + "in": "query", + "required": false, + "schema": { + "type": "string", + "nullable": true, + "default": null + } + } + ] + } + }, + "/api/v{api-version}/duplicate": { + "get": { + "tags": [ + "Duplicate" + ], + "operationId": "DuplicateName" + }, + "post": { + "tags": [ + "Duplicate" + ], + "operationId": "DuplicateName" + }, + "put": { + "tags": [ + "Duplicate" + ], + "operationId": "DuplicateName" + }, + "delete": { + "tags": [ + "Duplicate" + ], + "operationId": "DuplicateName" + } + }, + "/api/v{api-version}/no-content": { + "get": { + "tags": [ + "NoContent" + ], + "operationId": "CallWithNoContentResponse", + "responses": { + "204": { + "description": "Success" + } + } + } + }, + "/api/v{api-version}/multiple-tags/a": { + "get": { + "tags": [ + "MultipleTags1", + "MultipleTags2" + ], + "operationId": "DummyA", + "responses": { + "204": { + "description": "Success" + } + } + } + }, + "/api/v{api-version}/multiple-tags/b": { + "get": { + "tags": [ + "MultipleTags1", + "MultipleTags2", + "MultipleTags3" + ], + "operationId": "DummyB", + "responses": { + "204": { + "description": "Success" + } + } + } + }, + "/api/v{api-version}/response": { + "get": { + "tags": [ + "Response" + ], + "operationId": "CallWithResponse", + "responses": { + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" + } + } + } + } + } + }, + "post": { + "tags": [ + "Response" + ], + "operationId": "CallWithDuplicateResponses", + "responses": { + "default": { + "description": "Message for default response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" + } + } + } + }, + "201": { + "description": "Message for 201 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" + } + } + } + }, + "202": { + "description": "Message for 202 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" + } + } + } + }, + "500": { + "description": "Message for 500 error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" + } + } + } + }, + "501": { + "description": "Message for 501 error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" + } + } + } + }, + "502": { + "description": "Message for 502 error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" + } + } + } + } + } + }, + "put": { + "tags": [ + "Response" + ], + "operationId": "CallWithResponses", + "responses": { + "default": { + "description": "Message for default response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" + } + } + } + }, + "200": { + "description": "Message for 200 response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "@namespace.string": { + "type": "string", + "readOnly": true + }, + "@namespace.integer": { + "type": "integer", + "readOnly": true + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ModelWithString" + }, + "readOnly": true + } + } + } + } + } + }, + "201": { + "description": "Message for 201 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelThatExtends" + } + } + } + }, + "202": { + "description": "Message for 202 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelThatExtendsExtends" + } + } + } + }, + "500": { + "description": "Message for 500 error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" + } + } + } + }, + "501": { + "description": "Message for 501 error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" + } + } + } + }, + "502": { + "description": "Message for 502 error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" + } + } + } + } + } + } + }, + "/api/v{api-version}/collectionFormat": { + "get": { + "tags": [ + "CollectionFormat" + ], + "operationId": "CollectionFormat", + "parameters": [ + { + "description": "This is an array parameter that is sent as csv format (comma-separated values)", + "name": "parameterArrayCSV", + "in": "query", + "required": true, + "nullable": true, + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "collectionFormat": "csv" + }, + { + "description": "This is an array parameter that is sent as ssv format (space-separated values)", + "name": "parameterArraySSV", + "in": "query", + "required": true, + "nullable": true, + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "collectionFormat": "ssv" + }, + { + "description": "This is an array parameter that is sent as tsv format (tab-separated values)", + "name": "parameterArrayTSV", + "in": "query", + "required": true, + "nullable": true, + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "collectionFormat": "tsv" + }, + { + "description": "This is an array parameter that is sent as pipes format (pipe-separated values)", + "name": "parameterArrayPipes", + "in": "query", + "required": true, + "nullable": true, + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "collectionFormat": "pipes" + }, + { + "description": "This is an array parameter that is sent as multi format (multiple parameter instances)", + "name": "parameterArrayMulti", + "in": "query", + "required": true, + "nullable": true, + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "collectionFormat": "multi" + } + ] + } + }, + "/api/v{api-version}/types": { + "get": { + "tags": [ + "Types" + ], + "operationId": "Types", + "parameters": [ + { + "description": "This is a number parameter", + "name": "parameterNumber", + "in": "query", + "required": true, + "schema": { + "type": "number", + "default": 123 + } + }, + { + "description": "This is a string parameter", + "name": "parameterString", + "in": "query", + "required": true, + "schema": { + "type": "string", + "default": "default", + "nullable": true + } + }, + { + "description": "This is a boolean parameter", + "name": "parameterBoolean", + "in": "query", + "required": true, + "schema": { + "type": "boolean", + "default": true, + "nullable": true + } + }, + { + "description": "This is an object parameter", + "name": "parameterObject", + "in": "query", + "required": true, + "schema": { + "type": "object", + "default": null, + "nullable": true + } + }, + { + "description": "This is an array parameter", + "name": "parameterArray", + "in": "query", + "required": true, + "schema": { + "type": "array", + "items": { + "type": "string" + }, + "nullable": true + } + }, + { + "description": "This is a dictionary parameter", + "name": "parameterDictionary", + "in": "query", + "required": true, + "schema": { + "type": "object", + "items": { + "type": "string" + }, + "nullable": true + } + }, + { + "description": "This is an enum parameter", + "name": "parameterEnum", + "in": "query", + "required": true, + "schema": { + "enum": [ + "Success", + "Warning", + "Error" + ], + "nullable": true + } + }, + { + "description": "This is a number parameter", + "name": "id", + "in": "path", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Response is a simple number", + "content": { + "application/json": { + "schema": { + "type": "number" + } + } + } + }, + "201": { + "description": "Response is a simple string", + "content": { + "application/json": { + "schema": { + "type": "string" + } + } + } + }, + "202": { + "description": "Response is a simple boolean", + "content": { + "application/json": { + "schema": { + "type": "boolean" + } + } + } + }, + "203": { + "description": "Response is a simple object", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + } + } + } + }, + "/api/v{api-version}/upload": { + "post": { + "tags": [ + "Upload" + ], + "operationId": "UploadFile", + "parameters": [ + { + "description": "Supply a file reference for upload", + "name": "file", + "in": "formData", + "required": true, + "schema": { + "type": "file" + } + }, + { + "name": "api-version", + "in": "path", + "required": true, + "schema": { + "type": "string", + "nullable": true + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "type": "boolean" + } + } + } + } + } + } + }, + "/api/v{api-version}/complex": { + "get": { + "tags": [ + "Complex" + ], + "operationId": "ComplexTypes", + "parameters": [ + { + "description": "Parameter containing object", + "name": "parameterObject", + "in": "query", + "required": true, + "schema": { + "type": "object", + "properties": { + "first": { + "type": "object", + "properties": { + "second": { + "type": "object", + "properties": { + "third": { + "type": "string" + } + } + } + } + } + } + } + }, + { + "description": "Parameter containing reference", + "name": "parameterReference", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/ModelWithString" + } + } + ], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ModelWithString" + } + } + } + } + }, + "400": { + "description": "400 server error" + }, + "500": { + "description": "500 server error" + } + } + } + }, + "/api/v{api-version}/multipart": { + "post": { + "tags": [ + "multipart" + ], + "operationId": "MultipartRequest", + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "type": "object", + "properties": { + "content": { + "type": "string", + "format": "binary" + }, + "data": { + "oneOf": [ + { + "$ref": "#/components/schemas/ModelWithString" + } + ], + "nullable": true + } + } + }, + "encoding": { + "content": { + "style": "form" + }, + "data": { + "style": "form" + } + } + } + } + } + }, + "get": { + "tags": [ + "multipart" + ], + "operationId": "MultipartResponse", + "responses": { + "200": { + "description": "OK", + "content": { + "multipart/mixed": { + "schema": { + "type": "object", + "properties": { + "file": { + "type": "string", + "format": "binary" + }, + "metadata": { + "type": "object", + "properties": { + "foo": { + "type": "string" + }, + "bar": { + "type": "string" + } + } + } + } + } + } + } + } + } + } + }, + "/api/v{api-version}/complex/{id}": { + "put": { + "tags": [ + "Complex" + ], + "operationId": "ComplexParams", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "api-version", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json-patch+json": { + "schema": { + "required": [ + "key", + "name", + "parameters", + "type" + ], + "type": "object", + "properties": { + "key": { + "maxLength": 64, + "pattern": "^[a-zA-Z0-9_]*$", + "type": "string", + "nullable": true, + "readOnly": true + }, + "name": { + "maxLength": 255, + "type": "string", + "nullable": true + }, + "enabled": { + "type": "boolean", + "default": true + }, + "type": { + "enum": [ + "Monkey", + "Horse", + "Bird" + ], + "type": "string", + "readOnly": true + }, + "listOfModels": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ModelWithString" + }, + "nullable": true + }, + "listOfStrings": { + "type": "array", + "items": { + "type": "string" + }, + "nullable": true + }, + "parameters": { + "type": "object", + "oneOf": [ + { + "$ref": "#/components/schemas/ModelWithString" + }, + { + "$ref": "#/components/schemas/ModelWithEnum" + }, + { + "$ref": "#/components/schemas/ModelWithArray" + }, + { + "$ref": "#/components/schemas/ModelWithDictionary" + } + ] + }, + "user": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "readOnly": true + } + }, + "readOnly": true + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json; type=collection": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" + } + } + } + } + } + } + }, + "/api/v{api-version}/header": { + "post": { + "tags": [ + "Header" + ], + "operationId": "CallWithResultFromHeader", + "responses": { + "200": { + "description": "Successful response", + "headers": { + "operation-location": { + "schema": { + "type": "string" + } + } + } + }, + "400": { + "description": "400 server error" + }, + "500": { + "description": "500 server error" + } + } + } + }, + "/api/v{api-version}/error": { + "post": { + "tags": [ + "Error" + ], + "operationId": "testErrorCode", + "parameters": [ + { + "description": "Status code to return", + "name": "status", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Custom message: Successful response" + }, + "500": { + "description": "Custom message: Internal Server Error" + }, + "501": { + "description": "Custom message: Not Implemented" + }, + "502": { + "description": "Custom message: Bad Gateway" + }, + "503": { + "description": "Custom message: Service Unavailable" + } + } + } + } + }, + "components": { + "requestBodies": { + "SimpleRequestBody": { + "description": "A reusable request body", + "required": false, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" + } + } + } + }, + "SimpleFormData": { + "description": "A reusable request body", + "required": false, + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" + } + } + } + } + }, + "parameters": { + "SimpleParameter": { + "description": "This is a reusable parameter", + "name": "parameter", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + } + }, + "schemas": { + "CommentWithBreaks": { + "description": "Testing multiline comments in string: First line\nSecond line\n\nFourth line", + "type": "integer" + }, + "CommentWithBackticks": { + "description": "Testing backticks in string: `backticks` and ```multiple backticks``` should work", + "type": "integer" + }, + "CommentWithSlashes": { + "description": "Testing slashes in string: \\backwards\\\\\\ and /forwards/// should work", + "type": "integer" + }, + "CommentWithExpressionPlaceholders": { + "description": "Testing expression placeholders in string: ${expression} should work", + "type": "integer" + }, + "CommentWithQuotes": { + "description": "Testing quotes in string: 'single quote''' and \"double quotes\"\"\" should work", + "type": "integer" + }, + "CommentWithReservedCharacters": { + "description": "Testing reserved characters in string: /* inline */ and /** inline **/ should work", + "type": "integer" + }, + "SimpleInteger": { + "description": "This is a simple number", + "type": "integer" + }, + "SimpleBoolean": { + "description": "This is a simple boolean", + "type": "boolean" + }, + "SimpleString": { + "description": "This is a simple string", + "type": "string" + }, + "SimpleFile": { + "description": "This is a simple file", + "type": "file" + }, + "SimpleReference": { + "description": "This is a simple reference", + "$ref": "#/components/schemas/ModelWithString" + }, + "SimpleStringWithPattern": { + "description": "This is a simple string", + "type": "string", + "nullable": true, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9_]*$" + }, + "EnumWithStrings": { + "description": "This is a simple enum with strings", + "enum": [ + "Success", + "Warning", + "Error", + "'Single Quote'", + "\"Double Quotes\"" + ] + }, + "EnumWithNumbers": { + "description": "This is a simple enum with numbers", + "enum": [ + 1, + 2, + 3, + 1.1, + 1.20, + 1.300, + 100, + 200, + 300, + -100, + -200, + -300, + -1.1, + -1.20, + -1.300 + ] + }, + "EnumFromDescription": { + "description": "Success=1,Warning=2,Error=3", + "type": "number" + }, + "EnumWithExtensions": { + "description": "This is a simple enum with numbers", + "enum": [ + 200, + 400, + 500 + ], + "x-enum-varnames": [ + "CUSTOM_SUCCESS", + "CUSTOM_WARNING", + "CUSTOM_ERROR" + ], + "x-enum-descriptions": [ + "Used when the status of something is successful", + "Used when the status of something has a warning", + "Used when the status of something has an error" + ] + }, + "ArrayWithNumbers": { + "description": "This is a simple array with numbers", + "type": "array", + "items": { + "type": "integer" + } + }, + "ArrayWithBooleans": { + "description": "This is a simple array with booleans", + "type": "array", + "items": { + "type": "boolean" + } + }, + "ArrayWithStrings": { + "description": "This is a simple array with strings", + "type": "array", + "items": { + "type": "string" + } + }, + "ArrayWithReferences": { + "description": "This is a simple array with references", + "type": "array", + "items": { + "$ref": "#/components/schemas/ModelWithString" + } + }, + "ArrayWithArray": { + "description": "This is a simple array containing an array", + "type": "array", + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ModelWithString" + } + } + }, + "ArrayWithProperties": { + "description": "This is a simple array with properties", + "type": "array", + "items": { + "type": "object", + "properties": { + "foo": { + "type": "string" + }, + "bar": { + "type": "string" + } + } + } + }, + "DictionaryWithString": { + "description": "This is a string dictionary", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "DictionaryWithReference": { + "description": "This is a string reference", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/ModelWithString" + } + }, + "DictionaryWithArray": { + "description": "This is a complex dictionary", + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ModelWithString" + } + } + }, + "DictionaryWithDictionary": { + "description": "This is a string dictionary", + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "DictionaryWithProperties": { + "description": "This is a complex dictionary", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "foo": { + "type": "string" + }, + "bar": { + "type": "string" + } + } + } + }, + "ModelWithInteger": { + "description": "This is a model with one number property", + "type": "object", + "properties": { + "prop": { + "description": "This is a simple number property", + "type": "integer" + } + } + }, + "ModelWithBoolean": { + "description": "This is a model with one boolean property", + "type": "object", + "properties": { + "prop": { + "description": "This is a simple boolean property", + "type": "boolean" + } + } + }, + "ModelWithString": { + "description": "This is a model with one string property", + "type": "object", + "properties": { + "prop": { + "description": "This is a simple string property", + "type": "string" + } + } + }, + "ModelWithNullableString": { + "description": "This is a model with one string property", + "type": "object", + "required": [ + "nullableRequiredProp1", + "nullableRequiredProp2" + ], + "properties": { + "nullableProp1": { + "description": "This is a simple string property", + "type": "string", + "nullable": true + }, + "nullableRequiredProp1": { + "description": "This is a simple string property", + "type": "string", + "nullable": true + }, + "nullableProp2": { + "description": "This is a simple string property", + "type": [ + "string", + "null" + ] + }, + "nullableRequiredProp2": { + "description": "This is a simple string property", + "type": [ + "string", + "null" + ] + } + } + }, + "ModelWithEnum": { + "description": "This is a model with one enum", + "type": "object", + "properties": { + "test": { + "description": "This is a simple enum with strings", + "enum": [ + "Success", + "Warning", + "Error" + ] + }, + "statusCode": { + "description": "These are the HTTP error code enums", + "enum": [ + "100", + "200 FOO", + "300 FOO_BAR", + "400 foo-bar", + "500 foo.bar", + "600 foo&bar" + ] + }, + "bool": { + "description": "Simple boolean enum", + "type": "boolean", + "enum": [ + true + ] + } + } + }, + "ModelWithEnumFromDescription": { + "description": "This is a model with one enum", + "type": "object", + "properties": { + "test": { + "type": "integer", + "description": "Success=1,Warning=2,Error=3" + } + } + }, + "ModelWithNestedEnums": { + "description": "This is a model with nested enums", + "type": "object", + "properties": { + "dictionaryWithEnum": { + "type": "object", + "additionalProperties": { + "enum": [ + "Success", + "Warning", + "Error" + ] + } + }, + "dictionaryWithEnumFromDescription": { + "type": "object", + "additionalProperties": { + "type": "integer", + "description": "Success=1,Warning=2,Error=3" + } + }, + "arrayWithEnum": { + "type": "array", + "items": { + "enum": [ + "Success", + "Warning", + "Error" + ] + } + }, + "arrayWithDescription": { + "type": "array", + "items": { + "type": "integer", + "description": "Success=1,Warning=2,Error=3" + } + } + } + }, + "ModelWithReference": { + "description": "This is a model with one property containing a reference", + "type": "object", + "properties": { + "prop": { + "$ref": "#/components/schemas/ModelWithProperties" + } + } + }, + "ModelWithArray": { + "description": "This is a model with one property containing an array", + "type": "object", + "properties": { + "prop": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ModelWithString" + } + }, + "propWithFile": { + "type": "array", + "items": { + "type": "file" + } + }, + "propWithNumber": { + "type": "array", + "items": { + "type": "number" + } + } + } + }, + "ModelWithDictionary": { + "description": "This is a model with one property containing a dictionary", + "type": "object", + "properties": { + "prop": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + }, + "DeprecatedModel": { + "deprecated": true, + "description": "This is a deprecated model with a deprecated property", + "type": "object", + "properties": { + "prop": { + "deprecated": true, + "description": "This is a deprecated property", + "type": "string" + } + } + }, + "ModelWithCircularReference": { + "description": "This is a model with one property containing a circular reference", + "type": "object", + "properties": { + "prop": { + "$ref": "#/components/schemas/ModelWithCircularReference" + } + } + }, + "CompositionWithOneOf": { + "description": "This is a model with one property with a 'one of' relationship", + "type": "object", + "properties": { + "propA": { + "type": "object", + "oneOf": [ + { + "$ref": "#/components/schemas/ModelWithString" + }, + { + "$ref": "#/components/schemas/ModelWithEnum" + }, + { + "$ref": "#/components/schemas/ModelWithArray" + }, + { + "$ref": "#/components/schemas/ModelWithDictionary" + } + ] + } + } + }, + "CompositionWithOneOfAnonymous": { + "description": "This is a model with one property with a 'one of' relationship where the options are not $ref", + "type": "object", + "properties": { + "propA": { + "type": "object", + "oneOf": [ + { + "description": "Anonymous object type", + "type": "object", + "properties": { + "propA": { + "type": "string" + } + } + }, + { + "description": "Anonymous string type", + "type": "string" + }, + { + "description": "Anonymous integer type", + "type": "integer" + } + ] + } + } + }, + "ModelCircle": { + "description": "Circle", + "type": "object", + "required": [ + "kind" + ], + "properties": { + "kind": { + "type": "string" + }, + "radius": { + "type": "number" + } + } + }, + "ModelSquare": { + "description": "Square", + "type": "object", + "required": [ + "kind" + ], + "properties": { + "kind": { + "type": "string" + }, + "sideLength": { + "type": "number" + } + } + }, + "CompositionWithOneOfDiscriminator": { + "description": "This is a model with one property with a 'one of' relationship where the options are not $ref", + "type": "object", + "oneOf": [ + { + "$ref": "#/components/schemas/ModelCircle" + }, + { + "$ref": "#/components/schemas/ModelSquare" + } + ], + "discriminator": { + "propertyName": "kind", + "mapping": { + "circle": "#/components/schemas/ModelCircle", + "square": "#/components/schemas/ModelSquare" + } + } + }, + "CompositionWithAnyOf": { + "description": "This is a model with one property with a 'any of' relationship", + "type": "object", + "properties": { + "propA": { + "type": "object", + "anyOf": [ + { + "$ref": "#/components/schemas/ModelWithString" + }, + { + "$ref": "#/components/schemas/ModelWithEnum" + }, + { + "$ref": "#/components/schemas/ModelWithArray" + }, + { + "$ref": "#/components/schemas/ModelWithDictionary" + } + ] + } + } + }, + "CompositionWithAnyOfAnonymous": { + "description": "This is a model with one property with a 'any of' relationship where the options are not $ref", + "type": "object", + "properties": { + "propA": { + "type": "object", + "anyOf": [ + { + "description": "Anonymous object type", + "type": "object", + "properties": { + "propA": { + "type": "string" + } + } + }, + { + "description": "Anonymous string type", + "type": "string" + }, + { + "description": "Anonymous integer type", + "type": "integer" + } + ] + } + } + }, + "CompositionWithOneOfAndNullable": { + "description": "This is a model with one property with a 'one of' relationship", + "type": "object", + "properties": { + "propA": { + "nullable": true, + "type": "object", + "oneOf": [ + { + "type": "object", + "properties": { + "boolean": { + "type": "boolean" + } + } + }, + { + "$ref": "#/components/schemas/ModelWithEnum" + }, + { + "$ref": "#/components/schemas/ModelWithArray" + }, + { + "$ref": "#/components/schemas/ModelWithDictionary" + } + ] + } + } + }, + "CompositionWithOneOfAndSimpleDictionary": { + "description": "This is a model that contains a simple dictionary within composition", + "type": "object", + "properties": { + "propA": { + "oneOf": [ + { + "type": "boolean" + }, + { + "type": "object", + "additionalProperties": { + "type": "number" + } + } + ] + } + } + }, + "CompositionWithOneOfAndSimpleArrayDictionary": { + "description": "This is a model that contains a dictionary of simple arrays within composition", + "type": "object", + "properties": { + "propA": { + "oneOf": [ + { + "type": "boolean" + }, + { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "boolean" + } + } + } + ] + } + } + }, + "CompositionWithOneOfAndComplexArrayDictionary": { + "description": "This is a model that contains a dictionary of complex arrays (composited) within composition", + "type": "object", + "properties": { + "propA": { + "oneOf": [ + { + "type": "boolean" + }, + { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + } + } + } + ] + } + } + }, + "CompositionWithAllOfAndNullable": { + "description": "This is a model with one property with a 'all of' relationship", + "type": "object", + "properties": { + "propA": { + "nullable": true, + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "boolean": { + "type": "boolean" + } + } + }, + { + "$ref": "#/components/schemas/ModelWithEnum" + }, + { + "$ref": "#/components/schemas/ModelWithArray" + }, + { + "$ref": "#/components/schemas/ModelWithDictionary" + } + ] + } + } + }, + "CompositionWithAnyOfAndNullable": { + "description": "This is a model with one property with a 'any of' relationship", + "type": "object", + "properties": { + "propA": { + "nullable": true, + "type": "object", + "anyOf": [ + { + "type": "object", + "properties": { + "boolean": { + "type": "boolean" + } + } + }, + { + "$ref": "#/components/schemas/ModelWithEnum" + }, + { + "$ref": "#/components/schemas/ModelWithArray" + }, + { + "$ref": "#/components/schemas/ModelWithDictionary" + } + ] + } + } + }, + "CompositionBaseModel": { + "description": "This is a base model with two simple optional properties", + "type": "object", + "properties": { + "firstName": { + "type": "string" + }, + "lastname": { + "type": "string" + } + } + }, + "CompositionExtendedModel": { + "description": "This is a model that extends the base model", + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/CompositionBaseModel" + } + ], + "properties": { + "age": { + "type": "number" + } + }, + "required": [ + "firstName", + "lastname", + "age" + ] + }, + "ModelWithProperties": { + "description": "This is a model with one nested property", + "type": "object", + "required": [ + "required", + "requiredAndReadOnly", + "requiredAndNullable" + ], + "properties": { + "required": { + "type": "string" + }, + "requiredAndReadOnly": { + "type": "string", + "readOnly": true + }, + "requiredAndNullable": { + "type": "string", + "nullable": true + }, + "string": { + "type": "string" + }, + "number": { + "type": "number" + }, + "boolean": { + "type": "boolean" + }, + "reference": { + "$ref": "#/components/schemas/ModelWithString" + }, + "property with space": { + "type": "string" + }, + "default": { + "type": "string" + }, + "try": { + "type": "string" + }, + "@namespace.string": { + "type": "string", + "readOnly": true + }, + "@namespace.integer": { + "type": "integer", + "readOnly": true + } + } + }, + "ModelWithNestedProperties": { + "description": "This is a model with one nested property", + "type": "object", + "required": [ + "first" + ], + "properties": { + "first": { + "type": "object", + "required": [ + "second" + ], + "readOnly": true, + "nullable": true, + "properties": { + "second": { + "type": "object", + "required": [ + "third" + ], + "readOnly": true, + "nullable": true, + "properties": { + "third": { + "type": "string", + "required": true, + "readOnly": true, + "nullable": true + } + } + } + } + } + } + }, + "ModelWithDuplicateProperties": { + "description": "This is a model with duplicated properties", + "type": "object", + "properties": { + "prop": { + "$ref": "#/components/schemas/ModelWithString" + }, + "prop": { + "$ref": "#/components/schemas/ModelWithString" + }, + "prop": { + "$ref": "#/components/schemas/ModelWithString" + } + } + }, + "ModelWithOrderedProperties": { + "description": "This is a model with ordered properties", + "type": "object", + "properties": { + "zebra": { + "type": "string" + }, + "apple": { + "type": "string" + }, + "hawaii": { + "type": "string" + } + } + }, + "ModelWithDuplicateImports": { + "description": "This is a model with duplicated imports", + "type": "object", + "properties": { + "propA": { + "$ref": "#/components/schemas/ModelWithString" + }, + "propB": { + "$ref": "#/components/schemas/ModelWithString" + }, + "propC": { + "$ref": "#/components/schemas/ModelWithString" + } + } + }, + "ModelThatExtends": { + "description": "This is a model that extends another model", + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/ModelWithString" + }, + { + "type": "object", + "properties": { + "propExtendsA": { + "type": "string" + }, + "propExtendsB": { + "$ref": "#/components/schemas/ModelWithString" + } + } + } + ] + }, + "ModelThatExtendsExtends": { + "description": "This is a model that extends another model", + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/ModelWithString" + }, + { + "$ref": "#/components/schemas/ModelThatExtends" + }, + { + "type": "object", + "properties": { + "propExtendsC": { + "type": "string" + }, + "propExtendsD": { + "$ref": "#/components/schemas/ModelWithString" + } + } + } + ] + }, + "ModelWithPattern": { + "description": "This is a model that contains a some patterns", + "type": "object", + "required": [ + "key", + "name" + ], + "properties": { + "key": { + "maxLength": 64, + "pattern": "^[a-zA-Z0-9_]*$", + "type": "string" + }, + "name": { + "maxLength": 255, + "type": "string" + }, + "enabled": { + "type": "boolean", + "readOnly": true + }, + "modified": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "id": { + "type": "string", + "pattern": "^\\d{2}-\\d{3}-\\d{4}$" + }, + "text": { + "type": "string", + "pattern": "^\\w+$" + }, + "patternWithSingleQuotes": { + "type": "string", + "pattern": "^[a-zA-Z0-9']*$" + } + } + }, + "File": { + "required": [ + "mime" + ], + "type": "object", + "properties": { + "id": { + "title": "Id", + "type": "string", + "readOnly": true, + "minLength": 1 + }, + "updated_at": { + "title": "Updated at", + "type": "string", + "format": "date-time", + "readOnly": true + }, + "created_at": { + "title": "Created at", + "type": "string", + "format": "date-time", + "readOnly": true + }, + "mime": { + "title": "Mime", + "type": "string", + "maxLength": 24, + "minLength": 1 + }, + "file": { + "title": "File", + "type": "string", + "readOnly": true, + "format": "uri" + } + } + }, + "default": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + } + }, + "Pageable": { + "type": "object", + "properties": { + "page": { + "minimum": 0, + "type": "integer", + "format": "int32" + }, + "size": { + "minimum": 1, + "type": "integer", + "format": "int32" + }, + "sort": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "FreeFormObjectWithoutAdditionalProperties": { + "description": "This is a free-form object without additionalProperties.", + "type": "object" + }, + "FreeFormObjectWithAdditionalPropertiesEqTrue": { + "description": "This is a free-form object with additionalProperties: true.", + "type": "object", + "additionalProperties": true + }, + "FreeFormObjectWithAdditionalPropertiesEqEmptyObject": { + "description": "This is a free-form object with additionalProperties: {}.", + "type": "object", + "additionalProperties": {} + } + } + } +} diff --git a/tsconfig.json b/tsconfig.json index 2a36586eb..8d27e49a8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,33 +1,33 @@ { - "compileOnSave": false, - "compilerOptions": { "outDir": "./dist", - "target": "esnext", + "target": "es2019", "module": "commonjs", "moduleResolution": "node", - "lib": ["esnext", "dom"], - "types": ["node", "jest"], - "typeRoots": ["node_modules/@types"], - "declaration": true, + "lib": ["es2019", "dom"], + "types": ["jest", "node"], + "declaration": false, "declarationMap": false, "sourceMap": false, "noImplicitReturns": true, "noImplicitThis": true, "noImplicitAny": true, - "skipLibCheck": true, "strict": true, - "strictNullChecks": true, - "importHelpers": false, - "forceConsistentCasingInFileNames": true + "skipLibCheck": true, + "allowSyntheticDefaultImports": true, + "experimentalDecorators": true }, + "files": [ + "./src/typings/hbs.d.ts" + ], + "include": [ - "./src/index.ts" + "./src/**/*.ts" ], "exclude": [ - "node_modules" + "node_modules", + "**/__mocks__" ] } - diff --git a/tslint.json b/tslint.json deleted file mode 100644 index dfd79f4a9..000000000 --- a/tslint.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "extends": [ - "tslint:recommended", - "tslint-config-airbnb" - ], - "rules": { - "align": false, - "import-name": false, - "ordered-imports": true, - "object-literal-sort-keys": false, - "no-boolean-literal-compare": false, - "no-increment-decrement": false, - "no-unused-variable": false, - "no-namespace": false, - "no-console": false, - "no-bitwise": false, - "no-var-requires": false, - "radix": false, - "member-access": true, - "max-line-length": [false], - "array-type": [true, "array"], - "arrow-parens": [true, "ban-single-arg-parens"], - "ter-arrow-parens": [true, "as-needed"], - "no-submodule-imports": [true], - "function-name": [true, { - "function-regex": "^[a-zA-Z$][\\w\\d]*$", - "method-regex": "^[a-z$][\\w\\d]*$", - "private-method-regex": "^[a-z$][\\w\\d]*$", - "protected-method-regex": "^[a-z$][\\w\\d]*$", - "static-method-regex": "^[a-z$][\\w\\d]*$" - }], - "interface-name": [ - true, - "never-prefix" - ], - "variable-name": [ - true, - "ban-keywords", - "check-format", - "allow-pascal-case", - "allow-leading-underscore" - ], - "typedef": [ - true, - "call-signature", - "parameter", - "property-declaration", - "member-variable-declaration" - ], - "naming-convention": [true, { - "type": "enumMember", - "format": "UPPER_CASE" - }], - "ter-indent": [true, 4, { - "SwitchCase": 1 - }], - "jsx-no-lambda": false, - "jsx-alignment": false, - "jsx-wrap-multiline": false, - "jsx-no-multiline-js": false - } -} diff --git a/types/index.d.ts b/types/index.d.ts new file mode 100644 index 000000000..e2b5247e0 --- /dev/null +++ b/types/index.d.ts @@ -0,0 +1,41 @@ +export declare enum HttpClient { + FETCH = 'fetch', + XHR = 'xhr', + NODE = 'node', + AXIOS = 'axios', + ANGULAR = 'angular', +} + +export declare enum Indent { + SPACE_4 = '4', + SPACE_2 = '2', + TAB = 'tab', +} + +export type Options = { + input: string | Record; + output: string; + httpClient?: HttpClient | 'fetch' | 'xhr' | 'node' | 'axios' | 'angular'; + clientName?: string; + useOptions?: boolean; + useUnionTypes?: boolean; + exportCore?: boolean; + exportServices?: boolean; + exportModels?: boolean; + exportSchemas?: boolean; + indent?: Indent | '4' | '2' | 'tab'; + postfixServices?: string; + postfixModels?: string; + request?: string; + write?: boolean; +}; + +export declare function generate(options: Options): Promise; + +declare type OpenAPI = { + HttpClient: HttpClient; + Indent: Indent; + generate: typeof generate; +}; + +export default OpenAPI; diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 039fa41a3..000000000 --- a/yarn.lock +++ /dev/null @@ -1,5010 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" - integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== - dependencies: - "@babel/highlight" "^7.0.0" - -"@babel/core@7.7.2", "@babel/core@^7.1.0": - version "7.7.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.2.tgz#ea5b99693bcfc058116f42fa1dd54da412b29d91" - integrity sha512-eeD7VEZKfhK1KUXGiyPFettgF3m513f8FoBSWiQ1xTvl1RAopLs42Wp9+Ze911I6H0N9lNqJMDgoZT7gHsipeQ== - dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.7.2" - "@babel/helpers" "^7.7.0" - "@babel/parser" "^7.7.2" - "@babel/template" "^7.7.0" - "@babel/traverse" "^7.7.2" - "@babel/types" "^7.7.2" - convert-source-map "^1.7.0" - debug "^4.1.0" - json5 "^2.1.0" - lodash "^4.17.13" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/generator@^7.4.0", "@babel/generator@^7.7.2": - version "7.7.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.2.tgz#2f4852d04131a5e17ea4f6645488b5da66ebf3af" - integrity sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ== - dependencies: - "@babel/types" "^7.7.2" - jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" - -"@babel/helper-annotate-as-pure@^7.0.0", "@babel/helper-annotate-as-pure@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.0.tgz#efc54032d43891fe267679e63f6860aa7dbf4a5e" - integrity sha512-k50CQxMlYTYo+GGyUGFwpxKVtxVJi9yh61sXZji3zYHccK9RYliZGSTOgci85T+r+0VFN2nWbGM04PIqwfrpMg== - dependencies: - "@babel/types" "^7.7.0" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.0.tgz#32dd9551d6ed3a5fc2edc50d6912852aa18274d9" - integrity sha512-Cd8r8zs4RKDwMG/92lpZcnn5WPQ3LAMQbCw42oqUh4s7vsSN5ANUZjMel0OOnxDLq57hoDDbai+ryygYfCTOsw== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.7.0" - "@babel/types" "^7.7.0" - -"@babel/helper-call-delegate@^7.4.4": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.7.0.tgz#df8942452c2c1a217335ca7e393b9afc67f668dc" - integrity sha512-Su0Mdq7uSSWGZayGMMQ+z6lnL00mMCnGAbO/R0ZO9odIdB/WNU/VfQKqMQU0fdIsxQYbRjDM4BixIa93SQIpvw== - dependencies: - "@babel/helper-hoist-variables" "^7.7.0" - "@babel/traverse" "^7.7.0" - "@babel/types" "^7.7.0" - -"@babel/helper-create-class-features-plugin@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.7.0.tgz#bcdc223abbfdd386f94196ae2544987f8df775e8" - integrity sha512-MZiB5qvTWoyiFOgootmRSDV1udjIqJW/8lmxgzKq6oDqxdmHUjeP2ZUOmgHdYjmUVNABqRrHjYAYRvj8Eox/UA== - dependencies: - "@babel/helper-function-name" "^7.7.0" - "@babel/helper-member-expression-to-functions" "^7.7.0" - "@babel/helper-optimise-call-expression" "^7.7.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.7.0" - "@babel/helper-split-export-declaration" "^7.7.0" - -"@babel/helper-create-regexp-features-plugin@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.0.tgz#2e8badfe201cfafb5d930f46cf1e0b6f1cdcab23" - integrity sha512-ZhagAAVGD3L6MPM9/zZi7RRteonfBFLVUz3kjsnYsMAtr9hOJCKI9BAKIMpqn3NyWicPieoX779UL+7/3BEAOA== - dependencies: - "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.6.0" - -"@babel/helper-define-map@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.7.0.tgz#60b0e9fd60def9de5054c38afde8c8ee409c7529" - integrity sha512-kPKWPb0dMpZi+ov1hJiwse9dWweZsz3V9rP4KdytnX1E7z3cTNmFGglwklzFPuqIcHLIY3bgKSs4vkwXXdflQA== - dependencies: - "@babel/helper-function-name" "^7.7.0" - "@babel/types" "^7.7.0" - lodash "^4.17.13" - -"@babel/helper-explode-assignable-expression@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.0.tgz#db2a6705555ae1f9f33b4b8212a546bc7f9dc3ef" - integrity sha512-CDs26w2shdD1urNUAji2RJXyBFCaR+iBEGnFz3l7maizMkQe3saVw9WtjG1tz8CwbjvlFnaSLVhgnu1SWaherg== - dependencies: - "@babel/traverse" "^7.7.0" - "@babel/types" "^7.7.0" - -"@babel/helper-function-name@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz#44a5ad151cfff8ed2599c91682dda2ec2c8430a3" - integrity sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q== - dependencies: - "@babel/helper-get-function-arity" "^7.7.0" - "@babel/template" "^7.7.0" - "@babel/types" "^7.7.0" - -"@babel/helper-get-function-arity@^7.0.0", "@babel/helper-get-function-arity@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz#c604886bc97287a1d1398092bc666bc3d7d7aa2d" - integrity sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw== - dependencies: - "@babel/types" "^7.7.0" - -"@babel/helper-hoist-variables@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.0.tgz#b4552e4cfe5577d7de7b183e193e84e4ec538c81" - integrity sha512-LUe/92NqsDAkJjjCEWkNe+/PcpnisvnqdlRe19FahVapa4jndeuJ+FBiTX1rcAKWKcJGE+C3Q3tuEuxkSmCEiQ== - dependencies: - "@babel/types" "^7.7.0" - -"@babel/helper-member-expression-to-functions@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.0.tgz#472b93003a57071f95a541ea6c2b098398bcad8a" - integrity sha512-QaCZLO2RtBcmvO/ekOLp8p7R5X2JriKRizeDpm5ChATAFWrrYDcDxPuCIBXKyBjY+i1vYSdcUTMIb8psfxHDPA== - dependencies: - "@babel/types" "^7.7.0" - -"@babel/helper-module-imports@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.7.0.tgz#99c095889466e5f7b6d66d98dffc58baaf42654d" - integrity sha512-Dv3hLKIC1jyfTkClvyEkYP2OlkzNvWs5+Q8WgPbxM5LMeorons7iPP91JM+DU7tRbhqA1ZeooPaMFvQrn23RHw== - dependencies: - "@babel/types" "^7.7.0" - -"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.7.0.tgz#154a69f0c5b8fd4d39e49750ff7ac4faa3f36786" - integrity sha512-rXEefBuheUYQyX4WjV19tuknrJFwyKw0HgzRwbkyTbB+Dshlq7eqkWbyjzToLrMZk/5wKVKdWFluiAsVkHXvuQ== - dependencies: - "@babel/helper-module-imports" "^7.7.0" - "@babel/helper-simple-access" "^7.7.0" - "@babel/helper-split-export-declaration" "^7.7.0" - "@babel/template" "^7.7.0" - "@babel/types" "^7.7.0" - lodash "^4.17.13" - -"@babel/helper-optimise-call-expression@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.0.tgz#4f66a216116a66164135dc618c5d8b7a959f9365" - integrity sha512-48TeqmbazjNU/65niiiJIJRc5JozB8acui1OS7bSd6PgxfuovWsvjfWSzlgx+gPFdVveNzUdpdIg5l56Pl5jqg== - dependencies: - "@babel/types" "^7.7.0" - -"@babel/helper-plugin-utils@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" - integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== - -"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.5.5.tgz#0aa6824f7100a2e0e89c1527c23936c152cab351" - integrity sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw== - dependencies: - lodash "^4.17.13" - -"@babel/helper-remap-async-to-generator@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.0.tgz#4d69ec653e8bff5bce62f5d33fc1508f223c75a7" - integrity sha512-pHx7RN8X0UNHPB/fnuDnRXVZ316ZigkO8y8D835JlZ2SSdFKb6yH9MIYRU4fy/KPe5sPHDFOPvf8QLdbAGGiyw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.7.0" - "@babel/helper-wrap-function" "^7.7.0" - "@babel/template" "^7.7.0" - "@babel/traverse" "^7.7.0" - "@babel/types" "^7.7.0" - -"@babel/helper-replace-supers@^7.5.5", "@babel/helper-replace-supers@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.7.0.tgz#d5365c8667fe7cbd13b8ddddceb9bd7f2b387512" - integrity sha512-5ALYEul5V8xNdxEeWvRsBzLMxQksT7MaStpxjJf9KsnLxpAKBtfw5NeMKZJSYDa0lKdOcy0g+JT/f5mPSulUgg== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.7.0" - "@babel/helper-optimise-call-expression" "^7.7.0" - "@babel/traverse" "^7.7.0" - "@babel/types" "^7.7.0" - -"@babel/helper-simple-access@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.7.0.tgz#97a8b6c52105d76031b86237dc1852b44837243d" - integrity sha512-AJ7IZD7Eem3zZRuj5JtzFAptBw7pMlS3y8Qv09vaBWoFsle0d1kAn5Wq6Q9MyBXITPOKnxwkZKoAm4bopmv26g== - dependencies: - "@babel/template" "^7.7.0" - "@babel/types" "^7.7.0" - -"@babel/helper-split-export-declaration@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz#1365e74ea6c614deeb56ebffabd71006a0eb2300" - integrity sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA== - dependencies: - "@babel/types" "^7.7.0" - -"@babel/helper-wrap-function@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.7.0.tgz#15af3d3e98f8417a60554acbb6c14e75e0b33b74" - integrity sha512-sd4QjeMgQqzshSjecZjOp8uKfUtnpmCyQhKQrVJBBgeHAB/0FPi33h3AbVlVp07qQtMD4QgYSzaMI7VwncNK/w== - dependencies: - "@babel/helper-function-name" "^7.7.0" - "@babel/template" "^7.7.0" - "@babel/traverse" "^7.7.0" - "@babel/types" "^7.7.0" - -"@babel/helpers@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.7.0.tgz#359bb5ac3b4726f7c1fde0ec75f64b3f4275d60b" - integrity sha512-VnNwL4YOhbejHb7x/b5F39Zdg5vIQpUUNzJwx0ww1EcVRt41bbGRZWhAURrfY32T5zTT3qwNOQFWpn+P0i0a2g== - dependencies: - "@babel/template" "^7.7.0" - "@babel/traverse" "^7.7.0" - "@babel/types" "^7.7.0" - -"@babel/highlight@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" - integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== - dependencies: - chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0", "@babel/parser@^7.7.2": - version "7.7.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.2.tgz#ea8334dc77416bfd9473eb470fd00d8245b3943b" - integrity sha512-DDaR5e0g4ZTb9aP7cpSZLkACEBdoLGwJDWgHtBhrGX7Q1RjhdoMOfexICj5cqTAtpowjGQWfcvfnQG7G2kAB5w== - -"@babel/plugin-proposal-async-generator-functions@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.0.tgz#83ef2d6044496b4c15d8b4904e2219e6dccc6971" - integrity sha512-ot/EZVvf3mXtZq0Pd0+tSOfGWMizqmOohXmNZg6LNFjHOV+wOPv7BvVYh8oPR8LhpIP3ye8nNooKL50YRWxpYA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.7.0" - "@babel/plugin-syntax-async-generators" "^7.2.0" - -"@babel/plugin-proposal-dynamic-import@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.0.tgz#dc02a8bad8d653fb59daf085516fa416edd2aa7f" - integrity sha512-7poL3Xi+QFPC7sGAzEIbXUyYzGJwbc2+gSD0AkiC5k52kH2cqHdqxm5hNFfLW3cRSTcx9bN0Fl7/6zWcLLnKAQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-dynamic-import" "^7.2.0" - -"@babel/plugin-proposal-json-strings@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" - integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-json-strings" "^7.2.0" - -"@babel/plugin-proposal-object-rest-spread@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz#8ffccc8f3a6545e9f78988b6bf4fe881b88e8096" - integrity sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" - -"@babel/plugin-proposal-optional-catch-binding@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" - integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" - -"@babel/plugin-proposal-unicode-property-regex@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.0.tgz#549fe1717a1bd0a2a7e63163841cb37e78179d5d" - integrity sha512-mk34H+hp7kRBWJOOAR0ZMGCydgKMD4iN9TpDRp3IIcbunltxEY89XSimc6WbtSLCDrwcdy/EEw7h5CFCzxTchw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.7.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-async-generators@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" - integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-dynamic-import@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" - integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-json-strings@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" - integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" - integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" - integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-top-level-await@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.0.tgz#f5699549f50bbe8d12b1843a4e82f0a37bb65f4d" - integrity sha512-hi8FUNiFIY1fnUI2n1ViB1DR0R4QeK4iHcTlW6aJkrPoTdb8Rf1EMQ6GT3f67DDkYyWgew9DFoOZ6gOoEsdzTA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-typescript@^7.2.0": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.3.3.tgz#a7cc3f66119a9f7ebe2de5383cce193473d65991" - integrity sha512-dGwbSMA1YhVS8+31CnPR7LB4pcbrzcV99wQzby4uAfrkZPYZlQ7ImwdpzLqi6Z6IL02b8IAL379CaMwo0x5Lag== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-arrow-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" - integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-async-to-generator@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.0.tgz#e2b84f11952cf5913fe3438b7d2585042772f492" - integrity sha512-vLI2EFLVvRBL3d8roAMqtVY0Bm9C1QzLkdS57hiKrjUBSqsQYrBsMCeOg/0KK7B0eK9V71J5mWcha9yyoI2tZw== - dependencies: - "@babel/helper-module-imports" "^7.7.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.7.0" - -"@babel/plugin-transform-block-scoped-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" - integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-block-scoping@^7.6.3": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.3.tgz#6e854e51fbbaa84351b15d4ddafe342f3a5d542a" - integrity sha512-7hvrg75dubcO3ZI2rjYTzUrEuh1E9IyDEhhB6qfcooxhDA33xx2MasuLVgdxzcP6R/lipAC6n9ub9maNW6RKdw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - lodash "^4.17.13" - -"@babel/plugin-transform-classes@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.0.tgz#b411ecc1b8822d24b81e5d184f24149136eddd4a" - integrity sha512-/b3cKIZwGeUesZheU9jNYcwrEA7f/Bo4IdPmvp7oHgvks2majB5BoT5byAql44fiNQYOPzhk2w8DbgfuafkMoA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.7.0" - "@babel/helper-define-map" "^7.7.0" - "@babel/helper-function-name" "^7.7.0" - "@babel/helper-optimise-call-expression" "^7.7.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.7.0" - "@babel/helper-split-export-declaration" "^7.7.0" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" - integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-destructuring@^7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz#44bbe08b57f4480094d57d9ffbcd96d309075ba6" - integrity sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-dotall-regex@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.0.tgz#c5c9ecacab3a5e0c11db6981610f0c32fd698b3b" - integrity sha512-3QQlF7hSBnSuM1hQ0pS3pmAbWLax/uGNCbPBND9y+oJ4Y776jsyujG2k0Sn2Aj2a0QwVOiOFL5QVPA7spjvzSA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.7.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-duplicate-keys@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz#c5dbf5106bf84cdf691222c0974c12b1df931853" - integrity sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-exponentiation-operator@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" - integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-for-of@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556" - integrity sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-function-name@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.0.tgz#0fa786f1eef52e3b7d4fc02e54b2129de8a04c2a" - integrity sha512-P5HKu0d9+CzZxP5jcrWdpe7ZlFDe24bmqP6a6X8BHEBl/eizAsY8K6LX8LASZL0Jxdjm5eEfzp+FIrxCm/p8bA== - dependencies: - "@babel/helper-function-name" "^7.7.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" - integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-member-expression-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d" - integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-modules-amd@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz#ef00435d46da0a5961aa728a1d2ecff063e4fb91" - integrity sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg== - dependencies: - "@babel/helper-module-transforms" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - babel-plugin-dynamic-import-node "^2.3.0" - -"@babel/plugin-transform-modules-commonjs@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.0.tgz#3e5ffb4fd8c947feede69cbe24c9554ab4113fe3" - integrity sha512-KEMyWNNWnjOom8vR/1+d+Ocz/mILZG/eyHHO06OuBQ2aNhxT62fr4y6fGOplRx+CxCSp3IFwesL8WdINfY/3kg== - dependencies: - "@babel/helper-module-transforms" "^7.7.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-simple-access" "^7.7.0" - babel-plugin-dynamic-import-node "^2.3.0" - -"@babel/plugin-transform-modules-systemjs@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.0.tgz#9baf471213af9761c1617bb12fd278e629041417" - integrity sha512-ZAuFgYjJzDNv77AjXRqzQGlQl4HdUM6j296ee4fwKVZfhDR9LAGxfvXjBkb06gNETPnN0sLqRm9Gxg4wZH6dXg== - dependencies: - "@babel/helper-hoist-variables" "^7.7.0" - "@babel/helper-plugin-utils" "^7.0.0" - babel-plugin-dynamic-import-node "^2.3.0" - -"@babel/plugin-transform-modules-umd@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.0.tgz#d62c7da16670908e1d8c68ca0b5d4c0097b69966" - integrity sha512-u7eBA03zmUswQ9LQ7Qw0/ieC1pcAkbp5OQatbWUzY1PaBccvuJXUkYzoN1g7cqp7dbTu6Dp9bXyalBvD04AANA== - dependencies: - "@babel/helper-module-transforms" "^7.7.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.0.tgz#358e6fd869b9a4d8f5cbc79e4ed4fc340e60dcaf" - integrity sha512-+SicSJoKouPctL+j1pqktRVCgy+xAch1hWWTMy13j0IflnyNjaoskj+DwRQFimHbLqO3sq2oN2CXMvXq3Bgapg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.7.0" - -"@babel/plugin-transform-new-target@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz#18d120438b0cc9ee95a47f2c72bc9768fbed60a5" - integrity sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-object-super@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz#c70021df834073c65eb613b8679cc4a381d1a9f9" - integrity sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.5.5" - -"@babel/plugin-transform-parameters@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16" - integrity sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw== - dependencies: - "@babel/helper-call-delegate" "^7.4.4" - "@babel/helper-get-function-arity" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-property-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" - integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-regenerator@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.0.tgz#f1b20b535e7716b622c99e989259d7dd942dd9cc" - integrity sha512-AXmvnC+0wuj/cFkkS/HFHIojxH3ffSXE+ttulrqWjZZRaUOonfJc60e1wSNT4rV8tIunvu/R3wCp71/tLAa9xg== - dependencies: - regenerator-transform "^0.14.0" - -"@babel/plugin-transform-reserved-words@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634" - integrity sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-shorthand-properties@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" - integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-spread@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz#fc77cf798b24b10c46e1b51b1b88c2bf661bb8dd" - integrity sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-sticky-regex@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" - integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.0.0" - -"@babel/plugin-transform-template-literals@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0" - integrity sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g== - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-typeof-symbol@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" - integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-typescript@^7.7.2": - version "7.7.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.7.2.tgz#eb9f14c516b5d36f4d6f3a9d7badae6d0fc313d4" - integrity sha512-UWhDaJRqdPUtdK1s0sKYdoRuqK0NepjZto2UZltvuCgMoMZmdjhgz5hcRokie/3aYEaSz3xvusyoayVaq4PjRg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.7.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-typescript" "^7.2.0" - -"@babel/plugin-transform-unicode-regex@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.0.tgz#743d9bcc44080e3cc7d49259a066efa30f9187a3" - integrity sha512-RrThb0gdrNwFAqEAAx9OWgtx6ICK69x7i9tCnMdVrxQwSDp/Abu9DXFU5Hh16VP33Rmxh04+NGW28NsIkFvFKA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.7.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/preset-env@7.7.1": - version "7.7.1" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.7.1.tgz#04a2ff53552c5885cf1083e291c8dd5490f744bb" - integrity sha512-/93SWhi3PxcVTDpSqC+Dp4YxUu3qZ4m7I76k0w73wYfn7bGVuRIO4QUz95aJksbS+AD1/mT1Ie7rbkT0wSplaA== - dependencies: - "@babel/helper-module-imports" "^7.7.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-async-generator-functions" "^7.7.0" - "@babel/plugin-proposal-dynamic-import" "^7.7.0" - "@babel/plugin-proposal-json-strings" "^7.2.0" - "@babel/plugin-proposal-object-rest-spread" "^7.6.2" - "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.7.0" - "@babel/plugin-syntax-async-generators" "^7.2.0" - "@babel/plugin-syntax-dynamic-import" "^7.2.0" - "@babel/plugin-syntax-json-strings" "^7.2.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" - "@babel/plugin-syntax-top-level-await" "^7.7.0" - "@babel/plugin-transform-arrow-functions" "^7.2.0" - "@babel/plugin-transform-async-to-generator" "^7.7.0" - "@babel/plugin-transform-block-scoped-functions" "^7.2.0" - "@babel/plugin-transform-block-scoping" "^7.6.3" - "@babel/plugin-transform-classes" "^7.7.0" - "@babel/plugin-transform-computed-properties" "^7.2.0" - "@babel/plugin-transform-destructuring" "^7.6.0" - "@babel/plugin-transform-dotall-regex" "^7.7.0" - "@babel/plugin-transform-duplicate-keys" "^7.5.0" - "@babel/plugin-transform-exponentiation-operator" "^7.2.0" - "@babel/plugin-transform-for-of" "^7.4.4" - "@babel/plugin-transform-function-name" "^7.7.0" - "@babel/plugin-transform-literals" "^7.2.0" - "@babel/plugin-transform-member-expression-literals" "^7.2.0" - "@babel/plugin-transform-modules-amd" "^7.5.0" - "@babel/plugin-transform-modules-commonjs" "^7.7.0" - "@babel/plugin-transform-modules-systemjs" "^7.7.0" - "@babel/plugin-transform-modules-umd" "^7.7.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.7.0" - "@babel/plugin-transform-new-target" "^7.4.4" - "@babel/plugin-transform-object-super" "^7.5.5" - "@babel/plugin-transform-parameters" "^7.4.4" - "@babel/plugin-transform-property-literals" "^7.2.0" - "@babel/plugin-transform-regenerator" "^7.7.0" - "@babel/plugin-transform-reserved-words" "^7.2.0" - "@babel/plugin-transform-shorthand-properties" "^7.2.0" - "@babel/plugin-transform-spread" "^7.6.2" - "@babel/plugin-transform-sticky-regex" "^7.2.0" - "@babel/plugin-transform-template-literals" "^7.4.4" - "@babel/plugin-transform-typeof-symbol" "^7.2.0" - "@babel/plugin-transform-unicode-regex" "^7.7.0" - "@babel/types" "^7.7.1" - browserslist "^4.6.0" - core-js-compat "^3.1.1" - invariant "^2.2.2" - js-levenshtein "^1.1.3" - semver "^5.5.0" - -"@babel/preset-typescript@7.7.2": - version "7.7.2" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.7.2.tgz#f71c8bba2ae02f11b29dbf7d6a35f47bbe011632" - integrity sha512-1B4HthAelaLGfNRyrWqJtBEjXX1ulThCrLQ5B2VOtEAznWFIFXFJahgXImqppy66lx/Oh+cOSCQdJzZqh2Jh5g== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-transform-typescript" "^7.7.2" - -"@babel/runtime@^7.0.0": - version "7.7.1" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.7.1.tgz#b223497bbfbcbbb38116673904debc71470ca528" - integrity sha512-SQ0sS7KUJDvgCI2cpZG0nJygO6002oTbhgSuw4WcocsnbxLwL5Q8I3fqbJdyBAc3uFrWZiR2JomseuxSuci3SQ== - dependencies: - regenerator-runtime "^0.13.2" - -"@babel/template@^7.4.0", "@babel/template@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.0.tgz#4fadc1b8e734d97f56de39c77de76f2562e597d0" - integrity sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.7.0" - "@babel/types" "^7.7.0" - -"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": - version "7.7.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.2.tgz#ef0a65e07a2f3c550967366b3d9b62a2dcbeae09" - integrity sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw== - dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.7.2" - "@babel/helper-function-name" "^7.7.0" - "@babel/helper-split-export-declaration" "^7.7.0" - "@babel/parser" "^7.7.2" - "@babel/types" "^7.7.2" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.13" - -"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.7.0", "@babel/types@^7.7.1", "@babel/types@^7.7.2": - version "7.7.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.2.tgz#550b82e5571dcd174af576e23f0adba7ffc683f7" - integrity sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA== - dependencies: - esutils "^2.0.2" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - -"@cnakazawa/watch@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" - integrity sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA== - dependencies: - exec-sh "^0.3.2" - minimist "^1.2.0" - -"@jest/console@^24.7.1", "@jest/console@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" - integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ== - dependencies: - "@jest/source-map" "^24.9.0" - chalk "^2.0.1" - slash "^2.0.0" - -"@jest/core@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-24.9.0.tgz#2ceccd0b93181f9c4850e74f2a9ad43d351369c4" - integrity sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A== - dependencies: - "@jest/console" "^24.7.1" - "@jest/reporters" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/transform" "^24.9.0" - "@jest/types" "^24.9.0" - ansi-escapes "^3.0.0" - chalk "^2.0.1" - exit "^0.1.2" - graceful-fs "^4.1.15" - jest-changed-files "^24.9.0" - jest-config "^24.9.0" - jest-haste-map "^24.9.0" - jest-message-util "^24.9.0" - jest-regex-util "^24.3.0" - jest-resolve "^24.9.0" - jest-resolve-dependencies "^24.9.0" - jest-runner "^24.9.0" - jest-runtime "^24.9.0" - jest-snapshot "^24.9.0" - jest-util "^24.9.0" - jest-validate "^24.9.0" - jest-watcher "^24.9.0" - micromatch "^3.1.10" - p-each-series "^1.0.0" - realpath-native "^1.1.0" - rimraf "^2.5.4" - slash "^2.0.0" - strip-ansi "^5.0.0" - -"@jest/environment@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.9.0.tgz#21e3afa2d65c0586cbd6cbefe208bafade44ab18" - integrity sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ== - dependencies: - "@jest/fake-timers" "^24.9.0" - "@jest/transform" "^24.9.0" - "@jest/types" "^24.9.0" - jest-mock "^24.9.0" - -"@jest/fake-timers@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93" - integrity sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A== - dependencies: - "@jest/types" "^24.9.0" - jest-message-util "^24.9.0" - jest-mock "^24.9.0" - -"@jest/reporters@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-24.9.0.tgz#86660eff8e2b9661d042a8e98a028b8d631a5b43" - integrity sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw== - dependencies: - "@jest/environment" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/transform" "^24.9.0" - "@jest/types" "^24.9.0" - chalk "^2.0.1" - exit "^0.1.2" - glob "^7.1.2" - istanbul-lib-coverage "^2.0.2" - istanbul-lib-instrument "^3.0.1" - istanbul-lib-report "^2.0.4" - istanbul-lib-source-maps "^3.0.1" - istanbul-reports "^2.2.6" - jest-haste-map "^24.9.0" - jest-resolve "^24.9.0" - jest-runtime "^24.9.0" - jest-util "^24.9.0" - jest-worker "^24.6.0" - node-notifier "^5.4.2" - slash "^2.0.0" - source-map "^0.6.0" - string-length "^2.0.0" - -"@jest/source-map@^24.3.0", "@jest/source-map@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" - integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg== - dependencies: - callsites "^3.0.0" - graceful-fs "^4.1.15" - source-map "^0.6.0" - -"@jest/test-result@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" - integrity sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA== - dependencies: - "@jest/console" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/istanbul-lib-coverage" "^2.0.0" - -"@jest/test-sequencer@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz#f8f334f35b625a4f2f355f2fe7e6036dad2e6b31" - integrity sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A== - dependencies: - "@jest/test-result" "^24.9.0" - jest-haste-map "^24.9.0" - jest-runner "^24.9.0" - jest-runtime "^24.9.0" - -"@jest/transform@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.9.0.tgz#4ae2768b296553fadab09e9ec119543c90b16c56" - integrity sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ== - dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^24.9.0" - babel-plugin-istanbul "^5.1.0" - chalk "^2.0.1" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.1.15" - jest-haste-map "^24.9.0" - jest-regex-util "^24.9.0" - jest-util "^24.9.0" - micromatch "^3.1.10" - pirates "^4.0.1" - realpath-native "^1.1.0" - slash "^2.0.0" - source-map "^0.6.1" - write-file-atomic "2.4.1" - -"@jest/types@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" - integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^13.0.0" - -"@types/babel__core@^7.1.0": - version "7.1.3" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.3.tgz#e441ea7df63cd080dfcd02ab199e6d16a735fc30" - integrity sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.0.tgz#f1ec1c104d1bb463556ecb724018ab788d0c172a" - integrity sha512-c1mZUu4up5cp9KROs/QAw0gTeHrw/x7m52LcnvMxxOZ03DmLwPV0MlGmlgzV3cnSdjhJOZsj7E7FHeioai+egw== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" - integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.0.7" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.7.tgz#2496e9ff56196cc1429c72034e07eab6121b6f3f" - integrity sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw== - dependencies: - "@babel/types" "^7.3.0" - -"@types/color-name@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" - integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== - -"@types/eslint-visitor-keys@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" - integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== - -"@types/events@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" - integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== - -"@types/glob@*": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" - integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== - dependencies: - "@types/events" "*" - "@types/minimatch" "*" - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" - integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== - -"@types/istanbul-lib-report@*": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#e5471e7fa33c61358dd38426189c037a58433b8c" - integrity sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz#7a8cbf6a406f36c8add871625b278eaf0b0d255a" - integrity sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA== - dependencies: - "@types/istanbul-lib-coverage" "*" - "@types/istanbul-lib-report" "*" - -"@types/jest@24.0.23": - version "24.0.23" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.0.23.tgz#046f8e2ade026fe831623e361a36b6fb9a4463e4" - integrity sha512-L7MBvwfNpe7yVPTXLn32df/EK+AMBFAFvZrRuArGs7npEWnlziUXK+5GMIUTI4NIuwok3XibsjXCs5HxviYXjg== - dependencies: - jest-diff "^24.3.0" - -"@types/js-yaml@3.12.1": - version "3.12.1" - resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.1.tgz#5c6f4a1eabca84792fbd916f0cb40847f123c656" - integrity sha512-SGGAhXLHDx+PK4YLNcNGa6goPf9XRWQNAUUbffkwVGGXIxmDKWyGGL4inzq2sPmExu431Ekb9aEMn9BkPqEYFA== - -"@types/json-schema@^7.0.3": - version "7.0.3" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636" - integrity sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A== - -"@types/minimatch@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" - integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== - -"@types/mkdirp@0.5.2": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f" - integrity sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg== - dependencies: - "@types/node" "*" - -"@types/node@*", "@types/node@12.12.11": - version "12.12.11" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.11.tgz#bec2961975888d964196bf0016a2f984d793d3ce" - integrity sha512-O+x6uIpa6oMNTkPuHDa9MhMMehlxLAd5QcOvKRjAFsBVpeFWTOPnXbDvILvFgFFZfQ1xh1EZi1FbXxUix+zpsQ== - -"@types/rimraf@2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-2.0.3.tgz#0199a46af106729ba14213fda7b981278d8c84f2" - integrity sha512-dZfyfL/u9l/oi984hEXdmAjX3JHry7TLWw43u1HQ8HhPv6KtfxnrZ3T/bleJ0GEvnk9t5sM7eePkgMqz3yBcGg== - dependencies: - "@types/glob" "*" - "@types/node" "*" - -"@types/stack-utils@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" - integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== - -"@types/yargs-parser@*": - version "13.1.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-13.1.0.tgz#c563aa192f39350a1d18da36c5a8da382bbd8228" - integrity sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg== - -"@types/yargs@^13.0.0": - version "13.0.3" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.3.tgz#76482af3981d4412d65371a318f992d33464a380" - integrity sha512-K8/LfZq2duW33XW/tFwEAfnZlqIfVsoyRB3kfXdPXYhl0nfM8mmh7GS0jg7WrX2Dgq/0Ha/pR1PaR+BvmWwjiQ== - dependencies: - "@types/yargs-parser" "*" - -"@types/yup@0.26.24": - version "0.26.24" - resolved "https://registry.yarnpkg.com/@types/yup/-/yup-0.26.24.tgz#c24170b3a5c867b4fabd49fcc42fe45f780cb153" - integrity sha512-x0bhHnYjH5mZit4HivUYbTMO4LouOTGwp/LLxSL1mbJYVwNJtHYESH0ed2bwM1lkI2yDmsoCDYJnWEgHeJDACg== - -"@typescript-eslint/eslint-plugin@2.8.0": - version "2.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.8.0.tgz#eca584d46094ebebc3cb3e9fb625bfbc904a534d" - integrity sha512-ohqul5s6XEB0AzPWZCuJF5Fd6qC0b4+l5BGEnrlpmvXxvyymb8yw8Bs4YMF8usNAeuCJK87eFIHy8g8GFvOtGA== - dependencies: - "@typescript-eslint/experimental-utils" "2.8.0" - eslint-utils "^1.4.3" - functional-red-black-tree "^1.0.1" - regexpp "^3.0.0" - tsutils "^3.17.1" - -"@typescript-eslint/experimental-utils@2.8.0": - version "2.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.8.0.tgz#208b4164d175587e9b03ce6fea97d55f19c30ca9" - integrity sha512-jZ05E4SxCbbXseQGXOKf3ESKcsGxT8Ucpkp1jiVp55MGhOvZB2twmWKf894PAuVQTCgbPbJz9ZbRDqtUWzP8xA== - dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "2.8.0" - eslint-scope "^5.0.0" - -"@typescript-eslint/parser@2.8.0": - version "2.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.8.0.tgz#e10f7c40c8cf2fb19920c879311e6c46ad17bacb" - integrity sha512-NseXWzhkucq+JM2HgqAAoKEzGQMb5LuTRjFPLQzGIdLthXMNUfuiskbl7QSykvWW6mvzCtYbw1fYWGa2EIaekw== - dependencies: - "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "2.8.0" - "@typescript-eslint/typescript-estree" "2.8.0" - eslint-visitor-keys "^1.1.0" - -"@typescript-eslint/typescript-estree@2.8.0": - version "2.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.8.0.tgz#fcc3fe6532840085d29b75432c8a59895876aeca" - integrity sha512-ksvjBDTdbAQ04cR5JyFSDX113k66FxH1tAXmi+dj6hufsl/G0eMc/f1GgLjEVPkYClDbRKv+rnBFuE5EusomUw== - dependencies: - debug "^4.1.1" - eslint-visitor-keys "^1.1.0" - glob "^7.1.6" - is-glob "^4.0.1" - lodash.unescape "4.0.1" - semver "^6.3.0" - tsutils "^3.17.1" - -abab@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.2.tgz#a2fba1b122c69a85caa02d10f9270c7219709a9d" - integrity sha512-2scffjvioEmNz0OyDSLGWDfKCVwaKc6l9Pm9kOIREU13ClXZvHpg/nRL5xyjSSSLhOnXqft2HpsAzNEEA8cFFg== - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -acorn-globals@^4.1.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" - integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== - dependencies: - acorn "^6.0.1" - acorn-walk "^6.0.1" - -acorn-jsx@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" - integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== - -acorn-walk@^6.0.1: - version "6.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" - integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== - -acorn@^5.5.3: - version "5.7.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" - integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== - -acorn@^6.0.1: - version "6.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e" - integrity sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA== - -acorn@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" - integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== - -ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5: - version "6.10.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" - integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== - dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-escapes@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - -ansi-escapes@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.2.1.tgz#4dccdb846c3eee10f6d64dea66273eab90c37228" - integrity sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q== - dependencies: - type-fest "^0.5.2" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-regex@^4.0.0, ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.0.tgz#5681f0dcf7ae5880a7841d8831c4724ed9cc0172" - integrity sha512-7kFQgnEaMdRtwf6uSfUnVr9gSGC7faurn+J/Mv90/W+iTtN0405/nLdopfMWwchyxhbGYl6TC4Sccn9TUkGAgg== - dependencies: - "@types/color-name" "^1.1.1" - color-convert "^2.0.1" - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -aproba@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -array-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" - integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - -asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== - -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -atob@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - -aws4@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" - integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== - -babel-jest@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.9.0.tgz#3fc327cb8467b89d14d7bc70e315104a783ccd54" - integrity sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw== - dependencies: - "@jest/transform" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/babel__core" "^7.1.0" - babel-plugin-istanbul "^5.1.0" - babel-preset-jest "^24.9.0" - chalk "^2.4.2" - slash "^2.0.0" - -babel-plugin-dynamic-import-node@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" - integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== - dependencies: - object.assign "^4.1.0" - -babel-plugin-istanbul@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz#df4ade83d897a92df069c4d9a25cf2671293c854" - integrity sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - find-up "^3.0.0" - istanbul-lib-instrument "^3.3.0" - test-exclude "^5.2.3" - -babel-plugin-jest-hoist@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz#4f837091eb407e01447c8843cbec546d0002d756" - integrity sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw== - dependencies: - "@types/babel__traverse" "^7.0.6" - -babel-preset-jest@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz#192b521e2217fb1d1f67cf73f70c336650ad3cdc" - integrity sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg== - dependencies: - "@babel/plugin-syntax-object-rest-spread" "^7.0.0" - babel-plugin-jest-hoist "^24.9.0" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -browser-process-hrtime@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" - integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== - -browser-resolve@^1.11.3: - version "1.11.3" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" - integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== - dependencies: - resolve "1.1.7" - -browserslist@^4.6.0, browserslist@^4.7.2: - version "4.7.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.2.tgz#1bb984531a476b5d389cedecb195b2cd69fb1348" - integrity sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw== - dependencies: - caniuse-lite "^1.0.30001004" - electron-to-chromium "^1.3.295" - node-releases "^1.1.38" - -bser@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@5.3.1, camelcase@^5.0.0, camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -caniuse-lite@^1.0.30001004: - version "1.0.30001008" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001008.tgz#b8841b1df78a9f5ed9702537ef592f1f8772c0d9" - integrity sha512-b8DJyb+VVXZGRgJUa30cbk8gKHZ3LOZTBLaUEEVr2P4xpmFigOCc62CO4uzquW641Ouq1Rm9N+rWLWdSYDaDIw== - -capture-exit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" - integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== - dependencies: - rsvp "^4.8.4" - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - -chalk@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -chownr@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" - integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -combined-stream@^1.0.6, combined-stream@~1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.0.1.tgz#b67622721785993182e807f4883633e6401ba53c" - integrity sha512-IPF4ouhCP+qdlcmCedhxX4xiGBPyigb8v5NeUp+0LyhwLgxMqyp3S0vl7TAPfS/hiP7FC3caI/PB9lTmP8r1NA== - -commander@~2.20.3: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - -convert-source-map@^1.4.0, convert-source-map@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== - dependencies: - safe-buffer "~5.1.1" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - -core-js-compat@^3.1.1: - version "3.3.6" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.3.6.tgz#70c30dbeb582626efe9ecd6f49daa9ff4aeb136c" - integrity sha512-YnwZG/+0/f7Pf6Lr3jxtVAFjtGBW9lsLYcqrxhYJai1GfvrP8DEyEpnNzj/FRQfIkOOfk1j5tTBvPBLWVVJm4A== - dependencies: - browserslist "^4.7.2" - semver "^6.3.0" - -core-util-is@1.0.2, core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -cross-spawn@^6.0.0, cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" - integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== - dependencies: - cssom "0.3.x" - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - dependencies: - assert-plus "^1.0.0" - -data-urls@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" - integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== - dependencies: - abab "^2.0.0" - whatwg-mimetype "^2.2.0" - whatwg-url "^7.0.0" - -debug@^2.2.0, debug@^2.3.3: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - -debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== - dependencies: - ms "^2.1.1" - -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= - -define-properties@^1.1.2, define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - -detect-newline@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" - integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= - -diff-sequences@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" - integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -domexception@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" - integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== - dependencies: - webidl-conversions "^4.0.2" - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -electron-to-chromium@^1.3.295: - version "1.3.304" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.304.tgz#49b47d961f8143116174c2f70fbfee3aabf43015" - integrity sha512-a5mqa13jCdBc+Crgk3Gyr7vpXCiFWfFq23YDCEmrPYeiDOQKZDVE6EX/Q4Xdv97n3XkcjiSBDOY0IS19yP2yeA== - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.5.1: - version "1.16.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.16.0.tgz#d3a26dc9c3283ac9750dca569586e976d9dcc06d" - integrity sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg== - dependencies: - es-to-primitive "^1.2.0" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.0" - is-callable "^1.1.4" - is-regex "^1.0.4" - object-inspect "^1.6.0" - object-keys "^1.1.1" - string.prototype.trimleft "^2.1.0" - string.prototype.trimright "^2.1.0" - -es-to-primitive@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" - integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -escodegen@^1.9.1: - version "1.12.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.12.0.tgz#f763daf840af172bb3a2b6dd7219c0e17f7ff541" - integrity sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg== - dependencies: - esprima "^3.1.3" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -eslint-config-prettier@6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.7.0.tgz#9a876952e12df2b284adbd3440994bf1f39dfbb9" - integrity sha512-FamQVKM3jjUVwhG4hEMnbtsq7xOIDm+SY5iBPfR8gKsJoAB2IQnNF+bk1+8Fy44Nq7PPJaLvkRxILYdJWoguKQ== - dependencies: - get-stdin "^6.0.0" - -eslint-plugin-prettier@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.1.tgz#507b8562410d02a03f0ddc949c616f877852f2ba" - integrity sha512-A+TZuHZ0KU0cnn56/9mfR7/KjUJ9QNVXUhwvRFSR7PGPe0zQR6PTkmyqg1AtUUEOzTqeRsUwyKFh0oVZKVCrtA== - dependencies: - prettier-linter-helpers "^1.0.0" - -eslint-plugin-sort-imports-es6-autofix@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-sort-imports-es6-autofix/-/eslint-plugin-sort-imports-es6-autofix-0.5.0.tgz#dabae09a457eac6e95c52d8edd7855f576d014b6" - integrity sha512-KEX2Uz6bAs67jDYiH/OT1xz1E7AzIJJOIRg1F7OnFAfUVlpws3ldSZj5oZySRHfoVkWqDX9GGExYxckdLrWhwg== - dependencies: - eslint "^6.2.2" - -eslint-scope@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" - integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-utils@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-visitor-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" - integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== - -eslint@6.6.0: - version "6.6.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.6.0.tgz#4a01a2fb48d32aacef5530ee9c5a78f11a8afd04" - integrity sha512-PpEBq7b6qY/qrOmpYQ/jTMDYfuQMELR4g4WI1M/NaSDDD/bdcMb+dj4Hgks7p41kW2caXsPsEZAEAyAgjVVC0g== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.10.0" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" - doctrine "^3.0.0" - eslint-scope "^5.0.0" - eslint-utils "^1.4.3" - eslint-visitor-keys "^1.1.0" - espree "^6.1.2" - esquery "^1.0.1" - esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^11.7.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - inquirer "^7.0.0" - is-glob "^4.0.0" - js-yaml "^3.13.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.14" - minimatch "^3.0.4" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.2" - progress "^2.0.0" - regexpp "^2.0.1" - semver "^6.1.2" - strip-ansi "^5.2.0" - strip-json-comments "^3.0.1" - table "^5.2.3" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - -eslint@^6.2.2: - version "6.7.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.7.0.tgz#766162e383b236e61d873697f82c3a3e41392020" - integrity sha512-dQpj+PaHKHfXHQ2Imcw5d853PTvkUGbHk/MR68KQUl98EgKDCdh4vLRH1ZxhqeQjQFJeg8fgN0UwmNhN3l8dDQ== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.10.0" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" - doctrine "^3.0.0" - eslint-scope "^5.0.0" - eslint-utils "^1.4.3" - eslint-visitor-keys "^1.1.0" - espree "^6.1.2" - esquery "^1.0.1" - esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - inquirer "^7.0.0" - is-glob "^4.0.0" - js-yaml "^3.13.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.14" - minimatch "^3.0.4" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.3" - progress "^2.0.0" - regexpp "^2.0.1" - semver "^6.1.2" - strip-ansi "^5.2.0" - strip-json-comments "^3.0.1" - table "^5.2.3" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - -espree@^6.1.2: - version "6.1.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" - integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA== - dependencies: - acorn "^7.1.0" - acorn-jsx "^5.1.0" - eslint-visitor-keys "^1.1.0" - -esprima@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" - integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" - integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== - dependencies: - estraverse "^4.0.0" - -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== - dependencies: - estraverse "^4.1.0" - -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -exec-sh@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.2.tgz#6738de2eb7c8e671d0366aea0b0db8c6f7d7391b" - integrity sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg== - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expect@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca" - integrity sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q== - dependencies: - "@jest/types" "^24.9.0" - ansi-styles "^3.2.0" - jest-get-type "^24.9.0" - jest-matcher-utils "^24.9.0" - jest-message-util "^24.9.0" - jest-regex-util "^24.9.0" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= - -fast-deep-equal@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= - -fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== - -fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= - -fast-levenshtein@~2.0.4, fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - -fb-watchman@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" - integrity sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg= - dependencies: - bser "^2.0.0" - -figures@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec" - integrity sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg== - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== - dependencies: - flat-cache "^2.0.1" - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== - dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" - -flatted@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" - integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== - -fn-name@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fn-name/-/fn-name-2.0.1.tgz#5214d7537a4d06a4a301c0cc262feb84188002e7" - integrity sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc= - -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" - -fs-minipass@^1.2.5: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@^1.2.7: - version "1.2.9" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" - integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== - dependencies: - nan "^2.12.1" - node-pre-gyp "^0.12.0" - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -get-caller-file@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-stdin@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" - integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - dependencies: - assert-plus "^1.0.0" - -glob-parent@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" - integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== - dependencies: - is-glob "^4.0.1" - -glob@7.1.6, glob@^7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: - version "7.1.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.5.tgz#6714c69bee20f3c3e64c4dd905553e532b40cdc0" - integrity sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0, globals@^11.7.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^12.1.0: - version "12.3.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.3.0.tgz#1e564ee5c4dded2ab098b0f88f24702a3c56be13" - integrity sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw== - dependencies: - type-fest "^0.8.1" - -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: - version "4.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" - integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== - -growly@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" - integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= - -handlebars@4.5.3, handlebars@^4.1.2: - version "4.5.3" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.5.3.tgz#5cf75bd8714f7605713511a56be7c349becb0482" - integrity sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA== - dependencies: - neo-async "^2.6.0" - optimist "^0.6.1" - source-map "^0.6.1" - optionalDependencies: - uglify-js "^3.1.4" - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - -har-validator@~5.1.0: - version "5.1.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" - integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== - dependencies: - ajv "^6.5.5" - har-schema "^2.0.0" - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" - integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.1, has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hosted-git-info@^2.1.4: - version "2.8.5" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" - integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== - -html-encoding-sniffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" - integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== - dependencies: - whatwg-encoding "^1.0.1" - -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -ignore-walk@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" - integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== - dependencies: - minimatch "^3.0.4" - -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -import-fresh@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.1.0.tgz#6d33fa1dcef6df930fae003446f33415af905118" - integrity sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-local@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" - integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== - dependencies: - pkg-dir "^3.0.0" - resolve-cwd "^2.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - -ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== - -inquirer@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.0.tgz#9e2b032dde77da1db5db804758b8fea3a970519a" - integrity sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ== - dependencies: - ansi-escapes "^4.2.1" - chalk "^2.4.2" - cli-cursor "^3.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.15" - mute-stream "0.0.8" - run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^4.1.0" - strip-ansi "^5.1.0" - through "^2.3.6" - -invariant@^2.2.2, invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-callable@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" - integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== - -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-date-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" - integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-glob@^4.0.0, is-glob@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= - -is-regex@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" - integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= - dependencies: - has "^1.0.1" - -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - -is-symbol@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" - integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== - dependencies: - has-symbols "^1.0.0" - -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= - -isarray@1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - -istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" - integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== - -istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" - integrity sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA== - dependencies: - "@babel/generator" "^7.4.0" - "@babel/parser" "^7.4.3" - "@babel/template" "^7.4.0" - "@babel/traverse" "^7.4.3" - "@babel/types" "^7.4.0" - istanbul-lib-coverage "^2.0.5" - semver "^6.0.0" - -istanbul-lib-report@^2.0.4: - version "2.0.8" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" - integrity sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ== - dependencies: - istanbul-lib-coverage "^2.0.5" - make-dir "^2.1.0" - supports-color "^6.1.0" - -istanbul-lib-source-maps@^3.0.1: - version "3.0.6" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" - integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^2.0.5" - make-dir "^2.1.0" - rimraf "^2.6.3" - source-map "^0.6.1" - -istanbul-reports@^2.2.6: - version "2.2.6" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.6.tgz#7b4f2660d82b29303a8fe6091f8ca4bf058da1af" - integrity sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA== - dependencies: - handlebars "^4.1.2" - -jest-changed-files@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.9.0.tgz#08d8c15eb79a7fa3fc98269bc14b451ee82f8039" - integrity sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg== - dependencies: - "@jest/types" "^24.9.0" - execa "^1.0.0" - throat "^4.0.0" - -jest-cli@24.9.0, jest-cli@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.9.0.tgz#ad2de62d07472d419c6abc301fc432b98b10d2af" - integrity sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg== - dependencies: - "@jest/core" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - chalk "^2.0.1" - exit "^0.1.2" - import-local "^2.0.0" - is-ci "^2.0.0" - jest-config "^24.9.0" - jest-util "^24.9.0" - jest-validate "^24.9.0" - prompts "^2.0.1" - realpath-native "^1.1.0" - yargs "^13.3.0" - -jest-config@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.9.0.tgz#fb1bbc60c73a46af03590719efa4825e6e4dd1b5" - integrity sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ== - dependencies: - "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^24.9.0" - "@jest/types" "^24.9.0" - babel-jest "^24.9.0" - chalk "^2.0.1" - glob "^7.1.1" - jest-environment-jsdom "^24.9.0" - jest-environment-node "^24.9.0" - jest-get-type "^24.9.0" - jest-jasmine2 "^24.9.0" - jest-regex-util "^24.3.0" - jest-resolve "^24.9.0" - jest-util "^24.9.0" - jest-validate "^24.9.0" - micromatch "^3.1.10" - pretty-format "^24.9.0" - realpath-native "^1.1.0" - -jest-diff@^24.3.0, jest-diff@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" - integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== - dependencies: - chalk "^2.0.1" - diff-sequences "^24.9.0" - jest-get-type "^24.9.0" - pretty-format "^24.9.0" - -jest-docblock@^24.3.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.9.0.tgz#7970201802ba560e1c4092cc25cbedf5af5a8ce2" - integrity sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA== - dependencies: - detect-newline "^2.1.0" - -jest-each@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.9.0.tgz#eb2da602e2a610898dbc5f1f6df3ba86b55f8b05" - integrity sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog== - dependencies: - "@jest/types" "^24.9.0" - chalk "^2.0.1" - jest-get-type "^24.9.0" - jest-util "^24.9.0" - pretty-format "^24.9.0" - -jest-environment-jsdom@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz#4b0806c7fc94f95edb369a69cc2778eec2b7375b" - integrity sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA== - dependencies: - "@jest/environment" "^24.9.0" - "@jest/fake-timers" "^24.9.0" - "@jest/types" "^24.9.0" - jest-mock "^24.9.0" - jest-util "^24.9.0" - jsdom "^11.5.1" - -jest-environment-node@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.9.0.tgz#333d2d2796f9687f2aeebf0742b519f33c1cbfd3" - integrity sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA== - dependencies: - "@jest/environment" "^24.9.0" - "@jest/fake-timers" "^24.9.0" - "@jest/types" "^24.9.0" - jest-mock "^24.9.0" - jest-util "^24.9.0" - -jest-get-type@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" - integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== - -jest-haste-map@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" - integrity sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ== - dependencies: - "@jest/types" "^24.9.0" - anymatch "^2.0.0" - fb-watchman "^2.0.0" - graceful-fs "^4.1.15" - invariant "^2.2.4" - jest-serializer "^24.9.0" - jest-util "^24.9.0" - jest-worker "^24.9.0" - micromatch "^3.1.10" - sane "^4.0.3" - walker "^1.0.7" - optionalDependencies: - fsevents "^1.2.7" - -jest-jasmine2@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz#1f7b1bd3242c1774e62acabb3646d96afc3be6a0" - integrity sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw== - dependencies: - "@babel/traverse" "^7.1.0" - "@jest/environment" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - chalk "^2.0.1" - co "^4.6.0" - expect "^24.9.0" - is-generator-fn "^2.0.0" - jest-each "^24.9.0" - jest-matcher-utils "^24.9.0" - jest-message-util "^24.9.0" - jest-runtime "^24.9.0" - jest-snapshot "^24.9.0" - jest-util "^24.9.0" - pretty-format "^24.9.0" - throat "^4.0.0" - -jest-leak-detector@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz#b665dea7c77100c5c4f7dfcb153b65cf07dcf96a" - integrity sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA== - dependencies: - jest-get-type "^24.9.0" - pretty-format "^24.9.0" - -jest-matcher-utils@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073" - integrity sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA== - dependencies: - chalk "^2.0.1" - jest-diff "^24.9.0" - jest-get-type "^24.9.0" - pretty-format "^24.9.0" - -jest-message-util@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" - integrity sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw== - dependencies: - "@babel/code-frame" "^7.0.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/stack-utils" "^1.0.1" - chalk "^2.0.1" - micromatch "^3.1.10" - slash "^2.0.0" - stack-utils "^1.0.1" - -jest-mock@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6" - integrity sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w== - dependencies: - "@jest/types" "^24.9.0" - -jest-pnp-resolver@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" - integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== - -jest-regex-util@^24.3.0, jest-regex-util@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636" - integrity sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA== - -jest-resolve-dependencies@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz#ad055198959c4cfba8a4f066c673a3f0786507ab" - integrity sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g== - dependencies: - "@jest/types" "^24.9.0" - jest-regex-util "^24.3.0" - jest-snapshot "^24.9.0" - -jest-resolve@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.9.0.tgz#dff04c7687af34c4dd7e524892d9cf77e5d17321" - integrity sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ== - dependencies: - "@jest/types" "^24.9.0" - browser-resolve "^1.11.3" - chalk "^2.0.1" - jest-pnp-resolver "^1.2.1" - realpath-native "^1.1.0" - -jest-runner@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.9.0.tgz#574fafdbd54455c2b34b4bdf4365a23857fcdf42" - integrity sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg== - dependencies: - "@jest/console" "^24.7.1" - "@jest/environment" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - chalk "^2.4.2" - exit "^0.1.2" - graceful-fs "^4.1.15" - jest-config "^24.9.0" - jest-docblock "^24.3.0" - jest-haste-map "^24.9.0" - jest-jasmine2 "^24.9.0" - jest-leak-detector "^24.9.0" - jest-message-util "^24.9.0" - jest-resolve "^24.9.0" - jest-runtime "^24.9.0" - jest-util "^24.9.0" - jest-worker "^24.6.0" - source-map-support "^0.5.6" - throat "^4.0.0" - -jest-runtime@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.9.0.tgz#9f14583af6a4f7314a6a9d9f0226e1a781c8e4ac" - integrity sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw== - dependencies: - "@jest/console" "^24.7.1" - "@jest/environment" "^24.9.0" - "@jest/source-map" "^24.3.0" - "@jest/transform" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/yargs" "^13.0.0" - chalk "^2.0.1" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.1.15" - jest-config "^24.9.0" - jest-haste-map "^24.9.0" - jest-message-util "^24.9.0" - jest-mock "^24.9.0" - jest-regex-util "^24.3.0" - jest-resolve "^24.9.0" - jest-snapshot "^24.9.0" - jest-util "^24.9.0" - jest-validate "^24.9.0" - realpath-native "^1.1.0" - slash "^2.0.0" - strip-bom "^3.0.0" - yargs "^13.3.0" - -jest-serializer@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" - integrity sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ== - -jest-snapshot@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.9.0.tgz#ec8e9ca4f2ec0c5c87ae8f925cf97497b0e951ba" - integrity sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew== - dependencies: - "@babel/types" "^7.0.0" - "@jest/types" "^24.9.0" - chalk "^2.0.1" - expect "^24.9.0" - jest-diff "^24.9.0" - jest-get-type "^24.9.0" - jest-matcher-utils "^24.9.0" - jest-message-util "^24.9.0" - jest-resolve "^24.9.0" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - pretty-format "^24.9.0" - semver "^6.2.0" - -jest-util@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162" - integrity sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg== - dependencies: - "@jest/console" "^24.9.0" - "@jest/fake-timers" "^24.9.0" - "@jest/source-map" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - callsites "^3.0.0" - chalk "^2.0.1" - graceful-fs "^4.1.15" - is-ci "^2.0.0" - mkdirp "^0.5.1" - slash "^2.0.0" - source-map "^0.6.0" - -jest-validate@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab" - integrity sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ== - dependencies: - "@jest/types" "^24.9.0" - camelcase "^5.3.1" - chalk "^2.0.1" - jest-get-type "^24.9.0" - leven "^3.1.0" - pretty-format "^24.9.0" - -jest-watcher@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.9.0.tgz#4b56e5d1ceff005f5b88e528dc9afc8dd4ed2b3b" - integrity sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw== - dependencies: - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/yargs" "^13.0.0" - ansi-escapes "^3.0.0" - chalk "^2.0.1" - jest-util "^24.9.0" - string-length "^2.0.0" - -jest-worker@^24.6.0, jest-worker@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" - integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== - dependencies: - merge-stream "^2.0.0" - supports-color "^6.1.0" - -jest@24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-24.9.0.tgz#987d290c05a08b52c56188c1002e368edb007171" - integrity sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw== - dependencies: - import-local "^2.0.0" - jest-cli "^24.9.0" - -js-levenshtein@^1.1.3: - version "1.1.6" - resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" - integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@3.13.1, js-yaml@^3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - -jsdom@^11.5.1: - version "11.12.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" - integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== - dependencies: - abab "^2.0.0" - acorn "^5.5.3" - acorn-globals "^4.1.0" - array-equal "^1.0.0" - cssom ">= 0.3.2 < 0.4.0" - cssstyle "^1.0.0" - data-urls "^1.0.0" - domexception "^1.0.1" - escodegen "^1.9.1" - html-encoding-sniffer "^1.0.2" - left-pad "^1.3.0" - nwsapi "^2.0.7" - parse5 "4.0.0" - pn "^1.1.0" - request "^2.87.0" - request-promise-native "^1.0.5" - sax "^1.2.4" - symbol-tree "^3.2.2" - tough-cookie "^2.3.4" - w3c-hr-time "^1.0.1" - webidl-conversions "^4.0.2" - whatwg-encoding "^1.0.3" - whatwg-mimetype "^2.1.0" - whatwg-url "^6.4.1" - ws "^5.2.0" - xml-name-validator "^3.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= - -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - -json5@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" - integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== - dependencies: - minimist "^1.2.0" - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -left-pad@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" - integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= - -lodash.unescape@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" - integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw= - -lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== - -loose-envify@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -make-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" - -makeerror@1.0.x: - version "1.0.11" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= - dependencies: - tmpl "1.0.x" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -mime-db@1.40.0: - version "1.40.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" - integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== - -mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.24" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" - integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== - dependencies: - mime-db "1.40.0" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - -minimist@^1.1.1, minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= - -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= - -minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= - dependencies: - minimist "0.0.8" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - -nan@^2.12.1: - version "2.14.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" - integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= - -needle@^2.2.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" - integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - -neo-async@^2.6.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" - integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= - -node-modules-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" - integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= - -node-notifier@^5.4.2: - version "5.4.3" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50" - integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q== - dependencies: - growly "^1.3.0" - is-wsl "^1.1.0" - semver "^5.5.0" - shellwords "^0.1.1" - which "^1.3.0" - -node-pre-gyp@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" - integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4" - -node-releases@^1.1.38: - version "1.1.39" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.39.tgz#c1011f30343aff5b633153b10ff691d278d08e8d" - integrity sha512-8MRC/ErwNCHOlAFycy9OPca46fQYUjbJRDcZTHVWIGXIjYLM73k70vv3WkYutVnM4cCo4hE0MqBVVZjP6vjISA== - dependencies: - semver "^6.3.0" - -nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= - dependencies: - abbrev "1" - osenv "^0.1.4" - -normalize-package-data@^2.3.2: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - -npm-bundled@^1.0.1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" - integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== - -npm-packlist@^1.1.6: - version "1.4.6" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.6.tgz#53ba3ed11f8523079f1457376dd379ee4ea42ff4" - integrity sha512-u65uQdb+qwtGvEJh/DgQgW1Xg7sqeNbmxYyrvlNznaVTjV3E5P6F/EFjM+BVHXl7JJlsdG8A64M0XI8FI/IOlg== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= - dependencies: - path-key "^2.0.0" - -npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - -nwsapi@^2.0.7: - version "2.2.0" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" - integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - -object-assign@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-inspect@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" - integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ== - -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - -object.assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.getownpropertydescriptors@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" - integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= - dependencies: - define-properties "^1.1.2" - es-abstract "^1.5.1" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -onetime@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" - integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== - dependencies: - mimic-fn "^2.1.0" - -optimist@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= - dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" - -optionator@^0.8.1, optionator@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.4" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - wordwrap "~1.0.0" - -optionator@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - -os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -p-each-series@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" - integrity sha1-kw89Et0fUOdDRFeiLNbwSsatf3E= - dependencies: - p-reduce "^1.0.0" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - -p-limit@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" - integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== - dependencies: - p-try "^2.0.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-reduce@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" - integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse5@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" - integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== - -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - -path@0.12.7: - version "0.12.7" - resolved "https://registry.yarnpkg.com/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f" - integrity sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8= - dependencies: - process "^0.11.1" - util "^0.10.3" - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pirates@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" - integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== - dependencies: - node-modules-regexp "^1.0.0" - -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== - dependencies: - find-up "^3.0.0" - -pn@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" - integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= - -prettier-linter-helpers@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" - integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== - dependencies: - fast-diff "^1.1.2" - -prettier@1.19.1: - version "1.19.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" - integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== - -pretty-format@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" - integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== - dependencies: - "@jest/types" "^24.9.0" - ansi-regex "^4.0.0" - ansi-styles "^3.2.0" - react-is "^16.8.4" - -private@^0.1.6: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process@^0.11.1: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= - -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -prompts@^2.0.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.2.1.tgz#f901dd2a2dfee080359c0e20059b24188d75ad35" - integrity sha512-VObPvJiWPhpZI6C5m60XOzTfnYg/xc/an+r9VYymj9WJW3B/DIH+REzjpAACPf8brwPeP+7vz3bIim3S+AaMjw== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.3" - -property-expr@^1.5.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-1.5.1.tgz#22e8706894a0c8e28d58735804f6ba3a3673314f" - integrity sha512-CGuc0VUTGthpJXL36ydB6jnbyOf/rAHFvmVrJlH+Rg0DqqLFQGAP6hIaxD/G0OAmBJPhXDHuEJigrp0e0wFV6g== - -psl@^1.1.24, psl@^1.1.28: - version "1.4.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.4.0.tgz#5dd26156cdb69fa1fdb8ab1991667d3f80ced7c2" - integrity sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw== - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== - -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -react-is@^16.8.4: - version "16.11.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.11.0.tgz#b85dfecd48ad1ce469ff558a882ca8e8313928fa" - integrity sha512-gbBVYR2p8mnriqAwWx9LbuUrShnAuSCNnuPGyc7GJrMVQtPDAh8iLpv7FRuMPFb56KkaVZIYSz1PrjI9q0QPCw== - -read-pkg-up@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" - integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== - dependencies: - find-up "^3.0.0" - read-pkg "^3.0.0" - -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - -readable-stream@^2.0.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -realpath-native@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" - integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== - dependencies: - util.promisify "^1.0.0" - -regenerate-unicode-properties@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" - integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA== - dependencies: - regenerate "^1.4.0" - -regenerate@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" - integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== - -regenerator-runtime@^0.13.2: - version "0.13.3" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" - integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== - -regenerator-transform@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.1.tgz#3b2fce4e1ab7732c08f665dfdb314749c7ddd2fb" - integrity sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ== - dependencies: - private "^0.1.6" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== - -regexpp@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" - integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g== - -regexpu-core@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6" - integrity sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg== - dependencies: - regenerate "^1.4.0" - regenerate-unicode-properties "^8.1.0" - regjsgen "^0.5.0" - regjsparser "^0.6.0" - unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.1.0" - -regjsgen@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" - integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== - -regjsparser@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" - integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== - dependencies: - jsesc "~0.5.0" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - -repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -request-promise-core@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" - integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== - dependencies: - lodash "^4.17.15" - -request-promise-native@^1.0.5: - version "1.0.8" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" - integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== - dependencies: - request-promise-core "1.1.3" - stealthy-require "^1.1.1" - tough-cookie "^2.3.3" - -request@^2.87.0: - version "2.88.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" - integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.0" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.4.3" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= - dependencies: - resolve-from "^3.0.0" - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -resolve@1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= - -resolve@^1.10.0, resolve@^1.3.2: - version "1.12.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" - integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== - dependencies: - path-parse "^1.0.6" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - -rimraf@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.0.tgz#614176d4b3010b75e5c390eb0ee96f6dc0cebb9b" - integrity sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg== - dependencies: - glob "^7.1.3" - -rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -rsvp@^4.8.4: - version "4.8.5" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" - integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== - -run-async@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= - dependencies: - is-promise "^2.1.0" - -rxjs@^6.4.0: - version "6.5.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" - integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA== - dependencies: - tslib "^1.9.0" - -safe-buffer@^5.0.1, safe-buffer@^5.1.2: - version "5.2.0" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" - integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sane@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" - integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== - dependencies: - "@cnakazawa/watch" "^1.0.3" - anymatch "^2.0.0" - capture-exit "^2.0.0" - exec-sh "^0.3.2" - execa "^1.0.0" - fb-watchman "^2.0.0" - micromatch "^3.1.4" - minimist "^1.1.1" - walker "~1.0.5" - -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^6.0.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -set-blocking@^2.0.0, set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - -shellwords@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" - integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== - -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= - -sisteransi@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.3.tgz#98168d62b79e3a5e758e27ae63c4a053d748f4eb" - integrity sha512-SbEG75TzH8G7eVXFSN5f9EExILKfly7SUvVY5DhhYLvfhKqhDFY0OzevWa/zwak0RLRfWS5AvfMWpd9gJvr5Yg== - -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== - -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== - dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -source-map-resolve@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" - integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== - dependencies: - atob "^2.1.1" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@^0.5.6: - version "0.5.16" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" - integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= - -source-map@^0.5.0, source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -spdx-correct@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" - integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" - integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== - -spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" - integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -stack-utils@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" - integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -stealthy-require@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= - -string-length@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" - integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0= - dependencies: - astral-regex "^1.0.0" - strip-ansi "^4.0.0" - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2": - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string-width@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.1.0.tgz#ba846d1daa97c3c596155308063e075ed1c99aff" - integrity sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^5.2.0" - -string.prototype.trimleft@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz#6cc47f0d7eb8d62b0f3701611715a3954591d634" - integrity sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw== - dependencies: - define-properties "^1.1.3" - function-bind "^1.1.1" - -string.prototype.trimright@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz#669d164be9df9b6f7559fa8e89945b168a5a6c58" - integrity sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg== - dependencies: - define-properties "^1.1.3" - function-bind "^1.1.1" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= - -strip-json-comments@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" - integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" - integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== - dependencies: - has-flag "^4.0.0" - -symbol-tree@^3.2.2: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -synchronous-promise@^2.0.6: - version "2.0.10" - resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.10.tgz#e64c6fd3afd25f423963353043f4a68ebd397fd8" - integrity sha512-6PC+JRGmNjiG3kJ56ZMNWDPL8hjyghF5cMXIFOKg+NiwwEZZIvxTWd0pinWKyD227odg9ygF8xVhhz7gb8Uq7A== - -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== - dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" - -tar@^4: - version "4.4.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" - integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== - dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.8.6" - minizlib "^1.2.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.3" - -test-exclude@^5.2.3: - version "5.2.3" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" - integrity sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g== - dependencies: - glob "^7.1.3" - minimatch "^3.0.4" - read-pkg-up "^4.0.0" - require-main-filename "^2.0.0" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= - -throat@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" - integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= - -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -tmpl@1.0.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" - integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -toposort@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" - integrity sha1-riF2gXXRVZ1IvvNUILL0li8JwzA= - -tough-cookie@^2.3.3, tough-cookie@^2.3.4: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - -tough-cookie@~2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" - integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== - dependencies: - psl "^1.1.24" - punycode "^1.4.1" - -tr46@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= - dependencies: - punycode "^2.1.0" - -tslib@^1.8.1, tslib@^1.9.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" - integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== - -tsutils@^3.17.1: - version "3.17.1" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" - integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== - dependencies: - tslib "^1.8.1" - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= - dependencies: - prelude-ls "~1.1.2" - -type-fest@^0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" - integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw== - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -typescript@3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.2.tgz#27e489b95fa5909445e9fef5ee48d81697ad18fb" - integrity sha512-ml7V7JfiN2Xwvcer+XAf2csGO1bPBdRbFCkYBczNZggrBZ9c7G3riSUeJmqEU5uOtXNPMhE3n+R4FA/3YOAWOQ== - -uglify-js@^3.1.4: - version "3.6.8" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.8.tgz#5edcbcf9d49cbb0403dc49f856fe81530d65145e" - integrity sha512-XhHJ3S3ZyMwP8kY1Gkugqx3CJh2C3O0y8NPiSxtm1tyD/pktLAkFZsFGpuNfTZddKDQ/bbDBLAd2YyA1pbi8HQ== - dependencies: - commander "~2.20.3" - source-map "~0.6.1" - -unicode-canonical-property-names-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" - integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== - -unicode-match-property-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" - integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== - dependencies: - unicode-canonical-property-names-ecmascript "^1.0.4" - unicode-property-aliases-ecmascript "^1.0.4" - -unicode-match-property-value-ecmascript@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" - integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== - -unicode-property-aliases-ecmascript@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" - integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== - dependencies: - punycode "^2.1.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -util.promisify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" - integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== - dependencies: - define-properties "^1.1.2" - object.getownpropertydescriptors "^2.0.3" - -util@^0.10.3: - version "0.10.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" - integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== - dependencies: - inherits "2.0.3" - -uuid@^3.3.2: - version "3.3.3" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" - integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== - -v8-compile-cache@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" - integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -w3c-hr-time@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" - integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= - dependencies: - browser-process-hrtime "^0.1.2" - -walker@^1.0.7, walker@~1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" - integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= - dependencies: - makeerror "1.0.x" - -webidl-conversions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== - -whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - -whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== - -whatwg-url@^6.4.1: - version "6.5.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" - integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" - -whatwg-url@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" - integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which@^1.2.9, which@^1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - -word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= - -wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -write-file-atomic@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529" - integrity sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg== - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - signal-exit "^3.0.2" - -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - -ws@^5.2.0: - version "5.2.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" - integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== - dependencies: - async-limiter "~1.0.0" - -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== - -y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== - -yallist@^3.0.0, yallist@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yargs-parser@^13.1.1: - version "13.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" - integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs@^13.3.0: - version "13.3.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" - integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.1" - -yup@0.27.0: - version "0.27.0" - resolved "https://registry.yarnpkg.com/yup/-/yup-0.27.0.tgz#f8cb198c8e7dd2124beddc2457571329096b06e7" - integrity sha512-v1yFnE4+u9za42gG/b/081E7uNW9mUj3qtkmelLbW5YPROZzSH/KUUyJu9Wt8vxFJcT9otL/eZopS0YK1L5yPQ== - dependencies: - "@babel/runtime" "^7.0.0" - fn-name "~2.0.1" - lodash "^4.17.11" - property-expr "^1.5.0" - synchronous-promise "^2.0.6" - toposort "^2.0.2"