├── .adr-dir ├── .github ├── ISSUE_TEMPLATE │ └── config.yml ├── issue_template.md └── workflows │ └── jekyll-gh-pages.yml ├── .gitignore ├── LICENSE ├── README.md ├── doc ├── architecture │ ├── README.md │ └── decisions │ │ ├── 0001-record-architecture-decisions.md │ │ ├── 0002-support-for-iris.md │ │ └── template.md ├── index.md ├── initial-proposals │ ├── Deployments.md │ ├── README.md │ ├── changes.md │ └── examples │ │ ├── FlatOperations │ │ └── OperationList.yaml │ │ ├── aggregatedapi.yaml │ │ ├── dependentParameters.yaml │ │ ├── parameterSchema.yaml │ │ ├── petstore.yaml │ │ └── rpc.yaml └── moonwalk.html ├── package-lock.json ├── package.json ├── scripts └── Generate.ps1 └── specification ├── moonwalk-host.html ├── moonwalk-source.md └── respecConfig.js /.adr-dir: -------------------------------------------------------------------------------- 1 | doc/architecture/decisions 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: true 2 | contact_links: 3 | - name: Have an idea for Moonwalk? 4 | url: https://github.com/OAI/sig-moonwalk/discussions 5 | about: Please open or join a discussion instead of an issue! 6 | - name: Want to chat about Moonwalk? 7 | url: https://communityinviter.com/apps/open-api/openapi 8 | about: "Please join the #sig-moonwalk channel on our Slack!" 9 | -------------------------------------------------------------------------------- /.github/issue_template.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: '' 3 | about: Consider opening a discussion instead... 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | 17 | -------------------------------------------------------------------------------- /.github/workflows/jekyll-gh-pages.yml: -------------------------------------------------------------------------------- 1 | # Sample workflow for building and deploying a Jekyll site to GitHub Pages 2 | name: Deploy Jekyll with GitHub Pages dependencies preinstalled 3 | 4 | on: 5 | # Runs on pushes targeting the default branch 6 | push: 7 | branches: ["main"] 8 | 9 | # Allows you to run this workflow manually from the Actions tab 10 | workflow_dispatch: 11 | 12 | # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages 13 | permissions: 14 | contents: read 15 | pages: write 16 | id-token: write 17 | 18 | # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. 19 | # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. 20 | concurrency: 21 | group: "pages" 22 | cancel-in-progress: false 23 | 24 | jobs: 25 | 26 | # Build job 27 | build: 28 | runs-on: ubuntu-latest 29 | steps: 30 | - name: Checkout 31 | uses: actions/checkout@v4 32 | - uses: actions/setup-node@v4 33 | with: 34 | node-version: ">=20.12.1" 35 | - run: npm install 36 | - name: Generate Editors draft 37 | shell: pwsh 38 | run: ./scripts/Generate.ps1 39 | - name: Setup Pages 40 | uses: actions/configure-pages@v5 41 | - name: Build with Jekyll 42 | uses: actions/jekyll-build-pages@v1 43 | with: 44 | source: ./doc 45 | destination: ./_site 46 | - name: Upload artifact 47 | uses: actions/upload-pages-artifact@v3 48 | 49 | # Deployment job 50 | deploy: 51 | environment: 52 | name: github-pages 53 | url: ${{ steps.deployment.outputs.page_url }} 54 | runs-on: ubuntu-latest 55 | needs: build 56 | steps: 57 | - name: Deploy to GitHub Pages 58 | id: deployment 59 | uses: actions/deploy-pages@v4 60 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright The Linux Foundation 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Welcome to the OpenAPI Moonwalk SIG! 2 | 3 | The OpenAPI Moonwalk [Special Interest Group](https://learn.openapis.org/glossary.html) (SIG) is working on the next major release of the OpenAPI Specification (OAS), version 4.0. 4 | 5 | ## Principles 6 | 7 | Moonwalk is being developed in accordance with the following principles, which you can read in more detail in [our 2025 blog post](https://www.openapis.org/blog/2025/02/05/moonwalk-2025-update) (an update to the [2024 post](https://www.openapis.org/blog/2023/12/06/openapi-moonwalk-2024)): 8 | 9 | 1. **Semantics**: Semantics provide purpose, whether the consumer is a human or an AI. 10 | 2. **Signatures**: An API operation is identifiable by its signature, which can be based on any aspect of HTTP mechanics. 11 | 3. **Inclusion**: Moonwalk aspires to describe all HTTP-based APIs while remaining neutral regarding any specific design debate. 12 | 4. **Foundational Interfaces**: Reduce the complexity for tooling authors by establishing standardized interfaces for parsing API description documents and defining consistent methods for expressing API structural semantics. 13 | 5. **Separation of Concerns**: Modularization will keep the scope of Moonwalk manageable with loose coupling among concerns such as HTTP interfaces ("API shapes"), deployment configuration, and content schema formats. 14 | 6. **Mechanical Upgrading**: An automated upgrade process from 3.x to 4.0 will be developed as part of the Moonwalk effort. 15 | 16 | ## Contributing 17 | 18 | As of March 2025, we are using the following documents and processes: 19 | 20 | * [The Initial Moonwalk Proposals](./doc/initial-proposals) launched this effort, and continue to serve as the reference point for our discussions 21 | * [Discussions](https://github.com/OAI/sig-moonwalk/discussions): All Moonwalk ideas should start as discussions 22 | * [Architectural Design Records (ADRs)](./doc/architecture) as discussions produce consensus, decisions are recorded as ADRs 23 | * [Issues](https://github.com/OAI/sig-moonwalk/issues) should ***only*** be used to track actionable work items 24 | * [Meeting Agendas](https://github.com/OAI/sig-moonwalk/discussions?discussions_q=is%3Aopen+label%3AHousekeeping) focus the discussion in our weekly calls, which are open to all 25 | 26 | ### Issues and formal documents 27 | 28 | We are not yet at the point of writing a formal specification, so there are very few reasons to file issues at this stage. 29 | 30 | We will begin writing a formal document once enough decisions have been made through ADRs that a coherent document can be structured. 31 | 32 | ### Writing ADRs 33 | 34 | Before writing an ADR to submit as a PR, please make sure that there is sufficient agreement to move ahead either in the discussion or by getting a decision in the weekly call. 35 | 36 | A good ADR decides _just enough_ of a topic to allow moving on to the next decision. As discussions tend to be rather sprawling, it might take several ADRs to resolve everything needed to close a discussion. 37 | 38 | Feedback on ADR PRs should be about whether the ADR captures the decision and all related concerns from the discussion. Details will likely be refined in the PR process, but if the direction of the decision is still being challenged, it is best to close the PR (or declare the ADR "rejected" before merging) and return to the GitHub discussion to re-build consensus. 39 | -------------------------------------------------------------------------------- /doc/architecture/README.md: -------------------------------------------------------------------------------- 1 | # Moonwalk Architecture Documentation 2 | 3 | This directory documents the Moonwalk architecture, primarily by using Architectural Decision Records (ADRs). 4 | 5 | ADRs are stored in the [decisions](./decisions) directory, and should be created and managed using the [adr-tools](https://github.com/npryce/adr-tools) scripts which can be installed on any operating system. For those wishing to create ADRs manually, the [template](./decisions/template.md) is also provided. 6 | 7 | Supplemental material that is not part of a decision, such as examples or more detailed explorations of relevant topics, can be added in this directory rather than the decisions directory. 8 | 9 | -------------------------------------------------------------------------------- /doc/architecture/decisions/0001-record-architecture-decisions.md: -------------------------------------------------------------------------------- 1 | # 1. Record architecture decisions 2 | 3 | Date: 2024-02-28 4 | 5 | ## Status 6 | 7 | Accepted 8 | 9 | ## Context 10 | 11 | We need to record the architectural decisions made on this project. 12 | 13 | ## Decision 14 | 15 | We will use Architecture Decision Records, as [described by Michael Nygard](http://thinkrelevance.com/blog/2011/11/15/documenting-architecture-decisions). 16 | 17 | ## Consequences 18 | 19 | See Michael Nygard's article, linked above. For a lightweight ADR toolset, see Nat Pryce's [adr-tools](https://github.com/npryce/adr-tools). 20 | -------------------------------------------------------------------------------- /doc/architecture/decisions/0002-support-for-iris.md: -------------------------------------------------------------------------------- 1 | # 2. Support for IRIs 2 | 3 | Date: 2024-02-29 4 | 5 | ## Status 6 | 7 | Accepted 8 | 9 | ## Context 10 | 11 | The OpenAPI Specification (OAS) version 3 and earlier only support RFC 3986 URIs / URLs, for both API endpoints and for identifying and/or locating OpenAPI Description (OAD) documents. This means that users whose languages cannot be represented in the US-ASCII character set must encode all components (authorities, paths, query strings, and/or fragments) that include non-US-ASCII characters in accordance with [RFC 3987 §3.1](https://www.rfc-editor.org/rfc/rfc3987.html#section-3.1). 12 | 13 | The results of such encodings are not human-readible: 14 | 15 | IRI: https://www.例如.中国/api/中国/endpoint?例=如#如 16 | URI: https://www.xn--fsqu6v.xn--fiqs8s/api/%E4%B8%AD%E5%9B%BD/endpoint?%E4%BE%8B=%E5%A6%82#%E5%A6%82 17 | 18 | IRI: http://اب.تث.جح/خد/ذر/زس?شص=ضط;ظع=غف#قك 19 | URI: http://xn--mgbc.xn--pgbc.xn--rgbc/%D8%AE%D8%AF/%D8%B0%D8%B1/%D8%B2%D8%B3?%D8%B4%D8%B5=%D8%B6%D8%B7;%D8%B8%D8%B9=%D8%BA%D9%81#%D9%82%D9%83 20 | 21 | It's 2024, and the OAS is used all over the world. Everyone should be able to read identifiers in their own language and writing system. 22 | 23 | ## Decision 24 | 25 | All places where a URI/URL(-reference) would be used will be specified to allow an IRI(-reference) in UTF-8 encoding. If RFC 6570 URI Templates are used, then in accordance with [the last paragraph of section 1.1](https://www.rfc-editor.org/rfc/rfc6570.html#section-1.1) of that RFC, such templates will allow the use of the full IRI-supported character set. 26 | 27 | ## Consequences 28 | 29 | Implementations MUST support displaying IRIs and allowing their direct entry. When using an IRI as a URL, they will need to tranlsate the IRI to a URI first, or delegate such translation to an IRI-aware retrieval library. (Retrieval is not defined directly on IRI; there is no such thing as an "Internationalized Resource Locator"). 30 | 31 | Implementations MAY perform operations such as relative reference resolution, normalization, comparison, etc. either on IRIs or on IRIs encoded to URIs, but MUST display the results of such operations as IRIs. 32 | 33 | Implementations that already support I18N should not have difficulty with the display requirements, although implementations that assume US-ASCII, or at least left-to-right character ordering, will be impacted more substantially. 34 | -------------------------------------------------------------------------------- /doc/architecture/decisions/template.md: -------------------------------------------------------------------------------- 1 | # ADR template by Michael Nygard 2 | 3 | This is the template in [Documenting architecture decisions - Michael Nygard](http://thinkrelevance.com/blog/2011/11/15/documenting-architecture-decisions). 4 | You can use [adr-tools](https://github.com/npryce/adr-tools) for managing the ADR files. 5 | 6 | In each ADR file, write these sections: 7 | 8 | # Title 9 | 10 | ## Status 11 | 12 | What is the status, such as proposed, accepted, rejected, deprecated, superseded, etc.? 13 | 14 | ## Context 15 | 16 | What is the issue that we're seeing that is motivating this decision or change? 17 | 18 | ## Decision 19 | 20 | What is the change that we're proposing and/or doing? 21 | 22 | ## Consequences 23 | 24 | What becomes easier or more difficult to do because of this change? 25 | -------------------------------------------------------------------------------- /doc/index.md: -------------------------------------------------------------------------------- 1 | # Moonwalk 2 | 3 | The OpenAPI Moonwalk [Special Interest Group](https://learn.openapis.org/glossary.html) (SIG) is working on the next major release of the OpenAPI Specification (OAS), version 4.0, with a goal of [publishing by the end of 2024](https://www.openapis.org/blog/2023/12/06/openapi-moonwalk-2024). 4 | 5 | 6 | [Editors Draft](moonwalk.html) -------------------------------------------------------------------------------- /doc/initial-proposals/Deployments.md: -------------------------------------------------------------------------------- 1 | # Moonwalk Document refactoring 2 | 3 | The initial moonwalk proposal was primarily focused on how to describe the paths, requests, and responses of an API. Further discussions around the growing needs of the API community have identified additional opportunities for improvement by refactoring the structure of the OpenAPI document and the elements it contains. The first use case concerns improving lifecycle support as an API evolves. 4 | 5 | ## Requirements: 6 | 7 | - Decouple operations and schemas from the contexts (such as server or authentication) that are necessary to invoke those operations. 8 | - As an API changes over time, advertise a list of deployments that share a relationship to that API 9 | - Allow each deployment to independently refer to a different revisions of the description of that API as appropriate 10 | - Naturally support the existing use cases of OpenAPI, while also preserving the option to use other formats 11 | 12 | ## Current situation 13 | 14 | The description of an API contained in an OpenAPI document may actually be addressable at multiple locations (deployments), or it may not be implemented by any. In the case of industry standards bodies defining API shapes, the API may be implemented by completely different organizations than those describing the API shape. 15 | 16 | OpenAPI v3 does not make a clear delineation between the shape of the API and certain implementation details of the API by intention. 17 | 18 | ## Proposal 19 | 20 | For moonwalk this proposal suggests that we create a new object called `deployment` that captures the deployment details of a specific instance of an API along with certain implementation characteristics. The `deployment` object provides the context necessary to call API operations without providing any details about the shape of the API itself. 21 | 22 | ```mermaid 23 | classDiagram 24 | class OpenAPI { 25 | 26 | } 27 | 28 | OpenAPI "0" --> "0-1" Deployment:deployments 29 | 30 | class Deployment { 31 | title: string 32 | location: string 33 | clientRegistrationUrl: string 34 | apiDescriptionUrl: string 35 | } 36 | 37 | 38 | Deployment "0" --> "0..*" SecurityRequirement:security 39 | 40 | 41 | class SecurityRequirement { 42 | 43 | } 44 | 45 | OpenAPI "0" --> "*" pathItem:paths 46 | OpenAPI "0" --> "*" response:apiResponses 47 | 48 | class pathItem { 49 | uriTemplate: UriTemplate 50 | parameterSchema: JSONSchema 51 | } 52 | pathItem "0" --> "*" request:requests 53 | pathItem "0" --> "*" response:pathResponses 54 | 55 | class request { 56 | method: string 57 | contentType: string 58 | contentSchema: JSONSchema 59 | parameterSchema: JSONSchema 60 | } 61 | request "0" --> "*" response:responses 62 | request --> "0..*" Deployment:deployments 63 | class response { 64 | status: string 65 | contentType: string 66 | contentSchema: JSONSchema 67 | } 68 | 69 | ``` 70 | 71 | In order to support a single-file expression, an OpenAPI document may contain zero or multiple Deployment objects that share the otherwise identical description contained within said OpenAPI document. 72 | 73 | ```yaml 74 | OpenApi: 4.0.0 75 | namespace: self 76 | deployments: 77 | default: 78 | title: "prod - ca" 79 | location: https://api.example.ca 80 | security: 81 | - basic: [] 82 | clientRegistrationUrl: "https://developers.example.com/catalog/accounts" # optional, identifies where credentials may be obtained 83 | apiPaths: self // Do we really need this or can it be implicit? 84 | imports: 85 | - namespace: something 86 | href: https://example.org/somesharedstuff.json 87 | - namespace: someotherthing 88 | href: https://example.org/someothersharedstuff.json 89 | paths: 90 | /hello: 91 | requests: 92 | basic: 93 | deployments: ["default"] 94 | method: GET 95 | responses: 96 | success: 97 | status: '200' 98 | contentType: application/json 99 | contentSchema: someotherthing.HelloResponse 100 | fail: 101 | status: '5XX' 102 | contentType: application/json 103 | contentSchema: something.Error 104 | 105 | components: 106 | schemas: 107 | Error: 108 | type: object 109 | properties: 110 | code: 111 | type: integer 112 | format: int32 113 | message: 114 | type: string 115 | HelloResponse: 116 | type: object 117 | properties: 118 | message: 119 | type: string 120 | ``` 121 | 122 | However, an OpenAPI document may also contain **only** Deployment entries, and each Deployment object can contain a pointer to a distinct API description document. 123 | 124 | ```yaml 125 | openapi: 4.0.0 126 | deployments: 127 | test: 128 | title: "test" 129 | location: https://test.api.example.com 130 | security: 131 | - basic: [] 132 | clientRegistrationUrl: "" 133 | apiPaths: test 134 | canada: 135 | title: "prod - ca" 136 | location: https://api.example.ca 137 | security: 138 | - basic: [] 139 | clientRegistrationUrl: "https://developers.example.com/catalog/accounts" 140 | apiPaths: canada 141 | usa: 142 | title: "prod - us" 143 | location: https://api.example.us 144 | security: 145 | - basic: [] 146 | clientRegistrationUrl: "https://developers.example.com/catalog/accounts" 147 | apiPaths: usa 148 | imports: 149 | - namespace: test 150 | href: https://github.com/example-co/apis/blob/9182274701c279aedc4107fedf630639d7d70bbb/accounts/openapi.2.0.4.yaml 151 | - namespace: canada 152 | href: https://developers.example.com/catalog/accounts/openapi.2.0.2.yaml 153 | - namespace: usa 154 | href: https://developers.example.com/catalog/accounts/openapi.2.0.2.yaml 155 | 156 | ``` 157 | -------------------------------------------------------------------------------- /doc/initial-proposals/README.md: -------------------------------------------------------------------------------- 1 | # OpenAPI v4 (aka Moonwalk) Proposal 2 | 3 | > note: Warning, disclaimer, caveat. This is very early thinking and is subject to major change and potential abandonment. However, intial reactions to the direction have been positive and so ready for input from a wider group of people. 4 | 5 | ## Introduction 6 | This refresh of OpenAPI attempts to walk a fine line of being simpler while at the same time being more flexible. It attempts to lean more on existing standards and to minimize adding new functionality. The essence of the restructured model is captured in this diagram. 7 | 8 | 9 | ```mermaid 10 | classDiagram 11 | class OpenApi { 12 | 13 | } 14 | OpenApi "0" --> "*" pathItem:paths 15 | OpenApi "0" --> "*" response:apiResponses 16 | 17 | class pathItem { 18 | uriTemplate: UriTemplate 19 | parameterSchema: JSONSchema 20 | } 21 | pathItem "0" --> "*" request:requests 22 | pathItem "0" --> "*" response:pathResponses 23 | 24 | class request { 25 | method: string 26 | contentType: string 27 | contentSchema: JSONSchema 28 | parameterSchema: JSONSchema 29 | } 30 | request "0" --> "*" response:responses 31 | 32 | class response { 33 | status: string 34 | contentType: string 35 | contentSchema: JSONSchema 36 | } 37 | 38 | 39 | ``` 40 | 41 | ## Goals 42 | The primary goal of this proposal for a major new version of OpenAPI is to make it more approachable in order. One way it does so is by eliminating complexity that exists in OpenAPI v3. In addition, it aims to: 43 | 44 | - Support APIs that have different responses based on query parameters, headers and request bodies. 45 | - Support a broader range of URL design patterns 46 | - Reduce nested structures to improve readability and editability 47 | - Improve reusability of request and response patterns 48 | 49 | OpenAPI has become the defacto standard for API descriptions, and it benefits from a very wide range of tooling support. However, due to its historic opinions of how an HTTP API should be designed, there are some scenarios that v3 cannot support. On the one hand, some in the community are asking for increased descriptiveness to support more scenarios. Yet at the same time, other bemoan how OpenAPI has become too complex for hand authoring. 50 | 51 | This major update to the OpenAPI specification attempts to simplify the design by focusing on three main structural components: `pathItem`, `request`, and `response`. In OpenAPI v3, a `pathItem` had a set of operations, one for each HTTP method it supported. There was an implicit assumption in this design that a HTTP method on a path could only describe single interaction, with same set of responses. Moonwalk, by contrast, has minimal constraints on how many different types of requests could be performed on a single path. Almost, any part of the request can be used to signal that there may be a unique set of responses. 52 | 53 | In OpenAPI v3, the key for a `PathItem` object was limited to just the path portion of a URL. Moonwalk proposes that `pathItem` keys can be complete [URI Templates][uri-templates-rfc]. This allows query parameters to be used in the identification of a resource and its corresponding requests, and it removes the need for parameter definitions to contain serialization information as the URI Template can fully describe how URI template parameters should be serialized. This use of an internet standard will reduce the work required by tooling to support URL construction. This may address the long standing issue of unambiguously correlating URLs with the appropriate `pathItem`. 54 | 55 | [uri-templates-rfc]: https://www.rfc-editor.org/rfc/rfc6570 56 | 57 | ## Requests 58 | 59 | `request` objects flatten `operation` objects, `requestBody` objects, and `mediaType` objects into a single object. Deep nesting can become unnecessarily cumbersome for reading and writing OpenAPI descriptions. A `pathItem` object can have multiple request objects. Each request object is named and must have a method specified. It may have a `contentType`, `contentSchema`, and `parameterSchema` defined. This new model allows different responses to be described for different request body media types. However, it does make it more cumbersome for accepting two equivalent media types like `text/json` and `application/json`. 60 | 61 | By naming the `request` objects we can give the reader a friendly name to understand the purpose of the `request`. This is especially helpful when there are potentially multiple `request` objects that use the same method. 62 | 63 | Some tooling will need to be able to correlate an actual HTTP request with the corresponding OpenAPI description. This request selection process starts with matching on HTTP method and if present the request's `Content-Type`. If further selection is required, the `parameterSchema` JSON Schema of each `request` object can be used to match with a JSON representation of the HTTP request parameters, headers and request body. 64 | 65 | ## Responses 66 | Responses also have a friendly name. `response` objects remove the need for the nesting of media-type objects by allowing multiple responses with the same status code but with different content types. `response` objects can be defined at the request level, the path, or globally. This reduces duplicatation of responses that are consistent across the API or for all requests associated to path. 67 | 68 | A side effect of giving names to requests and responses is that it makes the predictions from AIs like GitHub Copilot significantly more effective. It also makes folded content more readable in editors in both YAML and JSON because there is a readable name with the details hidden. 69 | 70 | ## Simple Example 71 | 72 | ```yaml 73 | openapi: 4.0.0 74 | info: 75 | title: Simplest thing that works 76 | version: 0.5.0 77 | paths: 78 | "speakers": 79 | requests: 80 | createSpeaker: 81 | method: post 82 | contentType: application/json 83 | contentSchema: 84 | $ref: "#/components/schemas/speaker" 85 | responses: 86 | created: 87 | status: 201 88 | getSpeakers: 89 | method: get 90 | responses: 91 | ok: 92 | status: 200 93 | contentType: application/json 94 | contentSchema: 95 | type: array 96 | items: 97 | $ref: "#/components/schemas/speaker" 98 | pathResponses: 99 | notFound: 100 | status: 404 101 | contentType: application/http-problem 102 | apiResponses: 103 | serverError: 104 | status: 5XX 105 | contentType: application/http-problem 106 | components: 107 | schemas: 108 | Speaker: 109 | type: object 110 | properties: 111 | name: 112 | type: string 113 | ``` 114 | As compared to 3.1.0 115 | 116 | ```yaml 117 | openapi: 3.1.0 118 | info: 119 | title: Simplest thing that works 120 | version: 0.5.0 121 | paths: 122 | "/speakers": 123 | post: 124 | requestBody: 125 | content: 126 | application/json: 127 | schema: 128 | $ref: "#/components/schemas/speaker" 129 | responses: 130 | 201: 131 | description: created 132 | 404: 133 | description: notFound 134 | content: 135 | application/http-problem: {} 136 | 5XX: 137 | description: serverError 138 | content: 139 | application/http-problem: {} 140 | 141 | get: 142 | responses: 143 | 200: 144 | description: retrieved 145 | content: 146 | application/json: 147 | schema: 148 | type: array 149 | items: 150 | $ref: "#/components/schemas/speaker" 151 | 404: 152 | description: notFound 153 | content: 154 | application/http-problem: {} 155 | 5XX: 156 | description: serverError 157 | content: 158 | application/http-problem: {} 159 | components: 160 | schemas: 161 | Speaker: 162 | type: object 163 | properties: 164 | name: 165 | type: string 166 | ``` 167 | In this simple example, the moonwalk version has 20% less lines and one less level of indentation. 168 | 169 | ## JSONSchema for Parameters 170 | By using a JSON Schema object to describe input parameters we can futher disambiguate between the different kinds of requests supported by a path. This enables supporting a whole class of feature requests where API designers want to differentiate operations by [query parameter](examples/parameterSchema.yaml), [header](examples/rpc.yaml) or even [request body](examples/rpc.yaml) content. We can use `allOf` rules to combine parameters defined at the path level and at the request level. We can also have [interdependency rules](examples/dependentParameters.yaml) between parameters. For runtime validation of requests, once filtered by method and contentType, further disambiguation can be done by creating a `oneOf` of the `parameterSchema` for each ambiguous request that is `allOf`'d with the `pathItem`'s `parameterSchema`. 171 | 172 | ## UriTemplates 173 | By using full URI Templates to define the `pathItem` we can now use query parameters to distinguish between resources and the serialization rules of parameters no longer need to be encoded in the parameter object. OpenAPI v3 enhanced parameter objects to use the serialization features of a `uriTemplate` but without using the syntax. With this change, we can get full access to the `uriTemplate` features and use the standard syntax. 174 | 175 | Using full `uriTemplate` syntax allows us to support optional path parameters and multi-segment path parameters. We still need to address the issue of URL to `uriTemplate` mapping where there is ambiguity. 176 | 177 | ## Components 178 | `request`, `response`, and `schema` objects may be declared as reusable components. This allows `parameterSchema` to either reuse entire schemas of parameter descriptions or use `allOf` to reuse sets of parameters. As the OpenAPI reference object is now independent to the JSON Schema `$ref`, we are free to support OpenAPI Reference arrays as well as reference objects. This will allow reusing a set of requests or a set of responses. 179 | 180 | ## Examples 181 | 182 | - [PetStore Example](examples/petstore.yaml) 183 | - [Parameter Schemas](examples/parameterSchema.yaml) 184 | - [Aggregated API](examples/aggregatedapi.yaml) 185 | - [Dependent Parameters](examples/dependentParameters.yaml) 186 | - [rpc](examples/rpc.yaml) 187 | -------------------------------------------------------------------------------- /doc/initial-proposals/changes.md: -------------------------------------------------------------------------------- 1 | # Major Changes from V3 2 | * PathItem object is identified using a full UriTemplate 3 | * Operation objects are replaced by requests objects and are named 4 | * Response objects are named. 5 | * Info object is optional to allow aggregation of files into a single API 6 | * Parameters are defined by a JSON Schema object that is a combination of the pathItem parameterSchema and the request parameterSchema 7 | * pathitem key is relative and does NOT start with a slash 8 | 9 | 10 | # Issues addressed by this change 11 | ## no more parameter arrays 12 | ## no more deeply nested structure 13 | ## Collapsed structure shows names of requests and responses. 14 | ## Responses are named and use pattern matching so are much more flexible. 15 | ## ParameterSchema can be used to define interdependent parameters 16 | ## Treating parameters as JSON Schema objects allows doing allOf to reuse parameter groups 17 | ## Creating names for requests and responses provides a hint for co-pilot to suggest the right response/request -------------------------------------------------------------------------------- /doc/initial-proposals/examples/FlatOperations/OperationList.yaml: -------------------------------------------------------------------------------- 1 | openapi: 4.0.0 2 | operations: 3 | - id: GetFlat 4 | name: Get 5 | method: GET 6 | uriTemplate: /api/v1/flat 7 | description: Get a list of flat objects 8 | responses: 9 | - status: 200 10 | description: OK 11 | contentType: application/json 12 | schema: 13 | type: array 14 | items: 15 | $ref: '#/components/schemas/Flat' -------------------------------------------------------------------------------- /doc/initial-proposals/examples/aggregatedapi.yaml: -------------------------------------------------------------------------------- 1 | openapi: 4.0.0 2 | info: 3 | title: Aggregation API 4 | version: 1.0.0 5 | paths: 6 | $ref: ## $ref can be an array 7 | - "./accounting.yaml#/paths" 8 | - "./inventory.yaml#/paths" 9 | - "./purchasing.yaml#/paths" -------------------------------------------------------------------------------- /doc/initial-proposals/examples/dependentParameters.yaml: -------------------------------------------------------------------------------- 1 | openapi: 4.0.0 2 | info: 3 | title: Parameters with interdependencies 4 | description: Examples of parameters with interdependencies come from ASC 2022 talk by Alberto Martin Lopez 5 | version: 0.5.0 6 | paths: 7 | # --------- 8 | # Requires - The presence of a parameter (or a specific parameter value) 9 | # requires the presence of another parameter 10 | # --------- 11 | 12 | # Bing Web Search 13 | # if promote is specified then answerCount must also be specified 14 | "requires{?promote,answerCount}": 15 | requests: 16 | constrainedRequest: 17 | parameterSchema: 18 | type: object 19 | properties: 20 | from: 21 | type: string 22 | messagingServiceId: 23 | type: string 24 | oneOf: 25 | - not: 26 | - required: [promote] 27 | - required: [answerCount] 28 | responses: 29 | ok: 30 | status: 200 31 | 32 | # Tropo 33 | # if type == 'number' then prefix or number must be specified 34 | "requires{?type,prefix,number}": 35 | requests: 36 | constrainedRequest: 37 | parameterSchema: 38 | type: object 39 | properties: 40 | type: 41 | type: string 42 | prefix: 43 | type: string 44 | number: 45 | type: string 46 | oneOf: 47 | - not: 48 | - properties: 49 | type: 50 | enum: ['number'] 51 | - required: [prefix] 52 | - required: [number] 53 | responses: 54 | ok: 55 | status: 200 56 | 57 | # --------- 58 | # Or - Given a set of parameters, one or more of them must be included. 59 | # --------- 60 | 61 | # Flickr 62 | # Either title or description must be specified 63 | "or{?title,description}": 64 | requests: 65 | constrainedRequest: 66 | parameterSchema: 67 | type: object 68 | properties: 69 | title: 70 | type: string 71 | description: 72 | type: string 73 | anyOf: 74 | - required: [title] 75 | - required: [description] 76 | responses: 77 | ok: 78 | status: 200 79 | 80 | # NationBuilder 81 | # donor_id, email, or first_name and last_name must be specified 82 | "or{?donor_id,email,first_name,last_name}": 83 | requests: 84 | constrainedRequest: 85 | parameterSchema: 86 | type: object 87 | properties: 88 | donor_id: 89 | type: string 90 | email: 91 | type: string 92 | first_name: 93 | type: string 94 | last_name: 95 | type: string 96 | anyOf: 97 | - required: [donor_id] 98 | - required: [email] 99 | - required: [first_name,last_name] 100 | responses: 101 | ok: 102 | status: 200 103 | 104 | # --------- 105 | # OnlyOne - Given a set of parameters, one and only one of them must be included. 106 | # --------- 107 | 108 | # Twilio SMS 109 | # Either from or messagingServiceId must be specified but not both 110 | "onlyOne{?from,messagingServiceId}": 111 | parameterSchema: 112 | type: object 113 | properties: 114 | from: 115 | type: string 116 | messagingServiceId: 117 | type: string 118 | requests: 119 | constrainedRequest: 120 | parameterSchema: 121 | oneOf: 122 | - required: [from] 123 | - required: [messagingServiceId] 124 | responses: 125 | ok: 126 | status: 200 127 | 128 | # Yelp 129 | # Either location or (latitude and longitude) must be specified but not both 130 | "onlyOne{?location,latitude,longitude}": 131 | parameterSchema: 132 | type: object 133 | properties: 134 | location: 135 | type: string 136 | latitude: 137 | type: string 138 | longitude: 139 | type: string 140 | requests: 141 | constrainedRequest: 142 | parameterSchema: 143 | oneOf: 144 | - required: [location] 145 | not: 146 | anyOf: 147 | - required: [latitude] 148 | - required: [longitude] 149 | - required: [latitude,longitude] 150 | responses: 151 | ok: 152 | status: 200 153 | 154 | # --------- 155 | # AllOrNone - Given a set of parameters, either all of them are provided or none of them is. 156 | # --------- 157 | 158 | # GitHub 159 | # subject_type and subject_id are both specified or neither is specified 160 | "allOrNone{?subject_type,subject_id}": 161 | requests: 162 | constrainedRequest: 163 | parameterSchema: 164 | type: object 165 | properties: 166 | subject_type: 167 | type: string 168 | subject_id: 169 | type: string 170 | oneOf: 171 | - required: [subject_type,subject_id] 172 | - not: 173 | anyOf: 174 | - required: [subject_type] 175 | - required: [subject_id] 176 | responses: 177 | ok: 178 | status: 200 179 | 180 | # Stripe 181 | # value is present if and only if type is 'bucket' 182 | "allOrNone{?value,type}": 183 | requests: 184 | constrainedRequest: 185 | parameterSchema: 186 | type: object 187 | properties: 188 | value: 189 | type: string 190 | type: 191 | type: string 192 | oneOf: 193 | - properties: 194 | type: 195 | enum: ['bucket'] 196 | required: [type,value] 197 | - not: 198 | properties: 199 | type: 200 | enum: ['bucket'] 201 | required: [type,value] 202 | responses: 203 | ok: 204 | status: 200 205 | 206 | # --------- 207 | # ZeroOrOne - Given a set of parameters, at most one of can be included. 208 | # --------- 209 | 210 | # YouTube 211 | # specify zero or one of forContentOwner, forDeveloper, forMine, or relatedToVideoId 212 | "zeroOrOne{?forContentOwner,forDeveloper,forMine,relatedToVideoId}": 213 | requests: 214 | constrainedRequest: 215 | parameterSchema: 216 | type: object 217 | properties: 218 | forContentOwner: 219 | type: string 220 | forDeveloper: 221 | type: string 222 | forMine: 223 | type: string 224 | relatedToVideoId: 225 | type: string 226 | oneOf: 227 | - required: [forContentOwner] 228 | not: 229 | anyOf: 230 | - required: [forDeveloper] 231 | - required: [forMine] 232 | - required: [relatedToVideoId] 233 | - required: [forDeveloper] 234 | not: 235 | anyOf: 236 | - required: [forContentOwner] 237 | - required: [forMine] 238 | - required: [relatedToVideoId] 239 | - required: [forMine] 240 | not: 241 | anyOf: 242 | - required: [forContentOwner] 243 | - required: [forDeveloper] 244 | - required: [relatedToVideoId] 245 | - required: [relatedToVideoId] 246 | not: 247 | anyOf: 248 | - required: [forContentOwner] 249 | - required: [forDeveloper] 250 | - required: [forMine] 251 | - not: 252 | anyOf: 253 | - required: [forContentOwner] 254 | - required: [forDeveloper] 255 | - required: [forMine] 256 | - required: [relatedToVideoId] 257 | responses: 258 | ok: 259 | status: 200 260 | 261 | # Google Maps 262 | # radius must not be included if rankby == 'distance' 263 | "zeroOrOne{?rankby,radius}": 264 | requests: 265 | constrainedRequest: 266 | parameterSchema: 267 | type: object 268 | properties: 269 | radius: 270 | type: string 271 | rankby: 272 | type: string 273 | anyOf: 274 | - not: 275 | required: [radius] 276 | - not: 277 | properties: 278 | rankby: 279 | enum: ['distance'] 280 | responses: 281 | ok: 282 | status: 200 283 | 284 | # --------- 285 | # Complex - Involves two or more of the previous dependencies. 286 | # --------- 287 | 288 | # Stripe 289 | # If subscription_trial_end is specified, one of subscription_items or subscription is required 290 | "complex{?subscription_trial_end,subscription_items,subscription}": 291 | requests: 292 | constrainedRequest: 293 | parameterSchema: 294 | type: object 295 | properties: 296 | subscription_trial_end: 297 | type: string 298 | subscription_items: 299 | type: string 300 | subscription: 301 | type: string 302 | oneOf: 303 | - not: 304 | required: [subscription_trial_end] 305 | - oneOf: 306 | - required: [subscription_items] 307 | - required: [subscription] 308 | responses: 309 | ok: 310 | status: 200 311 | 312 | # Foursquare 313 | # radius is only valid for requests with intent=browse or requests with intent=checkin and categoryId or query 314 | "complex{?radius,intent,categoryId,query}": 315 | requests: 316 | constrainedRequest: 317 | parameterSchema: 318 | type: object 319 | properties: 320 | radius: 321 | type: number 322 | intent: 323 | type: string 324 | categoryId: 325 | type: string 326 | query: 327 | type: string 328 | anyOf: 329 | - not: 330 | required: [radius] 331 | - properties: 332 | intent: 333 | enum: ['browse'] 334 | required: ['intent'] 335 | - properties: 336 | intent: 337 | enum: ['checkin'] 338 | required: [intent] 339 | anyOf: 340 | - required: [categoryId] 341 | - required: [query] 342 | responses: 343 | ok: 344 | status: 200 345 | -------------------------------------------------------------------------------- /doc/initial-proposals/examples/parameterSchema.yaml: -------------------------------------------------------------------------------- 1 | openapi: 4.0.0 2 | info: 3 | title: Parameters defined at the path and at the request level 4 | version: 0.5.0 5 | paths: 6 | 'speakers/{speakerId}{?format}': ## as format is optional, it does not need to be declared for each request, only the ones that use it 7 | parameterSchema: 8 | type: object 9 | properties: 10 | speakerId: 11 | type: string 12 | title: Speaker ID 13 | requests: 14 | getSpeakerAsJson: ## the requests getSpeakerAsJson and getSpeakerAsCSV could be declared as a single request but with two 200 responses. 15 | parameterSchema: 16 | type: object 17 | properties: 18 | format: 19 | type: string 20 | const: json ## This example shows how you use query parameters to distinction between requests. 21 | method: get 22 | responses: 23 | ok: 24 | status: 200 25 | contentType: application/json 26 | contentSchema: 27 | $ref: '#/components/schemas/speaker' 28 | getSpeakerAsCSV: 29 | parameterSchema: 30 | type: object 31 | properties: 32 | format: 33 | type: string 34 | const: csv 35 | method: get 36 | responses: 37 | ok: 38 | status: 200 39 | contentType: text/csv 40 | contentSchema: 41 | type: string 42 | updateSpeaker: 43 | method: put 44 | contentType: application/json 45 | contentSchema: 46 | $ref: '#/components/schemas/speaker' 47 | responses: 48 | ok: 49 | status: 200 50 | contentType: application/json 51 | contentSchema: 52 | $ref: '#/components/schemas/speaker' 53 | deleteSpeaker: 54 | method: delete 55 | responses: 56 | ok: 57 | status: 200 58 | responses: 59 | notFound: 60 | status: 404 61 | contentType: application/http-problem 62 | responses: 63 | serverError: 64 | status: 5XX 65 | contentType: application/http-problem 66 | components: 67 | schemas: 68 | Speaker: 69 | type: object 70 | properties: 71 | name: 72 | type: string 73 | -------------------------------------------------------------------------------- /doc/initial-proposals/examples/petstore.yaml: -------------------------------------------------------------------------------- 1 | openapi: 4.0.0 2 | info: 3 | title: Swagger Petstore - OpenAPI 4.0 4 | description: |- 5 | This is a sample Pet Store Server based on the OpenAPI 3.0 specification. You can find out more about 6 | Swagger at [http://swagger.io](http://swagger.io). In the third iteration of the pet store, we've switched to the design first approach! 7 | You can now help us improve the API whether it's by making changes to the definition itself or to the code. 8 | That way, with time, we can improve the API in general, and expose some of the new features in OAS3. 9 | 10 | Some useful links: 11 | - [The Pet Store repository](https://github.com/swagger-api/swagger-petstore) 12 | - [The source API definition for the Pet Store](https://github.com/swagger-api/swagger-petstore/blob/master/src/main/resources/openapi.yaml) 13 | termsOfService: http://swagger.io/terms/ 14 | contact: 15 | email: apiteam@swagger.io 16 | license: 17 | name: Apache 2.0 18 | url: http://www.apache.org/licenses/LICENSE-2.0.html 19 | version: 1.0.15 20 | paths: 21 | "pet": ## Path is a relative reference. It needs to be anchored to a base by a servers URL. Or if you put an absolute URL in the path, it will be used as is. 22 | requests: 23 | CreatePet: ## Operation name is elevated to be a key for requests but is only unique within the pathItem 24 | method: POST 25 | contentType: application/json 26 | contentSchema: 27 | $ref: "#/components/schemas/Pet" 28 | responses: 29 | Created: ## response names can use conventions to map to request names 30 | status: 201 31 | contentType: application/json 32 | FailPetCreate: 33 | status: 400 34 | contentType: application/http-problem 35 | RetrievePets: 36 | method: GET 37 | responses: 38 | Ok: 39 | status: 200 40 | contentType: application/json 41 | contentSchema: 42 | type: array 43 | items: 44 | $ref: "#/components/schemas/Pet" 45 | OkinCSV: 46 | status: 200 47 | contentType: text/csv 48 | contentSchema: 49 | type: string 50 | FailPetRetrieve: 51 | status: 400 52 | contentType: application/http-problem 53 | "pet/findByStatus?status={status}": 54 | requests: 55 | findPetsByStatus: 56 | description: Multiple status values can be provided with comma separated strings 57 | method: GET 58 | parameterSchema: 59 | type: object 60 | required: 61 | - status 62 | properties: 63 | status: 64 | type: string 65 | enum: [available, pending, sold] 66 | responses: 67 | Ok: 68 | status: 200 69 | contentType: application/json 70 | contentSchema: 71 | type: array 72 | items: 73 | $ref: "#/components/schemas/Pet" 74 | failBadStatus: 75 | status: 400 76 | description: Invalid status value 77 | "pet/findByTags?tags={tags}": 78 | requests: 79 | findPetsByTags: 80 | description: Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. 81 | method: GET 82 | parameterSchema: 83 | type: object 84 | required: 85 | - tags 86 | properties: 87 | tags: 88 | type: string 89 | responses: 90 | Ok: 91 | status: 200 92 | contentType: application/json 93 | contentSchema: 94 | type: array 95 | items: 96 | $ref: "#/components/schemas/Pet" 97 | FailBadTag: 98 | status: 400 99 | description: Invalid tag value 100 | "pet/{petId}": ## Paths support full UriTemplate syntax to enable disambiguation of operations by query parameters. This means we don't need all the style/explode hints in the parameter object. 101 | parameterSchema: 102 | type: object 103 | properties: 104 | petId: 105 | type: string 106 | format: int64 107 | requests: 108 | RetrievePet: 109 | method: GET 110 | responses: 111 | retrieved: 112 | status: 200 113 | description: "The pet was retrieved" ## description is optional 114 | contentType: application/json 115 | contentSchema: 116 | $ref: "#/components/schemas/Pet" 117 | UpdatePet: 118 | method: PUT 119 | contentType: application/json 120 | contentSchema: 121 | $ref: "#/components/schemas/Pet" 122 | responses: 123 | Updated: 124 | status: 200 125 | description: "The pet was updated" 126 | contentType: application/json 127 | contentSchema: 128 | $ref: "#/components/schemas/Pet" 129 | FailPetUpdate: 130 | status: 400 131 | description: "The pet was not updated" 132 | UpdatePetWithForm: 133 | method: POST 134 | contentType: application/x-www-form-urlencoded 135 | contentSchema: 136 | type: object 137 | properties: 138 | name: 139 | type: string 140 | status: 141 | type: string 142 | responses: 143 | Updated: 144 | status: 200 145 | description: "The pet was updated" 146 | contentType: application/json 147 | contentSchema: 148 | $ref: "#/components/schemas/Pet" 149 | FailPetUpdate: 150 | status: 400 151 | description: "The pet was not updated" 152 | DeletePet: 153 | method: DELETE 154 | responses: 155 | deleted: 156 | status: 204 157 | description: "The pet was deleted" 158 | responses: 159 | petNotFound: 160 | status: 404 161 | description: "The pet was not found" 162 | serverError: 163 | status: 5XX 164 | "pet/{petId}/uploadImage{?additionalMetadata}": 165 | parameterSchema: 166 | properties: 167 | petId: 168 | type: string 169 | format: uuid 170 | additionalMetadata: 171 | type: string 172 | requests: 173 | uploadFile: 174 | summary: "Uploads an image" 175 | method: POST 176 | contentType: application/octet-stream 177 | responses: 178 | ok: 179 | status: 200 180 | contentType: application/json 181 | contentSchema: 182 | $ref: "#/components/schemas/ApiResponse" 183 | fail: 184 | status: 400 185 | "/store/order": 186 | requests: 187 | CreateOrder: 188 | method: POST 189 | contentType: application/json 190 | contentSchema: 191 | $ref: "#/components/schemas/Order" 192 | responses: 193 | Created: 194 | status: 201 195 | contentType: application/json 196 | contentSchema: 197 | $ref: "#/components/schemas/Order" 198 | FailOrderCreate: 199 | status: 400 200 | RetrieveOrders: 201 | method: GET 202 | responses: 203 | Ok: 204 | status: 200 205 | contentType: application/json 206 | contentSchema: 207 | type: array 208 | items: 209 | $ref: "#/components/schemas/Order" 210 | FailOrderRetrieve: 211 | status: 400 212 | "/store/order/{orderId}": 213 | parameterSchema: 214 | properties: 215 | orderId: 216 | type: string 217 | format: int64 218 | requests: 219 | RetrieveOrder: 220 | method: GET 221 | responses: 222 | Ok: 223 | status: 200 224 | contentType: application/json 225 | contentSchema: 226 | $ref: "#/components/schemas/Order" 227 | FailOrderRetrieve: 228 | status: 400 229 | DeleteOrder: 230 | method: DELETE 231 | responses: 232 | deleted: 233 | status: 204 234 | description: "The order was deleted" 235 | responses: 236 | orderNotFound: 237 | status: 404 238 | description: "The order was not found" 239 | serverError: 240 | status: 5XX 241 | components: 242 | schemas: 243 | Order: 244 | type: object 245 | properties: 246 | id: 247 | type: integer 248 | format: int64 249 | example: 10 250 | petId: 251 | type: integer 252 | format: int64 253 | example: 198772 254 | quantity: 255 | type: integer 256 | format: int32 257 | example: 7 258 | shipDate: 259 | type: string 260 | format: date-time 261 | status: 262 | type: string 263 | description: Order Status 264 | example: approved 265 | enum: 266 | - placed 267 | - approved 268 | - delivered 269 | complete: 270 | type: boolean 271 | xml: 272 | name: order 273 | Customer: 274 | type: object 275 | properties: 276 | id: 277 | type: integer 278 | format: int64 279 | example: 100000 280 | username: 281 | type: string 282 | example: fehguy 283 | address: 284 | type: array 285 | xml: 286 | name: addresses 287 | wrapped: true 288 | items: 289 | $ref: "#/components/schemas/Address" 290 | xml: 291 | name: customer 292 | Address: 293 | type: object 294 | properties: 295 | street: 296 | type: string 297 | example: 437 Lytton 298 | city: 299 | type: string 300 | example: Palo Alto 301 | state: 302 | type: string 303 | example: CA 304 | zip: 305 | type: string 306 | example: "94301" 307 | xml: 308 | name: address 309 | Category: 310 | type: object 311 | properties: 312 | id: 313 | type: integer 314 | format: int64 315 | example: 1 316 | name: 317 | type: string 318 | example: Dogs 319 | xml: 320 | name: category 321 | User: 322 | type: object 323 | properties: 324 | id: 325 | type: integer 326 | format: int64 327 | example: 10 328 | username: 329 | type: string 330 | example: theUser 331 | firstName: 332 | type: string 333 | example: John 334 | lastName: 335 | type: string 336 | example: James 337 | email: 338 | type: string 339 | example: john@email.com 340 | password: 341 | type: string 342 | example: "12345" 343 | phone: 344 | type: string 345 | example: "12345" 346 | userStatus: 347 | type: integer 348 | description: User Status 349 | format: int32 350 | example: 1 351 | xml: 352 | name: user 353 | Tag: 354 | type: object 355 | properties: 356 | id: 357 | type: integer 358 | format: int64 359 | name: 360 | type: string 361 | xml: 362 | name: tag 363 | Pet: 364 | required: 365 | - name 366 | - photoUrls 367 | type: object 368 | properties: 369 | id: 370 | type: integer 371 | format: int64 372 | example: 10 373 | name: 374 | type: string 375 | example: doggie 376 | category: 377 | $ref: "#/components/schemas/Category" 378 | photoUrls: 379 | type: array 380 | xml: 381 | wrapped: true 382 | items: 383 | type: string 384 | xml: 385 | name: photoUrl 386 | tags: 387 | type: array 388 | xml: 389 | wrapped: true 390 | items: 391 | $ref: "#/components/schemas/Tag" 392 | status: 393 | type: string 394 | description: pet status in the store 395 | enum: 396 | - available 397 | - pending 398 | - sold 399 | xml: 400 | name: pet 401 | ApiResponse: 402 | type: object 403 | properties: 404 | code: 405 | type: integer 406 | format: int32 407 | type: 408 | type: string 409 | message: 410 | type: string 411 | xml: 412 | name: "##default" 413 | requestBodies: 414 | Pet: 415 | description: Pet object that needs to be added to the store 416 | content: 417 | application/json: 418 | schema: 419 | $ref: "#/components/schemas/Pet" 420 | application/xml: 421 | schema: 422 | $ref: "#/components/schemas/Pet" 423 | UserArray: 424 | description: List of user object 425 | content: 426 | application/json: 427 | schema: 428 | type: array 429 | items: 430 | $ref: "#/components/schemas/User" 431 | securitySchemes: 432 | petstore_auth: 433 | type: oauth2 434 | flows: 435 | implicit: 436 | authorizationUrl: https://petstore3.swagger.io/oauth/authorize 437 | scopes: 438 | write:pets: modify pets in your account 439 | read:pets: read your pets 440 | api_key: 441 | type: apiKey 442 | name: api_key 443 | in: header 444 | -------------------------------------------------------------------------------- /doc/initial-proposals/examples/rpc.yaml: -------------------------------------------------------------------------------- 1 | openapi: 4.0.0 2 | info: 3 | title: RPC API 4 | version: 1.0.0 5 | paths: 6 | "/service": 7 | requests: 8 | createFoo: 9 | method: post 10 | parameterSchema: 11 | type: object 12 | properties: 13 | header: ## We can either use this specially named property or create a first class headerSchema property on the Request Object 14 | type: object 15 | properties: 16 | path: 17 | const: service.createFoo ## path Header field used to convey the RPC method 18 | contentType: application/json 19 | contentSchema: 20 | $ref: "#/components/schemas/foo" 21 | responses: 22 | ok: 23 | status: 201 24 | contentType: application/json 25 | contentSchema: 26 | $ref: "#/components/schemas/foo" 27 | updateFoo: 28 | method: post 29 | parameterSchema: 30 | type: object 31 | properties: 32 | header: 33 | type: object 34 | properties: 35 | path: 36 | const: service.updateFoo ## path Header field used to convey the RPC method 37 | contentType: application/json 38 | contentSchema: 39 | $ref: "#/components/schemas/foo" 40 | responses: 41 | ok: 42 | status: 200 43 | contentType: application/json 44 | contentSchema: 45 | $ref: "#/components/schemas/foo" 46 | getFoo: 47 | method: get 48 | parameterSchema: 49 | type: object 50 | properties: 51 | header: 52 | type: object 53 | properties: 54 | path: 55 | const: service.getFoo ## path Header field used to convey the RPC method 56 | responses: 57 | ok: 58 | status: 200 59 | contentType: application/json 60 | contentSchema: 61 | $ref: "#/components/schemas/foo" 62 | deleteFoo: 63 | method: post 64 | parameterSchema: 65 | type: object 66 | properties: 67 | header: 68 | type: object 69 | properties: 70 | path: 71 | const: service.deleteFoo 72 | responses: 73 | ok: 74 | status: 200 75 | contentType: application/json 76 | contentSchema: 77 | $ref: "#/components/schemas/foo" 78 | "/jsonrpc": 79 | requests: 80 | getFoo: 81 | method: post 82 | parameterSchema: 83 | type: object 84 | properties: 85 | body: 86 | type: object 87 | properties: 88 | jsonrpc: 89 | const: 2.0 90 | method: 91 | const: getFoo 92 | params: 93 | type: object 94 | properties: 95 | id: 96 | type: string 97 | responses: 98 | ok: 99 | status: 200 100 | contentType: application/json 101 | contentSchema: 102 | type: object 103 | properties: 104 | jsonrpc: 105 | const: 2.0 106 | result: 107 | $ref: "#/components/schemas/foo" 108 | id: 109 | type: string 110 | 111 | -------------------------------------------------------------------------------- /doc/moonwalk.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 25 | Moonwalk 26 | 27 | 28 | 29 | 30 | 31 | 75 | 76 | 77 | 84 | 138 | 139 | 140 |
141 |

143 |

Moonwalk

Version 4.0.0-draft

144 |

Unofficial Draft

145 |
146 | More details about this document 147 |
148 | 149 |
Latest published version:
150 | https://oai.github.io/sig-moonwalk/moonwalk.html 151 |
152 |
Latest editor's draft:
https://github.com/OAI/sig-moonwalk/blob/main/specification/moonwalk-source.md
153 | 154 | 155 | 156 | 157 | 158 | 159 |
Editor:
160 | TBD 161 |
162 | 163 | 164 | 165 | 166 |
Participate
167 | GitHub Moonwalk 168 |
169 | File a bug 170 |
171 | Commit history 172 |
173 | Pull requests 174 |
175 |
176 |
177 | 178 | 179 | 180 |
181 |
201 | 202 | 203 | 204 |

Current Status of Document

205 | 206 | 207 |

This contents of this document have been gathered from a combination of the 3.1 specification and proposed changes for Moonwalk. None of the content in this document should be considered as product of consensus. This is a working document for the purposes of getting the mechanics of publishing a document in place and beginning to discuss the overall structure of the document.

208 |
209 | 210 |

Abstract

211 | 212 | 213 |

The OpenAPI Specification (OAS) defines a standard, programming language-agnostic interface description for HTTP APIs, which allows both humans and computers to discover and understand the capabilities of a service without requiring access to source code, additional documentation, or inspection of network traffic. When properly defined via OpenAPI, a consumer can understand and interact with the remote service with a minimal amount of implementation logic. Similar to what interface descriptions have done for lower-level programming, the OpenAPI Specification removes guesswork in calling a service.

214 |
215 | 216 |

Conformance

As well as sections marked as non-normative, all authoring guidelines, diagrams, examples, and notes in this specification are non-normative. Everything else in this specification is normative.

217 | 218 | 219 |

This document is licensed under The Apache License, Version 2.0.

220 |
221 | 222 |

1. Introduction

223 |

2. Definitions

224 |

2.1 OpenAPI Document

225 |

2.2 Media Types

226 |

2.3 HTTP Status Codes

227 |

3. Conventions

228 |

3.1 Versions

3.2 Format

229 |

3.3 Data Types

230 |

3.3.1 Working With Binary Data

231 |
3.3.1.1 Migrating binary descriptions from OAS 3.0
232 |

3.4 Rich Text Formatting

233 |

3.5 Relative References in URIs

234 |

3.6 Relative References in URLs

235 |

3.7 Referencing Imports

236 |

3.7.1 Using Imported Names

237 |

3.7.2 Referencing a Complete Document

238 |

3.7.3 Locating and Loading Imported Resources

239 |

3.7.4 Security Considerations for URL Retrieval

240 |

3.8 Specification Extensions

241 |

4. Document Processing

242 |

4.1 Parsing Documents

243 |

4.2 Structural Interoperability

244 |

4.3 Resolving Implicit Connections

245 |

4.4 Undefined and Implementation-Defined Behavior

246 |

5. OpenAPI Document Structure

247 |

5.1 General Fixed Fields

248 |

5.2 Info Object

249 |

5.2.1 Fixed Fields

5.2.2 Info Object Example

250 |

5.3 Contact Object

251 |

5.3.1 Fixed Fields

252 |

5.3.2 Contact Object Example

253 |

5.4 License Object

254 |

5.4.1 Fixed Fields

255 |

5.4.2 License Object Example

256 |

5.5 Components Object

257 |

5.6 Import Object

258 |

5.6.1 Fixed Fields

259 |

5.7 API Shape

260 |

5.7.1 Shape Fixed Fields

261 |

5.7.2 Operation Object

262 |
5.7.2.1 Fixed Fields
263 |
5.7.2.2 Operation Object Example
264 |

5.8 API Deployment

265 |

5.8.1 Deployment Fixed Fields

266 |

5.8.2 Deployment Example

267 |

5.8.3 Deployment Object

268 |
5.8.3.1 Deployment Fixed Fields
269 |

5.8.4 Security Scheme Object

270 |
5.8.4.1 Fixed Fields
271 |

5.8.5 Credential Object

272 |
5.8.5.1 Field Fields
273 |

5.8.6 Security Config Object

274 |
5.8.6.1 ApiKey Config Object
275 |
5.8.6.2 OAuth2 Config Object
276 |
5.8.6.3 OIDC Config Object
277 |
5.8.6.4 HTTP Config Object
278 |

6. Appendix

279 |

A. Revision History

280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 |
VersionDateNotes
3.1.02021-02-15Release of the OpenAPI Specification 3.1.0
3.1.0-rc12020-10-08rc1 of the 3.1 specification
3.1.0-rc02020-06-18rc0 of the 3.1 specification
3.0.32020-02-20Patch release of the OpenAPI Specification 3.0.3
3.0.22018-10-08Patch release of the OpenAPI Specification 3.0.2
3.0.12017-12-06Patch release of the OpenAPI Specification 3.0.1
3.0.02017-07-26Release of the OpenAPI Specification 3.0.0
3.0.0-rc22017-06-16rc2 of the 3.0 specification
3.0.0-rc12017-04-27rc1 of the 3.0 specification
3.0.0-rc02017-02-28Implementer's Draft of the 3.0 specification
2.02015-12-31Donation of Swagger 2.0 to the OpenAPI Initiative
2.02014-09-08Release of Swagger 2.0
1.22014-03-14Initial release of the formal document.
1.12012-08-22Release of Swagger 1.1
1.02011-08-10First release of the Swagger Specification
366 |
367 | 368 |
369 | 370 | 371 | 372 | 373 | 374 |
-------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "oas-moonwalk", 3 | "version": "0.0.1", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "oas-moonwalk", 9 | "version": "0.0.1", 10 | "license": "Apache-2.0", 11 | "devDependencies": { 12 | "respec": "^35.1.0" 13 | } 14 | }, 15 | "node_modules/@babel/code-frame": { 16 | "version": "7.24.7", 17 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", 18 | "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", 19 | "dev": true, 20 | "dependencies": { 21 | "@babel/highlight": "^7.24.7", 22 | "picocolors": "^1.0.0" 23 | }, 24 | "engines": { 25 | "node": ">=6.9.0" 26 | } 27 | }, 28 | "node_modules/@babel/helper-validator-identifier": { 29 | "version": "7.24.7", 30 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", 31 | "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", 32 | "dev": true, 33 | "engines": { 34 | "node": ">=6.9.0" 35 | } 36 | }, 37 | "node_modules/@babel/highlight": { 38 | "version": "7.24.7", 39 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", 40 | "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", 41 | "dev": true, 42 | "dependencies": { 43 | "@babel/helper-validator-identifier": "^7.24.7", 44 | "chalk": "^2.4.2", 45 | "js-tokens": "^4.0.0", 46 | "picocolors": "^1.0.0" 47 | }, 48 | "engines": { 49 | "node": ">=6.9.0" 50 | } 51 | }, 52 | "node_modules/@puppeteer/browsers": { 53 | "version": "2.2.3", 54 | "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.2.3.tgz", 55 | "integrity": "sha512-bJ0UBsk0ESOs6RFcLXOt99a3yTDcOKlzfjad+rhFwdaG1Lu/Wzq58GHYCDTlZ9z6mldf4g+NTb+TXEfe0PpnsQ==", 56 | "dev": true, 57 | "dependencies": { 58 | "debug": "4.3.4", 59 | "extract-zip": "2.0.1", 60 | "progress": "2.0.3", 61 | "proxy-agent": "6.4.0", 62 | "semver": "7.6.0", 63 | "tar-fs": "3.0.5", 64 | "unbzip2-stream": "1.4.3", 65 | "yargs": "17.7.2" 66 | }, 67 | "bin": { 68 | "browsers": "lib/cjs/main-cli.js" 69 | }, 70 | "engines": { 71 | "node": ">=18" 72 | } 73 | }, 74 | "node_modules/@puppeteer/browsers/node_modules/debug": { 75 | "version": "4.3.4", 76 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 77 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 78 | "dev": true, 79 | "dependencies": { 80 | "ms": "2.1.2" 81 | }, 82 | "engines": { 83 | "node": ">=6.0" 84 | }, 85 | "peerDependenciesMeta": { 86 | "supports-color": { 87 | "optional": true 88 | } 89 | } 90 | }, 91 | "node_modules/@puppeteer/browsers/node_modules/ms": { 92 | "version": "2.1.2", 93 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 94 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 95 | "dev": true 96 | }, 97 | "node_modules/@tootallnate/quickjs-emscripten": { 98 | "version": "0.23.0", 99 | "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", 100 | "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", 101 | "dev": true 102 | }, 103 | "node_modules/@types/node": { 104 | "version": "20.14.2", 105 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz", 106 | "integrity": "sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==", 107 | "dev": true, 108 | "optional": true, 109 | "dependencies": { 110 | "undici-types": "~5.26.4" 111 | } 112 | }, 113 | "node_modules/@types/yauzl": { 114 | "version": "2.10.3", 115 | "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", 116 | "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", 117 | "dev": true, 118 | "optional": true, 119 | "dependencies": { 120 | "@types/node": "*" 121 | } 122 | }, 123 | "node_modules/agent-base": { 124 | "version": "7.1.1", 125 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", 126 | "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", 127 | "dev": true, 128 | "dependencies": { 129 | "debug": "^4.3.4" 130 | }, 131 | "engines": { 132 | "node": ">= 14" 133 | } 134 | }, 135 | "node_modules/agent-base/node_modules/debug": { 136 | "version": "4.3.5", 137 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", 138 | "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", 139 | "dev": true, 140 | "dependencies": { 141 | "ms": "2.1.2" 142 | }, 143 | "engines": { 144 | "node": ">=6.0" 145 | }, 146 | "peerDependenciesMeta": { 147 | "supports-color": { 148 | "optional": true 149 | } 150 | } 151 | }, 152 | "node_modules/agent-base/node_modules/ms": { 153 | "version": "2.1.2", 154 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 155 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 156 | "dev": true 157 | }, 158 | "node_modules/ansi-regex": { 159 | "version": "5.0.1", 160 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 161 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 162 | "dev": true, 163 | "engines": { 164 | "node": ">=8" 165 | } 166 | }, 167 | "node_modules/ansi-styles": { 168 | "version": "3.2.1", 169 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 170 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 171 | "dev": true, 172 | "dependencies": { 173 | "color-convert": "^1.9.0" 174 | }, 175 | "engines": { 176 | "node": ">=4" 177 | } 178 | }, 179 | "node_modules/argparse": { 180 | "version": "2.0.1", 181 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 182 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 183 | "dev": true 184 | }, 185 | "node_modules/ast-types": { 186 | "version": "0.13.4", 187 | "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", 188 | "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", 189 | "dev": true, 190 | "dependencies": { 191 | "tslib": "^2.0.1" 192 | }, 193 | "engines": { 194 | "node": ">=4" 195 | } 196 | }, 197 | "node_modules/b4a": { 198 | "version": "1.6.6", 199 | "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", 200 | "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", 201 | "dev": true 202 | }, 203 | "node_modules/bare-events": { 204 | "version": "2.4.2", 205 | "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz", 206 | "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==", 207 | "dev": true, 208 | "optional": true 209 | }, 210 | "node_modules/bare-fs": { 211 | "version": "2.3.1", 212 | "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.1.tgz", 213 | "integrity": "sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==", 214 | "dev": true, 215 | "optional": true, 216 | "dependencies": { 217 | "bare-events": "^2.0.0", 218 | "bare-path": "^2.0.0", 219 | "bare-stream": "^2.0.0" 220 | } 221 | }, 222 | "node_modules/bare-os": { 223 | "version": "2.3.0", 224 | "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.3.0.tgz", 225 | "integrity": "sha512-oPb8oMM1xZbhRQBngTgpcQ5gXw6kjOaRsSWsIeNyRxGed2w/ARyP7ScBYpWR1qfX2E5rS3gBw6OWcSQo+s+kUg==", 226 | "dev": true, 227 | "optional": true 228 | }, 229 | "node_modules/bare-path": { 230 | "version": "2.1.3", 231 | "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", 232 | "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", 233 | "dev": true, 234 | "optional": true, 235 | "dependencies": { 236 | "bare-os": "^2.1.0" 237 | } 238 | }, 239 | "node_modules/bare-stream": { 240 | "version": "2.1.2", 241 | "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.1.2.tgz", 242 | "integrity": "sha512-az/7TFOh4Gk9Tqs1/xMFq5FuFoeZ9hZ3orsM2x69u8NXVUDXZnpdhG8mZY/Pv6DF954MGn+iIt4rFrG34eQsvg==", 243 | "dev": true, 244 | "optional": true, 245 | "dependencies": { 246 | "streamx": "^2.18.0" 247 | } 248 | }, 249 | "node_modules/base64-js": { 250 | "version": "1.5.1", 251 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 252 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 253 | "dev": true, 254 | "funding": [ 255 | { 256 | "type": "github", 257 | "url": "https://github.com/sponsors/feross" 258 | }, 259 | { 260 | "type": "patreon", 261 | "url": "https://www.patreon.com/feross" 262 | }, 263 | { 264 | "type": "consulting", 265 | "url": "https://feross.org/support" 266 | } 267 | ] 268 | }, 269 | "node_modules/basic-ftp": { 270 | "version": "5.0.5", 271 | "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", 272 | "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", 273 | "dev": true, 274 | "engines": { 275 | "node": ">=10.0.0" 276 | } 277 | }, 278 | "node_modules/buffer": { 279 | "version": "5.7.1", 280 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 281 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 282 | "dev": true, 283 | "funding": [ 284 | { 285 | "type": "github", 286 | "url": "https://github.com/sponsors/feross" 287 | }, 288 | { 289 | "type": "patreon", 290 | "url": "https://www.patreon.com/feross" 291 | }, 292 | { 293 | "type": "consulting", 294 | "url": "https://feross.org/support" 295 | } 296 | ], 297 | "dependencies": { 298 | "base64-js": "^1.3.1", 299 | "ieee754": "^1.1.13" 300 | } 301 | }, 302 | "node_modules/buffer-crc32": { 303 | "version": "0.2.13", 304 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 305 | "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", 306 | "dev": true, 307 | "engines": { 308 | "node": "*" 309 | } 310 | }, 311 | "node_modules/callsites": { 312 | "version": "3.1.0", 313 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 314 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 315 | "dev": true, 316 | "engines": { 317 | "node": ">=6" 318 | } 319 | }, 320 | "node_modules/chalk": { 321 | "version": "2.4.2", 322 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 323 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 324 | "dev": true, 325 | "dependencies": { 326 | "ansi-styles": "^3.2.1", 327 | "escape-string-regexp": "^1.0.5", 328 | "supports-color": "^5.3.0" 329 | }, 330 | "engines": { 331 | "node": ">=4" 332 | } 333 | }, 334 | "node_modules/chromium-bidi": { 335 | "version": "0.5.23", 336 | "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.5.23.tgz", 337 | "integrity": "sha512-1o/gLU9wDqbN5nL2MtfjykjOuighGXc3/hnWueO1haiEoFgX8h5vbvcA4tgdQfjw1mkZ1OEF4x/+HVeqEX6NoA==", 338 | "dev": true, 339 | "dependencies": { 340 | "mitt": "3.0.1", 341 | "urlpattern-polyfill": "10.0.0", 342 | "zod": "3.23.8" 343 | }, 344 | "peerDependencies": { 345 | "devtools-protocol": "*" 346 | } 347 | }, 348 | "node_modules/cliui": { 349 | "version": "8.0.1", 350 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", 351 | "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", 352 | "dev": true, 353 | "dependencies": { 354 | "string-width": "^4.2.0", 355 | "strip-ansi": "^6.0.1", 356 | "wrap-ansi": "^7.0.0" 357 | }, 358 | "engines": { 359 | "node": ">=12" 360 | } 361 | }, 362 | "node_modules/color-convert": { 363 | "version": "1.9.3", 364 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 365 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 366 | "dev": true, 367 | "dependencies": { 368 | "color-name": "1.1.3" 369 | } 370 | }, 371 | "node_modules/color-name": { 372 | "version": "1.1.3", 373 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 374 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", 375 | "dev": true 376 | }, 377 | "node_modules/colors": { 378 | "version": "1.4.0", 379 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", 380 | "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", 381 | "dev": true, 382 | "engines": { 383 | "node": ">=0.1.90" 384 | } 385 | }, 386 | "node_modules/cosmiconfig": { 387 | "version": "9.0.0", 388 | "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", 389 | "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", 390 | "dev": true, 391 | "dependencies": { 392 | "env-paths": "^2.2.1", 393 | "import-fresh": "^3.3.0", 394 | "js-yaml": "^4.1.0", 395 | "parse-json": "^5.2.0" 396 | }, 397 | "engines": { 398 | "node": ">=14" 399 | }, 400 | "funding": { 401 | "url": "https://github.com/sponsors/d-fischer" 402 | }, 403 | "peerDependencies": { 404 | "typescript": ">=4.9.5" 405 | }, 406 | "peerDependenciesMeta": { 407 | "typescript": { 408 | "optional": true 409 | } 410 | } 411 | }, 412 | "node_modules/data-uri-to-buffer": { 413 | "version": "6.0.2", 414 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", 415 | "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", 416 | "dev": true, 417 | "engines": { 418 | "node": ">= 14" 419 | } 420 | }, 421 | "node_modules/debug": { 422 | "version": "2.6.9", 423 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 424 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 425 | "dev": true, 426 | "dependencies": { 427 | "ms": "2.0.0" 428 | } 429 | }, 430 | "node_modules/degenerator": { 431 | "version": "5.0.1", 432 | "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", 433 | "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", 434 | "dev": true, 435 | "dependencies": { 436 | "ast-types": "^0.13.4", 437 | "escodegen": "^2.1.0", 438 | "esprima": "^4.0.1" 439 | }, 440 | "engines": { 441 | "node": ">= 14" 442 | } 443 | }, 444 | "node_modules/depd": { 445 | "version": "2.0.0", 446 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 447 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 448 | "dev": true, 449 | "engines": { 450 | "node": ">= 0.8" 451 | } 452 | }, 453 | "node_modules/destroy": { 454 | "version": "1.2.0", 455 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 456 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 457 | "dev": true, 458 | "engines": { 459 | "node": ">= 0.8", 460 | "npm": "1.2.8000 || >= 1.4.16" 461 | } 462 | }, 463 | "node_modules/devtools-protocol": { 464 | "version": "0.0.1299070", 465 | "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1299070.tgz", 466 | "integrity": "sha512-+qtL3eX50qsJ7c+qVyagqi7AWMoQCBGNfoyJZMwm/NSXVqLYbuitrWEEIzxfUmTNy7//Xe8yhMmQ+elj3uAqSg==", 467 | "dev": true 468 | }, 469 | "node_modules/ee-first": { 470 | "version": "1.1.1", 471 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 472 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", 473 | "dev": true 474 | }, 475 | "node_modules/emoji-regex": { 476 | "version": "8.0.0", 477 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 478 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 479 | "dev": true 480 | }, 481 | "node_modules/encodeurl": { 482 | "version": "1.0.2", 483 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 484 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 485 | "dev": true, 486 | "engines": { 487 | "node": ">= 0.8" 488 | } 489 | }, 490 | "node_modules/end-of-stream": { 491 | "version": "1.4.4", 492 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 493 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 494 | "dev": true, 495 | "dependencies": { 496 | "once": "^1.4.0" 497 | } 498 | }, 499 | "node_modules/env-paths": { 500 | "version": "2.2.1", 501 | "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", 502 | "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", 503 | "dev": true, 504 | "engines": { 505 | "node": ">=6" 506 | } 507 | }, 508 | "node_modules/error-ex": { 509 | "version": "1.3.2", 510 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 511 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 512 | "dev": true, 513 | "dependencies": { 514 | "is-arrayish": "^0.2.1" 515 | } 516 | }, 517 | "node_modules/escalade": { 518 | "version": "3.1.2", 519 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", 520 | "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", 521 | "dev": true, 522 | "engines": { 523 | "node": ">=6" 524 | } 525 | }, 526 | "node_modules/escape-html": { 527 | "version": "1.0.3", 528 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 529 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", 530 | "dev": true 531 | }, 532 | "node_modules/escape-string-regexp": { 533 | "version": "1.0.5", 534 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 535 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 536 | "dev": true, 537 | "engines": { 538 | "node": ">=0.8.0" 539 | } 540 | }, 541 | "node_modules/escodegen": { 542 | "version": "2.1.0", 543 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", 544 | "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", 545 | "dev": true, 546 | "dependencies": { 547 | "esprima": "^4.0.1", 548 | "estraverse": "^5.2.0", 549 | "esutils": "^2.0.2" 550 | }, 551 | "bin": { 552 | "escodegen": "bin/escodegen.js", 553 | "esgenerate": "bin/esgenerate.js" 554 | }, 555 | "engines": { 556 | "node": ">=6.0" 557 | }, 558 | "optionalDependencies": { 559 | "source-map": "~0.6.1" 560 | } 561 | }, 562 | "node_modules/esprima": { 563 | "version": "4.0.1", 564 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 565 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 566 | "dev": true, 567 | "bin": { 568 | "esparse": "bin/esparse.js", 569 | "esvalidate": "bin/esvalidate.js" 570 | }, 571 | "engines": { 572 | "node": ">=4" 573 | } 574 | }, 575 | "node_modules/estraverse": { 576 | "version": "5.3.0", 577 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 578 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 579 | "dev": true, 580 | "engines": { 581 | "node": ">=4.0" 582 | } 583 | }, 584 | "node_modules/esutils": { 585 | "version": "2.0.3", 586 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 587 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 588 | "dev": true, 589 | "engines": { 590 | "node": ">=0.10.0" 591 | } 592 | }, 593 | "node_modules/etag": { 594 | "version": "1.8.1", 595 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 596 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 597 | "dev": true, 598 | "engines": { 599 | "node": ">= 0.6" 600 | } 601 | }, 602 | "node_modules/extract-zip": { 603 | "version": "2.0.1", 604 | "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", 605 | "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", 606 | "dev": true, 607 | "dependencies": { 608 | "debug": "^4.1.1", 609 | "get-stream": "^5.1.0", 610 | "yauzl": "^2.10.0" 611 | }, 612 | "bin": { 613 | "extract-zip": "cli.js" 614 | }, 615 | "engines": { 616 | "node": ">= 10.17.0" 617 | }, 618 | "optionalDependencies": { 619 | "@types/yauzl": "^2.9.1" 620 | } 621 | }, 622 | "node_modules/extract-zip/node_modules/debug": { 623 | "version": "4.3.5", 624 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", 625 | "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", 626 | "dev": true, 627 | "dependencies": { 628 | "ms": "2.1.2" 629 | }, 630 | "engines": { 631 | "node": ">=6.0" 632 | }, 633 | "peerDependenciesMeta": { 634 | "supports-color": { 635 | "optional": true 636 | } 637 | } 638 | }, 639 | "node_modules/extract-zip/node_modules/ms": { 640 | "version": "2.1.2", 641 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 642 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 643 | "dev": true 644 | }, 645 | "node_modules/fast-fifo": { 646 | "version": "1.3.2", 647 | "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", 648 | "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", 649 | "dev": true 650 | }, 651 | "node_modules/fd-slicer": { 652 | "version": "1.1.0", 653 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", 654 | "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", 655 | "dev": true, 656 | "dependencies": { 657 | "pend": "~1.2.0" 658 | } 659 | }, 660 | "node_modules/finalhandler": { 661 | "version": "1.2.0", 662 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 663 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 664 | "dev": true, 665 | "dependencies": { 666 | "debug": "2.6.9", 667 | "encodeurl": "~1.0.2", 668 | "escape-html": "~1.0.3", 669 | "on-finished": "2.4.1", 670 | "parseurl": "~1.3.3", 671 | "statuses": "2.0.1", 672 | "unpipe": "~1.0.0" 673 | }, 674 | "engines": { 675 | "node": ">= 0.8" 676 | } 677 | }, 678 | "node_modules/fresh": { 679 | "version": "0.5.2", 680 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 681 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 682 | "dev": true, 683 | "engines": { 684 | "node": ">= 0.6" 685 | } 686 | }, 687 | "node_modules/fs-extra": { 688 | "version": "11.2.0", 689 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", 690 | "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", 691 | "dev": true, 692 | "dependencies": { 693 | "graceful-fs": "^4.2.0", 694 | "jsonfile": "^6.0.1", 695 | "universalify": "^2.0.0" 696 | }, 697 | "engines": { 698 | "node": ">=14.14" 699 | } 700 | }, 701 | "node_modules/get-caller-file": { 702 | "version": "2.0.5", 703 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 704 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 705 | "dev": true, 706 | "engines": { 707 | "node": "6.* || 8.* || >= 10.*" 708 | } 709 | }, 710 | "node_modules/get-stream": { 711 | "version": "5.2.0", 712 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", 713 | "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", 714 | "dev": true, 715 | "dependencies": { 716 | "pump": "^3.0.0" 717 | }, 718 | "engines": { 719 | "node": ">=8" 720 | }, 721 | "funding": { 722 | "url": "https://github.com/sponsors/sindresorhus" 723 | } 724 | }, 725 | "node_modules/get-uri": { 726 | "version": "6.0.3", 727 | "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", 728 | "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", 729 | "dev": true, 730 | "dependencies": { 731 | "basic-ftp": "^5.0.2", 732 | "data-uri-to-buffer": "^6.0.2", 733 | "debug": "^4.3.4", 734 | "fs-extra": "^11.2.0" 735 | }, 736 | "engines": { 737 | "node": ">= 14" 738 | } 739 | }, 740 | "node_modules/get-uri/node_modules/debug": { 741 | "version": "4.3.5", 742 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", 743 | "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", 744 | "dev": true, 745 | "dependencies": { 746 | "ms": "2.1.2" 747 | }, 748 | "engines": { 749 | "node": ">=6.0" 750 | }, 751 | "peerDependenciesMeta": { 752 | "supports-color": { 753 | "optional": true 754 | } 755 | } 756 | }, 757 | "node_modules/get-uri/node_modules/ms": { 758 | "version": "2.1.2", 759 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 760 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 761 | "dev": true 762 | }, 763 | "node_modules/graceful-fs": { 764 | "version": "4.2.11", 765 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 766 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 767 | "dev": true 768 | }, 769 | "node_modules/has-flag": { 770 | "version": "3.0.0", 771 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 772 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 773 | "dev": true, 774 | "engines": { 775 | "node": ">=4" 776 | } 777 | }, 778 | "node_modules/http-errors": { 779 | "version": "2.0.0", 780 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 781 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 782 | "dev": true, 783 | "dependencies": { 784 | "depd": "2.0.0", 785 | "inherits": "2.0.4", 786 | "setprototypeof": "1.2.0", 787 | "statuses": "2.0.1", 788 | "toidentifier": "1.0.1" 789 | }, 790 | "engines": { 791 | "node": ">= 0.8" 792 | } 793 | }, 794 | "node_modules/http-proxy-agent": { 795 | "version": "7.0.2", 796 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", 797 | "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", 798 | "dev": true, 799 | "dependencies": { 800 | "agent-base": "^7.1.0", 801 | "debug": "^4.3.4" 802 | }, 803 | "engines": { 804 | "node": ">= 14" 805 | } 806 | }, 807 | "node_modules/http-proxy-agent/node_modules/debug": { 808 | "version": "4.3.5", 809 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", 810 | "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", 811 | "dev": true, 812 | "dependencies": { 813 | "ms": "2.1.2" 814 | }, 815 | "engines": { 816 | "node": ">=6.0" 817 | }, 818 | "peerDependenciesMeta": { 819 | "supports-color": { 820 | "optional": true 821 | } 822 | } 823 | }, 824 | "node_modules/http-proxy-agent/node_modules/ms": { 825 | "version": "2.1.2", 826 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 827 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 828 | "dev": true 829 | }, 830 | "node_modules/https-proxy-agent": { 831 | "version": "7.0.4", 832 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", 833 | "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", 834 | "dev": true, 835 | "dependencies": { 836 | "agent-base": "^7.0.2", 837 | "debug": "4" 838 | }, 839 | "engines": { 840 | "node": ">= 14" 841 | } 842 | }, 843 | "node_modules/https-proxy-agent/node_modules/debug": { 844 | "version": "4.3.5", 845 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", 846 | "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", 847 | "dev": true, 848 | "dependencies": { 849 | "ms": "2.1.2" 850 | }, 851 | "engines": { 852 | "node": ">=6.0" 853 | }, 854 | "peerDependenciesMeta": { 855 | "supports-color": { 856 | "optional": true 857 | } 858 | } 859 | }, 860 | "node_modules/https-proxy-agent/node_modules/ms": { 861 | "version": "2.1.2", 862 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 863 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 864 | "dev": true 865 | }, 866 | "node_modules/ieee754": { 867 | "version": "1.2.1", 868 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 869 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 870 | "dev": true, 871 | "funding": [ 872 | { 873 | "type": "github", 874 | "url": "https://github.com/sponsors/feross" 875 | }, 876 | { 877 | "type": "patreon", 878 | "url": "https://www.patreon.com/feross" 879 | }, 880 | { 881 | "type": "consulting", 882 | "url": "https://feross.org/support" 883 | } 884 | ] 885 | }, 886 | "node_modules/import-fresh": { 887 | "version": "3.3.0", 888 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 889 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 890 | "dev": true, 891 | "dependencies": { 892 | "parent-module": "^1.0.0", 893 | "resolve-from": "^4.0.0" 894 | }, 895 | "engines": { 896 | "node": ">=6" 897 | }, 898 | "funding": { 899 | "url": "https://github.com/sponsors/sindresorhus" 900 | } 901 | }, 902 | "node_modules/inherits": { 903 | "version": "2.0.4", 904 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 905 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 906 | "dev": true 907 | }, 908 | "node_modules/ip-address": { 909 | "version": "9.0.5", 910 | "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", 911 | "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", 912 | "dev": true, 913 | "dependencies": { 914 | "jsbn": "1.1.0", 915 | "sprintf-js": "^1.1.3" 916 | }, 917 | "engines": { 918 | "node": ">= 12" 919 | } 920 | }, 921 | "node_modules/is-arrayish": { 922 | "version": "0.2.1", 923 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 924 | "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", 925 | "dev": true 926 | }, 927 | "node_modules/is-fullwidth-code-point": { 928 | "version": "3.0.0", 929 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 930 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 931 | "dev": true, 932 | "engines": { 933 | "node": ">=8" 934 | } 935 | }, 936 | "node_modules/js-tokens": { 937 | "version": "4.0.0", 938 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 939 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 940 | "dev": true 941 | }, 942 | "node_modules/js-yaml": { 943 | "version": "4.1.0", 944 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 945 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 946 | "dev": true, 947 | "dependencies": { 948 | "argparse": "^2.0.1" 949 | }, 950 | "bin": { 951 | "js-yaml": "bin/js-yaml.js" 952 | } 953 | }, 954 | "node_modules/jsbn": { 955 | "version": "1.1.0", 956 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", 957 | "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", 958 | "dev": true 959 | }, 960 | "node_modules/json-parse-even-better-errors": { 961 | "version": "2.3.1", 962 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", 963 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", 964 | "dev": true 965 | }, 966 | "node_modules/jsonfile": { 967 | "version": "6.1.0", 968 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", 969 | "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", 970 | "dev": true, 971 | "dependencies": { 972 | "universalify": "^2.0.0" 973 | }, 974 | "optionalDependencies": { 975 | "graceful-fs": "^4.1.6" 976 | } 977 | }, 978 | "node_modules/lines-and-columns": { 979 | "version": "1.2.4", 980 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 981 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", 982 | "dev": true 983 | }, 984 | "node_modules/lru-cache": { 985 | "version": "7.18.3", 986 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", 987 | "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", 988 | "dev": true, 989 | "engines": { 990 | "node": ">=12" 991 | } 992 | }, 993 | "node_modules/marked": { 994 | "version": "12.0.2", 995 | "resolved": "https://registry.npmjs.org/marked/-/marked-12.0.2.tgz", 996 | "integrity": "sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==", 997 | "dev": true, 998 | "bin": { 999 | "marked": "bin/marked.js" 1000 | }, 1001 | "engines": { 1002 | "node": ">= 18" 1003 | } 1004 | }, 1005 | "node_modules/mime": { 1006 | "version": "1.6.0", 1007 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1008 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 1009 | "dev": true, 1010 | "bin": { 1011 | "mime": "cli.js" 1012 | }, 1013 | "engines": { 1014 | "node": ">=4" 1015 | } 1016 | }, 1017 | "node_modules/mitt": { 1018 | "version": "3.0.1", 1019 | "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", 1020 | "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", 1021 | "dev": true 1022 | }, 1023 | "node_modules/mri": { 1024 | "version": "1.2.0", 1025 | "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", 1026 | "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", 1027 | "dev": true, 1028 | "engines": { 1029 | "node": ">=4" 1030 | } 1031 | }, 1032 | "node_modules/ms": { 1033 | "version": "2.0.0", 1034 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1035 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 1036 | "dev": true 1037 | }, 1038 | "node_modules/netmask": { 1039 | "version": "2.0.2", 1040 | "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", 1041 | "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", 1042 | "dev": true, 1043 | "engines": { 1044 | "node": ">= 0.4.0" 1045 | } 1046 | }, 1047 | "node_modules/on-finished": { 1048 | "version": "2.4.1", 1049 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 1050 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1051 | "dev": true, 1052 | "dependencies": { 1053 | "ee-first": "1.1.1" 1054 | }, 1055 | "engines": { 1056 | "node": ">= 0.8" 1057 | } 1058 | }, 1059 | "node_modules/once": { 1060 | "version": "1.4.0", 1061 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1062 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1063 | "dev": true, 1064 | "dependencies": { 1065 | "wrappy": "1" 1066 | } 1067 | }, 1068 | "node_modules/pac-proxy-agent": { 1069 | "version": "7.0.1", 1070 | "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", 1071 | "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", 1072 | "dev": true, 1073 | "dependencies": { 1074 | "@tootallnate/quickjs-emscripten": "^0.23.0", 1075 | "agent-base": "^7.0.2", 1076 | "debug": "^4.3.4", 1077 | "get-uri": "^6.0.1", 1078 | "http-proxy-agent": "^7.0.0", 1079 | "https-proxy-agent": "^7.0.2", 1080 | "pac-resolver": "^7.0.0", 1081 | "socks-proxy-agent": "^8.0.2" 1082 | }, 1083 | "engines": { 1084 | "node": ">= 14" 1085 | } 1086 | }, 1087 | "node_modules/pac-proxy-agent/node_modules/debug": { 1088 | "version": "4.3.5", 1089 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", 1090 | "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", 1091 | "dev": true, 1092 | "dependencies": { 1093 | "ms": "2.1.2" 1094 | }, 1095 | "engines": { 1096 | "node": ">=6.0" 1097 | }, 1098 | "peerDependenciesMeta": { 1099 | "supports-color": { 1100 | "optional": true 1101 | } 1102 | } 1103 | }, 1104 | "node_modules/pac-proxy-agent/node_modules/ms": { 1105 | "version": "2.1.2", 1106 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1107 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1108 | "dev": true 1109 | }, 1110 | "node_modules/pac-resolver": { 1111 | "version": "7.0.1", 1112 | "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", 1113 | "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", 1114 | "dev": true, 1115 | "dependencies": { 1116 | "degenerator": "^5.0.0", 1117 | "netmask": "^2.0.2" 1118 | }, 1119 | "engines": { 1120 | "node": ">= 14" 1121 | } 1122 | }, 1123 | "node_modules/parent-module": { 1124 | "version": "1.0.1", 1125 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1126 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1127 | "dev": true, 1128 | "dependencies": { 1129 | "callsites": "^3.0.0" 1130 | }, 1131 | "engines": { 1132 | "node": ">=6" 1133 | } 1134 | }, 1135 | "node_modules/parse-json": { 1136 | "version": "5.2.0", 1137 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", 1138 | "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", 1139 | "dev": true, 1140 | "dependencies": { 1141 | "@babel/code-frame": "^7.0.0", 1142 | "error-ex": "^1.3.1", 1143 | "json-parse-even-better-errors": "^2.3.0", 1144 | "lines-and-columns": "^1.1.6" 1145 | }, 1146 | "engines": { 1147 | "node": ">=8" 1148 | }, 1149 | "funding": { 1150 | "url": "https://github.com/sponsors/sindresorhus" 1151 | } 1152 | }, 1153 | "node_modules/parseurl": { 1154 | "version": "1.3.3", 1155 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1156 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 1157 | "dev": true, 1158 | "engines": { 1159 | "node": ">= 0.8" 1160 | } 1161 | }, 1162 | "node_modules/pend": { 1163 | "version": "1.2.0", 1164 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 1165 | "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", 1166 | "dev": true 1167 | }, 1168 | "node_modules/picocolors": { 1169 | "version": "1.0.1", 1170 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", 1171 | "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", 1172 | "dev": true 1173 | }, 1174 | "node_modules/progress": { 1175 | "version": "2.0.3", 1176 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1177 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1178 | "dev": true, 1179 | "engines": { 1180 | "node": ">=0.4.0" 1181 | } 1182 | }, 1183 | "node_modules/proxy-agent": { 1184 | "version": "6.4.0", 1185 | "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", 1186 | "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", 1187 | "dev": true, 1188 | "dependencies": { 1189 | "agent-base": "^7.0.2", 1190 | "debug": "^4.3.4", 1191 | "http-proxy-agent": "^7.0.1", 1192 | "https-proxy-agent": "^7.0.3", 1193 | "lru-cache": "^7.14.1", 1194 | "pac-proxy-agent": "^7.0.1", 1195 | "proxy-from-env": "^1.1.0", 1196 | "socks-proxy-agent": "^8.0.2" 1197 | }, 1198 | "engines": { 1199 | "node": ">= 14" 1200 | } 1201 | }, 1202 | "node_modules/proxy-agent/node_modules/debug": { 1203 | "version": "4.3.5", 1204 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", 1205 | "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", 1206 | "dev": true, 1207 | "dependencies": { 1208 | "ms": "2.1.2" 1209 | }, 1210 | "engines": { 1211 | "node": ">=6.0" 1212 | }, 1213 | "peerDependenciesMeta": { 1214 | "supports-color": { 1215 | "optional": true 1216 | } 1217 | } 1218 | }, 1219 | "node_modules/proxy-agent/node_modules/ms": { 1220 | "version": "2.1.2", 1221 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1222 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1223 | "dev": true 1224 | }, 1225 | "node_modules/proxy-from-env": { 1226 | "version": "1.1.0", 1227 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 1228 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", 1229 | "dev": true 1230 | }, 1231 | "node_modules/pump": { 1232 | "version": "3.0.0", 1233 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 1234 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 1235 | "dev": true, 1236 | "dependencies": { 1237 | "end-of-stream": "^1.1.0", 1238 | "once": "^1.3.1" 1239 | } 1240 | }, 1241 | "node_modules/puppeteer": { 1242 | "version": "22.11.0", 1243 | "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-22.11.0.tgz", 1244 | "integrity": "sha512-U5U0Dx5Tsd/ec39BmflhcSFIK9UnZxGQfyUzvQVHivt6gIi6RgJqYL9MJaU90OG6tTz65XqzN4wF0ZyDyY0NuA==", 1245 | "dev": true, 1246 | "hasInstallScript": true, 1247 | "dependencies": { 1248 | "@puppeteer/browsers": "2.2.3", 1249 | "cosmiconfig": "9.0.0", 1250 | "devtools-protocol": "0.0.1299070", 1251 | "puppeteer-core": "22.11.0" 1252 | }, 1253 | "bin": { 1254 | "puppeteer": "lib/esm/puppeteer/node/cli.js" 1255 | }, 1256 | "engines": { 1257 | "node": ">=18" 1258 | } 1259 | }, 1260 | "node_modules/puppeteer-core": { 1261 | "version": "22.11.0", 1262 | "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-22.11.0.tgz", 1263 | "integrity": "sha512-57YUjhRoSpZWg9lCssWsgzM1/X/1jQnkKbbspbeW0bhZTt3TD4WdNXEYI7KrFFnSvx21tyHhfWW0zlxzbwYSAA==", 1264 | "dev": true, 1265 | "dependencies": { 1266 | "@puppeteer/browsers": "2.2.3", 1267 | "chromium-bidi": "0.5.23", 1268 | "debug": "4.3.5", 1269 | "devtools-protocol": "0.0.1299070", 1270 | "ws": "8.17.0" 1271 | }, 1272 | "engines": { 1273 | "node": ">=18" 1274 | } 1275 | }, 1276 | "node_modules/puppeteer-core/node_modules/debug": { 1277 | "version": "4.3.5", 1278 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", 1279 | "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", 1280 | "dev": true, 1281 | "dependencies": { 1282 | "ms": "2.1.2" 1283 | }, 1284 | "engines": { 1285 | "node": ">=6.0" 1286 | }, 1287 | "peerDependenciesMeta": { 1288 | "supports-color": { 1289 | "optional": true 1290 | } 1291 | } 1292 | }, 1293 | "node_modules/puppeteer-core/node_modules/ms": { 1294 | "version": "2.1.2", 1295 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1296 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1297 | "dev": true 1298 | }, 1299 | "node_modules/queue-tick": { 1300 | "version": "1.0.1", 1301 | "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", 1302 | "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", 1303 | "dev": true 1304 | }, 1305 | "node_modules/range-parser": { 1306 | "version": "1.2.1", 1307 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1308 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 1309 | "dev": true, 1310 | "engines": { 1311 | "node": ">= 0.6" 1312 | } 1313 | }, 1314 | "node_modules/require-directory": { 1315 | "version": "2.1.1", 1316 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1317 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 1318 | "dev": true, 1319 | "engines": { 1320 | "node": ">=0.10.0" 1321 | } 1322 | }, 1323 | "node_modules/resolve-from": { 1324 | "version": "4.0.0", 1325 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1326 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1327 | "dev": true, 1328 | "engines": { 1329 | "node": ">=4" 1330 | } 1331 | }, 1332 | "node_modules/respec": { 1333 | "version": "35.1.0", 1334 | "resolved": "https://registry.npmjs.org/respec/-/respec-35.1.0.tgz", 1335 | "integrity": "sha512-1aONSs0jU7exqe/mM6M04PNrjUTYFxGIl7PEKpa4awvKHSluECuAMqveNMWAaLxk3pkgqSt5rjmYo9qfElS2yA==", 1336 | "dev": true, 1337 | "dependencies": { 1338 | "colors": "1.4.0", 1339 | "finalhandler": "^1.2.0", 1340 | "marked": "^12.0.2", 1341 | "puppeteer": "^22.10.0", 1342 | "sade": "^1.8.1", 1343 | "serve-static": "^1.15.0" 1344 | }, 1345 | "bin": { 1346 | "respec": "tools/respec2html.js", 1347 | "respec2html": "tools/respec2html.js" 1348 | }, 1349 | "engines": { 1350 | "node": ">=20.12.1" 1351 | }, 1352 | "funding": { 1353 | "type": "opencollective", 1354 | "url": "https://opencollective.com/respec" 1355 | } 1356 | }, 1357 | "node_modules/sade": { 1358 | "version": "1.8.1", 1359 | "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", 1360 | "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", 1361 | "dev": true, 1362 | "dependencies": { 1363 | "mri": "^1.1.0" 1364 | }, 1365 | "engines": { 1366 | "node": ">=6" 1367 | } 1368 | }, 1369 | "node_modules/semver": { 1370 | "version": "7.6.0", 1371 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", 1372 | "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", 1373 | "dev": true, 1374 | "dependencies": { 1375 | "lru-cache": "^6.0.0" 1376 | }, 1377 | "bin": { 1378 | "semver": "bin/semver.js" 1379 | }, 1380 | "engines": { 1381 | "node": ">=10" 1382 | } 1383 | }, 1384 | "node_modules/semver/node_modules/lru-cache": { 1385 | "version": "6.0.0", 1386 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1387 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1388 | "dev": true, 1389 | "dependencies": { 1390 | "yallist": "^4.0.0" 1391 | }, 1392 | "engines": { 1393 | "node": ">=10" 1394 | } 1395 | }, 1396 | "node_modules/send": { 1397 | "version": "0.18.0", 1398 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 1399 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 1400 | "dev": true, 1401 | "dependencies": { 1402 | "debug": "2.6.9", 1403 | "depd": "2.0.0", 1404 | "destroy": "1.2.0", 1405 | "encodeurl": "~1.0.2", 1406 | "escape-html": "~1.0.3", 1407 | "etag": "~1.8.1", 1408 | "fresh": "0.5.2", 1409 | "http-errors": "2.0.0", 1410 | "mime": "1.6.0", 1411 | "ms": "2.1.3", 1412 | "on-finished": "2.4.1", 1413 | "range-parser": "~1.2.1", 1414 | "statuses": "2.0.1" 1415 | }, 1416 | "engines": { 1417 | "node": ">= 0.8.0" 1418 | } 1419 | }, 1420 | "node_modules/send/node_modules/ms": { 1421 | "version": "2.1.3", 1422 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1423 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1424 | "dev": true 1425 | }, 1426 | "node_modules/serve-static": { 1427 | "version": "1.15.0", 1428 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 1429 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 1430 | "dev": true, 1431 | "dependencies": { 1432 | "encodeurl": "~1.0.2", 1433 | "escape-html": "~1.0.3", 1434 | "parseurl": "~1.3.3", 1435 | "send": "0.18.0" 1436 | }, 1437 | "engines": { 1438 | "node": ">= 0.8.0" 1439 | } 1440 | }, 1441 | "node_modules/setprototypeof": { 1442 | "version": "1.2.0", 1443 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1444 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", 1445 | "dev": true 1446 | }, 1447 | "node_modules/smart-buffer": { 1448 | "version": "4.2.0", 1449 | "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", 1450 | "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", 1451 | "dev": true, 1452 | "engines": { 1453 | "node": ">= 6.0.0", 1454 | "npm": ">= 3.0.0" 1455 | } 1456 | }, 1457 | "node_modules/socks": { 1458 | "version": "2.8.3", 1459 | "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", 1460 | "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", 1461 | "dev": true, 1462 | "dependencies": { 1463 | "ip-address": "^9.0.5", 1464 | "smart-buffer": "^4.2.0" 1465 | }, 1466 | "engines": { 1467 | "node": ">= 10.0.0", 1468 | "npm": ">= 3.0.0" 1469 | } 1470 | }, 1471 | "node_modules/socks-proxy-agent": { 1472 | "version": "8.0.3", 1473 | "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz", 1474 | "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==", 1475 | "dev": true, 1476 | "dependencies": { 1477 | "agent-base": "^7.1.1", 1478 | "debug": "^4.3.4", 1479 | "socks": "^2.7.1" 1480 | }, 1481 | "engines": { 1482 | "node": ">= 14" 1483 | } 1484 | }, 1485 | "node_modules/socks-proxy-agent/node_modules/debug": { 1486 | "version": "4.3.5", 1487 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", 1488 | "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", 1489 | "dev": true, 1490 | "dependencies": { 1491 | "ms": "2.1.2" 1492 | }, 1493 | "engines": { 1494 | "node": ">=6.0" 1495 | }, 1496 | "peerDependenciesMeta": { 1497 | "supports-color": { 1498 | "optional": true 1499 | } 1500 | } 1501 | }, 1502 | "node_modules/socks-proxy-agent/node_modules/ms": { 1503 | "version": "2.1.2", 1504 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1505 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1506 | "dev": true 1507 | }, 1508 | "node_modules/source-map": { 1509 | "version": "0.6.1", 1510 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1511 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1512 | "dev": true, 1513 | "optional": true, 1514 | "engines": { 1515 | "node": ">=0.10.0" 1516 | } 1517 | }, 1518 | "node_modules/sprintf-js": { 1519 | "version": "1.1.3", 1520 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", 1521 | "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", 1522 | "dev": true 1523 | }, 1524 | "node_modules/statuses": { 1525 | "version": "2.0.1", 1526 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1527 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 1528 | "dev": true, 1529 | "engines": { 1530 | "node": ">= 0.8" 1531 | } 1532 | }, 1533 | "node_modules/streamx": { 1534 | "version": "2.18.0", 1535 | "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.18.0.tgz", 1536 | "integrity": "sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==", 1537 | "dev": true, 1538 | "dependencies": { 1539 | "fast-fifo": "^1.3.2", 1540 | "queue-tick": "^1.0.1", 1541 | "text-decoder": "^1.1.0" 1542 | }, 1543 | "optionalDependencies": { 1544 | "bare-events": "^2.2.0" 1545 | } 1546 | }, 1547 | "node_modules/string-width": { 1548 | "version": "4.2.3", 1549 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1550 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1551 | "dev": true, 1552 | "dependencies": { 1553 | "emoji-regex": "^8.0.0", 1554 | "is-fullwidth-code-point": "^3.0.0", 1555 | "strip-ansi": "^6.0.1" 1556 | }, 1557 | "engines": { 1558 | "node": ">=8" 1559 | } 1560 | }, 1561 | "node_modules/strip-ansi": { 1562 | "version": "6.0.1", 1563 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1564 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1565 | "dev": true, 1566 | "dependencies": { 1567 | "ansi-regex": "^5.0.1" 1568 | }, 1569 | "engines": { 1570 | "node": ">=8" 1571 | } 1572 | }, 1573 | "node_modules/supports-color": { 1574 | "version": "5.5.0", 1575 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1576 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1577 | "dev": true, 1578 | "dependencies": { 1579 | "has-flag": "^3.0.0" 1580 | }, 1581 | "engines": { 1582 | "node": ">=4" 1583 | } 1584 | }, 1585 | "node_modules/tar-fs": { 1586 | "version": "3.0.5", 1587 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.5.tgz", 1588 | "integrity": "sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==", 1589 | "dev": true, 1590 | "dependencies": { 1591 | "pump": "^3.0.0", 1592 | "tar-stream": "^3.1.5" 1593 | }, 1594 | "optionalDependencies": { 1595 | "bare-fs": "^2.1.1", 1596 | "bare-path": "^2.1.0" 1597 | } 1598 | }, 1599 | "node_modules/tar-stream": { 1600 | "version": "3.1.7", 1601 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", 1602 | "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", 1603 | "dev": true, 1604 | "dependencies": { 1605 | "b4a": "^1.6.4", 1606 | "fast-fifo": "^1.2.0", 1607 | "streamx": "^2.15.0" 1608 | } 1609 | }, 1610 | "node_modules/text-decoder": { 1611 | "version": "1.1.0", 1612 | "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.0.tgz", 1613 | "integrity": "sha512-TmLJNj6UgX8xcUZo4UDStGQtDiTzF7BzWlzn9g7UWrjkpHr5uJTK1ld16wZ3LXb2vb6jH8qU89dW5whuMdXYdw==", 1614 | "dev": true, 1615 | "dependencies": { 1616 | "b4a": "^1.6.4" 1617 | } 1618 | }, 1619 | "node_modules/through": { 1620 | "version": "2.3.8", 1621 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1622 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", 1623 | "dev": true 1624 | }, 1625 | "node_modules/toidentifier": { 1626 | "version": "1.0.1", 1627 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1628 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 1629 | "dev": true, 1630 | "engines": { 1631 | "node": ">=0.6" 1632 | } 1633 | }, 1634 | "node_modules/tslib": { 1635 | "version": "2.6.3", 1636 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", 1637 | "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", 1638 | "dev": true 1639 | }, 1640 | "node_modules/unbzip2-stream": { 1641 | "version": "1.4.3", 1642 | "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", 1643 | "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", 1644 | "dev": true, 1645 | "dependencies": { 1646 | "buffer": "^5.2.1", 1647 | "through": "^2.3.8" 1648 | } 1649 | }, 1650 | "node_modules/undici-types": { 1651 | "version": "5.26.5", 1652 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 1653 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", 1654 | "dev": true, 1655 | "optional": true 1656 | }, 1657 | "node_modules/universalify": { 1658 | "version": "2.0.1", 1659 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", 1660 | "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", 1661 | "dev": true, 1662 | "engines": { 1663 | "node": ">= 10.0.0" 1664 | } 1665 | }, 1666 | "node_modules/unpipe": { 1667 | "version": "1.0.0", 1668 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1669 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 1670 | "dev": true, 1671 | "engines": { 1672 | "node": ">= 0.8" 1673 | } 1674 | }, 1675 | "node_modules/urlpattern-polyfill": { 1676 | "version": "10.0.0", 1677 | "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", 1678 | "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", 1679 | "dev": true 1680 | }, 1681 | "node_modules/wrap-ansi": { 1682 | "version": "7.0.0", 1683 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1684 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1685 | "dev": true, 1686 | "dependencies": { 1687 | "ansi-styles": "^4.0.0", 1688 | "string-width": "^4.1.0", 1689 | "strip-ansi": "^6.0.0" 1690 | }, 1691 | "engines": { 1692 | "node": ">=10" 1693 | }, 1694 | "funding": { 1695 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1696 | } 1697 | }, 1698 | "node_modules/wrap-ansi/node_modules/ansi-styles": { 1699 | "version": "4.3.0", 1700 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1701 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1702 | "dev": true, 1703 | "dependencies": { 1704 | "color-convert": "^2.0.1" 1705 | }, 1706 | "engines": { 1707 | "node": ">=8" 1708 | }, 1709 | "funding": { 1710 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1711 | } 1712 | }, 1713 | "node_modules/wrap-ansi/node_modules/color-convert": { 1714 | "version": "2.0.1", 1715 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1716 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1717 | "dev": true, 1718 | "dependencies": { 1719 | "color-name": "~1.1.4" 1720 | }, 1721 | "engines": { 1722 | "node": ">=7.0.0" 1723 | } 1724 | }, 1725 | "node_modules/wrap-ansi/node_modules/color-name": { 1726 | "version": "1.1.4", 1727 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1728 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1729 | "dev": true 1730 | }, 1731 | "node_modules/wrappy": { 1732 | "version": "1.0.2", 1733 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1734 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1735 | "dev": true 1736 | }, 1737 | "node_modules/ws": { 1738 | "version": "8.17.0", 1739 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", 1740 | "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", 1741 | "dev": true, 1742 | "engines": { 1743 | "node": ">=10.0.0" 1744 | }, 1745 | "peerDependencies": { 1746 | "bufferutil": "^4.0.1", 1747 | "utf-8-validate": ">=5.0.2" 1748 | }, 1749 | "peerDependenciesMeta": { 1750 | "bufferutil": { 1751 | "optional": true 1752 | }, 1753 | "utf-8-validate": { 1754 | "optional": true 1755 | } 1756 | } 1757 | }, 1758 | "node_modules/y18n": { 1759 | "version": "5.0.8", 1760 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 1761 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 1762 | "dev": true, 1763 | "engines": { 1764 | "node": ">=10" 1765 | } 1766 | }, 1767 | "node_modules/yallist": { 1768 | "version": "4.0.0", 1769 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1770 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 1771 | "dev": true 1772 | }, 1773 | "node_modules/yargs": { 1774 | "version": "17.7.2", 1775 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", 1776 | "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", 1777 | "dev": true, 1778 | "dependencies": { 1779 | "cliui": "^8.0.1", 1780 | "escalade": "^3.1.1", 1781 | "get-caller-file": "^2.0.5", 1782 | "require-directory": "^2.1.1", 1783 | "string-width": "^4.2.3", 1784 | "y18n": "^5.0.5", 1785 | "yargs-parser": "^21.1.1" 1786 | }, 1787 | "engines": { 1788 | "node": ">=12" 1789 | } 1790 | }, 1791 | "node_modules/yargs-parser": { 1792 | "version": "21.1.1", 1793 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", 1794 | "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", 1795 | "dev": true, 1796 | "engines": { 1797 | "node": ">=12" 1798 | } 1799 | }, 1800 | "node_modules/yauzl": { 1801 | "version": "2.10.0", 1802 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 1803 | "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", 1804 | "dev": true, 1805 | "dependencies": { 1806 | "buffer-crc32": "~0.2.3", 1807 | "fd-slicer": "~1.1.0" 1808 | } 1809 | }, 1810 | "node_modules/zod": { 1811 | "version": "3.23.8", 1812 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", 1813 | "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", 1814 | "dev": true, 1815 | "funding": { 1816 | "url": "https://github.com/sponsors/colinhacks" 1817 | } 1818 | } 1819 | } 1820 | } 1821 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "oas-moonwalk", 3 | "version": "0.0.1", 4 | "description": "OpenAPI Specification 4.0 Moonwalk", 5 | "author": { 6 | "name": "OpenAPI Initiative TSC", 7 | "email": "tsc@openapis.org", 8 | "url": "https://openapis.org/" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "https://github.com/OAI/OpenAPI-Specification.git" 13 | }, 14 | "license": "Apache-2.0", 15 | "readmeFilename": "README.md", 16 | "files": [ 17 | "README.md" 18 | ], 19 | "dependencies": {}, 20 | "devDependencies": { 21 | "respec": "^35.1.0" 22 | }, 23 | "keywords": [ 24 | "OpenAPI", 25 | "OAS", 26 | "Swagger", 27 | "API" 28 | ], 29 | "scripts": { 30 | "build": "pwsh scripts/Generate.ps1" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /scripts/Generate.ps1: -------------------------------------------------------------------------------- 1 | # Usage: .\Generate.ps1 2 | 3 | $SpecName = "moonwalk" 4 | # get the folder of the script 5 | $ScriptFolder = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent 6 | $SpecFolder = Join-Path -Path $ScriptFolder -ChildPath "..\specification" 7 | $OutputFolder = Join-Path -Path $ScriptFolder -ChildPath "..\doc" 8 | 9 | $Respec = Join-Path -Path $ScriptFolder -ChildPath "..\node_modules\.bin\respec" 10 | 11 | $HostFile = Join-Path -Path $SpecFolder -ChildPath ($SpecName + "-host.html") 12 | $SourceFile = Join-Path -Path $SpecFolder -ChildPath ($SpecName + "-source.md") 13 | $MergedFile = Join-Path -Path $SpecFolder -ChildPath ($SpecName + "-merged.html") 14 | $OutputFile = Join-Path -Path $OutputFolder -ChildPath ($SpecName + ".html") 15 | 16 | # Outer HTML template 17 | $template = Get-Content $HostFile 18 | 19 | # Core Markdown content 20 | $content = Get-Content $SourceFile -raw 21 | 22 | # Replace the content in the template 23 | $template = $template -replace "", $content 24 | $template | Set-Content $MergedFile 25 | 26 | # Do Respec processing on the merged file 27 | & $Respec --src $MergedFile --out $OutputFile 28 | 29 | Remove-Item $MergedFile 30 | -------------------------------------------------------------------------------- /specification/moonwalk-host.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Moonwalk 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /specification/moonwalk-source.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | ## Current Status of Document 4 | 5 | This contents of this document have been gathered from a combination of the 3.1 specification and proposed changes for Moonwalk. None of the content in this document should be considered as product of consensus. This is a working document for the purposes of getting the mechanics of publishing a document in place and beginning to discuss the overall structure of the document. 6 | 7 |
8 | 9 |
10 | The OpenAPI Specification (OAS) defines a standard, programming language-agnostic interface description for HTTP APIs, which allows both humans and computers to discover and understand the capabilities of a service without requiring access to source code, additional documentation, or inspection of network traffic. When properly defined via OpenAPI, a consumer can understand and interact with the remote service with a minimal amount of implementation logic. Similar to what interface descriptions have done for lower-level programming, the OpenAPI Specification removes guesswork in calling a service. 11 |
12 | 13 |
14 | This document is licensed under [The Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.html). 15 |
16 | 17 | ## Introduction 18 | 19 | ## Definitions 20 | 21 | ##### OpenAPI Document 22 | 23 | ##### Media Types 24 | 25 | ##### HTTP Status Codes 26 | 27 | ## Conventions 28 | 29 | ### Versions {#oas-version} 30 | 31 | ### Format 32 | 33 | ### Data Types 34 | 35 | #### Working With Binary Data 36 | 37 | ##### Migrating binary descriptions from OAS 3.0 38 | 39 | ### Rich Text Formatting 40 | 41 | ### Relative References in URIs 42 | 43 | ### Relative References in URLs 44 | 45 | ### Referencing Imports 46 | 47 | #### Using Imported Names 48 | 49 | #### Referencing a Complete Document 50 | 51 | #### Locating and Loading Imported Resources 52 | 53 | #### Security Considerations for URL Retrieval 54 | 55 | ### Specification Extensions 56 | 57 | ## Document Processing 58 | 59 | #### Parsing Documents 60 | 61 | #### Structural Interoperability 62 | 63 | #### Resolving Implicit Connections 64 | 65 | #### Undefined and Implementation-Defined Behavior 66 | 67 | ## OpenAPI Document Structure 68 | 69 | ##### General Fixed Fields 70 | 71 | #### Info Object 72 | 73 | ##### Fixed Fields {#info-object-fixed-fields} 74 | 75 | ##### Info Object Example 76 | 77 | #### Contact Object 78 | 79 | ##### Fixed Fields 80 | 81 | ##### Contact Object Example 82 | 83 | #### License Object 84 | 85 | ##### Fixed Fields 86 | 87 | ##### License Object Example 88 | 89 | #### Components Object 90 | 91 | #### Import Object 92 | 93 | ##### Fixed Fields 94 | 95 | ### API Shape 96 | 97 | ##### Shape Fixed Fields 98 | 99 | #### Operation Object 100 | 101 | ##### Fixed Fields 102 | 103 | ##### Operation Object Example 104 | 105 | ### API Deployment 106 | 107 | ##### Deployment Fixed Fields 108 | 109 | ##### Deployment Example 110 | 111 | #### Deployment Object 112 | 113 | ##### Deployment Fixed Fields 114 | 115 | #### Security Scheme Object 116 | 117 | ##### Fixed Fields 118 | 119 | #### Credential Object 120 | 121 | ##### Field Fields 122 | 123 | #### Security Config Object 124 | 125 | ##### ApiKey Config Object 126 | 127 | ##### OAuth2 Config Object 128 | 129 | ##### OIDC Config Object 130 | 131 | ##### HTTP Config Object 132 | 133 | ## Appendix 134 | 135 |
136 | 137 | ## Revision History 138 | 139 | | Version | Date | Notes | 140 | | --------- | ---------- | ------------------------------------------------- | 141 | | 3.1.0 | 2021-02-15 | Release of the OpenAPI Specification 3.1.0 | 142 | | 3.1.0-rc1 | 2020-10-08 | rc1 of the 3.1 specification | 143 | | 3.1.0-rc0 | 2020-06-18 | rc0 of the 3.1 specification | 144 | | 3.0.3 | 2020-02-20 | Patch release of the OpenAPI Specification 3.0.3 | 145 | | 3.0.2 | 2018-10-08 | Patch release of the OpenAPI Specification 3.0.2 | 146 | | 3.0.1 | 2017-12-06 | Patch release of the OpenAPI Specification 3.0.1 | 147 | | 3.0.0 | 2017-07-26 | Release of the OpenAPI Specification 3.0.0 | 148 | | 3.0.0-rc2 | 2017-06-16 | rc2 of the 3.0 specification | 149 | | 3.0.0-rc1 | 2017-04-27 | rc1 of the 3.0 specification | 150 | | 3.0.0-rc0 | 2017-02-28 | Implementer's Draft of the 3.0 specification | 151 | | 2.0 | 2015-12-31 | Donation of Swagger 2.0 to the OpenAPI Initiative | 152 | | 2.0 | 2014-09-08 | Release of Swagger 2.0 | 153 | | 1.2 | 2014-03-14 | Initial release of the formal document. | 154 | | 1.1 | 2012-08-22 | Release of Swagger 1.1 | 155 | | 1.0 | 2011-08-10 | First release of the Swagger Specification | 156 | 157 |
158 | 159 |
160 | 161 |
162 | -------------------------------------------------------------------------------- /specification/respecConfig.js: -------------------------------------------------------------------------------- 1 | // Need to figure out how to make this https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/yaml.min.js 2 | // work with the example here https://github.com/speced/respec/wiki/pre-and-code-elements 3 | 4 | var respecConfig = { 5 | // preProcess: [loadYaml], 6 | // isPreview: true, 7 | format: "markdown", 8 | // maxTocLevel: 3, 9 | latestVersion: "https://oai.github.io/sig-moonwalk/moonwalk.html", 10 | edDraftURI: 11 | "https://github.com/OAI/sig-moonwalk/blob/main/specification/moonwalk-source.md", 12 | subtitle: "Version 4.0.0-draft", 13 | // publishDate: "yyyy-mm-dd", 14 | logos: [ 15 | { 16 | src: "https://raw.githubusercontent.com/OAI/OpenAPI-Style-Guide/master/graphics/bitmap/OpenAPI_Logo_Pantone.png", 17 | alt: "OpenAPI Initiative", 18 | height: 48, 19 | url: "https://openapis.org/", 20 | }, 21 | ], 22 | specStatus: "unofficial", // Use "unofficial" for unofficial drafts, "base" for official versions 23 | shortName: "moonwalk-draft", // This should become part of the latestVersion URL 24 | editors: [ 25 | { 26 | name: "TBD", 27 | }, 28 | ], 29 | otherLinks: [ 30 | { 31 | key: "Participate", 32 | data: [ 33 | { 34 | value: "GitHub Moonwalk", 35 | href: "https://github.com/OAI/sig-moonwalk/", 36 | }, 37 | { 38 | value: "File a bug", 39 | href: "https://github.com/OAI/sig-moonwalk/issues", 40 | }, 41 | { 42 | value: "Commit history", 43 | href: "https://github.com/OAI/sig-moonwalk/commits/main/specification/moonwalk-source.md", 44 | }, 45 | { 46 | value: "Pull requests", 47 | href: "https://github.com/OAI/sig-moonwalk/pulls", 48 | }, 49 | ], 50 | }, 51 | ], 52 | localBiblio: { 53 | CommonMark: { 54 | title: "CommonMark syntax", 55 | href: "https://spec.commonmark.org/", 56 | status: "Living Standard", 57 | publisher: "John MacFarlane", 58 | }, 59 | }, 60 | }; 61 | --------------------------------------------------------------------------------