From 945608774abfe12e16b7ddc0d3bcf62a80aa0fb9 Mon Sep 17 00:00:00 2001 From: Michael Nahkies Date: Sun, 24 Nov 2024 20:17:47 +0000 Subject: [PATCH] docs: iterate on the documentation - quicker quick start - shorter pages - remove out of date architecture page - add more links --- README.md | 14 +- .../public/architecture.excalidraw | 2373 ----------------- .../public/architecture_core.svg | 21 - .../public/architecture_high_level.svg | 21 - .../public/architecture_templates.svg | 21 - packages/documentation/public/example.png | Bin 0 -> 94207 bytes .../src/pages/getting-started/quick-start.mdx | 145 +- .../client-templates/typescript-angular.mdx | 7 +- .../client-templates/typescript-axios.mdx | 6 +- .../client-templates/typescript-fetch.mdx | 5 +- .../authenticated-input-specifications.mdx | 86 + .../server-templates/typescript-koa.mdx | 7 +- .../src/pages/overview/about.mdx | 79 +- .../pages/overview/schema-first-design.mdx | 45 + .../src/pages/reference/architecture.mdx | 96 - .../src/pages/reference/cli-options.mdx | 63 +- packages/documentation/src/theme.config.tsx | 4 +- packages/openapi-code-generator/README.md | 5 +- packages/typescript-axios-runtime/README.md | 6 +- packages/typescript-fetch-runtime/README.md | 6 +- packages/typescript-koa-runtime/README.md | 6 +- 21 files changed, 315 insertions(+), 2701 deletions(-) delete mode 100644 packages/documentation/public/architecture.excalidraw delete mode 100644 packages/documentation/public/architecture_core.svg delete mode 100644 packages/documentation/public/architecture_high_level.svg delete mode 100644 packages/documentation/public/architecture_templates.svg create mode 100644 packages/documentation/public/example.png create mode 100644 packages/documentation/src/pages/guides/concepts/authenticated-input-specifications.mdx create mode 100644 packages/documentation/src/pages/overview/schema-first-design.mdx delete mode 100644 packages/documentation/src/pages/reference/architecture.mdx diff --git a/README.md b/README.md index fd2e60a8..8ac1d50f 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,17 @@ # @nahkies/openapi-code-generator -![CI/CD](https://github.com/mnahkies/openapi-code-generator/actions/workflows/ci.yml/badge.svg) +[![CI/CD](https://github.com/mnahkies/openapi-code-generator/actions/workflows/ci.yml/badge.svg)](https://github.com/mnahkies/openapi-code-generator/actions?query=branch%3Amain+event%3Apush) [![npm](https://img.shields.io/npm/v/@nahkies/openapi-code-generator.svg)](https://www.npmjs.com/package/@nahkies/openapi-code-generator) `@nahkies/openapi-code-generator` is a CLI tool that aims to generate high quality typescript client SDK's, -and API server scaffolding (routing, validation, serialization) from OpenAPI 3 specifications. +and API server scaffolding (routing, validation, serialization) from api specifications. Currently, [OpenAPI 3.0](https://swagger.io/specification/v3), [OpenAPI 3.1](https://swagger.io/specification/), -and [TypeSpec](https://typespec.io/) are supported an input specifications. +and [TypeSpec](https://typespec.io/) are supported as input specifications. + +With typescript templates for [koa](https://openapi-code-generator.nahkies.co.nz/guides/server-templates/typescript-koa), [fetch](https://openapi-code-generator.nahkies.co.nz/guides/client-templates/typescript-fetch), [axios](https://openapi-code-generator.nahkies.co.nz/guides/client-templates/typescript-axios), and [angular](https://openapi-code-generator.nahkies.co.nz/guides/client-templates/typescript-angular) currently available. + +The [fetch](https://openapi-code-generator.nahkies.co.nz/guides/client-templates/typescript-fetch) and [axios](https://openapi-code-generator.nahkies.co.nz/guides/client-templates/typescript-axios) templates work great in conjunction with [react-query](https://tanstack.com/query/latest) @@ -47,8 +51,6 @@ Scripts to refresh the test data live in [./scripts](./scripts) Contributing guidelines can be found in [./CONTRIBUTING.md](./CONTRIBUTING.md). -An overview of the codebase architecture is [available here](https://openapi-code-generator.nahkies.co.nz/reference/architecture) - ## License -See [./LICENSE](./LICENSE) +MIT Licensed, see [./LICENSE](./LICENSE) diff --git a/packages/documentation/public/architecture.excalidraw b/packages/documentation/public/architecture.excalidraw deleted file mode 100644 index ff0a857f..00000000 --- a/packages/documentation/public/architecture.excalidraw +++ /dev/null @@ -1,2373 +0,0 @@ -{ - "type": "excalidraw", - "version": 2, - "source": "https://excalidraw.com", - "elements": [ - { - "type": "rectangle", - "version": 88, - "versionNonce": 1840255760, - "isDeleted": false, - "id": "ZHIya36dvizs7W4E8l1Ps", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 360, - "y": 280, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 160, - "height": 60, - "seed": 1798814138, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [ - { - "type": "text", - "id": "Zl_XhKZzhPPI2BNSzTr6G" - }, - { - "id": "K7T_waKxAGsiFIppdTYyA", - "type": "arrow" - }, - { - "id": "tYHxWFX-Hrk9COBi0PAuw", - "type": "arrow" - } - ], - "updated": 1706357848443, - "link": null, - "locked": false - }, - { - "id": "Zl_XhKZzhPPI2BNSzTr6G", - "type": "text", - "x": 396.09166717529297, - "y": 298.5, - "width": 87.81666564941406, - "height": 23, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "#b2f2bb", - "fillStyle": "hachure", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "roundness": null, - "seed": 778648048, - "version": 29, - "versionNonce": 324691440, - "isDeleted": false, - "boundElements": null, - "updated": 1706357848443, - "link": null, - "locked": false, - "text": "file-loader", - "fontSize": 20, - "fontFamily": 2, - "textAlign": "center", - "verticalAlign": "middle", - "baseline": 17, - "containerId": "ZHIya36dvizs7W4E8l1Ps", - "originalText": "file-loader", - "lineHeight": 1.15 - }, - { - "type": "rectangle", - "version": 102, - "versionNonce": 418916336, - "isDeleted": false, - "id": "R5kXnqpMM_ut22QF9Nicy", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 360, - "y": 400, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 163, - "height": 60, - "seed": 2044916282, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [ - { - "id": "X6ausgGdMFt7K_FWl7Hfs", - "type": "arrow" - }, - { - "id": "iSlB09LC0smxRiZeVKXtK", - "type": "arrow" - }, - { - "type": "text", - "id": "ZQcT23-0h-EK2xt56NQfh" - }, - { - "id": "K7T_waKxAGsiFIppdTYyA", - "type": "arrow" - }, - { - "id": "lDpnoa9iqg4ycuu1zmtzj", - "type": "arrow" - }, - { - "id": "1KSdB3XVEKZC-W6ON94yk", - "type": "arrow" - } - ], - "updated": 1706357848443, - "link": null, - "locked": false - }, - { - "id": "ZQcT23-0h-EK2xt56NQfh", - "type": "text", - "x": 374.8000030517578, - "y": 418.5, - "width": 133.39999389648438, - "height": 23, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "#b2f2bb", - "fillStyle": "hachure", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "roundness": null, - "seed": 208076560, - "version": 13, - "versionNonce": 804425488, - "isDeleted": false, - "boundElements": null, - "updated": 1706357848443, - "link": null, - "locked": false, - "text": "openapi-loader", - "fontSize": 20, - "fontFamily": 2, - "textAlign": "center", - "verticalAlign": "middle", - "baseline": 17, - "containerId": "R5kXnqpMM_ut22QF9Nicy", - "originalText": "openapi-loader", - "lineHeight": 1.15 - }, - { - "type": "rectangle", - "version": 74, - "versionNonce": 2129538320, - "isDeleted": false, - "id": "ov3RkUv40LQ1zVzPwmtkW", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 580, - "y": 280, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 219.99999999999997, - "height": 60, - "seed": 456698938, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [ - { - "id": "lDpnoa9iqg4ycuu1zmtzj", - "type": "arrow" - }, - { - "type": "text", - "id": "9MZwYvcdCPtfXmk7czBzO" - } - ], - "updated": 1706357848443, - "link": null, - "locked": false - }, - { - "id": "9MZwYvcdCPtfXmk7czBzO", - "type": "text", - "x": 613.3000030517578, - "y": 298.5, - "width": 153.39999389648438, - "height": 23, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "#b2f2bb", - "fillStyle": "hachure", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "roundness": null, - "seed": 1658245104, - "version": 25, - "versionNonce": 1344465904, - "isDeleted": false, - "boundElements": null, - "updated": 1706357848443, - "link": null, - "locked": false, - "text": "openapi-validator", - "fontSize": 20, - "fontFamily": 2, - "textAlign": "center", - "verticalAlign": "middle", - "baseline": 17, - "containerId": "ov3RkUv40LQ1zVzPwmtkW", - "originalText": "openapi-validator", - "lineHeight": 1.15 - }, - { - "type": "arrow", - "version": 666, - "versionNonce": 1992289776, - "isDeleted": false, - "id": "K7T_waKxAGsiFIppdTYyA", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 441.03572862947874, - "y": 344, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 1.0855526872916244, - "height": 55.00000000000006, - "seed": 635250854, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1706357848444, - "link": null, - "locked": false, - "startBinding": { - "elementId": "ZHIya36dvizs7W4E8l1Ps", - "focus": -0.021178219048013012, - "gap": 4 - }, - "endBinding": { - "elementId": "R5kXnqpMM_ut22QF9Nicy", - "focus": -0.0263323816743043, - "gap": 1 - }, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "points": [ - [ - 0, - 0 - ], - [ - -1.0855526872916244, - 55.00000000000006 - ] - ] - }, - { - "type": "arrow", - "version": 424, - "versionNonce": 1207052560, - "isDeleted": false, - "id": "lDpnoa9iqg4ycuu1zmtzj", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 670.7841985194816, - "y": 341, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 176.38702570269595, - "height": 58, - "seed": 1271907002, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1706357848444, - "link": null, - "locked": false, - "startBinding": { - "elementId": "ov3RkUv40LQ1zVzPwmtkW", - "focus": -0.3729974719256632, - "gap": 1 - }, - "endBinding": { - "elementId": "R5kXnqpMM_ut22QF9Nicy", - "focus": -0.23955035565785154, - "gap": 1 - }, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "points": [ - [ - 0, - 0 - ], - [ - -176.38702570269595, - 58 - ] - ] - }, - { - "type": "rectangle", - "version": 231, - "versionNonce": 107786224, - "isDeleted": false, - "id": "AtYF0zw_V2TvjEolzBz7p", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 80, - "y": 400, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 179.99999999999997, - "height": 60, - "seed": 927195578, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [ - { - "type": "text", - "id": "hEZac3BT9fipXgpiyS_lS" - }, - { - "id": "iSlB09LC0smxRiZeVKXtK", - "type": "arrow" - } - ], - "updated": 1706357848444, - "link": null, - "locked": false - }, - { - "id": "hEZac3BT9fipXgpiyS_lS", - "type": "text", - "x": 107.20000076293944, - "y": 418.5, - "width": 125.5999984741211, - "height": 23, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "#b2f2bb", - "fillStyle": "hachure", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "roundness": null, - "seed": 30099728, - "version": 18, - "versionNonce": 1743423248, - "isDeleted": false, - "boundElements": null, - "updated": 1706357848444, - "link": null, - "locked": false, - "text": "openapi-types", - "fontSize": 20, - "fontFamily": 2, - "textAlign": "center", - "verticalAlign": "middle", - "baseline": 17, - "containerId": "AtYF0zw_V2TvjEolzBz7p", - "originalText": "openapi-types", - "lineHeight": 1.15 - }, - { - "type": "arrow", - "version": 406, - "versionNonce": 1697064208, - "isDeleted": false, - "id": "iSlB09LC0smxRiZeVKXtK", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 261, - "y": 438.62302483136693, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 93.21376615796083, - "height": 2.104148220593629, - "seed": 54394810, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1706357848444, - "link": null, - "locked": false, - "startBinding": { - "elementId": "AtYF0zw_V2TvjEolzBz7p", - "focus": 0.3333333333607734, - "gap": 1 - }, - "endBinding": { - "elementId": "R5kXnqpMM_ut22QF9Nicy", - "focus": -0.14285714285714443, - "gap": 5.786233842039167 - }, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "points": [ - [ - 0, - 0 - ], - [ - 93.21376615796083, - -2.104148220593629 - ] - ] - }, - { - "type": "rectangle", - "version": 74, - "versionNonce": 1075147760, - "isDeleted": false, - "id": "4nyuzpzu4P25Kr4CWtYLf", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 360, - "y": 520, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 160.00000000000003, - "height": 60, - "seed": 2067859878, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [ - { - "id": "BIzaPXBnqV-F6AyB8bZI_", - "type": "arrow" - }, - { - "id": "1KSdB3XVEKZC-W6ON94yk", - "type": "arrow" - }, - { - "id": "u4fqAc1tiIehj_Yu_wcvQ", - "type": "arrow" - }, - { - "type": "text", - "id": "uoUDtB5Jeus-9HoDDkTvJ" - } - ], - "updated": 1706357848444, - "link": null, - "locked": false - }, - { - "id": "uoUDtB5Jeus-9HoDDkTvJ", - "type": "text", - "x": 418.32500076293945, - "y": 538.5, - "width": 43.349998474121094, - "height": 23, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "#b2f2bb", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "roundness": null, - "seed": 146977552, - "version": 5, - "versionNonce": 220201744, - "isDeleted": false, - "boundElements": null, - "updated": 1706357848444, - "link": null, - "locked": false, - "text": "input", - "fontSize": 20, - "fontFamily": 2, - "textAlign": "center", - "verticalAlign": "middle", - "baseline": 17, - "containerId": "4nyuzpzu4P25Kr4CWtYLf", - "originalText": "input", - "lineHeight": 1.15 - }, - { - "type": "rectangle", - "version": 54, - "versionNonce": 1045242128, - "isDeleted": false, - "id": "TK_NiD-HeB6tvcET-r1c2", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 20, - "y": 500, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 260, - "height": 80, - "seed": 1980754298, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [ - { - "id": "BIzaPXBnqV-F6AyB8bZI_", - "type": "arrow" - }, - { - "type": "text", - "id": "hd1PxAFiERfWq5KFFWaSm" - } - ], - "updated": 1706357848444, - "link": null, - "locked": false - }, - { - "id": "hd1PxAFiERfWq5KFFWaSm", - "type": "text", - "x": 34.958335876464844, - "y": 528.5, - "width": 230.0833282470703, - "height": 23, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "#b2f2bb", - "fillStyle": "hachure", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "roundness": null, - "seed": 800058864, - "version": 14, - "versionNonce": 1901934576, - "isDeleted": false, - "boundElements": null, - "updated": 1706357848444, - "link": null, - "locked": false, - "text": "openapi-types-normalized", - "fontSize": 20, - "fontFamily": 2, - "textAlign": "center", - "verticalAlign": "middle", - "baseline": 17, - "containerId": "TK_NiD-HeB6tvcET-r1c2", - "originalText": "openapi-types-normalized", - "lineHeight": 1.15 - }, - { - "type": "arrow", - "version": 998, - "versionNonce": 315668976, - "isDeleted": false, - "id": "BIzaPXBnqV-F6AyB8bZI_", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 285.7093759698405, - "y": 548.571140089658, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 69.12630005188953, - "height": 0.24994023828412537, - "seed": 715110394, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1706357848444, - "link": null, - "locked": false, - "startBinding": { - "elementId": "TK_NiD-HeB6tvcET-r1c2", - "focus": 0.19966510672387305, - "gap": 5.709375969840494 - }, - "endBinding": { - "elementId": "4nyuzpzu4P25Kr4CWtYLf", - "focus": 0.028755763352491352, - "gap": 5.164323978269977 - }, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "points": [ - [ - 0, - 0 - ], - [ - 69.12630005188953, - 0.24994023828412537 - ] - ] - }, - { - "type": "arrow", - "version": 601, - "versionNonce": 1260657936, - "isDeleted": false, - "id": "1KSdB3XVEKZC-W6ON94yk", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 440, - "y": 460, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 0.5635760323452814, - "height": 60, - "seed": 1720668262, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1706357848444, - "link": null, - "locked": false, - "startBinding": { - "elementId": "R5kXnqpMM_ut22QF9Nicy", - "focus": 0.0217871002749449, - "gap": 1 - }, - "endBinding": { - "elementId": "4nyuzpzu4P25Kr4CWtYLf", - "focus": 0.01052996039833623, - "gap": 1 - }, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "points": [ - [ - 0, - 0 - ], - [ - 0.5635760323452814, - 60 - ] - ] - }, - { - "type": "arrow", - "version": 1314, - "versionNonce": 2122578928, - "isDeleted": false, - "id": "u4fqAc1tiIehj_Yu_wcvQ", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 441.55044242425737, - "y": 620, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 1.1475541733148589, - "height": 57.999999999999886, - "seed": 1705620346, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1706357848444, - "link": null, - "locked": false, - "startBinding": { - "elementId": "K6EmNIIr04ELJtsa6SQor", - "focus": -0.0627896376388875, - "gap": 1 - }, - "endBinding": { - "elementId": "q85OEceL3Dml0KaBBRJD5", - "focus": 0.039692542246244765, - "gap": 2.0000000000001137 - }, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "points": [ - [ - 0, - 0 - ], - [ - -1.1475541733148589, - 57.999999999999886 - ] - ] - }, - { - "type": "rectangle", - "version": 163, - "versionNonce": 415103760, - "isDeleted": false, - "id": "q85OEceL3Dml0KaBBRJD5", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 0, - "y": 680, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 840, - "height": 358.99999999999994, - "seed": 1603992038, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [ - { - "id": "GUlxqsr-PdsTFXhkHoRo3", - "type": "arrow" - }, - { - "id": "u4fqAc1tiIehj_Yu_wcvQ", - "type": "arrow" - } - ], - "updated": 1706357848444, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 157, - "versionNonce": 1451163120, - "isDeleted": false, - "id": "p-134JBsqHcHMf_aUmlIZ", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 20, - "y": 700, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 266.70001220703125, - "height": 23, - "seed": 1247733754, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1706357848444, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 2, - "text": "(typescript) template functions", - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "(typescript) template functions", - "lineHeight": 1.15, - "baseline": 17 - }, - { - "type": "rectangle", - "version": 114, - "versionNonce": 325851408, - "isDeleted": false, - "id": "K6EmNIIr04ELJtsa6SQor", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 0, - "y": 100, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 840, - "height": 520, - "seed": 254637882, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [ - { - "id": "u4fqAc1tiIehj_Yu_wcvQ", - "type": "arrow" - } - ], - "updated": 1706357848444, - "link": null, - "locked": false - }, - { - "type": "rectangle", - "version": 185, - "versionNonce": 1750508528, - "isDeleted": false, - "id": "dSaffHWPtRrtRM1bi1XKM", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": -900, - "y": 100, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 800, - "height": 200, - "seed": 2104511760, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1706358381449, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 80, - "versionNonce": 1003077616, - "isDeleted": false, - "id": "mK8f0X-omOw3HLZh2iloV", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 20, - "y": 120, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 98.91666412353516, - "height": 23, - "seed": 1144000314, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1706357848444, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 2, - "text": "core library", - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "core library", - "lineHeight": 1.15, - "baseline": 17 - }, - { - "type": "rectangle", - "version": 163, - "versionNonce": 245790480, - "isDeleted": false, - "id": "9IWARcQMMEgDrGOcX3mCB", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 40, - "y": 760, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 217.00000000000003, - "height": 60, - "seed": 1558419898, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [ - { - "type": "text", - "id": "hQ4Mcm5D-q69Zfn-ZQzm0" - }, - { - "id": "ZmJ-Y-ZLg9-FZYu-dxtU2", - "type": "arrow" - } - ], - "updated": 1706357848444, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 85, - "versionNonce": 1852588528, - "isDeleted": false, - "id": "hQ4Mcm5D-q69Zfn-ZQzm0", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 80.71666717529298, - "y": 778.5, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 135.56666564941406, - "height": 23, - "seed": 1386304270, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1706357848444, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 2, - "text": "typescript-fetch", - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "9IWARcQMMEgDrGOcX3mCB", - "originalText": "typescript-fetch", - "lineHeight": 1.15, - "baseline": 17 - }, - { - "type": "rectangle", - "version": 109, - "versionNonce": 786765072, - "isDeleted": false, - "id": "Ucq1XheJGAV0LdCc8BgyJ", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 300, - "y": 760, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 243.99999999999997, - "height": 60, - "seed": 590497530, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [ - { - "type": "text", - "id": "diC5CTUe4M3J7qlbTU-rC" - }, - { - "id": "BocdCzXUV2MnkQO80x811", - "type": "arrow" - } - ], - "updated": 1706357848444, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 66, - "versionNonce": 1835959280, - "isDeleted": false, - "id": "diC5CTUe4M3J7qlbTU-rC", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 342.53333282470703, - "y": 778.5, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 158.93333435058594, - "height": 23, - "seed": 1368196498, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1706357848444, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 2, - "text": "typescript-angular", - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "Ucq1XheJGAV0LdCc8BgyJ", - "originalText": "typescript-angular", - "lineHeight": 1.15, - "baseline": 17 - }, - { - "type": "rectangle", - "version": 106, - "versionNonce": 1235219216, - "isDeleted": false, - "id": "VxwNqg1GJMs-XSosrT4Dy", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 580, - "y": 400, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 220.00000000000006, - "height": 60, - "seed": 1164191930, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [ - { - "type": "text", - "id": "FSAlpl_DZeiy7vXDfsK4P" - }, - { - "id": "X6ausgGdMFt7K_FWl7Hfs", - "type": "arrow" - } - ], - "updated": 1706357848444, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 37, - "versionNonce": 383288816, - "isDeleted": false, - "id": "FSAlpl_DZeiy7vXDfsK4P", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 629.4166679382324, - "y": 418.5, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 121.16666412353516, - "height": 23, - "seed": 1160298194, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1706357848444, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 2, - "text": "generation-lib", - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "VxwNqg1GJMs-XSosrT4Dy", - "originalText": "generation-lib", - "lineHeight": 1.15, - "baseline": 17 - }, - { - "type": "arrow", - "version": 487, - "versionNonce": 1162809616, - "isDeleted": false, - "id": "X6ausgGdMFt7K_FWl7Hfs", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 580, - "y": 440, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 60, - "height": 0, - "seed": 1918302010, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1706357848444, - "link": null, - "locked": false, - "startBinding": { - "elementId": "VxwNqg1GJMs-XSosrT4Dy", - "focus": -0.3333333333333333, - "gap": 1 - }, - "endBinding": null, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "points": [ - [ - 0, - 0 - ], - [ - -60, - 0 - ] - ] - }, - { - "type": "rectangle", - "version": 98, - "versionNonce": 1202866160, - "isDeleted": false, - "id": "DU372PL-Ksq98Y0XEszuX", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 340, - "y": 140, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 200, - "height": 60, - "seed": 1695068306, - "groupIds": [], - "frameId": null, - "roundness": { - "type": 3 - }, - "boundElements": [ - { - "type": "text", - "id": "3bboc2pcnrVRpm7VcGqsE" - }, - { - "id": "-hWdjvq5_RiQbU-5PXwXX", - "type": "arrow" - } - ], - "updated": 1706357848444, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 97, - "versionNonce": 2037018384, - "isDeleted": false, - "id": "3bboc2pcnrVRpm7VcGqsE", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 392.21666717529297, - "y": 158.5, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 95.56666564941406, - "height": 23, - "seed": 1528594962, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1706357848444, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 2, - "text": "Entry point", - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "DU372PL-Ksq98Y0XEszuX", - "originalText": "Entry point", - "lineHeight": 1.15, - "baseline": 17 - }, - { - "type": "rectangle", - "version": 133, - "versionNonce": 2080623088, - "isDeleted": false, - "id": "KcTGkJLnnUI-9Fm7WMOZ0", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 620, - "y": 140, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 180, - "height": 60, - "seed": 927332818, - "groupIds": [], - "frameId": null, - "roundness": { - "type": 3 - }, - "boundElements": [ - { - "type": "text", - "id": "3Zx6URc7zFTOKRiOsUsuu" - }, - { - "id": "-hWdjvq5_RiQbU-5PXwXX", - "type": "arrow" - } - ], - "updated": 1706357848444, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 143, - "versionNonce": 241831184, - "isDeleted": false, - "id": "3Zx6URc7zFTOKRiOsUsuu", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 683.3250007629395, - "y": 158.5, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 53.349998474121094, - "height": 23, - "seed": 466284434, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1706357848444, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 2, - "text": "config", - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "KcTGkJLnnUI-9Fm7WMOZ0", - "originalText": "config", - "lineHeight": 1.15, - "baseline": 17 - }, - { - "type": "arrow", - "version": 785, - "versionNonce": 1859455984, - "isDeleted": false, - "id": "-hWdjvq5_RiQbU-5PXwXX", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 615.5, - "y": 170.6817249977949, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 72.49999999999989, - "height": 1.3074266897928624, - "seed": 20157006, - "groupIds": [], - "frameId": null, - "roundness": { - "type": 2 - }, - "boundElements": [], - "updated": 1706357848444, - "link": null, - "locked": false, - "startBinding": { - "elementId": "KcTGkJLnnUI-9Fm7WMOZ0", - "gap": 4.5, - "focus": 0.03233269470479317 - }, - "endBinding": { - "elementId": "DU372PL-Ksq98Y0XEszuX", - "gap": 3, - "focus": 0.12094951017332375 - }, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "points": [ - [ - 0, - 0 - ], - [ - -72.49999999999989, - 1.3074266897928624 - ] - ] - }, - { - "type": "arrow", - "version": 1114, - "versionNonce": 1573251856, - "isDeleted": false, - "id": "tYHxWFX-Hrk9COBi0PAuw", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 440.97268677577375, - "y": 199.46471784274092, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 0.9726867757737523, - "height": 80.53528215725908, - "seed": 1119341330, - "groupIds": [], - "frameId": null, - "roundness": { - "type": 2 - }, - "boundElements": [], - "updated": 1706357848444, - "link": null, - "locked": false, - "startBinding": null, - "endBinding": { - "elementId": "ZHIya36dvizs7W4E8l1Ps", - "focus": -0.004508743657926648, - "gap": 1 - }, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "points": [ - [ - 0, - 0 - ], - [ - -0.9726867757737523, - 80.53528215725908 - ] - ] - }, - { - "type": "rectangle", - "version": 171, - "versionNonce": 976096752, - "isDeleted": false, - "id": "hRVO-RZtLp_oyckWuhp2k", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 580, - "y": 760, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 219.99999999999997, - "height": 60, - "seed": 1335947150, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [ - { - "type": "text", - "id": "DqsIoRZtHRQkpfGONDpFW" - }, - { - "id": "p_nR6MPzBZ25G5Wj4e3os", - "type": "arrow" - } - ], - "updated": 1706357848444, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 133, - "versionNonce": 1375078672, - "isDeleted": false, - "id": "DqsIoRZtHRQkpfGONDpFW", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 627.7666664123535, - "y": 778.5, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 124.46666717529297, - "height": 23, - "seed": 892849614, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1706357848444, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 2, - "text": "typescript-koa", - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "hRVO-RZtLp_oyckWuhp2k", - "originalText": "typescript-koa", - "lineHeight": 1.15, - "baseline": 17 - }, - { - "type": "rectangle", - "version": 191, - "versionNonce": 1997983728, - "isDeleted": false, - "id": "g9jqIPlnyUY5TJDRTzqLX", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 300, - "y": 920, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 239.99999999999997, - "height": 60, - "seed": 1865631118, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [ - { - "type": "text", - "id": "i72YMyiOe5Kmu6hewYZ-U" - }, - { - "id": "BocdCzXUV2MnkQO80x811", - "type": "arrow" - }, - { - "id": "p_nR6MPzBZ25G5Wj4e3os", - "type": "arrow" - }, - { - "id": "ZmJ-Y-ZLg9-FZYu-dxtU2", - "type": "arrow" - } - ], - "updated": 1706357848444, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 152, - "versionNonce": 1181902608, - "isDeleted": false, - "id": "i72YMyiOe5Kmu6hewYZ-U", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 381.65833282470703, - "y": 938.5, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 76.68333435058594, - "height": 23, - "seed": 470770638, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1706357848444, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 2, - "text": "common", - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "g9jqIPlnyUY5TJDRTzqLX", - "originalText": "common", - "lineHeight": 1.15, - "baseline": 17 - }, - { - "type": "arrow", - "version": 307, - "versionNonce": 1570198000, - "isDeleted": false, - "id": "ZmJ-Y-ZLg9-FZYu-dxtU2", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 320, - "y": 920, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 118.49965846474282, - "height": 99.70906645879154, - "seed": 288653394, - "groupIds": [], - "frameId": null, - "roundness": { - "type": 2 - }, - "boundElements": [], - "updated": 1706357848444, - "link": null, - "locked": false, - "startBinding": { - "elementId": "g9jqIPlnyUY5TJDRTzqLX", - "focus": -0.4133946365455086, - "gap": 1 - }, - "endBinding": { - "elementId": "9IWARcQMMEgDrGOcX3mCB", - "focus": -0.11793636369420542, - "gap": 1 - }, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "points": [ - [ - 0, - 0 - ], - [ - -118.49965846474282, - -99.70906645879154 - ] - ] - }, - { - "type": "arrow", - "version": 294, - "versionNonce": 1739785488, - "isDeleted": false, - "id": "BocdCzXUV2MnkQO80x811", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 420, - "y": 920, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 0, - "height": 100, - "seed": 812829966, - "groupIds": [], - "frameId": null, - "roundness": { - "type": 2 - }, - "boundElements": [], - "updated": 1706357848444, - "link": null, - "locked": false, - "startBinding": { - "elementId": "g9jqIPlnyUY5TJDRTzqLX", - "focus": 0, - "gap": 1 - }, - "endBinding": { - "elementId": "Ucq1XheJGAV0LdCc8BgyJ", - "focus": 0.01639344262295082, - "gap": 1 - }, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "points": [ - [ - 0, - 0 - ], - [ - 0, - -100 - ] - ] - }, - { - "type": "arrow", - "version": 312, - "versionNonce": 1689752560, - "isDeleted": false, - "id": "p_nR6MPzBZ25G5Wj4e3os", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 520, - "y": 920, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 136.72832887562276, - "height": 99.97437261715527, - "seed": 1762961166, - "groupIds": [], - "frameId": null, - "roundness": { - "type": 2 - }, - "boundElements": [], - "updated": 1706357848444, - "link": null, - "locked": false, - "startBinding": { - "elementId": "g9jqIPlnyUY5TJDRTzqLX", - "focus": 0.366213426123206, - "gap": 1 - }, - "endBinding": { - "elementId": "hRVO-RZtLp_oyckWuhp2k", - "focus": -0.05159532531852169, - "gap": 1 - }, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "points": [ - [ - 0, - 0 - ], - [ - 136.72832887562276, - -99.97437261715527 - ] - ] - }, - { - "type": "rectangle", - "version": 223, - "versionNonce": 321905424, - "isDeleted": false, - "id": "fZX9vbN9p7wjjg83NWwnA", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 0, - "y": 1100, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 840, - "height": 199.99999999999997, - "seed": 281427982, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [ - { - "id": "GUlxqsr-PdsTFXhkHoRo3", - "type": "arrow" - } - ], - "updated": 1706357848444, - "link": null, - "locked": false - }, - { - "type": "rectangle", - "version": 142, - "versionNonce": 1652528624, - "isDeleted": false, - "id": "awXUYo05jebJQpaFSzONs", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 240, - "y": 1160, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 203, - "height": 72, - "seed": 1628708174, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [ - { - "type": "text", - "id": "j_qrJfMPbsc0idrqJCs2d" - } - ], - "updated": 1706357848444, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 121, - "versionNonce": 929104144, - "isDeleted": false, - "id": "j_qrJfMPbsc0idrqJCs2d", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 270.3833312988281, - "y": 1173, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 142.23333740234375, - "height": 46, - "seed": 2132412750, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1706357848444, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 2, - "text": "typescript-fetch-\nruntime", - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "awXUYo05jebJQpaFSzONs", - "originalText": "typescript-fetch-runtime", - "lineHeight": 1.15, - "baseline": 40 - }, - { - "type": "rectangle", - "version": 185, - "versionNonce": 737630192, - "isDeleted": false, - "id": "VyvKtY-eGEOP7bvo9R3FX", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 500, - "y": 1160, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 203, - "height": 72, - "seed": 502377678, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [ - { - "type": "text", - "id": "UzwVLjPK7E2Zk66NyXcwR" - } - ], - "updated": 1706357848444, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 169, - "versionNonce": 868114192, - "isDeleted": false, - "id": "UzwVLjPK7E2Zk66NyXcwR", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 535.9333343505859, - "y": 1173, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 131.13333129882812, - "height": 46, - "seed": 218030862, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1706357848444, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 2, - "text": "typescript-koa-\nruntime", - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "VyvKtY-eGEOP7bvo9R3FX", - "originalText": "typescript-koa-runtime", - "lineHeight": 1.15, - "baseline": 40 - }, - { - "type": "text", - "version": 39, - "versionNonce": 891738608, - "isDeleted": false, - "id": "Ywk__TU1rUG9cD6FJg49r", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 20, - "y": 1120, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 157.81666564941406, - "height": 23, - "seed": 798654350, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1706357848444, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 2, - "text": "runtime packages", - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "runtime packages", - "lineHeight": 1.15, - "baseline": 17 - }, - { - "id": "GUlxqsr-PdsTFXhkHoRo3", - "type": "arrow", - "x": 440.24928632370325, - "y": 1040, - "width": 0.20366296017368768, - "height": 59, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "#b2f2bb", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "roundness": null, - "seed": 49957872, - "version": 187, - "versionNonce": 383832560, - "isDeleted": false, - "boundElements": null, - "updated": 1706358207856, - "link": null, - "locked": false, - "points": [ - [ - 0, - 0 - ], - [ - -0.20366296017368768, - 59 - ] - ], - "lastCommittedPoint": null, - "startBinding": { - "elementId": "q85OEceL3Dml0KaBBRJD5", - "focus": -0.04962288010102902, - "gap": 1 - }, - "endBinding": { - "elementId": "fZX9vbN9p7wjjg83NWwnA", - "focus": 0.046859058676779454, - "gap": 1 - }, - "startArrowhead": "arrow", - "endArrowhead": null - }, - { - "type": "text", - "version": 103, - "versionNonce": 1148070160, - "isDeleted": false, - "id": "ZH6prHN9fFfmXqb38NZTC", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": -880, - "y": 120, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 84.48332977294922, - "height": 23, - "seed": 209042704, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1706358332616, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 2, - "text": "high level", - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "high level", - "lineHeight": 1.15, - "baseline": 17 - }, - { - "type": "rectangle", - "version": 187, - "versionNonce": 1556092176, - "isDeleted": false, - "id": "rVsHgQ3ZsTuXSKzISTkXa", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": -880, - "y": 160, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 200, - "height": 80, - "seed": 794909168, - "groupIds": [], - "frameId": null, - "roundness": { - "type": 3 - }, - "boundElements": [ - { - "type": "text", - "id": "BuglQ-gnrWwlNiqumejcs" - }, - { - "id": "FB4wjZPb_UimW1HmCNFUR", - "type": "arrow" - } - ], - "updated": 1706358373572, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 207, - "versionNonce": 1604624880, - "isDeleted": false, - "id": "BuglQ-gnrWwlNiqumejcs", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": -829.4583320617676, - "y": 188.5, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 98.91666412353516, - "height": 23, - "seed": 39920, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1706358406422, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 2, - "text": "read config", - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "rVsHgQ3ZsTuXSKzISTkXa", - "originalText": "read config", - "lineHeight": 1.15, - "baseline": 17 - }, - { - "type": "rectangle", - "version": 198, - "versionNonce": 1784922384, - "isDeleted": false, - "id": "oPlNwDWU15MSudhi1tqOP", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": -600, - "y": 160, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 200, - "height": 80, - "seed": 388211696, - "groupIds": [], - "frameId": null, - "roundness": { - "type": 3 - }, - "boundElements": [ - { - "type": "text", - "id": "bdY5xd8UBxwHD1xbO_jJm" - }, - { - "id": "FB4wjZPb_UimW1HmCNFUR", - "type": "arrow" - }, - { - "id": "bOT_b6jnQVE6UZ1_IPZkA", - "type": "arrow" - } - ], - "updated": 1706358374722, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 223, - "versionNonce": 2033824528, - "isDeleted": false, - "id": "bdY5xd8UBxwHD1xbO_jJm", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": -557.25, - "y": 188.5, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 114.5, - "height": 23, - "seed": 424465168, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": null, - "updated": 1706358401311, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 2, - "text": "load openapi", - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "oPlNwDWU15MSudhi1tqOP", - "originalText": "load openapi", - "lineHeight": 1.15, - "baseline": 17 - }, - { - "type": "rectangle", - "version": 210, - "versionNonce": 1808317936, - "isDeleted": false, - "id": "9hW_9ugop9LpKmEPTUG7j", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": -320, - "y": 160, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 200, - "height": 80, - "seed": 513482736, - "groupIds": [], - "frameId": null, - "roundness": { - "type": 3 - }, - "boundElements": [ - { - "type": "text", - "id": "jreguVlfevBioZWS8u_jO" - }, - { - "id": "bOT_b6jnQVE6UZ1_IPZkA", - "type": "arrow" - } - ], - "updated": 1706358376589, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 246, - "versionNonce": 920220432, - "isDeleted": false, - "id": "jreguVlfevBioZWS8u_jO", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": -290.0166702270508, - "y": 188.5, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 140.03334045410156, - "height": 23, - "seed": 68884240, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": null, - "updated": 1706358410061, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 2, - "text": "render template", - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "9hW_9ugop9LpKmEPTUG7j", - "originalText": "render template", - "lineHeight": 1.15, - "baseline": 17 - }, - { - "id": "FB4wjZPb_UimW1HmCNFUR", - "type": "arrow", - "x": -680, - "y": 200, - "width": 78, - "height": 1.9747996693722882, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "roundness": null, - "seed": 1078757872, - "version": 50, - "versionNonce": 211415824, - "isDeleted": false, - "boundElements": null, - "updated": 1706358378088, - "link": null, - "locked": false, - "points": [ - [ - 0, - 0 - ], - [ - 78, - 1.9747996693722882 - ] - ], - "lastCommittedPoint": null, - "startBinding": { - "elementId": "rVsHgQ3ZsTuXSKzISTkXa", - "focus": -0.05952710156665896, - "gap": 1 - }, - "endBinding": { - "elementId": "oPlNwDWU15MSudhi1tqOP", - "focus": -0.10714878281998613, - "gap": 2 - }, - "startArrowhead": null, - "endArrowhead": "arrow" - }, - { - "id": "bOT_b6jnQVE6UZ1_IPZkA", - "type": "arrow", - "x": -400, - "y": 201.16357629710373, - "width": 78, - "height": 0.000007949080327307456, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "roundness": null, - "seed": 470771184, - "version": 94, - "versionNonce": 2024802576, - "isDeleted": false, - "boundElements": null, - "updated": 1706358379312, - "link": null, - "locked": false, - "points": [ - [ - 0, - 0 - ], - [ - 78, - 0.000007949080327307456 - ] - ], - "lastCommittedPoint": null, - "startBinding": { - "elementId": "oPlNwDWU15MSudhi1tqOP", - "focus": 0.029089145238097136, - "gap": 1 - }, - "endBinding": { - "elementId": "9hW_9ugop9LpKmEPTUG7j", - "focus": -0.029089858616919113, - "gap": 2 - }, - "startArrowhead": null, - "endArrowhead": "arrow" - } - ], - "appState": { - "gridSize": 20, - "viewBackgroundColor": "#ffffff" - }, - "files": {} -} \ No newline at end of file diff --git a/packages/documentation/public/architecture_core.svg b/packages/documentation/public/architecture_core.svg deleted file mode 100644 index 8cdc8e40..00000000 --- a/packages/documentation/public/architecture_core.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - file-loaderopenapi-loaderopenapi-validatoropenapi-typesinputopenapi-types-normalizedcore librarygeneration-libEntry pointconfig \ No newline at end of file diff --git a/packages/documentation/public/architecture_high_level.svg b/packages/documentation/public/architecture_high_level.svg deleted file mode 100644 index 92ed979f..00000000 --- a/packages/documentation/public/architecture_high_level.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - high levelread configload openapirender template \ No newline at end of file diff --git a/packages/documentation/public/architecture_templates.svg b/packages/documentation/public/architecture_templates.svg deleted file mode 100644 index eb6c9de2..00000000 --- a/packages/documentation/public/architecture_templates.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - (typescript) template functionstypescript-fetchtypescript-angulartypescript-koacommontypescript-fetch-runtimetypescript-koa-runtimeruntime packages \ No newline at end of file diff --git a/packages/documentation/public/example.png b/packages/documentation/public/example.png new file mode 100644 index 0000000000000000000000000000000000000000..4acafe41233283417e7e638a1f475a74e04c5dba GIT binary patch literal 94207 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

g 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%0DoYWIy^Eb#KD51 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

ovOX`NY)4O?AxC{x13S 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 literal 0 HcmV?d00001 diff --git a/packages/documentation/src/pages/getting-started/quick-start.mdx b/packages/documentation/src/pages/getting-started/quick-start.mdx index 47e50ed5..7b2bfe29 100644 --- a/packages/documentation/src/pages/getting-started/quick-start.mdx +++ b/packages/documentation/src/pages/getting-started/quick-start.mdx @@ -1,39 +1,130 @@ -import {Steps} from 'nextra/components' +import {Steps, Tabs} from "nextra/components" -# Requirements +# Quick Start Install the latest [NodeJS LTS release](https://nodejs.org/en/download), though any recent version of NodeJS will likely work. +You'll also need either an OpenAPI v3 / v3.1, or TypeSpec API specification to generate from. You can +provide OpenAPI specifications as YAML or JSON, local files or remote urls - we'll load them all! 🚀 + +Cross-file references are also supported, so don't worry about pre-processing the input. + You can check the version we develop and test against [here](https://github.com/mnahkies/openapi-code-generator/blob/main/.github/workflows/ci.yml#L17). -# Installation +Fetch Client,

Axios Client

,

Koa Server

]}> + + + {

Install dependencies

} + First install the CLI and the required runtime packages to your project: + ```sh npm2yarn + npm i --dev @nahkies/openapi-code-generator + npm i @nahkies/typescript-fetch-runtime + ``` + + You could also install the CLI globally if you prefer, but it's best to version it per project. + + {

Run generation

} + This will generate the client to `./src/generated/clients/some-service` + + You can provide either a local file path or url for the input file. + ```sh npm2yarn + npm run openapi-code-generator \ + --input ./openapi.yaml \ # or https://example.com/openapi.{json,yaml} + --output ./src/generated/clients/some-service \ + --template typescript-fetch + ``` + {

Profit

} + Use your new type-safe client, and never worry about making a typo in a url or parameter name again. + Let the typescript compiler take care of checking that for you. + + See [Guide to typescript-fetch client template](../guides/client-templates/typescript-fetch) for more details. +
+
+ + + + {

Install dependencies

} + First install the CLI and the required runtime packages to your project: + ```sh npm2yarn + npm i --dev @nahkies/openapi-code-generator + npm i axios @nahkies/typescript-axios-runtime + ``` + You could also install the CLI globally if you prefer, but it's best to version it per project. + + {

Run generation

} + This will generate the client to `./src/generated/clients/some-service` + + You can provide either a local file path or url for the input file. + ```sh npm2yarn + npm run openapi-code-generator \ + --input ./openapi.yaml \ # or https://example.com/openapi.{json,yaml} + --output ./src/generated/clients/some-service \ + --template typescript-axios + ``` + + {

Profit

} + Use your new type-safe client, and never worry about making a typo in a url or parameter name again. + Let the typescript compiler take care of checking that for you. + + See [Guide to typescript-axios client template](../guides/client-templates/typescript-axios) for more details. +
+
+ + + + {

Install dependencies

} + First install the CLI and the required runtime packages to your project: + ```sh npm2yarn + npm i --dev @nahkies/openapi-code-generator @types/koa @types/koa__router + npm i @nahkies/typescript-koa-runtime @koa/cors @koa/router koa koa-body zod + ``` + You could also install the CLI globally if you prefer, but it's best to version it per project. + + You can provide either a local file path or url for the input file. + + {

Run generation

} + This will generate the server router and validation logic to `./src/generated` + ```sh npm2yarn + npm run openapi-code-generator \ + --input ./openapi.yaml \ # or https://example.com/openapi.{json,yaml} + --output ./src/generated \ + --template typescript-koa + ``` + + {

Profit

} + Implement handlers for your server, and be confident that they match what the client expects. Everything + will be strongly typed, so typos are surfaced at development time, not runtime. + + By default the runtime validation is using zod. - - ### Install the cli - First we must install the cli package. It's recommended to install this as a `devDependency` in each project that - depends on it, though you could also install it globally if you prefer. - ```sh npm2yarn - npm i -D @nahkies/openapi-code-generator - ``` + See [Guide to typescript-koa client template](../guides/server-templates/typescript-koa) for more details. + +
+ - ### (Optional) For typespec support - If you want to use [typespec](https://typespec.io/) instead of [openapi3](https://spec.openapis.org/oas/latest.html) - as your input specifications, additionally install the typespec compiler and supporting packages. +## CLI options +See the [cli reference](../reference/cli-options) for the full range of supported options, or try +```sh npm2yarn +npm run openapi-code-generator --help +``` - ```sh npm2yarn - npm i -D @typespec/compiler @typespec/http @typespec/openapi @typespec/openapi3 @typespec/versioning - ``` +## Typespec specifications +If you want to use [typespec](https://typespec.io/) instead of [openapi3](https://spec.openapis.org/oas/latest.html) +as your input specifications, additionally install the typespec compiler and supporting packages. - Depending how your typespec specification is written, you may find you need to install additional packages such - as `@typespec/rest`. +```sh npm2yarn +npm i --dev @typespec/compiler @typespec/http @typespec/openapi @typespec/openapi3 @typespec/versioning +``` - ### Follow the instructions for the desired template - Each template has it's own dependency requirements. Please see the specific guides linked below +Depending on how your `typespec` specification is written, you may need to install additional packages such +as `@typespec/rest`. - #### Server Scaffolding Templates - - [typescript-koa](../guides/server-templates/typescript-koa) +You can then generate like so: +```sh npm2yarn +npm run openapi-code-generator \ + --input ./some-service.tsp \ # or https://example.com/some-service.tsp + --input-type=typespec \ + --output ./src/generated/clients/some-service \ + --template typescript-fetch +``` - #### Client SDK Templates - - [typescript-fetch](../guides/client-templates/typescript-fetch) - - [typescript-axios](../guides/client-templates/typescript-axios) - - [typescript-angular](../guides/client-templates/typescript-angular) - +You can see [examples of code generated](https://github.com/mnahkies/openapi-code-generator/blob/main/integration-tests/typescript-fetch/src/generated/azure-resource-manager.tsp/client.ts) from typespec specifications here diff --git a/packages/documentation/src/pages/guides/client-templates/typescript-angular.mdx b/packages/documentation/src/pages/guides/client-templates/typescript-angular.mdx index 594b0e13..307fbfd7 100644 --- a/packages/documentation/src/pages/guides/client-templates/typescript-angular.mdx +++ b/packages/documentation/src/pages/guides/client-templates/typescript-angular.mdx @@ -14,9 +14,12 @@ It does not yet support runtime validation/parsing - compile time type safety on See [integration-tests/typescript-angular](https://github.com/mnahkies/openapi-code-generator/tree/main/integration-tests/typescript-angular) for more samples. ### Install dependencies -Prerequisite [installed the cli](../../getting-started/quick-start) +First install the CLI to your project: +```sh npm2yarn +npm i --dev @nahkies/openapi-code-generator +``` -There are no additional dependencies required for this template. +See also [quick start](../../getting-started/quick-start) guide ### Run generation diff --git a/packages/documentation/src/pages/guides/client-templates/typescript-axios.mdx b/packages/documentation/src/pages/guides/client-templates/typescript-axios.mdx index 40b96e4b..30596800 100644 --- a/packages/documentation/src/pages/guides/client-templates/typescript-axios.mdx +++ b/packages/documentation/src/pages/guides/client-templates/typescript-axios.mdx @@ -15,12 +15,14 @@ Runtime request parameter validation is not currently supported. See [integration-tests/typescript-axios](https://github.com/mnahkies/openapi-code-generator/tree/main/integration-tests/typescript-axios) for more samples. ### Install dependencies -Prerequisite [installed the cli](../../getting-started/quick-start) - +First install the CLI and the required runtime packages to your project: ```sh npm2yarn +npm i --dev @nahkies/openapi-code-generator npm i axios @nahkies/typescript-axios-runtime ``` +See also [quick start](../../getting-started/quick-start) guide + ### Run generation diff --git a/packages/documentation/src/pages/guides/client-templates/typescript-fetch.mdx b/packages/documentation/src/pages/guides/client-templates/typescript-fetch.mdx index 2fefe769..eec1648e 100644 --- a/packages/documentation/src/pages/guides/client-templates/typescript-fetch.mdx +++ b/packages/documentation/src/pages/guides/client-templates/typescript-fetch.mdx @@ -15,12 +15,13 @@ See [integration-tests/typescript-fetch](https://github.com/mnahkies/openapi-cod Dependencies: ### Install dependencies -Prerequisite [installed the cli](../../getting-started/quick-start) - +First install the CLI and the required runtime packages to your project: ```sh npm2yarn +npm i --dev @nahkies/openapi-code-generator npm i @nahkies/typescript-fetch-runtime ``` +See also [quick start](../../getting-started/quick-start) guide If you're using an older version of NodeJS, or targeting very old web browsers, diff --git a/packages/documentation/src/pages/guides/concepts/authenticated-input-specifications.mdx b/packages/documentation/src/pages/guides/concepts/authenticated-input-specifications.mdx new file mode 100644 index 00000000..53975262 --- /dev/null +++ b/packages/documentation/src/pages/guides/concepts/authenticated-input-specifications.mdx @@ -0,0 +1,86 @@ +# Authenticated input specifications + +Sometimes you want to generate using a URL as the input, but the URL requires some kind of authentication +header to be passed. + +A good example is [Google cloud platforms IAP proxy](https://cloud.google.com/iap/docs/concepts-overview), +which was the original motivation for supporting this, where we must pass a `Proxy-Authorization` header. +Or from [private github repositories](https://docs.github.com/en/rest/authentication/authenticating-to-the-rest-api), +where a `Authorization` header should be supplied. + +This can be achieved using the environment variable (preferred)) `OPENAPI_REMOTE_SPEC_REQUEST_HEADERS`, +also available as the `--remote-spec-request-headers` cli flag. + +## Format + +The format of the value is a JSON object keyed by URI, with values being either an object, +or array of `{name, value}` pairs. + +For example: +```json +{ + "https://example.com": [ + {"name": "X-Client-Id", "value": "my-client-id"}, + {"name": "X-Client-Secret", "value": "some-secret-value"} + ], + "https://example.org/some/path": {"name": "Proxy-Authorization", "value": "some token"} +} +``` + +As a typescript type: +```typescript +type OPENAPI_REMOTE_SPEC_REQUEST_HEADERS = { + [uri: string]: { name: string, value: string }[] | { name: string, value: string } +} +``` + +## Hostname matching +You should set the uris to the least specific uris you're happy for the header to be sent to - +a full match on the provided uri is required for the headers to be sent. + +Eg: given a uri of `https://exmaple.com:8080/openapi.yaml` the headers would **not** +be sent for requests to other ports, resource paths, or protocols, but a less specific +uri like `https://example.com` will send headers on any (`https`) request to that domain, +such as `https://exmaple.com/some/path/openapi.yaml` + +## Tips for generating the JSON +Unfortunately it is a little annoying to formulate in shell scripts, so here's some examples to get you started. + +Typically, in any real use cases the secret values would be coming from other shell variables, eg: storing a +short-lived access token, etc. + +### Use `jq` +Using [jq](https://jqlang.github.io/jq/): +```shell +OPENAPI_REMOTE_SPEC_REQUEST_HEADERS=$(jq --null-input --compact-output \ + --arg domain "https://example.com" \ + --arg name "proxy-authorization" \ + --arg value "some secret value" '{$domain: {$name, $value}}') +echo $OPENAPI_REMOTE_SPEC_REQUEST_HEADERS +``` +Outputs: +```json +{"https://example.com":{"name":"proxy-authorization","value":"some secret value"}} +``` + +### Use `node` +Using [nodejs](https://nodejs.org/): + +```shell +OPENAPI_REMOTE_SPEC_REQUEST_HEADERS=$(node -p 'JSON.stringify({[process.argv[1]]: {name: process.argv[2], value: process.argv[3]}})' \ + https://example.com \ + proxy-authorization \ + 'some secret value') +echo $OPENAPI_REMOTE_SPEC_REQUEST_HEADERS +``` +Outputs: +```json +{"https://example.com":{"name":"proxy-authorization","value":"some secret value"}} +``` + +## Why JSON +Why JSON you ask? Simply put it has very well-defined semantics, and is easy to parse without +fear of jumbling the pieces together. + +I started by trying to come up with a more ergonomic format, and then felt like I was re-inventing JSON +when it came to dealing with all the edge cases correctly. diff --git a/packages/documentation/src/pages/guides/server-templates/typescript-koa.mdx b/packages/documentation/src/pages/guides/server-templates/typescript-koa.mdx index be71da3d..c4eec344 100644 --- a/packages/documentation/src/pages/guides/server-templates/typescript-koa.mdx +++ b/packages/documentation/src/pages/guides/server-templates/typescript-koa.mdx @@ -13,13 +13,14 @@ See [integration-tests/typescript-koa](https://github.com/mnahkies/openapi-code- ### Install dependencies -Prerequisite [installed the cli](../../getting-started/quick-start) - +First install the CLI and the required runtime packages to your project: ```sh npm2yarn +npm i --dev @nahkies/openapi-code-generator @types/koa @types/koa__router npm i @nahkies/typescript-koa-runtime @koa/cors @koa/router koa koa-body zod -npm i --dev @types/koa @types/koa__router ``` +See also [quick start](../../getting-started/quick-start) guide + ### Run generation diff --git a/packages/documentation/src/pages/overview/about.mdx b/packages/documentation/src/pages/overview/about.mdx index 996e6f9b..c87031fc 100644 --- a/packages/documentation/src/pages/overview/about.mdx +++ b/packages/documentation/src/pages/overview/about.mdx @@ -1,22 +1,35 @@ -# About +import {Callout} from "nextra/components" + +# Welcome `@nahkies/openapi-code-generator` is a CLI tool that aims to generate high quality typescript client SDK's, and API server scaffolding (routing, validation, serialization) from OpenAPI 3 specifications. +Currently, [OpenAPI 3.0](https://swagger.io/specification/v3), [OpenAPI 3.1](https://swagger.io/specification/), and [TypeSpec](https://typespec.io/) are supported an input specifications. + +This gives you amazing auto-complete, and compile-time safety. Typescripts expressive type system it used to +make the generated clients feel idomatic, and as close to handwritten as possible. -Currently, [OpenAPI 3.0](https://swagger.io/specification/v3), [OpenAPI 3.1](https://swagger.io/specification/), -and [TypeSpec](https://typespec.io/) are supported an input specifications. +![Github API Example](/example.png) -The following templates are supported. + + Already know that code generation will save you time? Jump straight in with the [quick start guide](../getting-started/quick-start) + ### Server Scaffolding Templates +Server templates handle the routing setup, request and response validation/serialization so that you +can focus on the business logic. + - [typescript-koa](../guides/server-templates/typescript-koa) ### Client SDK Templates +Client templates give you a strongly typed interface to your remote server calls, ensuring that you +never misspell a field name or route again. - [typescript-fetch](../guides/client-templates/typescript-fetch) - [typescript-axios](../guides/client-templates/typescript-axios) - [typescript-angular](../guides/client-templates/typescript-angular) + ## Project Goal / Principals To make it fun, easy and productive to generate both client and server "glue" @@ -39,59 +52,11 @@ The initial focus on `typescript`, with an intention to later support other lang is the most likely candidate for a second language. -## Why schema first - -Broadly speaking there are two approaches people take to maintaining API specifications: -- Schema first, where you write the schema by hand -- Code first, where you generate the schema from your code - -This project being a code generator from API specification files is on the schema first side of the debate, but why? - -Ultimately this is fairly subjective, but there are four primary motivators that lead us to believe schema first -is the better approach. - -#### Longevity -[APIs are forever](https://www.allthingsdistributed.com/2016/03/10-lessons-from-10-years-of-aws.html), -changing them in backwards incompatible ways is hard/expensive, or sometimes not possible. - -With that in mind, we believe it's important to be thoughtful about your API design, and -that writing an explicit specification/contract is a great forcing function to accomplish this. - -Additionally, programming languages / frameworks come and go - they are an implementation detail, -and subject to change as business requirements evolve. -OpenAPI (originally Swagger) has been around for over a decade now, and we're confident it'll be around for a long time. - -#### Common Language -Many large projects / systems will involve multiple programming languages. For example, you might have a Java backend, -Kotlin Android app, Swift iOS app, and Typescript web frontend. - -For writing your API contracts using OpenAPI up front, you create a common ground for developers of all languages to discuss -and hash out the details. - -#### Constraints -Turing complete programming languages are very flexible. If you try hard enough, you can probably implement it. -Specifications like OpenAPI on the other hand are more rigid and constraining. - -We believe it's better to lean into this and design your systems in ways that can be represented fully by a -specification, rather than attempt to generate a specification from the implementation and potentially lose -information/nuance in the process. - -#### Separation -A good specification not only defines the API contract, but also includes a lot of supplementary information such as examples, -and documentation. - -Generating a good specification from your code, therefore requires including all this extra metadata in the code, which -can make the code more difficult to work with. - -We prefer to separate these concerns out into the specification, and keep the implementation code leaner and simpler. - ## Compatibility / Completeness -This project should be considered beta quality, and is still pre-v1. +This project should be considered beta quality, though it's getting close to a v1 release. It does not yet handle all aspects of the OpenAPI / JSON schema specification, but *most* common -features are implemented. - -In particular at the moment __only JSON__ content types are supported properly. +features are implemented. In particular at the moment __only JSON__ content types are supported properly. You can get a sense of what works by looking at the [compatibility](./compatibility) tables, or the [Github issues](https://github.com/mnahkies/openapi-code-generator/issues) (non-exhaustive). However often the best way is to just try it out with your API specification and see what happens! @@ -103,9 +68,7 @@ The [integration tests](https://github.com/mnahkies/openapi-code-generator/tree/ There are many similar projects out there, so why should you use this one? - Strong emphasis on "human like" code output -- Tackles the program space from both ends - client *and* server, for a single source of truth -- Comprehensive runtime parsing/validation in addition to static compile time safety +- Tackles the program space from both ends - client *and* server, for a **single source of truth** +- Comprehensive **runtime parsing/validation** in addition to static compile time safety So if you want a low risk, write-once, get strong build & runtime guarantees experience then we're worth giving a try. - -If you're looking to achieve the minimal runtime bundle size in your web frontends, then this project probably isn't for you (try [OpenAPI TypeScript](https://openapi-ts.pages.dev/) instead). diff --git a/packages/documentation/src/pages/overview/schema-first-design.mdx b/packages/documentation/src/pages/overview/schema-first-design.mdx new file mode 100644 index 00000000..439663b3 --- /dev/null +++ b/packages/documentation/src/pages/overview/schema-first-design.mdx @@ -0,0 +1,45 @@ +# Why schema first + +Broadly speaking there are two approaches people take to maintaining API specifications: +- Schema first, where you write the schema by hand +- Code first, where you generate the schema from your code + +This project being a code generator from API specification files is on the schema first side of the debate, but why? + +Ultimately this is fairly subjective, but there are four primary motivators that lead us to believe schema first +is the better approach. + +## Longevity +[APIs are forever](https://www.allthingsdistributed.com/2016/03/10-lessons-from-10-years-of-aws.html), +changing them in backwards incompatible ways is hard/expensive, or sometimes not possible. + +With that in mind, we believe it's important to be thoughtful about your API design, and +that writing an explicit specification/contract is a great forcing function to accomplish this. + +Additionally, programming languages / frameworks come and go - they are an implementation detail, +and subject to change as business requirements evolve. +OpenAPI (originally Swagger) has been around for over a decade now, and we're confident it'll be around for a long time. + +## Common Language +Many large projects / systems will involve multiple programming languages. For example, you might have a Java backend, +Kotlin Android app, Swift iOS app, and Typescript web frontend. + +For writing your API contracts using OpenAPI up front, you create a common ground for developers of all languages to discuss +and hash out the details. + +## Constraints +General purpose programming languages are very flexible. If you try hard enough, you can probably implement it. +Specifications like OpenAPI on the other hand are more rigid and constraining. + +We believe it's better to lean into this and design your system such that it can be represented fully by a +specification, rather than attempt to generate a specification from the implementation and lose +information/nuance in the process. + +## Separation +A good specification not only defines the API contract, but also includes a lot of supplementary information such as examples, +and documentation. + +Generating a good specification from your code, therefore requires including all this extra metadata in the code, which +can make the code more difficult to work with. + +We prefer to separate these concerns out into the specification, and keep the implementation code leaner and simpler. diff --git a/packages/documentation/src/pages/reference/architecture.mdx b/packages/documentation/src/pages/reference/architecture.mdx deleted file mode 100644 index 0354555f..00000000 --- a/packages/documentation/src/pages/reference/architecture.mdx +++ /dev/null @@ -1,96 +0,0 @@ -# Architecture - -The project is still evolving, but this should give a good overview -of the current codebase structure. - -Broadly speaking we have the "core" part of the library that should be re-usable -across all templates / target languages, and then the template functions. - -Some templates also make use of a runtime library. - -![high level architecture](/architecture_high_level.svg) - -## Core - -This directory [`./src/core`](https://github.com/mnahkies/openapi-code-generator/tree/main/packages/openapi-code-generator/src/core) contains the generator/target language agnostic parts of the project. - -The process of generation resembles a pipeline. - -![core architecture](/architecture_core.svg) - -### `./loaders` - -Loaders are responsible for fetching a supported input format, and converting -it to openapi3 if required, to be handed off to the `openapi-validator` / `openapi-loader`. - -Two loaders are supported: -- `generic` which loads openapi3 specs in JSON/YAML formats -- `typespec` which loads typespec specs and converts them in-memory to openapi3 - - -### `openapi-validator` - -Nothing particularly interesting here, just takes a loaded document and validates -it against the OpenAPI 3 specification in JSON schema format. - -Useful for detecting errors due to bad input rather than bugs in the -code generation. - -Due to a [bug](https://github.com/mnahkies/openapi-code-generator/issues/103) in `ajv` -validation is currently skipped for OpenAPI 3.1 documents. - -### `openapi-loader` - -`openapi-loader` takes an entry point path, and loads + validates a collection -of files (`$ref` to other files supported). - -It then provides typed access to the raw OpenAPI structures, with methods able -to convert "maybe refs" into the referenced objects. - -This is important because one of the more painful (and bug prone) parts of -parsing OpenAPI documents is correctly following `$ref`'s, as you need to carry -around the context of which document you came from. - -The `openapi-loader` makes this much less complicated by loading all files up front, and normalizing -the contained `$ref`s to absolute paths. - -### `input` - -Ultimately an instance of the `input` class is passed to a generator. - -The goal of the `input` class is to provide ergonomic, target language agnostic access to -the OpenAPI documents given as input to the generator. - -It primarily surfaces API operations, with optional grouping strategies, as a normalized type -that has already de-referenced parameters / responses, and set default values on various properties. - -## Templates - -Currently only `typescript` templates are implemented, living in [./src/typescript](https://github.com/mnahkies/openapi-code-generator/tree/main/packages/openapi-code-generator/src/typescript). - -![templates architecture](/architecture_templates.svg) - -Each template currently has a simple signature: -(from [./src/templates.types.ts](https://github.com/mnahkies/openapi-code-generator/tree/main/packages/openapi-code-generator/src/templates.types.ts)) - -```typescript -export interface OpenapiGeneratorConfig { - dest: string - input: Input - schemaBuilder: SchemaBuilderType - enableRuntimeResponseValidation: boolean - compilerOptions: CompilerOptions - allowUnusedImports: boolean - groupingStrategy: OperationGroupStrategy -} - -export interface OpenapiGenerator { - (args: OpenapiGeneratorConfig): Promise -} -``` - -Where `dest` is a path to a directory to emit code into, and `input` is an initialized instance -of the `Input` class described above. `schemaBuilder` refers to `zod | joi` - -You can find all registered generators in [./src/templates.ts](https://github.com/mnahkies/openapi-code-generator/tree/main/packages/openapi-code-generator/src/templates.ts) - eventually this likely be split into -packages that consume the core modules, or some other more pluggable system. diff --git a/packages/documentation/src/pages/reference/cli-options.mdx b/packages/documentation/src/pages/reference/cli-options.mdx index f583afb4..6e72f37f 100644 --- a/packages/documentation/src/pages/reference/cli-options.mdx +++ b/packages/documentation/src/pages/reference/cli-options.mdx @@ -100,6 +100,8 @@ Generate names based on usage, and extract in-line schemas to be standalone type generated code. This is especially useful when dealing with input schemas that don't make good use of named `$ref`'s. +See [extract-inline-schemas guide](../guides/concepts/extract-inline-schemas) for details of how this works. + Default `false` #### `--allow-unused-imports` @@ -170,65 +172,8 @@ As environment variable `OPENAPI_REMOTE_SPEC_REQUEST_HEADERS` Allows providing request headers to use when fetching remote specifications. This allows for running generation against remote sources that require authentication. -Common examples include [private github repositories](https://docs.github.com/en/rest/authentication/authenticating-to-the-rest-api), -urls secured by an authenticating proxy like [GCP IAP Proxy](https://cloud.google.com/iap/docs/concepts-overview), -or just generally authenticated servers - - - - We strongly recommend using the **environment variable** variant of this option - (`OPENAPI_REMOTE_SPEC_REQUEST_HEADERS`), as values for this option will likely include secrets, and it - is best to keep these out of your shell history. - - -The format of the value is a JSON object keyed by URI, with values being either an object, -or array of `{name, value}` pairs. As a typescript type: -```typescript -type value = { - [uri: string]: { name: string, value: string }[] | { name: string, value: string } -} -``` - -For example: -```json -{ - "https://example.com": [ - {"name": "X-Client-Id", "value": "my-client-id"}, - {"name": "X-Client-Secret", "value": "some-secret-value"} - ], - "https://example.org/some/path": {"name": "Proxy-Authorization", "value": "some token"} -} -``` - -A full match on the provided uri is required for the headers to be sent. -Eg: given a uri of "https://exmaple.com:8080/openapi.yaml" the headers would **not** -be sent for requests to other ports, resource paths, or protocols, but a less specific -uri like "https://example.com" will send headers on any (`https`) request to that domain. - - - Why JSON you ask? Simply put it has well defined semantics, and is easy to parse without fear of jumbling the pieces together. - - Unfortunately it is a little annoying to formulate in shell scripts, so here's some examples to get you started - - Using [jq](https://jqlang.github.io/jq/): - ```shell - jq --null-input --compact-output \ - --arg domain "https://example.com" \ - --arg name "authorization" \ - --arg value "secret value" '{$domain: {$name, $value}}' - ``` - - Using [nodejs](https://nodejs.org/): - ```shell - node -p 'JSON.stringify({[process.argv[1]]: {name: process.argv[2], value: process.argv[3]}})' \ - https://example.com \ - authorization \ - 'some secret value' - ``` - - Where typically in either example the values would be coming from shell variables, eg: storing a short-lived - access token, etc. - +See [authenticated-input-specifications guide](../guides/concepts/authenticated-input-specifications) for +details of how to use. #### `-h, --help` Displays help text for command diff --git a/packages/documentation/src/theme.config.tsx b/packages/documentation/src/theme.config.tsx index 7ca3c0dd..cd7701c1 100644 --- a/packages/documentation/src/theme.config.tsx +++ b/packages/documentation/src/theme.config.tsx @@ -50,9 +50,9 @@ const ThemeConfig = { }, footer: { - text: ( + content: ( - MIT {new Date().getFullYear()} ©{" "} + {new Date().getFullYear()} ©{" "}