@typespec/openapi3
Version:
TypeSpec library for emitting OpenAPI 3.0 and OpenAPI 3.1 from the TypeSpec REST protocol binding and converting OpenAPI3 to TypeSpec
228 lines (139 loc) • 7.39 kB
Markdown
# @typespec/openapi3
TypeSpec library for emitting OpenAPI 3.0 and OpenAPI 3.1 from the TypeSpec REST protocol binding and converting OpenAPI3 to TypeSpec
## Install
```bash
npm install @typespec/openapi3
```
## Emitter usage
1. Via the command line
```bash
tsp compile . --emit=@typespec/openapi3
```
2. Via the config
```yaml
emit:
- "@typespec/openapi3"
```
The config can be extended with options as follows:
```yaml
emit:
- "@typespec/openapi3"
options:
"@typespec/openapi3":
option: value
```
## Emitter options
### `emitter-output-dir`
**Type:** `absolutePath`
Defines the emitter output directory. Defaults to `{output-dir}/@typespec/openapi3`
See [Configuring output directory for more info](https://typespec.io/docs/handbook/configuration/configuration/#configuring-output-directory)
### `file-type`
**Type:** `"yaml" | "json" | ("yaml" | "json")[]`
If the content should be serialized as YAML or JSON. Can be a single value or an array to emit multiple formats. Default 'yaml', if not specified infer from the `output-file` extension
**Options:**
- `"yaml" | "json"`
- `("yaml" | "json")[]`
### `output-file`
**Type:** `string`
Name of the output file.
Output file will interpolate the following values:
- service-name: Name of the service
- service-name-if-multiple: Name of the service if multiple
- version: Version of the service if multiple
- file-type: The file type being emitted (json or yaml). Useful when `file-type` is an array.
Default: `{service-name-if-multiple}.{version}.openapi.yaml` or `.json` if `file-type` is `"json"`
When `file-type` is an array: `{service-name-if-multiple}.{version}.openapi.{file-type}`
Example Single service no versioning
- `openapi.yaml`
Example Multiple services no versioning
- `openapi.Org1.Service1.yaml`
- `openapi.Org1.Service2.yaml`
Example Single service with versioning
- `openapi.v1.yaml`
- `openapi.v2.yaml`
Example Multiple service with versioning
- `openapi.Org1.Service1.v1.yaml`
- `openapi.Org1.Service1.v2.yaml`
- `openapi.Org1.Service2.v1.0.yaml`
- `openapi.Org1.Service2.v1.1.yaml`
### `openapi-versions`
**Type:** `"3.0.0" | "3.1.0" | "3.2.0"`
**Default:** `["3.0.0"]`
### `new-line`
**Type:** `"crlf" | "lf"`
**Default:** `"lf"`
Set the newline character for emitting files.
### `omit-unreachable-types`
**Type:** `boolean`
Omit unreachable types.
By default all types declared under the service namespace will be included. With this flag on only types references in an operation will be emitted.
### `include-x-typespec-name`
**Type:** `"inline-only" | "never"`
**Default:** `"never"`
If the generated openapi types should have the `x-typespec-name` extension set with the name of the TypeSpec type that created it.
This extension is meant for debugging and should not be depended on.
### `safeint-strategy`
**Type:** `"double-int" | "int64"`
**Default:** `"int64"`
How to handle safeint type. Options are:
- `double-int`: Will produce `type: integer, format: double-int`
- `int64`: Will produce `type: integer, format: int64`
Default: `int64`
### `seal-object-schemas`
**Type:** `boolean`
**Default:** `false`
If true, then for models emitted as object schemas we default `additionalProperties` to false for
OpenAPI 3.0, and `unevaluatedProperties` to false for OpenAPI 3.1, if not explicitly specified elsewhere.
Default: `false`
### `experimental-parameter-examples`
**Type:** `"data" | "serialized"`
Determines how to emit examples on parameters.
Note: This is an experimental feature and may change in future versions.
See https://spec.openapis.org/oas/v3.0.4.html#style-examples for parameter example serialization rules
See https://github.com/OAI/OpenAPI-Specification/discussions/4622 for discussion on handling parameter examples.
### `operation-id-strategy`
**Type:** `"parent-container" | "fqn" | "explicit-only" | object { kind, separator }`
**Options:**
- `"parent-container" | "fqn" | "explicit-only"` (default: `"parent-container"`)
Determines how to generate operation IDs when `@operationId` is not used.
Avaliable options are:
- `parent-container`: Uses the parent namespace and operation name to generate the ID.
- `fqn`: Uses the fully qualified name of the operation to generate the ID.
- `explicit-only`: Only use explicitly defined operation IDs.
- `object { kind, separator }`
| Name | Type | Default | Description |
| ----------- | ------------------------------------------------ | -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `kind` | `"parent-container" \| "fqn" \| "explicit-only"` | `"parent-container"` | Determines how to generate operation IDs when `@operationId` is not used.<br />Avaliable options are:<br /> - `parent-container`: Uses the parent namespace and operation name to generate the ID.<br /> - `fqn`: Uses the fully qualified name of the operation to generate the ID.<br /> - `explicit-only`: Only use explicitly defined operation IDs. |
| `separator` | `string` | | Separator used to join segment in the operation name. |
### `enum-strategy`
**Type:** `"default" | "annotated"`
**Default:** `"default"`
How to emit TypeSpec enums. Options are:
- `default`: Emit as a single schema using the `enum` keyword.
- `annotated`: Emit as a `oneOf` of `const` subschemas annotated with `title` and `description`
from each member's `@summary` and `@doc`. Follows the OpenAPI 3.1.1 annotated enumerations pattern.
Only supported by OpenAPI 3.1.0 and above; on 3.0.0 the `default` style is used and a warning is reported.
## Decorators
### TypeSpec.OpenAPI
- [`@oneOf`](#@oneof)
- [`@useRef`](#@useref)
#### `@oneOf`
Specify that `oneOf` should be used instead of `anyOf` for that union.
```typespec
@TypeSpec.OpenAPI.oneOf
```
##### Target
`Union | ModelProperty`
##### Parameters
None
#### `@useRef`
Specify an external reference that should be used inside of emitting this type.
```typespec
@TypeSpec.OpenAPI.useRef(ref: valueof string)
```
##### Target
`Model | ModelProperty`
##### Parameters
| Name | Type | Description |
| ---- | ---------------- | -------------------------------------------------------------------- |
| ref | `valueof string` | External reference(e.g. "../../common.json#/components/schemas/Foo") |