TypeSpec library for declaring and emitting versioned APIs
npm install @typespec/versioning
Versioning library works with projection to project the service at a given version.
// Get a list of all the different version of the service and the projections
const projections = buildVersionProjections(program, serviceNamespace);
for (const projection of projections) {
const projectedProgram = projectProgram(program, projection.projections);
// projectedProgram now contains the representation of the service at the given version.
}
Versioning library works with projection to project the service at a given version.
const versions = resolveVersions(program, serviceNamespace);
// versions now contain a list of all the version of the service namespace and what version should all the other dependencies namespace use.
If the emitter needs to have the whole picture of the service evolution across the version then using the decorator accessor will provide the metadata for each type:
getAddedOn
getRemovedOn
getRenamedFromVersion
getMadeOptionalOn
@added
@madeOptional
@madeRequired
@removed
@renamedFrom
@returnTypeChangedFrom
@typeChangedFrom
@useDependency
@versioned
Identifies when the target was added.
@TypeSpec.Versioning.added(version: EnumMember)
Model | ModelProperty | Operation | Enum | EnumMember | Union | UnionVariant | Scalar | Interface
Name | Type | Description |
---|---|---|
version | EnumMember |
The version that the target was added in. |
@added(Versions.v2)
op addedInV2(): void;
@added(Versions.v2)
model AlsoAddedInV2 {}
model Foo {
name: string;
@added(Versions.v3)
addedInV3: string;
}
Identifies when a target was made optional.
@TypeSpec.Versioning.madeOptional(version: EnumMember)
ModelProperty
Name | Type | Description |
---|---|---|
version | EnumMember |
The version that the target was made optional in. |
model Foo {
name: string;
@madeOptional(Versions.v2)
nickname: string;
}
Identifies when a target was made required.
@TypeSpec.Versioning.madeRequired(version: EnumMember)
ModelProperty
Name | Type | Description |
---|---|---|
version | EnumMember |
The version that the target was made required in. |
model Foo {
name: string;
@madeRequired(Versions.v2)
nickname: string;
}
Identifies when the target was removed.
@TypeSpec.Versioning.removed(version: EnumMember)
Model | ModelProperty | Operation | Enum | EnumMember | Union | UnionVariant | Scalar | Interface
Name | Type | Description |
---|---|---|
version | EnumMember |
The version that the target was removed in. |
@removed(Versions.v2)
op removedInV2(): void;
@removed(Versions.v2)
model AlsoRemovedInV2 {}
model Foo {
name: string;
@removed(Versions.v3)
removedInV3: string;
}
Identifies when the target has been renamed.
@TypeSpec.Versioning.renamedFrom(version: EnumMember, oldName: valueof string)
Model | ModelProperty | Operation | Enum | EnumMember | Union | UnionVariant | Scalar | Interface
Name | Type | Description |
---|---|---|
version | EnumMember |
The version that the target was renamed in. |
oldName | valueof string |
The previous name of the target. |
@renamedFrom(Versions.v2, "oldName")
op newName(): void;
Identifies when the target type changed.
@TypeSpec.Versioning.returnTypeChangedFrom(version: EnumMember, oldType: unknown)
Operation
Name | Type | Description |
---|---|---|
version | EnumMember |
The version that the target type changed in. |
oldType | unknown |
The previous type of the target. |
Identifies when the target type changed.
@TypeSpec.Versioning.typeChangedFrom(version: EnumMember, oldType: unknown)
ModelProperty
Name | Type | Description |
---|---|---|
version | EnumMember |
The version that the target type changed in. |
oldType | unknown |
The previous type of the target. |
Identifies that a namespace or a given versioning enum member relies upon a versioned package.
@TypeSpec.Versioning.useDependency(...versionRecords: EnumMember[])
EnumMember | Namespace
Name | Type | Description |
---|---|---|
versionRecords | EnumMember[] |
The dependent library version(s) for the target namespace or version. |
@useDependency(MyLib.Versions.v1_1)
namespace NonVersionedService;
@versioned(Versions)
namespace MyService1;
enum Version {
@useDependency(MyLib.Versions.v1_1) // V1 use lib v1_1
v1,
@useDependency(MyLib.Versions.v1_1) // V2 use lib v1_1
v2,
@useDependency(MyLib.Versions.v2) // V3 use lib v2
v3,
}
Identifies that the decorated namespace is versioned by the provided enum.
@TypeSpec.Versioning.versioned(versions: Enum)
Namespace
Name | Type | Description |
---|---|---|
versions | Enum |
The enum that describes the supported versions. |
@versioned(Versions)
namespace MyService;
enum Versions {
v1,
v2,
v3,
}