From 38c4f5ab7a314375b1494d200422f3797d096b7b Mon Sep 17 00:00:00 2001 From: Bojan Rajh Date: Mon, 17 Jul 2023 15:51:08 +0200 Subject: [PATCH 1/3] Openapi --- src/api.md | 9 + src/components/OpenAPIViewer.vue | 184 ++++++++++++++++++ .../OpenApiViewerEndpointParameters.vue | 58 ++++++ .../OpenApiViewerEndpointPlayground.vue | 65 +++++++ .../OpenApiViewerEndpointResponses.vue | 30 +++ src/components/OpenApiViewerMagic.vue | 116 +++++++++++ src/components/OpenApiViewerUnref.vue | 19 ++ src/components/openApi/sample.ts | 57 ++++++ 8 files changed, 538 insertions(+) create mode 100644 src/api.md create mode 100644 src/components/OpenAPIViewer.vue create mode 100644 src/components/OpenApiViewerEndpointParameters.vue create mode 100644 src/components/OpenApiViewerEndpointPlayground.vue create mode 100644 src/components/OpenApiViewerEndpointResponses.vue create mode 100644 src/components/OpenApiViewerMagic.vue create mode 100644 src/components/OpenApiViewerUnref.vue create mode 100644 src/components/openApi/sample.ts diff --git a/src/api.md b/src/api.md new file mode 100644 index 00000000..389fd4de --- /dev/null +++ b/src/api.md @@ -0,0 +1,9 @@ +--- +aside: false +sidebar: false +--- + + + \ No newline at end of file diff --git a/src/components/OpenAPIViewer.vue b/src/components/OpenAPIViewer.vue new file mode 100644 index 00000000..aedd9c0e --- /dev/null +++ b/src/components/OpenAPIViewer.vue @@ -0,0 +1,184 @@ + + + + + \ No newline at end of file diff --git a/src/components/OpenApiViewerEndpointParameters.vue b/src/components/OpenApiViewerEndpointParameters.vue new file mode 100644 index 00000000..5d7a099a --- /dev/null +++ b/src/components/OpenApiViewerEndpointParameters.vue @@ -0,0 +1,58 @@ + + + \ No newline at end of file diff --git a/src/components/OpenApiViewerEndpointPlayground.vue b/src/components/OpenApiViewerEndpointPlayground.vue new file mode 100644 index 00000000..bd9750c6 --- /dev/null +++ b/src/components/OpenApiViewerEndpointPlayground.vue @@ -0,0 +1,65 @@ + + + \ No newline at end of file diff --git a/src/components/OpenApiViewerEndpointResponses.vue b/src/components/OpenApiViewerEndpointResponses.vue new file mode 100644 index 00000000..f9c9deb3 --- /dev/null +++ b/src/components/OpenApiViewerEndpointResponses.vue @@ -0,0 +1,30 @@ + + + \ No newline at end of file diff --git a/src/components/OpenApiViewerMagic.vue b/src/components/OpenApiViewerMagic.vue new file mode 100644 index 00000000..00878da5 --- /dev/null +++ b/src/components/OpenApiViewerMagic.vue @@ -0,0 +1,116 @@ + + + \ No newline at end of file diff --git a/src/components/OpenApiViewerUnref.vue b/src/components/OpenApiViewerUnref.vue new file mode 100644 index 00000000..b2d588a3 --- /dev/null +++ b/src/components/OpenApiViewerUnref.vue @@ -0,0 +1,19 @@ + + + \ No newline at end of file diff --git a/src/components/openApi/sample.ts b/src/components/openApi/sample.ts new file mode 100644 index 00000000..7ba7ff82 --- /dev/null +++ b/src/components/openApi/sample.ts @@ -0,0 +1,57 @@ +export class Sample { + hostname: string; + endpoint: string; + method: string; + + constructor(endpoint: string, method: string) { + this.endpoint = endpoint; + this.method = method; + this.hostname = 'http://localhost:8000'; + } +} + +export class PHPGuzzle extends Sample { + getCode() { + return `request('${this.method.toUpperCase()}', '${this.hostname}${this.endpoint}', [ + 'headers' => [ + 'Accept' => 'application/vnd.api+json, application/json', + 'Authorization' => '', + ], +]); + +echo $response->getBody();` + } +} + +export class HTTP extends Sample { + getCode() { + return `${this.method.toUpperCase()} ${this.endpoint} HTTP/1.1 +Accept: application/vnd.api+json, application/json +Authorization: +Host: ${this.hostname.split('//')[1]}` + } +} + +export class CURL extends Sample { + getCode() { + return `curl --request ${this.method.toUpperCase()} \\ + --url ${this.hostname}${this.endpoint} \\ + --header 'Accept: application/vnd.api+json, application/json' \\ + --header 'Authorization: '` + } +} + +export class Wget extends Sample { + getCode() { + return `wget --quiet \\ + --method ${this.method.toUpperCase()} \\ + --header 'Accept: application/vnd.api+json, application/json' \\ + --header 'Authorization: ' \\ + --output-document \\ + - ${this.hostname}${this.endpoint}`; + } +} \ No newline at end of file From 3604a4c02d01ec7c21bd504edf24dd83f9204b8b Mon Sep 17 00:00:00 2001 From: Bojan Rajh Date: Thu, 3 Aug 2023 14:11:02 +0200 Subject: [PATCH 2/3] More features --- pnpm-lock.yaml | 38 +++- src/components/OpenAPIViewer.vue | 170 ++++++++++-------- src/components/OpenApi.vue | 18 ++ .../OpenApiViewerEndpointParameters.vue | 10 +- .../OpenApiViewerEndpointResponses.vue | 12 +- src/components/OpenApiViewerMagic.vue | 97 +++++++--- .../OpenApiViewerSecuritySchemas.vue | 45 +++++ src/components/openApi/markdown.ts | 30 ++++ src/components/openApi/openApi.ts | 69 +++++++ src/components/openApi/symbol.ts | 1 + .../page/OpenApiViewerPageEndpoint.vue | 54 ++++++ .../page/OpenApiViewerPageResponse.vue | 23 +++ .../page/OpenApiViewerPageSchema.vue | 35 ++++ .../sidebar/OpenApiViewerSidebarEndpoints.vue | 48 +++++ .../sidebar/OpenApiViewerSidebarResponses.vue | 20 +++ .../sidebar/OpenApiViewerSidebarSchemas.vue | 20 +++ 16 files changed, 579 insertions(+), 111 deletions(-) create mode 100644 src/components/OpenApi.vue create mode 100644 src/components/OpenApiViewerSecuritySchemas.vue create mode 100644 src/components/openApi/markdown.ts create mode 100644 src/components/openApi/openApi.ts create mode 100644 src/components/openApi/symbol.ts create mode 100644 src/components/page/OpenApiViewerPageEndpoint.vue create mode 100644 src/components/page/OpenApiViewerPageResponse.vue create mode 100644 src/components/page/OpenApiViewerPageSchema.vue create mode 100644 src/components/sidebar/OpenApiViewerSidebarEndpoints.vue create mode 100644 src/components/sidebar/OpenApiViewerSidebarResponses.vue create mode 100644 src/components/sidebar/OpenApiViewerSidebarSchemas.vue diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d973e2a8..b4ce5138 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,9 @@ importers: cross-env: specifier: ^7.0.3 version: 7.0.3 + highlight.js: + specifier: ^11.8.0 + version: 11.8.0 terser: specifier: ^5.17.3 version: 5.17.3 @@ -141,6 +144,9 @@ importers: lorem-ipsum: specifier: ^2.0.8 version: 2.0.8 + markdown-it: + specifier: ^13.0.1 + version: 13.0.1 mermaid: specifier: ^10.2.3 version: 10.2.3 @@ -8833,6 +8839,11 @@ packages: tapable: 2.2.1 dev: true + /entities@3.0.1: + resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} + engines: {node: '>=0.12'} + dev: true + /envinfo@7.10.0: resolution: {integrity: sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==} engines: {node: '>=4'} @@ -9795,6 +9806,11 @@ packages: resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} dev: true + /highlight.js@11.8.0: + resolution: {integrity: sha512-MedQhoqVdr0U6SSnWPzfiadUcDHfN/Wzq25AkXiQv9oiOO/sG0S7XkvpFIqWBl9Yq1UYyYOOVORs5UW2XlPyzg==} + engines: {node: '>=12.0.0'} + dev: false + /history@4.10.1: resolution: {integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==} dependencies: @@ -11264,6 +11280,12 @@ packages: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true + /linkify-it@4.0.1: + resolution: {integrity: sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==} + dependencies: + uc.micro: 1.0.6 + dev: true + /liquid-json@0.3.1: resolution: {integrity: sha512-wUayTU8MS827Dam6MxgD72Ui+KOSF+u/eIqpatOtjnvgJ0+mnDq33uC2M7J0tPK+upe/DpUAuK4JUU89iBoNKQ==} engines: {node: '>=4'} @@ -11529,6 +11551,17 @@ packages: /mark.js@8.11.1: resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + /markdown-it@13.0.1: + resolution: {integrity: sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==} + hasBin: true + dependencies: + argparse: 2.0.1 + entities: 3.0.1 + linkify-it: 4.0.1 + mdurl: 1.0.1 + uc.micro: 1.0.6 + dev: true + /markdown-table@2.0.0: resolution: {integrity: sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==} dependencies: @@ -11714,7 +11747,6 @@ packages: /mdurl@1.0.1: resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} - dev: false /media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} @@ -14735,6 +14767,10 @@ packages: hasBin: true dev: true + /uc.micro@1.0.6: + resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} + dev: true + /ufo@1.1.2: resolution: {integrity: sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==} diff --git a/src/components/OpenAPIViewer.vue b/src/components/OpenAPIViewer.vue index aedd9c0e..53b4fba6 100644 --- a/src/components/OpenAPIViewer.vue +++ b/src/components/OpenAPIViewer.vue @@ -68,6 +68,11 @@ @apply bg-red; } } + + p { + margin: 0; + line-height: 125%; + } } @@ -76,51 +81,19 @@
-
- -
-
+ -
- -
-
-

{{ endpoint.summary }}

-
-
- {{ selectedMethod }} - http://localhost:8000/api{{ selectedPath }} -
-
-

{{ endpoint.description }}

- -

{{ endpoint.operationId }}

- -

Request

- - -

Response

- -
-
- -
-
- + + +
+ + + +
@@ -128,57 +101,102 @@ \ No newline at end of file diff --git a/src/components/OpenApi.vue b/src/components/OpenApi.vue new file mode 100644 index 00000000..d9ed5d9d --- /dev/null +++ b/src/components/OpenApi.vue @@ -0,0 +1,18 @@ + + + \ No newline at end of file diff --git a/src/components/OpenApiViewerEndpointParameters.vue b/src/components/OpenApiViewerEndpointParameters.vue index 5d7a099a..43d84cac 100644 --- a/src/components/OpenApiViewerEndpointParameters.vue +++ b/src/components/OpenApiViewerEndpointParameters.vue @@ -2,7 +2,7 @@
-

{{ group }} parameters

+

{{ niceGroupName(group) }}

@@ -28,7 +28,6 @@ const props = defineProps({ }) const getGroupedParameters = (endpoint: OpenAPIV3.PathItemObject) => { - console.log(endpoint); const groups = { header: [], query: [], @@ -55,4 +54,11 @@ const getGroupedParameters = (endpoint: OpenAPIV3.PathItemObject) => { return groups; } + +const niceGroupName = group => { + return { + query: 'Query Parameters', + path: 'Path Parameters', + }[group] || `${group} Parameters`; +} \ No newline at end of file diff --git a/src/components/OpenApiViewerEndpointResponses.vue b/src/components/OpenApiViewerEndpointResponses.vue index f9c9deb3..5409ca83 100644 --- a/src/components/OpenApiViewerEndpointResponses.vue +++ b/src/components/OpenApiViewerEndpointResponses.vue @@ -2,11 +2,12 @@
-
{{ code }} +
+ {{ code }}
- +
@@ -14,6 +15,8 @@ \ No newline at end of file diff --git a/src/components/OpenApiViewerMagic.vue b/src/components/OpenApiViewerMagic.vue index 00878da5..ea4998c3 100644 --- a/src/components/OpenApiViewerMagic.vue +++ b/src/components/OpenApiViewerMagic.vue @@ -1,78 +1,108 @@ + +