UNPKG

@typespec/json-schema

Version:

TypeSpec library for emitting TypeSpec to JSON Schema and converting JSON Schema to TypeSpec

427 lines (269 loc) 10.9 kB
# @typespec/json-schema TypeSpec library for emitting TypeSpec to JSON Schema and converting JSON Schema to TypeSpec ## Install ```bash npm install @typespec/json-schema ``` ## Usage Add the `@jsonSchema` decorator to any types or namespaces you want to emit as JSON Schema. ```TypeSpec import "@typespec/json-schema"; using JsonSchema; @jsonSchema namespace Example; model Car { make: string; modelName: string; } ``` ## Usage 1. Via the command line ```bash tsp compile . --emit=@typespec/json-schema ``` 2. Via the config ```yaml emit: - "@typespec/json-schema" ``` The config can be extended with options as follows: ```yaml emit: - "@typespec/json-schema" options: "@typespec/json-schema": option: value ``` ## Emitter options ### `file-type` **Type:** `"yaml" | "json"` Serialize the schema as either yaml or json. ### `int64-strategy` **Type:** `"string" | "number"` How to handle 64 bit integers on the wire. Options are: - string: serialize as a string (widely interoperable) - number: serialize as a number (not widely interoperable) ### `bundleId` **Type:** `string` When provided, bundle all the schemas into a single json schema document with schemas under $defs. The provided id is the id of the root document and is also used for the file name. ### `emitAllModels` **Type:** `boolean` When true, emit all model declarations to JSON Schema without requiring the @jsonSchema decorator. ### `emitAllRefs` **Type:** `boolean` When true, emit all references as json schema files, even if the referenced type does not have the `@jsonSchema` decorator or is not within a namespace with the `@jsonSchema` decorator. ### `seal-object-schemas` **Type:** `boolean` If true, then for models emitted as object schemas we default `unevaluatedProperties` to `{ not: {} }`, if not explicitly specified elsewhere. Default: `false` ## Decorators ### TypeSpec.JsonSchema - [`@baseUri`](#@baseuri) - [`@contains`](#@contains) - [`@contentEncoding`](#@contentencoding) - [`@contentMediaType`](#@contentmediatype) - [`@contentSchema`](#@contentschema) - [`@extension`](#@extension) - [`@id`](#@id) - [`@jsonSchema`](#@jsonschema) - [`@maxContains`](#@maxcontains) - [`@maxProperties`](#@maxproperties) - [`@minContains`](#@mincontains) - [`@minProperties`](#@minproperties) - [`@multipleOf`](#@multipleof) - [`@oneOf`](#@oneof) - [`@prefixItems`](#@prefixitems) - [`@uniqueItems`](#@uniqueitems) #### `@baseUri` Set the base URI for any schemas emitted from types within this namespace. ```typespec @TypeSpec.JsonSchema.baseUri(baseUri: valueof string) ``` ##### Target `Namespace` ##### Parameters | Name | Type | Description | | ------- | ---------------- | ------------------------------------------------------------------------ | | baseUri | `valueof string` | The base URI. Schema IDs inside this namespace are relative to this URI. | #### `@contains` Specify that the array must contain at least one instance of the provided type. Use `@minContains` and `@maxContains` to customize how many instances to expect. ```typespec @TypeSpec.JsonSchema.contains(value: unknown) ``` ##### Target `unknown[] | ModelProperty` ##### Parameters | Name | Type | Description | | ----- | --------- | -------------------------------- | | value | `unknown` | The type the array must contain. | #### `@contentEncoding` Specify the encoding used for the contents of a string. ```typespec @TypeSpec.JsonSchema.contentEncoding(value: valueof string) ``` ##### Target `string | ModelProperty` ##### Parameters | Name | Type | Description | | ----- | ---------------- | ----------- | | value | `valueof string` | <br /> | #### `@contentMediaType` Specify the content type of content stored in a string. ```typespec @TypeSpec.JsonSchema.contentMediaType(value: valueof string) ``` ##### Target `string | ModelProperty` ##### Parameters | Name | Type | Description | | ----- | ---------------- | ------------------------------------- | | value | `valueof string` | The media type of the string contents | #### `@contentSchema` Specify the schema for the contents of a string when interpreted according to the content's media type and encoding. ```typespec @TypeSpec.JsonSchema.contentSchema(value: unknown) ``` ##### Target `string | ModelProperty` ##### Parameters | Name | Type | Description | | ----- | --------- | --------------------------------- | | value | `unknown` | The schema of the string contents | #### `@extension` Specify a custom property to add to the emitted schema. This is useful for adding custom keywords and other vendor-specific extensions. Scalar values need to be specified using `typeof` to be converted to a schema. For example, `@extension("x-schema", typeof "foo")` will emit a JSON schema value for `x-schema`, whereas `@extension("x-schema", "foo")` will emit the raw code `"foo"`. The value will be treated as a raw value if any of the following are true: - The value is a scalar value (e.g. string, number, boolean, etc.) - The value is wrapped in the `Json<Data>` template - The value is provided using the value syntax (e.g. `#{}`, `#[]`) For example, `@extension("x-schema", { x: "value" })` will emit a JSON schema value for `x-schema`, whereas `@extension("x-schema", #{x: "value"})` and `@extension("x-schema", Json<{x: "value"}>)` will emit the raw JSON code `{x: "value"}`. ```typespec @TypeSpec.JsonSchema.extension(key: valueof string, value: unknown | valueof unknown) ``` ##### Target `unknown` ##### Parameters | Name | Type | Description | | ----- | ------------------------------ | ------------------------------------------------------------- | | key | `valueof string` | The name of the keyword of vendor extension, e.g. `x-custom`. | | value | `unknown` \| `valueof unknown` | The value of the keyword. | #### `@id` Specify the JSON Schema id. If this model or a parent namespace has a base URI, the provided ID will be relative to that base URI. By default, the id will be constructed based on the declaration's name. ```typespec @TypeSpec.JsonSchema.id(id: valueof string) ``` ##### Target `unknown` ##### Parameters | Name | Type | Description | | ---- | ---------------- | ----------------------------------------------- | | id | `valueof string` | The id of the JSON schema for this declaration. | #### `@jsonSchema` Add to namespaces to emit models within that namespace to JSON schema. Add to another declaration to emit that declaration to JSON schema. Optionally, for namespaces, you can provide a baseUri, and for other declarations, you can provide the id. ```typespec @TypeSpec.JsonSchema.jsonSchema(baseUri?: valueof string) ``` ##### Target `unknown` ##### Parameters | Name | Type | Description | | ------- | ---------------- | --------------------------------------------------- | | baseUri | `valueof string` | Schema IDs are interpreted as relative to this URI. | #### `@maxContains` Used in conjunction with the `@contains` decorator, specifies that the array must contain at most a certain number of the types provided by the `@contains` decorator. ```typespec @TypeSpec.JsonSchema.maxContains(value: valueof int32) ``` ##### Target `unknown[] | ModelProperty` ##### Parameters | Name | Type | Description | | ----- | --------------- | ------------------------------------------------------ | | value | `valueof int32` | The maximum number of instances the array must contain | #### `@maxProperties` Specify the maximum number of properties this object can have. ```typespec @TypeSpec.JsonSchema.maxProperties(value: valueof int32) ``` ##### Target `Record<unknown> | ModelProperty` ##### Parameters | Name | Type | Description | | ----- | --------------- | ------------------------------------------------------ | | value | `valueof int32` | The maximum number of properties this object can have. | #### `@minContains` Used in conjunction with the `@contains` decorator, specifies that the array must contain at least a certain number of the types provided by the `@contains` decorator. ```typespec @TypeSpec.JsonSchema.minContains(value: valueof int32) ``` ##### Target `unknown[] | ModelProperty` ##### Parameters | Name | Type | Description | | ----- | --------------- | ------------------------------------------------------ | | value | `valueof int32` | The minimum number of instances the array must contain | #### `@minProperties` Specify the minimum number of properties this object can have. ```typespec @TypeSpec.JsonSchema.minProperties(value: valueof int32) ``` ##### Target `Record<unknown> | ModelProperty` ##### Parameters | Name | Type | Description | | ----- | --------------- | ------------------------------------------------------ | | value | `valueof int32` | The minimum number of properties this object can have. | #### `@multipleOf` Specify that the numeric type must be a multiple of some numeric value. ```typespec @TypeSpec.JsonSchema.multipleOf(value: valueof numeric) ``` ##### Target `numeric | ModelProperty` ##### Parameters | Name | Type | Description | | ----- | ----------------- | -------------------------------------------------- | | value | `valueof numeric` | The numeric type must be a multiple of this value. | #### `@oneOf` Specify that `oneOf` should be used instead of `anyOf` for that union. ```typespec @TypeSpec.JsonSchema.oneOf ``` ##### Target `Union | ModelProperty` ##### Parameters None #### `@prefixItems` Specify that the target array must begin with the provided types. ```typespec @TypeSpec.JsonSchema.prefixItems(value: unknown[]) ``` ##### Target `unknown[] | ModelProperty` ##### Parameters | Name | Type | Description | | ----- | ----------- | --------------------------------------------------------------------------- | | value | `unknown[]` | A tuple containing the types that must be present at the start of the array | #### `@uniqueItems` Specify that every item in the array must be unique. ```typespec @TypeSpec.JsonSchema.uniqueItems ``` ##### Target `unknown[] | ModelProperty` ##### Parameters None