├── .editorconfig ├── .github └── workflows │ └── Theneo.yml ├── .gitignore ├── LICENSE ├── README.md ├── action.yml ├── asset └── logo.png ├── dist └── index.js ├── package-lock.json ├── package.json ├── scripts └── check-doc.sh ├── src ├── file.js ├── helpers.js ├── index.js ├── input.js ├── main.js ├── validate.js └── version.js └── test ├── petstore.yaml └── sample.json /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | -------------------------------------------------------------------------------- /.github/workflows/Theneo.yml: -------------------------------------------------------------------------------- 1 | name: Update Documentation 2 | on: 3 | push: 4 | branches: 5 | - main 6 | jobs: 7 | update-doc: 8 | name: update theneo doc 9 | runs-on: ubuntu-latest 10 | steps: 11 | - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event." 12 | - name: Checkout 13 | uses: actions/checkout@v4 14 | - name: Setup Node.js 15 | uses: actions/setup-node@v4 16 | with: 17 | node-version: "18" 18 | - name: Process documentation on server 19 | uses: Theneo-Inc/api-documentation@main 20 | with: 21 | FILE_PATH: test/petstore.yaml 22 | PROJECT_KEY: ${{vars.PROJECT_KEY}} 23 | SECRET: ${{secrets.THENEO_ACCOUNT_SECRET}} 24 | IMPORT_OPTION: overwrite 25 | AUTO_PUBLISH: true 26 | INCLUDE_GITHUB_METADATA: true 27 | - name: check if documentation is updated 28 | run: | 29 | chmod +X ./scripts/check-doc.sh 30 | ./scripts/check-doc.sh ${{vars.THENEO_GITHUB_ACTION_TEST_PROJECT_URL}} "find Pets" "add Pet" "find pet by id" "delete Pet" 31 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # TypeScript v1 declaration files 46 | typings/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Microbundle cache 58 | .rpt2_cache/ 59 | .rts2_cache_cjs/ 60 | .rts2_cache_es/ 61 | .rts2_cache_umd/ 62 | 63 | # Optional REPL history 64 | .node_repl_history 65 | 66 | # Output of 'npm pack' 67 | *.tgz 68 | 69 | # Yarn Integrity file 70 | .yarn-integrity 71 | 72 | # dotenv environment variables file 73 | .env 74 | .env.test 75 | 76 | # parcel-bundler cache (https://parceljs.org/) 77 | .cache 78 | 79 | # Next.js build output 80 | .next 81 | 82 | # Nuxt.js build / generate output 83 | .nuxt 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # Serverless directories 95 | .serverless/ 96 | 97 | # FuseBox cache 98 | .fusebox/ 99 | 100 | # DynamoDB Local files 101 | .dynamodb/ 102 | 103 | # TernJS port file 104 | .tern-port 105 | 106 | .idea 107 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Theneo 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Generate Stripe-like API Documentation 2 | 3 |

4 |

Get Started Today

5 | 6 | ## Table of contents 7 | 8 | - [Usage](#usage) 9 | - [Inputs](#inputs) 10 | - [Contributing](#contributing) 11 | - [Licence](#license) 12 | 13 | ## Usage 14 | 15 | Start by creating a documentation on [Theneo](https://theneo.io). Then add following workflow file to your GitHub project `.github/workflows/Theneo.yml`. On every push request theneo documentation will be updated. 16 | 17 | ### Update documentation on pull request 18 | 19 | Update api documentation on push. 20 | 21 | ``` 22 | name: Update documention 23 | on: 24 | pull_request: 25 | branches: 26 | - main 27 | jobs: 28 | update-doc: 29 | name: update theneo doc 30 | runs-on: ubuntu-latest 31 | steps: 32 | - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event." 33 | - name: Checkout 34 | uses: actions/checkout@v4 35 | - name: Setup Node.js 36 | uses: actions/setup-node@v4 37 | with: 38 | node-version: "18" 39 | - name: Import documentation in Theneo 40 | uses: Theneo-Inc/api-documentation@1.8.0 41 | with: 42 | FILE_PATH: doc/api.yml 43 | PROJECT_KEY: 44 | SECRET: ${{secrets.SECRET}} 45 | IMPORT_OPTION: overwrite 46 | AUTO_PUBLISH: false 47 | INCLUDE_GITHUB_METADATA: true 48 | ``` 49 | 50 | _make sure to update path with your document path, PROJECT_KEY with project key, SECRET with GitHub secret_ 51 | 52 | ## Inputs 53 | 54 | - `FILE_PATH` (required): path to your documentation file within repository. 55 | - `PROJECT_SLUG` (required): unique identifier of project, it can be found under project settings for existing project. 56 | - `VERSION_SLUG` (optional): Project version slug to import documentation under a specific version, otherwise default version will be used. 57 | - `WORKSPACE_SLUG` (optional): Project workspace slug to import documentation under specific workspace. 58 | - `SECRET` (required): Theneo API token to authenticate GitHub request, displayed under user profile. 59 | - `IMPORT_OPTION` (optional): import option should be one of (`overwrite`, `merge`, `endpoints`, `append`), by default `overwrite` will be used. 60 | - `AUTO_PUBLISH` (optional): Indicates if the documentation should be published automatically or not after importing. 61 | - `INCLUDE_GITHUB_METADATA` (optional): Indicates if the imported documentation should include GitHub metadata (such as GitHub actor) or not - only visible in Theneo's editor. 62 | - `SECTION_DESCRIPTION_MERGE_STRATEGY` (optional): Merging strategy for section descriptions to keep old descriptions from theneo editor if needed, valid values are keep_new or keep_old. 63 | - `PARAMETER_DESCRIPTION_MERGE_STRATEGY` (optional): Merging strategy for parameter descriptions to keep old descriptions from theneo editor if needed, valid values are keep_new or keep_old. 64 | 65 | ### deprecated inputs 66 | - `PROJECT_KEY` - instead use `PROJECT_SLUG` 67 | - `PATH` - instead use `FILE_PATH` 68 | 69 | ## Note 70 | you can find your project/version/workspace slugs upon publishing the project: 71 | 72 | `https://app.theneo.io///` 73 | 74 | 75 | ### Example using `merge` import option 76 | ```yaml 77 | - name: Import documentation in Theneo 78 | uses: Theneo-Inc/api-documentation@1.8.0 79 | with: 80 | FILE_PATH: doc/api.yml 81 | 82 | PROJECT_KEY: 83 | VERSION_SLUG: 84 | WORKSPACE_SLUG: 85 | 86 | SECRET: ${{secrets.SECRET}} 87 | 88 | AUTO_PUBLISH: true 89 | 90 | IMPORT_OPTION: merge 91 | PARAMETER_DESCRIPTION_MERGE_STRATEGY: keep_new 92 | SECTION_DESCRIPTION_MERGE_STRATEGY: keep_old 93 | 94 | INCLUDE_GITHUB_METADATA: true 95 | ``` 96 | 97 | ## Release 98 | 1. Update version in `package.json` 99 | 2. run `npm run build` 100 | 3. commit changes and add tag: 101 | ```bash 102 | git tag 103 | git push origin main --tags 104 | ``` 105 | 4. Create a release on GitHub with the same version 106 | 5. Update the version in the [usage](#usage) section of this README 107 | 108 | ## Contributing 109 | 110 | Bug reports and pull requests are welcome on GitHub at https://github.com/theneoAPIDoc/api-documentation. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org/) code of conduct. 111 | 112 | ## License 113 | 114 | The scripts and documentation in this project are released under the [MIT License](https://github.com/theneoAPIDoc/api-documentation/blob/main/LICENSE). 115 | -------------------------------------------------------------------------------- /action.yml: -------------------------------------------------------------------------------- 1 | name: Theneo API Documentation 2 | description: Generate Stripe-like API Documentation 3 | inputs: 4 | FILE_PATH: 5 | description: "API documentation file path" 6 | required: true 7 | PATH: 8 | description: "API documentation file path (deprecated)" 9 | deprecationMessage: "Use FILE_PATH instead" 10 | required: false 11 | PROJECT_KEY: 12 | description: "Unique Key for the project" 13 | deprecationMessage: "Use PROJECT_SLUG instead" 14 | required: false 15 | PROJECT_SLUG: 16 | description: "Unique Key for the project" 17 | required: false 18 | VERSION_SLUG: 19 | description: "Project version slug to import the update data into, if not provided, the default version will be used" 20 | required: false 21 | WORKSPACE_SLUG: 22 | description: "Workspace slug where project is located, if not provided it will search for the project in all workspaces" 23 | required: false 24 | SECRET: 25 | description: "API Key from Theneo website" 26 | required: true 27 | IMPORT_OPTION: 28 | description: "Import option should be one of (overwrite, merge, endpoints, append)" 29 | required: false 30 | default: "overwrite" 31 | AUTO_PUBLISH: 32 | description: "Indicates if the documentation should be published automatically or not after importing" 33 | required: false 34 | default: "true" 35 | INCLUDE_GITHUB_METADATA: 36 | description: "Include GitHub metadata - such as GitHub actor username for import metadata" 37 | required: false 38 | default: "false" 39 | PARAMETER_DESCRIPTION_MERGE_STRATEGY: 40 | description: "Merging strategy for parameter descriptions to keep old descriptions from theneo editor if needed, valid values are keep_new or keep_old" 41 | required: false 42 | 43 | SECTION_DESCRIPTION_MERGE_STRATEGY: 44 | description: "Merging strategy for section descriptions to keep old descriptions from theneo editor if needed, valid values are keep_new or keep_old" 45 | required: false 46 | 47 | runs: 48 | using: "node16" 49 | main: "dist/index.js" 50 | branding: 51 | icon: "book-open" 52 | color: "orange" 53 | -------------------------------------------------------------------------------- /asset/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Theneo-Inc/api-documentation/2b72e0e61bacade748fad9f998848e1fa518345b/asset/logo.png -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "api-documentation", 3 | "version": "1.8.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "api-documentation", 9 | "version": "1.8.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@actions/core": "^1.10.1", 13 | "@theneo/sdk": "^0.9.0", 14 | "@vercel/ncc": "^0.38.1", 15 | "yaml-lint": "^1.7.0" 16 | } 17 | }, 18 | "node_modules/@actions/core": { 19 | "version": "1.10.1", 20 | "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.1.tgz", 21 | "integrity": "sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g==", 22 | "dependencies": { 23 | "@actions/http-client": "^2.0.1", 24 | "uuid": "^8.3.2" 25 | } 26 | }, 27 | "node_modules/@actions/http-client": { 28 | "version": "2.0.1", 29 | "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.0.1.tgz", 30 | "integrity": "sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw==", 31 | "dependencies": { 32 | "tunnel": "^0.0.6" 33 | } 34 | }, 35 | "node_modules/@nodelib/fs.scandir": { 36 | "version": "2.1.5", 37 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 38 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 39 | "dependencies": { 40 | "@nodelib/fs.stat": "2.0.5", 41 | "run-parallel": "^1.1.9" 42 | }, 43 | "engines": { 44 | "node": ">= 8" 45 | } 46 | }, 47 | "node_modules/@nodelib/fs.stat": { 48 | "version": "2.0.5", 49 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 50 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 51 | "engines": { 52 | "node": ">= 8" 53 | } 54 | }, 55 | "node_modules/@nodelib/fs.walk": { 56 | "version": "1.2.8", 57 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 58 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 59 | "dependencies": { 60 | "@nodelib/fs.scandir": "2.1.5", 61 | "fastq": "^1.6.0" 62 | }, 63 | "engines": { 64 | "node": ">= 8" 65 | } 66 | }, 67 | "node_modules/@theneo/sdk": { 68 | "version": "0.9.0", 69 | "resolved": "https://registry.npmjs.org/@theneo/sdk/-/sdk-0.9.0.tgz", 70 | "integrity": "sha512-CGtpQOfxPb6P1b0St+Zsz8pRkTZp9YY6dZQOQcIw5w0wZDXiRUca1sBbZOp2GVN/JH6iDpWyD0NVblyy70iXeA==", 71 | "dependencies": { 72 | "axios": "^1.7.2", 73 | "form-data": "^4.0.0", 74 | "fs-extra": "^11.2.0" 75 | }, 76 | "engines": { 77 | "node": ">=16.0" 78 | } 79 | }, 80 | "node_modules/@vercel/ncc": { 81 | "version": "0.38.1", 82 | "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.38.1.tgz", 83 | "integrity": "sha512-IBBb+iI2NLu4VQn3Vwldyi2QwaXt5+hTyh58ggAMoCGE6DJmPvwL3KPBWcJl1m9LYPChBLE980Jw+CS4Wokqxw==", 84 | "bin": { 85 | "ncc": "dist/ncc/cli.js" 86 | } 87 | }, 88 | "node_modules/ansi-regex": { 89 | "version": "5.0.1", 90 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 91 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 92 | "engines": { 93 | "node": ">=8" 94 | } 95 | }, 96 | "node_modules/ansi-styles": { 97 | "version": "4.3.0", 98 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 99 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 100 | "dependencies": { 101 | "color-convert": "^2.0.1" 102 | }, 103 | "engines": { 104 | "node": ">=8" 105 | }, 106 | "funding": { 107 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 108 | } 109 | }, 110 | "node_modules/argparse": { 111 | "version": "2.0.1", 112 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 113 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" 114 | }, 115 | "node_modules/array-union": { 116 | "version": "2.1.0", 117 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", 118 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", 119 | "engines": { 120 | "node": ">=8" 121 | } 122 | }, 123 | "node_modules/async": { 124 | "version": "3.2.4", 125 | "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", 126 | "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" 127 | }, 128 | "node_modules/asynckit": { 129 | "version": "0.4.0", 130 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 131 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 132 | }, 133 | "node_modules/axios": { 134 | "version": "1.7.2", 135 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", 136 | "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", 137 | "dependencies": { 138 | "follow-redirects": "^1.15.6", 139 | "form-data": "^4.0.0", 140 | "proxy-from-env": "^1.1.0" 141 | } 142 | }, 143 | "node_modules/braces": { 144 | "version": "3.0.3", 145 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 146 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 147 | "dependencies": { 148 | "fill-range": "^7.1.1" 149 | }, 150 | "engines": { 151 | "node": ">=8" 152 | } 153 | }, 154 | "node_modules/cliui": { 155 | "version": "7.0.4", 156 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 157 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 158 | "dependencies": { 159 | "string-width": "^4.2.0", 160 | "strip-ansi": "^6.0.0", 161 | "wrap-ansi": "^7.0.0" 162 | } 163 | }, 164 | "node_modules/color-convert": { 165 | "version": "2.0.1", 166 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 167 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 168 | "dependencies": { 169 | "color-name": "~1.1.4" 170 | }, 171 | "engines": { 172 | "node": ">=7.0.0" 173 | } 174 | }, 175 | "node_modules/color-name": { 176 | "version": "1.1.4", 177 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 178 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 179 | }, 180 | "node_modules/combined-stream": { 181 | "version": "1.0.8", 182 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 183 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 184 | "dependencies": { 185 | "delayed-stream": "~1.0.0" 186 | }, 187 | "engines": { 188 | "node": ">= 0.8" 189 | } 190 | }, 191 | "node_modules/consola": { 192 | "version": "2.15.3", 193 | "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", 194 | "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" 195 | }, 196 | "node_modules/delayed-stream": { 197 | "version": "1.0.0", 198 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 199 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 200 | "engines": { 201 | "node": ">=0.4.0" 202 | } 203 | }, 204 | "node_modules/dir-glob": { 205 | "version": "3.0.1", 206 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", 207 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", 208 | "dependencies": { 209 | "path-type": "^4.0.0" 210 | }, 211 | "engines": { 212 | "node": ">=8" 213 | } 214 | }, 215 | "node_modules/emoji-regex": { 216 | "version": "8.0.0", 217 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 218 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 219 | }, 220 | "node_modules/escalade": { 221 | "version": "3.1.1", 222 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 223 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 224 | "engines": { 225 | "node": ">=6" 226 | } 227 | }, 228 | "node_modules/fast-glob": { 229 | "version": "3.2.12", 230 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", 231 | "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", 232 | "dependencies": { 233 | "@nodelib/fs.stat": "^2.0.2", 234 | "@nodelib/fs.walk": "^1.2.3", 235 | "glob-parent": "^5.1.2", 236 | "merge2": "^1.3.0", 237 | "micromatch": "^4.0.4" 238 | }, 239 | "engines": { 240 | "node": ">=8.6.0" 241 | } 242 | }, 243 | "node_modules/fastq": { 244 | "version": "1.15.0", 245 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", 246 | "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", 247 | "dependencies": { 248 | "reusify": "^1.0.4" 249 | } 250 | }, 251 | "node_modules/fill-range": { 252 | "version": "7.1.1", 253 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 254 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 255 | "dependencies": { 256 | "to-regex-range": "^5.0.1" 257 | }, 258 | "engines": { 259 | "node": ">=8" 260 | } 261 | }, 262 | "node_modules/follow-redirects": { 263 | "version": "1.15.6", 264 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", 265 | "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", 266 | "funding": [ 267 | { 268 | "type": "individual", 269 | "url": "https://github.com/sponsors/RubenVerborgh" 270 | } 271 | ], 272 | "engines": { 273 | "node": ">=4.0" 274 | }, 275 | "peerDependenciesMeta": { 276 | "debug": { 277 | "optional": true 278 | } 279 | } 280 | }, 281 | "node_modules/form-data": { 282 | "version": "4.0.0", 283 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 284 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 285 | "dependencies": { 286 | "asynckit": "^0.4.0", 287 | "combined-stream": "^1.0.8", 288 | "mime-types": "^2.1.12" 289 | }, 290 | "engines": { 291 | "node": ">= 6" 292 | } 293 | }, 294 | "node_modules/fs-extra": { 295 | "version": "11.2.0", 296 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", 297 | "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", 298 | "dependencies": { 299 | "graceful-fs": "^4.2.0", 300 | "jsonfile": "^6.0.1", 301 | "universalify": "^2.0.0" 302 | }, 303 | "engines": { 304 | "node": ">=14.14" 305 | } 306 | }, 307 | "node_modules/get-caller-file": { 308 | "version": "2.0.5", 309 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 310 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 311 | "engines": { 312 | "node": "6.* || 8.* || >= 10.*" 313 | } 314 | }, 315 | "node_modules/glob-parent": { 316 | "version": "5.1.2", 317 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 318 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 319 | "dependencies": { 320 | "is-glob": "^4.0.1" 321 | }, 322 | "engines": { 323 | "node": ">= 6" 324 | } 325 | }, 326 | "node_modules/globby": { 327 | "version": "11.1.0", 328 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", 329 | "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", 330 | "dependencies": { 331 | "array-union": "^2.1.0", 332 | "dir-glob": "^3.0.1", 333 | "fast-glob": "^3.2.9", 334 | "ignore": "^5.2.0", 335 | "merge2": "^1.4.1", 336 | "slash": "^3.0.0" 337 | }, 338 | "engines": { 339 | "node": ">=10" 340 | }, 341 | "funding": { 342 | "url": "https://github.com/sponsors/sindresorhus" 343 | } 344 | }, 345 | "node_modules/graceful-fs": { 346 | "version": "4.2.11", 347 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 348 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" 349 | }, 350 | "node_modules/ignore": { 351 | "version": "5.2.4", 352 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", 353 | "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", 354 | "engines": { 355 | "node": ">= 4" 356 | } 357 | }, 358 | "node_modules/ini": { 359 | "version": "2.0.0", 360 | "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", 361 | "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", 362 | "engines": { 363 | "node": ">=10" 364 | } 365 | }, 366 | "node_modules/is-extglob": { 367 | "version": "2.1.1", 368 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 369 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 370 | "engines": { 371 | "node": ">=0.10.0" 372 | } 373 | }, 374 | "node_modules/is-fullwidth-code-point": { 375 | "version": "3.0.0", 376 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 377 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 378 | "engines": { 379 | "node": ">=8" 380 | } 381 | }, 382 | "node_modules/is-glob": { 383 | "version": "4.0.3", 384 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 385 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 386 | "dependencies": { 387 | "is-extglob": "^2.1.1" 388 | }, 389 | "engines": { 390 | "node": ">=0.10.0" 391 | } 392 | }, 393 | "node_modules/is-number": { 394 | "version": "7.0.0", 395 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 396 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 397 | "engines": { 398 | "node": ">=0.12.0" 399 | } 400 | }, 401 | "node_modules/js-yaml": { 402 | "version": "4.1.0", 403 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 404 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 405 | "dependencies": { 406 | "argparse": "^2.0.1" 407 | }, 408 | "bin": { 409 | "js-yaml": "bin/js-yaml.js" 410 | } 411 | }, 412 | "node_modules/jsonfile": { 413 | "version": "6.1.0", 414 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", 415 | "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", 416 | "dependencies": { 417 | "universalify": "^2.0.0" 418 | }, 419 | "optionalDependencies": { 420 | "graceful-fs": "^4.1.6" 421 | } 422 | }, 423 | "node_modules/merge2": { 424 | "version": "1.4.1", 425 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 426 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 427 | "engines": { 428 | "node": ">= 8" 429 | } 430 | }, 431 | "node_modules/micromatch": { 432 | "version": "4.0.5", 433 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 434 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 435 | "dependencies": { 436 | "braces": "^3.0.2", 437 | "picomatch": "^2.3.1" 438 | }, 439 | "engines": { 440 | "node": ">=8.6" 441 | } 442 | }, 443 | "node_modules/mime-db": { 444 | "version": "1.52.0", 445 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 446 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 447 | "engines": { 448 | "node": ">= 0.6" 449 | } 450 | }, 451 | "node_modules/mime-types": { 452 | "version": "2.1.35", 453 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 454 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 455 | "dependencies": { 456 | "mime-db": "1.52.0" 457 | }, 458 | "engines": { 459 | "node": ">= 0.6" 460 | } 461 | }, 462 | "node_modules/nconf": { 463 | "version": "0.12.0", 464 | "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.12.0.tgz", 465 | "integrity": "sha512-T3fZPw3c7Dfrz8JBQEbEcZJ2s8f7cUMpKuyBtsGQe0b71pcXx6gNh4oti2xh5dxB+gO9ufNfISBlGvvWtfyMcA==", 466 | "dependencies": { 467 | "async": "^3.0.0", 468 | "ini": "^2.0.0", 469 | "secure-keys": "^1.0.0", 470 | "yargs": "^16.1.1" 471 | }, 472 | "engines": { 473 | "node": ">= 0.4.0" 474 | } 475 | }, 476 | "node_modules/path-type": { 477 | "version": "4.0.0", 478 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 479 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 480 | "engines": { 481 | "node": ">=8" 482 | } 483 | }, 484 | "node_modules/picomatch": { 485 | "version": "2.3.1", 486 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 487 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 488 | "engines": { 489 | "node": ">=8.6" 490 | }, 491 | "funding": { 492 | "url": "https://github.com/sponsors/jonschlinkert" 493 | } 494 | }, 495 | "node_modules/proxy-from-env": { 496 | "version": "1.1.0", 497 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 498 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 499 | }, 500 | "node_modules/queue-microtask": { 501 | "version": "1.2.3", 502 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 503 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 504 | "funding": [ 505 | { 506 | "type": "github", 507 | "url": "https://github.com/sponsors/feross" 508 | }, 509 | { 510 | "type": "patreon", 511 | "url": "https://www.patreon.com/feross" 512 | }, 513 | { 514 | "type": "consulting", 515 | "url": "https://feross.org/support" 516 | } 517 | ] 518 | }, 519 | "node_modules/require-directory": { 520 | "version": "2.1.1", 521 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 522 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 523 | "engines": { 524 | "node": ">=0.10.0" 525 | } 526 | }, 527 | "node_modules/reusify": { 528 | "version": "1.0.4", 529 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 530 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 531 | "engines": { 532 | "iojs": ">=1.0.0", 533 | "node": ">=0.10.0" 534 | } 535 | }, 536 | "node_modules/run-parallel": { 537 | "version": "1.2.0", 538 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 539 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 540 | "funding": [ 541 | { 542 | "type": "github", 543 | "url": "https://github.com/sponsors/feross" 544 | }, 545 | { 546 | "type": "patreon", 547 | "url": "https://www.patreon.com/feross" 548 | }, 549 | { 550 | "type": "consulting", 551 | "url": "https://feross.org/support" 552 | } 553 | ], 554 | "dependencies": { 555 | "queue-microtask": "^1.2.2" 556 | } 557 | }, 558 | "node_modules/secure-keys": { 559 | "version": "1.0.0", 560 | "resolved": "https://registry.npmjs.org/secure-keys/-/secure-keys-1.0.0.tgz", 561 | "integrity": "sha512-nZi59hW3Sl5P3+wOO89eHBAAGwmCPd2aE1+dLZV5MO+ItQctIvAqihzaAXIQhvtH4KJPxM080HsnqltR2y8cWg==" 562 | }, 563 | "node_modules/slash": { 564 | "version": "3.0.0", 565 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 566 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 567 | "engines": { 568 | "node": ">=8" 569 | } 570 | }, 571 | "node_modules/string-width": { 572 | "version": "4.2.3", 573 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 574 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 575 | "dependencies": { 576 | "emoji-regex": "^8.0.0", 577 | "is-fullwidth-code-point": "^3.0.0", 578 | "strip-ansi": "^6.0.1" 579 | }, 580 | "engines": { 581 | "node": ">=8" 582 | } 583 | }, 584 | "node_modules/strip-ansi": { 585 | "version": "6.0.1", 586 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 587 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 588 | "dependencies": { 589 | "ansi-regex": "^5.0.1" 590 | }, 591 | "engines": { 592 | "node": ">=8" 593 | } 594 | }, 595 | "node_modules/to-regex-range": { 596 | "version": "5.0.1", 597 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 598 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 599 | "dependencies": { 600 | "is-number": "^7.0.0" 601 | }, 602 | "engines": { 603 | "node": ">=8.0" 604 | } 605 | }, 606 | "node_modules/tunnel": { 607 | "version": "0.0.6", 608 | "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", 609 | "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", 610 | "engines": { 611 | "node": ">=0.6.11 <=0.7.0 || >=0.7.3" 612 | } 613 | }, 614 | "node_modules/universalify": { 615 | "version": "2.0.1", 616 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", 617 | "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", 618 | "engines": { 619 | "node": ">= 10.0.0" 620 | } 621 | }, 622 | "node_modules/uuid": { 623 | "version": "8.3.2", 624 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 625 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", 626 | "bin": { 627 | "uuid": "dist/bin/uuid" 628 | } 629 | }, 630 | "node_modules/wrap-ansi": { 631 | "version": "7.0.0", 632 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 633 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 634 | "dependencies": { 635 | "ansi-styles": "^4.0.0", 636 | "string-width": "^4.1.0", 637 | "strip-ansi": "^6.0.0" 638 | }, 639 | "engines": { 640 | "node": ">=10" 641 | }, 642 | "funding": { 643 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 644 | } 645 | }, 646 | "node_modules/y18n": { 647 | "version": "5.0.8", 648 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 649 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 650 | "engines": { 651 | "node": ">=10" 652 | } 653 | }, 654 | "node_modules/yaml-lint": { 655 | "version": "1.7.0", 656 | "resolved": "https://registry.npmjs.org/yaml-lint/-/yaml-lint-1.7.0.tgz", 657 | "integrity": "sha512-zeBC/kskKQo4zuoGQ+IYjw6C9a/YILr2SXoEZA9jM0COrSwvwVbfTiFegT8qYBSBgOwLMWGL8sY137tOmFXGnQ==", 658 | "dependencies": { 659 | "consola": "^2.15.3", 660 | "globby": "^11.1.0", 661 | "js-yaml": "^4.1.0", 662 | "nconf": "^0.12.0" 663 | }, 664 | "bin": { 665 | "yamllint": "dist/cli.js" 666 | } 667 | }, 668 | "node_modules/yargs": { 669 | "version": "16.2.0", 670 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 671 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 672 | "dependencies": { 673 | "cliui": "^7.0.2", 674 | "escalade": "^3.1.1", 675 | "get-caller-file": "^2.0.5", 676 | "require-directory": "^2.1.1", 677 | "string-width": "^4.2.0", 678 | "y18n": "^5.0.5", 679 | "yargs-parser": "^20.2.2" 680 | }, 681 | "engines": { 682 | "node": ">=10" 683 | } 684 | }, 685 | "node_modules/yargs-parser": { 686 | "version": "20.2.9", 687 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", 688 | "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", 689 | "engines": { 690 | "node": ">=10" 691 | } 692 | } 693 | }, 694 | "dependencies": { 695 | "@actions/core": { 696 | "version": "1.10.1", 697 | "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.1.tgz", 698 | "integrity": "sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g==", 699 | "requires": { 700 | "@actions/http-client": "^2.0.1", 701 | "uuid": "^8.3.2" 702 | } 703 | }, 704 | "@actions/http-client": { 705 | "version": "2.0.1", 706 | "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.0.1.tgz", 707 | "integrity": "sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw==", 708 | "requires": { 709 | "tunnel": "^0.0.6" 710 | } 711 | }, 712 | "@nodelib/fs.scandir": { 713 | "version": "2.1.5", 714 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 715 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 716 | "requires": { 717 | "@nodelib/fs.stat": "2.0.5", 718 | "run-parallel": "^1.1.9" 719 | } 720 | }, 721 | "@nodelib/fs.stat": { 722 | "version": "2.0.5", 723 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 724 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" 725 | }, 726 | "@nodelib/fs.walk": { 727 | "version": "1.2.8", 728 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 729 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 730 | "requires": { 731 | "@nodelib/fs.scandir": "2.1.5", 732 | "fastq": "^1.6.0" 733 | } 734 | }, 735 | "@theneo/sdk": { 736 | "version": "0.9.0", 737 | "resolved": "https://registry.npmjs.org/@theneo/sdk/-/sdk-0.9.0.tgz", 738 | "integrity": "sha512-CGtpQOfxPb6P1b0St+Zsz8pRkTZp9YY6dZQOQcIw5w0wZDXiRUca1sBbZOp2GVN/JH6iDpWyD0NVblyy70iXeA==", 739 | "requires": { 740 | "axios": "^1.7.2", 741 | "form-data": "^4.0.0", 742 | "fs-extra": "^11.2.0" 743 | } 744 | }, 745 | "@vercel/ncc": { 746 | "version": "0.38.1", 747 | "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.38.1.tgz", 748 | "integrity": "sha512-IBBb+iI2NLu4VQn3Vwldyi2QwaXt5+hTyh58ggAMoCGE6DJmPvwL3KPBWcJl1m9LYPChBLE980Jw+CS4Wokqxw==" 749 | }, 750 | "ansi-regex": { 751 | "version": "5.0.1", 752 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 753 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" 754 | }, 755 | "ansi-styles": { 756 | "version": "4.3.0", 757 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 758 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 759 | "requires": { 760 | "color-convert": "^2.0.1" 761 | } 762 | }, 763 | "argparse": { 764 | "version": "2.0.1", 765 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 766 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" 767 | }, 768 | "array-union": { 769 | "version": "2.1.0", 770 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", 771 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" 772 | }, 773 | "async": { 774 | "version": "3.2.4", 775 | "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", 776 | "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" 777 | }, 778 | "asynckit": { 779 | "version": "0.4.0", 780 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 781 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 782 | }, 783 | "axios": { 784 | "version": "1.7.2", 785 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", 786 | "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", 787 | "requires": { 788 | "follow-redirects": "^1.15.6", 789 | "form-data": "^4.0.0", 790 | "proxy-from-env": "^1.1.0" 791 | } 792 | }, 793 | "braces": { 794 | "version": "3.0.3", 795 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 796 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 797 | "requires": { 798 | "fill-range": "^7.1.1" 799 | } 800 | }, 801 | "cliui": { 802 | "version": "7.0.4", 803 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 804 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 805 | "requires": { 806 | "string-width": "^4.2.0", 807 | "strip-ansi": "^6.0.0", 808 | "wrap-ansi": "^7.0.0" 809 | } 810 | }, 811 | "color-convert": { 812 | "version": "2.0.1", 813 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 814 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 815 | "requires": { 816 | "color-name": "~1.1.4" 817 | } 818 | }, 819 | "color-name": { 820 | "version": "1.1.4", 821 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 822 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 823 | }, 824 | "combined-stream": { 825 | "version": "1.0.8", 826 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 827 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 828 | "requires": { 829 | "delayed-stream": "~1.0.0" 830 | } 831 | }, 832 | "consola": { 833 | "version": "2.15.3", 834 | "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", 835 | "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" 836 | }, 837 | "delayed-stream": { 838 | "version": "1.0.0", 839 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 840 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" 841 | }, 842 | "dir-glob": { 843 | "version": "3.0.1", 844 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", 845 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", 846 | "requires": { 847 | "path-type": "^4.0.0" 848 | } 849 | }, 850 | "emoji-regex": { 851 | "version": "8.0.0", 852 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 853 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 854 | }, 855 | "escalade": { 856 | "version": "3.1.1", 857 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 858 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" 859 | }, 860 | "fast-glob": { 861 | "version": "3.2.12", 862 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", 863 | "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", 864 | "requires": { 865 | "@nodelib/fs.stat": "^2.0.2", 866 | "@nodelib/fs.walk": "^1.2.3", 867 | "glob-parent": "^5.1.2", 868 | "merge2": "^1.3.0", 869 | "micromatch": "^4.0.4" 870 | } 871 | }, 872 | "fastq": { 873 | "version": "1.15.0", 874 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", 875 | "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", 876 | "requires": { 877 | "reusify": "^1.0.4" 878 | } 879 | }, 880 | "fill-range": { 881 | "version": "7.1.1", 882 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 883 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 884 | "requires": { 885 | "to-regex-range": "^5.0.1" 886 | } 887 | }, 888 | "follow-redirects": { 889 | "version": "1.15.6", 890 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", 891 | "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" 892 | }, 893 | "form-data": { 894 | "version": "4.0.0", 895 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 896 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 897 | "requires": { 898 | "asynckit": "^0.4.0", 899 | "combined-stream": "^1.0.8", 900 | "mime-types": "^2.1.12" 901 | } 902 | }, 903 | "fs-extra": { 904 | "version": "11.2.0", 905 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", 906 | "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", 907 | "requires": { 908 | "graceful-fs": "^4.2.0", 909 | "jsonfile": "^6.0.1", 910 | "universalify": "^2.0.0" 911 | } 912 | }, 913 | "get-caller-file": { 914 | "version": "2.0.5", 915 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 916 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" 917 | }, 918 | "glob-parent": { 919 | "version": "5.1.2", 920 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 921 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 922 | "requires": { 923 | "is-glob": "^4.0.1" 924 | } 925 | }, 926 | "globby": { 927 | "version": "11.1.0", 928 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", 929 | "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", 930 | "requires": { 931 | "array-union": "^2.1.0", 932 | "dir-glob": "^3.0.1", 933 | "fast-glob": "^3.2.9", 934 | "ignore": "^5.2.0", 935 | "merge2": "^1.4.1", 936 | "slash": "^3.0.0" 937 | } 938 | }, 939 | "graceful-fs": { 940 | "version": "4.2.11", 941 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 942 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" 943 | }, 944 | "ignore": { 945 | "version": "5.2.4", 946 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", 947 | "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==" 948 | }, 949 | "ini": { 950 | "version": "2.0.0", 951 | "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", 952 | "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" 953 | }, 954 | "is-extglob": { 955 | "version": "2.1.1", 956 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 957 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" 958 | }, 959 | "is-fullwidth-code-point": { 960 | "version": "3.0.0", 961 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 962 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" 963 | }, 964 | "is-glob": { 965 | "version": "4.0.3", 966 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 967 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 968 | "requires": { 969 | "is-extglob": "^2.1.1" 970 | } 971 | }, 972 | "is-number": { 973 | "version": "7.0.0", 974 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 975 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 976 | }, 977 | "js-yaml": { 978 | "version": "4.1.0", 979 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 980 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 981 | "requires": { 982 | "argparse": "^2.0.1" 983 | } 984 | }, 985 | "jsonfile": { 986 | "version": "6.1.0", 987 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", 988 | "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", 989 | "requires": { 990 | "graceful-fs": "^4.1.6", 991 | "universalify": "^2.0.0" 992 | } 993 | }, 994 | "merge2": { 995 | "version": "1.4.1", 996 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 997 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" 998 | }, 999 | "micromatch": { 1000 | "version": "4.0.5", 1001 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 1002 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 1003 | "requires": { 1004 | "braces": "^3.0.2", 1005 | "picomatch": "^2.3.1" 1006 | } 1007 | }, 1008 | "mime-db": { 1009 | "version": "1.52.0", 1010 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1011 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 1012 | }, 1013 | "mime-types": { 1014 | "version": "2.1.35", 1015 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1016 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1017 | "requires": { 1018 | "mime-db": "1.52.0" 1019 | } 1020 | }, 1021 | "nconf": { 1022 | "version": "0.12.0", 1023 | "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.12.0.tgz", 1024 | "integrity": "sha512-T3fZPw3c7Dfrz8JBQEbEcZJ2s8f7cUMpKuyBtsGQe0b71pcXx6gNh4oti2xh5dxB+gO9ufNfISBlGvvWtfyMcA==", 1025 | "requires": { 1026 | "async": "^3.0.0", 1027 | "ini": "^2.0.0", 1028 | "secure-keys": "^1.0.0", 1029 | "yargs": "^16.1.1" 1030 | } 1031 | }, 1032 | "path-type": { 1033 | "version": "4.0.0", 1034 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 1035 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" 1036 | }, 1037 | "picomatch": { 1038 | "version": "2.3.1", 1039 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1040 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" 1041 | }, 1042 | "proxy-from-env": { 1043 | "version": "1.1.0", 1044 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 1045 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 1046 | }, 1047 | "queue-microtask": { 1048 | "version": "1.2.3", 1049 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1050 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" 1051 | }, 1052 | "require-directory": { 1053 | "version": "2.1.1", 1054 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1055 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" 1056 | }, 1057 | "reusify": { 1058 | "version": "1.0.4", 1059 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1060 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" 1061 | }, 1062 | "run-parallel": { 1063 | "version": "1.2.0", 1064 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1065 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1066 | "requires": { 1067 | "queue-microtask": "^1.2.2" 1068 | } 1069 | }, 1070 | "secure-keys": { 1071 | "version": "1.0.0", 1072 | "resolved": "https://registry.npmjs.org/secure-keys/-/secure-keys-1.0.0.tgz", 1073 | "integrity": "sha512-nZi59hW3Sl5P3+wOO89eHBAAGwmCPd2aE1+dLZV5MO+ItQctIvAqihzaAXIQhvtH4KJPxM080HsnqltR2y8cWg==" 1074 | }, 1075 | "slash": { 1076 | "version": "3.0.0", 1077 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 1078 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" 1079 | }, 1080 | "string-width": { 1081 | "version": "4.2.3", 1082 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1083 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1084 | "requires": { 1085 | "emoji-regex": "^8.0.0", 1086 | "is-fullwidth-code-point": "^3.0.0", 1087 | "strip-ansi": "^6.0.1" 1088 | } 1089 | }, 1090 | "strip-ansi": { 1091 | "version": "6.0.1", 1092 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1093 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1094 | "requires": { 1095 | "ansi-regex": "^5.0.1" 1096 | } 1097 | }, 1098 | "to-regex-range": { 1099 | "version": "5.0.1", 1100 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1101 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1102 | "requires": { 1103 | "is-number": "^7.0.0" 1104 | } 1105 | }, 1106 | "tunnel": { 1107 | "version": "0.0.6", 1108 | "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", 1109 | "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" 1110 | }, 1111 | "universalify": { 1112 | "version": "2.0.1", 1113 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", 1114 | "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==" 1115 | }, 1116 | "uuid": { 1117 | "version": "8.3.2", 1118 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 1119 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" 1120 | }, 1121 | "wrap-ansi": { 1122 | "version": "7.0.0", 1123 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1124 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1125 | "requires": { 1126 | "ansi-styles": "^4.0.0", 1127 | "string-width": "^4.1.0", 1128 | "strip-ansi": "^6.0.0" 1129 | } 1130 | }, 1131 | "y18n": { 1132 | "version": "5.0.8", 1133 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 1134 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" 1135 | }, 1136 | "yaml-lint": { 1137 | "version": "1.7.0", 1138 | "resolved": "https://registry.npmjs.org/yaml-lint/-/yaml-lint-1.7.0.tgz", 1139 | "integrity": "sha512-zeBC/kskKQo4zuoGQ+IYjw6C9a/YILr2SXoEZA9jM0COrSwvwVbfTiFegT8qYBSBgOwLMWGL8sY137tOmFXGnQ==", 1140 | "requires": { 1141 | "consola": "^2.15.3", 1142 | "globby": "^11.1.0", 1143 | "js-yaml": "^4.1.0", 1144 | "nconf": "^0.12.0" 1145 | } 1146 | }, 1147 | "yargs": { 1148 | "version": "16.2.0", 1149 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 1150 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 1151 | "requires": { 1152 | "cliui": "^7.0.2", 1153 | "escalade": "^3.1.1", 1154 | "get-caller-file": "^2.0.5", 1155 | "require-directory": "^2.1.1", 1156 | "string-width": "^4.2.0", 1157 | "y18n": "^5.0.5", 1158 | "yargs-parser": "^20.2.2" 1159 | } 1160 | }, 1161 | "yargs-parser": { 1162 | "version": "20.2.9", 1163 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", 1164 | "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" 1165 | } 1166 | } 1167 | } 1168 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "api-documentation", 3 | "version": "1.8.0", 4 | "description": "GitHub Action to Import documentation into Theneo", 5 | "main": "src/index.js", 6 | "scripts": { 7 | "build": "ncc build src/index.js -m -o dist", 8 | "start": "node src/index.js", 9 | "test": "FILE_PATH=test/petstore.yaml SECRET=test PROJECT_SLUG=test VERSION_SLUG=test WORKSPACE_SLUG=theneo-testing IMPORT_OPTION=merge AUTO_PUBLISH=true PARAMETER_DESCRIPTION_MERGE_STRATEGY=keep_new SECTION_DESCRIPTION_MERGE_STRATEGY=keep_old npm run start" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "git+https://github.com/Theneo-Inc/api-documentation.git" 14 | }, 15 | "keywords": [ 16 | "API", 17 | "Documetation", 18 | "Theneo" 19 | ], 20 | "author": "", 21 | "license": "ISC", 22 | "bugs": { 23 | "url": "https://github.com/Theneo-Inc/api-documentation/issues" 24 | }, 25 | "homepage": "https://github.com/Theneo-Inc/api-documentation#readme", 26 | "dependencies": { 27 | "@actions/core": "^1.10.1", 28 | "@theneo/sdk": "^0.9.0", 29 | "@vercel/ncc": "^0.38.1", 30 | "yaml-lint": "^1.7.0" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /scripts/check-doc.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Check if URL and at least one search string are provided 4 | if [ -z "$1" ] || [ "$#" -lt 2 ]; then 5 | echo "Usage: $0 [search_string2 ...]" 6 | exit 1 7 | fi 8 | 9 | url=$1 10 | shift 11 | search_strings=("$@") 12 | 13 | # Make a curl request and capture the HTTP status code and HTML content 14 | http_status=$(curl -s -o /dev/null -w "%{http_code}" "$url") 15 | html_content=$(curl -s "$url") 16 | 17 | # Check if the HTTP status code is 200 18 | if [ "$http_status" -eq 200 ]; then 19 | echo "Request successful! HTTP Status Code: $http_status" 20 | 21 | # Check if each search string is present in the HTML content 22 | for search_string in "${search_strings[@]}"; do 23 | if [[ "$html_content" =~ "$search_string" ]]; then 24 | echo "String '$search_string' found in the HTML content." 25 | else 26 | echo "String '$search_string' not found in the HTML content." 27 | exit 1 28 | fi 29 | done 30 | 31 | exit 0 32 | else 33 | echo "Request failed! HTTP Status Code: $http_status" 34 | exit 1 35 | fi 36 | -------------------------------------------------------------------------------- /src/file.js: -------------------------------------------------------------------------------- 1 | const {lintFile} = require("yaml-lint"); 2 | 3 | async function checkDocumentationFile(path) { 4 | if (path.includes(".")) { 5 | const extension = path.split(".").pop(); 6 | if (extension === "yaml" || extension === "yml") { 7 | await lintFile(path).catch((err) => { 8 | throw new Error(err); 9 | }); 10 | } 11 | // TODO ADD checks for other type of files 12 | } 13 | } 14 | 15 | 16 | module.exports = { 17 | checkDocumentationFile 18 | } 19 | -------------------------------------------------------------------------------- /src/helpers.js: -------------------------------------------------------------------------------- 1 | 2 | function getProjectId(projects, projectKey, workspaceSlug) { 3 | const project = projects.find((project) => { 4 | if (project.key !== projectKey) { 5 | return false 6 | } 7 | if (!workspaceSlug) { 8 | return true 9 | } 10 | return project.company?.slug === workspaceSlug; 11 | }); 12 | if (!project) { 13 | throw new Error(`Could not find projects using slug: ${projectKey}`) 14 | } 15 | return project.id; 16 | } 17 | 18 | 19 | function getVersionId(versions, versionSlug) { 20 | const version = versions.find((version) => version.slug === versionSlug); 21 | if (!version) { 22 | throw new Error(`Could not find Project version using slug: ${versionSlug}`) 23 | } 24 | return version.id; 25 | } 26 | 27 | 28 | module.exports = { 29 | getProjectId, 30 | getVersionId 31 | } 32 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | const {setFailed} = require("@actions/core"); 2 | const {getInputOptions} = require("./input.js"); 3 | const {main} = require("./main"); 4 | 5 | 6 | main(getInputOptions()) 7 | .catch(setFailed); 8 | -------------------------------------------------------------------------------- /src/input.js: -------------------------------------------------------------------------------- 1 | const {getInput} = require("@actions/core"); 2 | const {validateMergingStrategy} = require("./validate"); 3 | 4 | function getInputOption(name) { 5 | if (!name) { 6 | throw new Error('name is required'); 7 | } 8 | return getInput(name) || process.env[name]; 9 | } 10 | 11 | 12 | function getInputOptions() { 13 | const path = getInputOption("FILE_PATH") || getInputOption("PATH"); 14 | const projectKey = getInputOption("PROJECT_KEY") || getInputOption("PROJECT_SLUG"); 15 | const versionSlug = getInputOption("VERSION_SLUG"); 16 | const workspaceSlug = getInputOption("WORKSPACE_SLUG"); 17 | const secret = getInputOption("SECRET"); 18 | const importOption = getInputOption("IMPORT_OPTION"); 19 | const autoPublish = getInputOption("AUTO_PUBLISH") === "true"; 20 | const includeGithubMetadata = getInputOption("INCLUDE_GITHUB_METADATA") === "true"; 21 | const parameterDescriptionMergeStrategy = getInputOption("PARAMETER_DESCRIPTION_MERGE_STRATEGY"); 22 | const sectionDescriptionMergeStrategy = getInputOption("SECTION_DESCRIPTION_MERGE_STRATEGY"); 23 | return { 24 | path, 25 | projectKey, 26 | versionSlug, 27 | workspaceSlug, 28 | secret, 29 | importOption, 30 | autoPublish, 31 | includeGithubMetadata, 32 | parameterDescriptionMergeStrategy, 33 | sectionDescriptionMergeStrategy 34 | }; 35 | } 36 | 37 | 38 | module.exports = { 39 | getInputOptions 40 | } 41 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | const {validateInputOptions} = require("./validate"); 2 | const {Theneo, ImportOption} = require("@theneo/sdk"); 3 | const {GITHUB_ACTION_VERSION} = require("./version"); 4 | const {setFailed} = require("@actions/core"); 5 | const {getVersionId, getProjectId} = require("./helpers"); 6 | 7 | 8 | 9 | async function main(options) { 10 | await validateInputOptions(options); 11 | const { 12 | path, 13 | projectKey, 14 | secret, 15 | importOption, 16 | autoPublish, 17 | includeGithubMetadata, 18 | versionSlug, 19 | workspaceSlug, 20 | parameterDescriptionMergeStrategy, 21 | sectionDescriptionMergeStrategy 22 | } = options 23 | 24 | const theneo = new Theneo({ 25 | apiKey: secret, 26 | apiClientMetadata: { 27 | apiClientName: "github-action", 28 | apiClientVersion: GITHUB_ACTION_VERSION 29 | } 30 | }) 31 | 32 | 33 | const projectsResult = await theneo.listProjects(); 34 | if (projectsResult.err) { 35 | setFailed(projectsResult.error.message); 36 | return; 37 | } 38 | const projectId = getProjectId(projectsResult.unwrap(), projectKey, workspaceSlug); 39 | 40 | const importProjectData = { 41 | projectId: projectId, 42 | publish: autoPublish, 43 | data: { 44 | file: path 45 | }, 46 | importOption: importOption, 47 | }; 48 | 49 | if (includeGithubMetadata) { 50 | const authorName = process.env.GITHUB_ACTOR ?? process.env.GITHUB_TRIGGERING_ACTOR; 51 | importProjectData.importMetadata = { 52 | authorName: authorName, 53 | } 54 | } 55 | 56 | if (versionSlug) { 57 | const versionsResult = await theneo.listProjectVersions(projectId); 58 | if (versionsResult.err) { 59 | setFailed(versionsResult.error.message) 60 | return; 61 | } 62 | importProjectData.versionId = getVersionId(versionsResult.unwrap(), versionSlug) 63 | } 64 | 65 | if (importOption === ImportOption.MERGE) { 66 | if (parameterDescriptionMergeStrategy || sectionDescriptionMergeStrategy) { 67 | importProjectData.importOptionAdditionalData = { 68 | parameterDescriptionMergeStrategy, 69 | sectionDescriptionMergeStrategy 70 | } 71 | } 72 | } 73 | 74 | const result = await theneo.importProjectDocument(importProjectData); 75 | 76 | if (result.err) { 77 | setFailed(result.error.message); 78 | return; 79 | } 80 | if (result.value.publishData) { 81 | console.log(`API Documentation was published, you can see it here: ${result.value.publishData.publishedPageUrl}`) 82 | } else { 83 | console.log("API Documentation was updated successfully") 84 | } 85 | } 86 | 87 | module.exports = { 88 | main 89 | } 90 | -------------------------------------------------------------------------------- /src/validate.js: -------------------------------------------------------------------------------- 1 | const {ImportOption, MergingStrategy} = require("@theneo/sdk"); 2 | const {checkDocumentationFile} = require("./file"); 3 | 4 | 5 | async function validateInputOptions(options) { 6 | if (!options.path) { 7 | throw new Error("Add API documentation FILE_PATH in workflow file"); 8 | } 9 | if (!options.projectKey) { 10 | throw new Error("PROJECT_SLUG is missing"); 11 | } 12 | if (!options.secret) { 13 | throw new Error("Add SECRET - Theneo API token, you can get it from: https://app.theneo.io/account-settings/toolsandintegrations"); 14 | } 15 | 16 | const importOptions = Object.values(ImportOption); 17 | if (options.importOption && !importOptions.includes(options.importOption)) { 18 | throw new Error(`import option should be one of ${options.importOption}`); 19 | } 20 | 21 | await checkDocumentationFile(options.path); 22 | 23 | validateMergingStrategy(options.parameterDescriptionMergeStrategy, "PARAMETER_DESCRIPTION_MERGE_STRATEGY") 24 | validateMergingStrategy(options.sectionDescriptionMergeStrategy, "SECTION_DESCRIPTION_MERGE_STRATEGY") 25 | 26 | } 27 | 28 | function validateMergingStrategy(strategy, parameterName) { 29 | if (strategy) { 30 | let mergingStrategies = [MergingStrategy.KEEP_NEW, MergingStrategy.KEEP_OLD]; 31 | if (!mergingStrategies.includes(strategy)) { 32 | throw new Error(`Invalid merging strategy ${strategy} for ${parameterName}, should be one of this ${mergingStrategies}`); 33 | } 34 | } 35 | } 36 | 37 | 38 | module.exports = { 39 | validateInputOptions, 40 | validateMergingStrategy 41 | } 42 | -------------------------------------------------------------------------------- /src/version.js: -------------------------------------------------------------------------------- 1 | const packageJson = require('../package.json'); 2 | // const fs = require("fs"); 3 | // const packageJson = JSON.parse(fs.readFileSync(__dirname + "/../package.json", "utf8").toString()); 4 | 5 | const GITHUB_ACTION_VERSION = packageJson.version; 6 | 7 | module.exports = { 8 | GITHUB_ACTION_VERSION 9 | } 10 | -------------------------------------------------------------------------------- /test/petstore.yaml: -------------------------------------------------------------------------------- 1 | openapi: "3.0.0" 2 | info: 3 | version: 1.0.0 4 | title: Swagger Petstore 5 | description: A sample API that uses a petstore as an example to demonstrate features in the OpenAPI 3.0 specification 6 | termsOfService: http://swagger.io/terms/ 7 | contact: 8 | name: Swagger API Team 9 | email: apiteam@swagger.io 10 | url: http://swagger.io 11 | license: 12 | name: Apache 2.0 13 | url: https://www.apache.org/licenses/LICENSE-2.0.html 14 | servers: 15 | - url: https://petstore.swagger.io/v2 16 | paths: 17 | /pets: 18 | get: 19 | description: | 20 | Returns all pets from the system that the user has access to 21 | Nam sed condimentum est. Maecenas tempor sagittis sapien, nec rhoncus sem sagittis sit amet. Aenean at gravida augue, ac iaculis sem. Curabitur odio lorem, ornare eget elementum nec, cursus id lectus. Duis mi turpis, pulvinar ac eros ac, tincidunt varius justo. In hac habitasse platea dictumst. Integer at adipiscing ante, a sagittis ligula. Aenean pharetra tempor ante molestie imperdiet. Vivamus id aliquam diam. Cras quis velit non tortor eleifend sagittis. Praesent at enim pharetra urna volutpat venenatis eget eget mauris. In eleifend fermentum facilisis. Praesent enim enim, gravida ac sodales sed, placerat id erat. Suspendisse lacus dolor, consectetur non augue vel, vehicula interdum libero. Morbi euismod sagittis libero sed lacinia. 22 | 23 | Sed tempus felis lobortis leo pulvinar rutrum. Nam mattis velit nisl, eu condimentum ligula luctus nec. Phasellus semper velit eget aliquet faucibus. In a mattis elit. Phasellus vel urna viverra, condimentum lorem id, rhoncus nibh. Ut pellentesque posuere elementum. Sed a varius odio. Morbi rhoncus ligula libero, vel eleifend nunc tristique vitae. Fusce et sem dui. Aenean nec scelerisque tortor. Fusce malesuada accumsan magna vel tempus. Quisque mollis felis eu dolor tristique, sit amet auctor felis gravida. Sed libero lorem, molestie sed nisl in, accumsan tempor nisi. Fusce sollicitudin massa ut lacinia mattis. Sed vel eleifend lorem. Pellentesque vitae felis pretium, pulvinar elit eu, euismod sapien. 24 | operationId: findPets 25 | parameters: 26 | - name: tags 27 | in: query 28 | description: tags to filter by 29 | required: false 30 | style: form 31 | schema: 32 | type: array 33 | items: 34 | type: string 35 | - name: limit 36 | in: query 37 | description: maximum number of results to return 38 | required: false 39 | schema: 40 | type: integer 41 | format: int32 42 | responses: 43 | '200': 44 | description: pet response 45 | content: 46 | application/json: 47 | schema: 48 | type: array 49 | items: 50 | $ref: '#/components/schemas/Pet' 51 | default: 52 | description: unexpected error 53 | content: 54 | application/json: 55 | schema: 56 | $ref: '#/components/schemas/Error' 57 | post: 58 | description: Creates a new pet in the store. Duplicates are allowed 59 | operationId: addPet 60 | requestBody: 61 | description: Pet to add to the store 62 | required: true 63 | content: 64 | application/json: 65 | schema: 66 | $ref: '#/components/schemas/NewPet' 67 | responses: 68 | '200': 69 | description: pet response 70 | content: 71 | application/json: 72 | schema: 73 | $ref: '#/components/schemas/Pet' 74 | default: 75 | description: unexpected error 76 | content: 77 | application/json: 78 | schema: 79 | $ref: '#/components/schemas/Error' 80 | /pets/{id}: 81 | get: 82 | description: Returns a user based on a single ID, if the user does not have access to the pet 83 | operationId: find pet by id 84 | parameters: 85 | - name: id 86 | in: path 87 | description: ID of pet to fetch 88 | required: true 89 | schema: 90 | type: integer 91 | format: int64 92 | responses: 93 | '200': 94 | description: pet response 95 | content: 96 | application/json: 97 | schema: 98 | $ref: '#/components/schemas/Pet' 99 | default: 100 | description: unexpected error 101 | content: 102 | application/json: 103 | schema: 104 | $ref: '#/components/schemas/Error' 105 | delete: 106 | description: deletes a single pet based on the ID supplied 107 | operationId: deletePet 108 | parameters: 109 | - name: id 110 | in: path 111 | description: ID of pet to delete 112 | required: true 113 | schema: 114 | type: integer 115 | format: int64 116 | responses: 117 | '204': 118 | description: pet deleted 119 | default: 120 | description: unexpected error 121 | content: 122 | application/json: 123 | schema: 124 | $ref: '#/components/schemas/Error' 125 | components: 126 | schemas: 127 | Pet: 128 | allOf: 129 | - $ref: '#/components/schemas/NewPet' 130 | - type: object 131 | required: 132 | - id 133 | properties: 134 | id: 135 | type: integer 136 | format: int64 137 | 138 | NewPet: 139 | type: object 140 | required: 141 | - name 142 | properties: 143 | name: 144 | type: string 145 | tag: 146 | type: string 147 | 148 | Error: 149 | type: object 150 | required: 151 | - code 152 | - message 153 | properties: 154 | code: 155 | type: integer 156 | format: int32 157 | message: 158 | type: string 159 | -------------------------------------------------------------------------------- /test/sample.json: -------------------------------------------------------------------------------- 1 | { 2 | "info": { 3 | "_postman_id": "7b93e5d9-ff17-4cdc-8fdc-5de864ffa471", 4 | "name": "Theneo Sample OpenGMAPI Doc", 5 | "description": "Theneo APIs enable you to generate beautiful API documentations effortlessly. Why should only top companies like Stripe, Square, and Twilio have gorgeous documentations? With Theneo you can also generate API documents that you could be proud of. The Theneo API follows the general patterns of REST Please note: All the endpoints and API references discussed here are just for demo purposes, they are not functional\n\n\nContact Support:\n Email: hello@theneo.io", 6 | "schema": "https://schema.getpostman.com/json/collection/v2.0.0/collection.json" 7 | }, 8 | "item": [ 9 | { 10 | "name": "retrieves super duper mock-documentations", 11 | "request": { 12 | "method": "GET", 13 | "header": [], 14 | "url": { 15 | "raw": "{{baseUrl}}/documentation?searchString=&numberofDocs=25&category=&sortBy=&sortOrder=", 16 | "host": [ 17 | "{{baseUrl}}" 18 | ], 19 | "path": [ 20 | "documentation" 21 | ], 22 | "query": [ 23 | { 24 | "key": "searchString", 25 | "value": "", 26 | "description": "pass an optional search string for looking up inventory" 27 | }, 28 | { 29 | "key": "numberofDocs", 30 | "value": "25", 31 | "description": "number of documentations to return" 32 | }, 33 | { 34 | "key": "category", 35 | "value": "", 36 | "description": "category of documentations to return" 37 | }, 38 | { 39 | "key": "sortBy", 40 | "value": "", 41 | "description": "Allowed: dateUpdated, dateAdded." 42 | }, 43 | { 44 | "key": "sortOrder", 45 | "value": "", 46 | "description": "Allowed: asc, desc. asc is ascending and sorts from A to Z. desc is descending and sorts from Z to A." 47 | } 48 | ] 49 | }, 50 | "description": "By passing in the appropriate options, you can search for\navailable API documentations\n" 51 | }, 52 | "response": [ 53 | { 54 | "name": "bad input parameter", 55 | "originalRequest": { 56 | "method": "GET", 57 | "header": [], 58 | "url": { 59 | "raw": "{{baseUrl}}/documentation?searchString=&numberofDocs=25&category=publicAPI&sortBy=key&sortOrder=desc", 60 | "host": [ 61 | "{{baseUrl}}" 62 | ], 63 | "path": [ 64 | "documentation" 65 | ], 66 | "query": [ 67 | { 68 | "key": "searchString", 69 | "value": "" 70 | }, 71 | { 72 | "key": "numberofDocs", 73 | "value": "25" 74 | }, 75 | { 76 | "key": "category", 77 | "value": "publicAPI" 78 | }, 79 | { 80 | "key": "sortBy", 81 | "value": "key" 82 | }, 83 | { 84 | "key": "sortOrder", 85 | "value": "desc" 86 | } 87 | ] 88 | } 89 | }, 90 | "status": "Bad Request", 91 | "code": 400, 92 | "_postman_previewlanguage": "text", 93 | "header": [ 94 | { 95 | "key": "Content-Type", 96 | "value": "text/plain" 97 | } 98 | ], 99 | "cookie": [], 100 | "body": "" 101 | }, 102 | { 103 | "name": "search results matching criteria", 104 | "originalRequest": { 105 | "method": "GET", 106 | "header": [], 107 | "url": { 108 | "raw": "{{baseUrl}}/documentation?searchString=&numberofDocs=25&category=publicAPI&sortBy=key&sortOrder=desc", 109 | "host": [ 110 | "{{baseUrl}}" 111 | ], 112 | "path": [ 113 | "documentation" 114 | ], 115 | "query": [ 116 | { 117 | "key": "searchString", 118 | "value": "" 119 | }, 120 | { 121 | "key": "numberofDocs", 122 | "value": "25" 123 | }, 124 | { 125 | "key": "category", 126 | "value": "publicAPI" 127 | }, 128 | { 129 | "key": "sortBy", 130 | "value": "key" 131 | }, 132 | { 133 | "key": "sortOrder", 134 | "value": "desc" 135 | } 136 | ] 137 | } 138 | }, 139 | "status": "OK", 140 | "code": 200, 141 | "_postman_previewlanguage": "json", 142 | "header": [ 143 | { 144 | "key": "Content-Type", 145 | "value": "application/json" 146 | } 147 | ], 148 | "cookie": [], 149 | "body": "[\n {\n \"id\": \"demo\",\n \"dateAdded\": \"2016-08-29T09:12:33.001Z\",\n \"documentation\": \"Theneo Sample API Doc\",\n \"category\": \"OpenAPI\",\n \"key\": \"demo\"\n },\n {\n \"id\": \"demo\",\n \"dateAdded\": \"2016-08-29T09:12:33.001Z\",\n \"documentation\": \"Theneo Sample API Doc\",\n \"category\": \"OpenAPI\",\n \"key\": \"demo\"\n }\n]" 150 | } 151 | ] 152 | }, 153 | { 154 | "name": "adds a documentation", 155 | "request": { 156 | "method": "POST", 157 | "header": [ 158 | { 159 | "key": "Content-Type", 160 | "value": "application/json" 161 | } 162 | ], 163 | "body": { 164 | "mode": "raw", 165 | "raw": "{\n \"documentation\": \"\",\n \"key\": \"\",\n \"category\": \"\"\n}", 166 | "options": { 167 | "raw": { 168 | "language": "json" 169 | } 170 | } 171 | }, 172 | "url": "{{baseUrl}}/documentation", 173 | "description": "Adds a documentation to the system" 174 | }, 175 | "response": [ 176 | { 177 | "name": "invalid input, object invalid", 178 | "originalRequest": { 179 | "method": "POST", 180 | "header": [], 181 | "body": { 182 | "mode": "raw", 183 | "raw": "{\n \"documentation\": \"Theneo Sample API Doc\",\n \"key\": \"demo\",\n \"category\": \"knockKnock\"\n}", 184 | "options": { 185 | "raw": { 186 | "language": "json" 187 | } 188 | } 189 | }, 190 | "url": "{{baseUrl}}/documentation" 191 | }, 192 | "status": "Bad Request", 193 | "code": 400, 194 | "_postman_previewlanguage": "text", 195 | "header": [ 196 | { 197 | "key": "Content-Type", 198 | "value": "text/plain" 199 | } 200 | ], 201 | "cookie": [], 202 | "body": "" 203 | }, 204 | { 205 | "name": "an existing item already exists", 206 | "originalRequest": { 207 | "method": "POST", 208 | "header": [], 209 | "body": { 210 | "mode": "raw", 211 | "raw": "{\n \"documentation\": \"Theneo Sample API Doc\",\n \"key\": \"demo\",\n \"category\": \"knockKnock\"\n}", 212 | "options": { 213 | "raw": { 214 | "language": "json" 215 | } 216 | } 217 | }, 218 | "url": "{{baseUrl}}/documentation" 219 | }, 220 | "status": "Conflict", 221 | "code": 409, 222 | "_postman_previewlanguage": "text", 223 | "header": [ 224 | { 225 | "key": "Content-Type", 226 | "value": "text/plain" 227 | } 228 | ], 229 | "cookie": [], 230 | "body": "" 231 | }, 232 | { 233 | "name": "item created", 234 | "originalRequest": { 235 | "method": "POST", 236 | "header": [], 237 | "body": { 238 | "mode": "raw", 239 | "raw": "{\n \"documentation\": \"Theneo Sample API Doc\",\n \"key\": \"demo\",\n \"category\": \"knockKnock\"\n}", 240 | "options": { 241 | "raw": { 242 | "language": "json" 243 | } 244 | } 245 | }, 246 | "url": "{{baseUrl}}/documentation" 247 | }, 248 | "status": "Created", 249 | "code": 201, 250 | "_postman_previewlanguage": "text", 251 | "header": [ 252 | { 253 | "key": "Content-Type", 254 | "value": "application/vnd.json" 255 | } 256 | ], 257 | "cookie": [], 258 | "body": "" 259 | } 260 | ] 261 | }, 262 | { 263 | "name": "Deletes an API Doc", 264 | "request": { 265 | "method": "DELETE", 266 | "header": [], 267 | "url": { 268 | "raw": "{{baseUrl}}/documentation/:id", 269 | "host": [ 270 | "{{baseUrl}}" 271 | ], 272 | "path": [ 273 | "documentation", 274 | ":id" 275 | ], 276 | "variable": [ 277 | { 278 | "key": "id", 279 | "value": "", 280 | "description": "(Required) The documentation ID for the documentation you want to delete" 281 | } 282 | ] 283 | }, 284 | "description": "Delete the API Doc from the system" 285 | }, 286 | "response": [ 287 | { 288 | "name": "Documentation was successfully deleted", 289 | "originalRequest": { 290 | "method": "DELETE", 291 | "header": [], 292 | "url": { 293 | "raw": "{{baseUrl}}/documentation/:id", 294 | "host": [ 295 | "{{baseUrl}}" 296 | ], 297 | "path": [ 298 | "documentation", 299 | ":id" 300 | ], 301 | "variable": [ 302 | { 303 | "key": "id", 304 | "value": "", 305 | "description": "(Required) The documentation ID for the documentation you want to delete" 306 | } 307 | ] 308 | } 309 | }, 310 | "status": "OK", 311 | "code": 200, 312 | "_postman_previewlanguage": "text", 313 | "header": [ 314 | { 315 | "key": "Content-Type", 316 | "value": "text/plain" 317 | } 318 | ], 319 | "cookie": [], 320 | "body": "" 321 | } 322 | ] 323 | }, 324 | { 325 | "name": "Invite users to the document", 326 | "request": { 327 | "method": "POST", 328 | "header": [ 329 | { 330 | "key": "Content-Type", 331 | "value": "application/json" 332 | } 333 | ], 334 | "body": { 335 | "mode": "raw", 336 | "raw": "{\n \"useremail\": \"\",\n \"documentatId\": \"\",\n \"permission\": \"\"\n}", 337 | "options": { 338 | "raw": { 339 | "language": "json" 340 | } 341 | } 342 | }, 343 | "url": "{{baseUrl}}/doumentation/invitatation", 344 | "description": "Invite users to the document" 345 | }, 346 | "response": [ 347 | { 348 | "name": "invalid input, object invalid", 349 | "originalRequest": { 350 | "method": "POST", 351 | "header": [], 352 | "body": { 353 | "mode": "raw", 354 | "raw": "{\n \"useremail\": \"arobakid@theneo.io\",\n \"documentatId\": \"theneo-demo\",\n \"permission\": \"editor\"\n}", 355 | "options": { 356 | "raw": { 357 | "language": "json" 358 | } 359 | } 360 | }, 361 | "url": "{{baseUrl}}/doumentation/invitatation" 362 | }, 363 | "status": "Bad Request", 364 | "code": 400, 365 | "_postman_previewlanguage": "text", 366 | "header": [ 367 | { 368 | "key": "Content-Type", 369 | "value": "text/plain" 370 | } 371 | ], 372 | "cookie": [], 373 | "body": "" 374 | }, 375 | { 376 | "name": "item created", 377 | "originalRequest": { 378 | "method": "POST", 379 | "header": [], 380 | "body": { 381 | "mode": "raw", 382 | "raw": "{\n \"useremail\": \"arobakid@theneo.io\",\n \"documentatId\": \"theneo-demo\",\n \"permission\": \"editor\"\n}", 383 | "options": { 384 | "raw": { 385 | "language": "json" 386 | } 387 | } 388 | }, 389 | "url": "{{baseUrl}}/doumentation/invitatation" 390 | }, 391 | "status": "Created", 392 | "code": 201, 393 | "_postman_previewlanguage": "text", 394 | "header": [ 395 | { 396 | "key": "Content-Type", 397 | "value": "application/vnd.json" 398 | } 399 | ], 400 | "cookie": [], 401 | "body": "" 402 | }, 403 | { 404 | "name": "an existing item already exists", 405 | "originalRequest": { 406 | "method": "POST", 407 | "header": [], 408 | "body": { 409 | "mode": "raw", 410 | "raw": "{\n \"useremail\": \"arobakid@theneo.io\",\n \"documentatId\": \"theneo-demo\",\n \"permission\": \"editor\"\n}", 411 | "options": { 412 | "raw": { 413 | "language": "json" 414 | } 415 | } 416 | }, 417 | "url": "{{baseUrl}}/doumentation/invitatation" 418 | }, 419 | "status": "Conflict", 420 | "code": 409, 421 | "_postman_previewlanguage": "text", 422 | "header": [ 423 | { 424 | "key": "Content-Type", 425 | "value": "text/plain" 426 | } 427 | ], 428 | "cookie": [], 429 | "body": "" 430 | } 431 | ] 432 | }, 433 | { 434 | "name": "Updates the API Doc", 435 | "request": { 436 | "method": "PUT", 437 | "header": [], 438 | "url": { 439 | "raw": "{{baseUrl}}/doumentation/:id", 440 | "host": [ 441 | "{{baseUrl}}" 442 | ], 443 | "path": [ 444 | "doumentation", 445 | ":id" 446 | ], 447 | "variable": [ 448 | { 449 | "key": "id", 450 | "value": "", 451 | "description": "(Required) The documentation ID for the documentation you want to update" 452 | } 453 | ] 454 | }, 455 | "description": "Update the API documentation details" 456 | }, 457 | "response": [ 458 | { 459 | "name": "invalid input, object invalid", 460 | "originalRequest": { 461 | "method": "PUT", 462 | "header": [], 463 | "url": { 464 | "raw": "{{baseUrl}}/doumentation/:id", 465 | "host": [ 466 | "{{baseUrl}}" 467 | ], 468 | "path": [ 469 | "doumentation", 470 | ":id" 471 | ], 472 | "variable": [ 473 | { 474 | "key": "id", 475 | "value": "", 476 | "description": "(Required) The documentation ID for the documentation you want to update" 477 | } 478 | ] 479 | } 480 | }, 481 | "status": "Bad Request", 482 | "code": 400, 483 | "_postman_previewlanguage": "text", 484 | "header": [ 485 | { 486 | "key": "Content-Type", 487 | "value": "text/plain" 488 | } 489 | ], 490 | "cookie": [], 491 | "body": "" 492 | }, 493 | { 494 | "name": "Documentation was successfully updated", 495 | "originalRequest": { 496 | "method": "PUT", 497 | "header": [], 498 | "url": { 499 | "raw": "{{baseUrl}}/doumentation/:id", 500 | "host": [ 501 | "{{baseUrl}}" 502 | ], 503 | "path": [ 504 | "doumentation", 505 | ":id" 506 | ], 507 | "variable": [ 508 | { 509 | "key": "id", 510 | "value": "", 511 | "description": "(Required) The documentation ID for the documentation you want to update" 512 | } 513 | ] 514 | } 515 | }, 516 | "status": "Created", 517 | "code": 201, 518 | "_postman_previewlanguage": "json", 519 | "header": [ 520 | { 521 | "key": "Content-Type", 522 | "value": "application/json" 523 | } 524 | ], 525 | "cookie": [], 526 | "body": "{\n \"key\": \"demo\"\n}" 527 | } 528 | ] 529 | } 530 | ], 531 | "variable": [ 532 | { 533 | "key": "baseUrl", 534 | "value": "https://app.theneo.io", 535 | "type": "string" 536 | } 537 | ] 538 | } 539 | --------------------------------------------------------------------------------