bdb3f24bff
Hopefully I got all the places I needed to get and added enough tests. My methodology was pretty much "Look at what madeOptional does, and do the opposite" Closes #2731 --------- Co-authored-by: Timothee Guerin <tiguerin@microsoft.com> Co-authored-by: Timothee Guerin <timothee.guerin@outlook.com> |
||
---|---|---|
.. | ||
.tspd/docs | ||
generated-defs | ||
lib | ||
src | ||
test | ||
CHANGELOG.json | ||
CHANGELOG.md | ||
LICENSE | ||
README.md | ||
package.json | ||
tsconfig.config.json | ||
tsconfig.json | ||
vitest.config.ts |
README.md
@typespec/versioning
TypeSpec library for declaring and emitting versioned APIs
Install
npm install @typespec/versioning
Usage
Consuming versioning library from an emitter
Get the service representation at a given version
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.
}
Get list of versions and version dependency across namespaces
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.
Consume versioning manually
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
Decorators
TypeSpec.Versioning
@added
@madeOptional
@madeRequired
@removed
@renamedFrom
@returnTypeChangedFrom
@typeChangedFrom
@useDependency
@versioned
@added
Identifies when the target was added.
@TypeSpec.Versioning.added(version: EnumMember)
Target
Model | ModelProperty | Operation | Enum | EnumMember | Union | UnionVariant | Scalar | Interface
Parameters
Name | Type | Description |
---|---|---|
version | EnumMember |
The version that the target was added in. |
Examples
@added(Versions.v2)
op addedInV2(): void;
@added(Versions.v2)
model AlsoAddedInV2 {}
model Foo {
name: string;
@added(Versions.v3)
addedInV3: string;
}
@madeOptional
Identifies when a target was made optional.
@TypeSpec.Versioning.madeOptional(version: EnumMember)
Target
ModelProperty
Parameters
Name | Type | Description |
---|---|---|
version | EnumMember |
The version that the target was made optional in. |
Examples
model Foo {
name: string;
@madeOptional(Versions.v2)
nickname: string;
}
@madeRequired
Identifies when a target was made required.
@TypeSpec.Versioning.madeRequired(version: EnumMember)
Target
ModelProperty
Parameters
Name | Type | Description |
---|---|---|
version | EnumMember |
The version that the target was made required in. |
Examples
model Foo {
name: string;
@madeRequired(Versions.v2)
nickname: string;
}
@removed
Identifies when the target was removed.
@TypeSpec.Versioning.removed(version: EnumMember)
Target
Model | ModelProperty | Operation | Enum | EnumMember | Union | UnionVariant | Scalar | Interface
Parameters
Name | Type | Description |
---|---|---|
version | EnumMember |
The version that the target was removed in. |
Examples
@removed(Versions.v2)
op removedInV2(): void;
@removed(Versions.v2)
model AlsoRemovedInV2 {}
model Foo {
name: string;
@removed(Versions.v3)
removedInV3: string;
}
@renamedFrom
Identifies when the target has been renamed.
@TypeSpec.Versioning.renamedFrom(version: EnumMember, oldName: valueof string)
Target
Model | ModelProperty | Operation | Enum | EnumMember | Union | UnionVariant | Scalar | Interface
Parameters
Name | Type | Description |
---|---|---|
version | EnumMember |
The version that the target was renamed in. |
oldName | valueof string |
The previous name of the target. |
Examples
@renamedFrom(Versions.v2, "oldName")
op newName(): void;
@returnTypeChangedFrom
Identifies when the target type changed.
@TypeSpec.Versioning.returnTypeChangedFrom(version: EnumMember, oldType: unknown)
Target
Operation
Parameters
Name | Type | Description |
---|---|---|
version | EnumMember |
The version that the target type changed in. |
oldType | unknown |
The previous type of the target. |
@typeChangedFrom
Identifies when the target type changed.
@TypeSpec.Versioning.typeChangedFrom(version: EnumMember, oldType: unknown)
Target
ModelProperty
Parameters
Name | Type | Description |
---|---|---|
version | EnumMember |
The version that the target type changed in. |
oldType | unknown |
The previous type of the target. |
@useDependency
Identifies that a namespace or a given versioning enum member relies upon a versioned package.
@TypeSpec.Versioning.useDependency(...versionRecords: EnumMember[])
Target
EnumMember | Namespace
Parameters
Name | Type | Description |
---|---|---|
versionRecords | EnumMember[] |
The dependent library version(s) for the target namespace or version. |
Examples
Select a single version of MyLib
to use
@useDependency(MyLib.Versions.v1_1)
namespace NonVersionedService;
Select which version of the library match to which version of the service.
@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,
}
@versioned
Identifies that the decorated namespace is versioned by the provided enum.
@TypeSpec.Versioning.versioned(versions: Enum)
Target
Namespace
Parameters
Name | Type | Description |
---|---|---|
versions | Enum |
The enum that describes the supported versions. |
Examples
@versioned(Versions)
namespace MyService;
enum Versions {
v1,
v2,
v3,
}