240 строки
4.8 KiB
TypeScript
240 строки
4.8 KiB
TypeScript
import type {
|
|
DecoratorContext,
|
|
Enum,
|
|
EnumMember,
|
|
Interface,
|
|
Model,
|
|
ModelProperty,
|
|
Namespace,
|
|
Operation,
|
|
Scalar,
|
|
Type,
|
|
Union,
|
|
UnionVariant,
|
|
} from "@typespec/compiler";
|
|
|
|
/**
|
|
* Identifies that the decorated namespace is versioned by the provided enum.
|
|
*
|
|
* @param versions The enum that describes the supported versions.
|
|
* @example
|
|
* ```tsp
|
|
* @versioned(Versions)
|
|
* namespace MyService;
|
|
* enum Versions {
|
|
* v1,
|
|
* v2,
|
|
* v3,
|
|
* }
|
|
* ```
|
|
*/
|
|
export type VersionedDecorator = (
|
|
context: DecoratorContext,
|
|
target: Namespace,
|
|
versions: Enum,
|
|
) => void;
|
|
|
|
/**
|
|
* Identifies that a namespace or a given versioning enum member relies upon a versioned package.
|
|
*
|
|
* @param versionRecords The dependent library version(s) for the target namespace or version.
|
|
* @example Select a single version of `MyLib` to use
|
|
*
|
|
* ```tsp
|
|
* @useDependency(MyLib.Versions.v1_1)
|
|
* namespace NonVersionedService;
|
|
* ```
|
|
* @example Select which version of the library match to which version of the service.
|
|
*
|
|
* ```tsp
|
|
* @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,
|
|
* }
|
|
* ```
|
|
*/
|
|
export type UseDependencyDecorator = (
|
|
context: DecoratorContext,
|
|
target: EnumMember | Namespace,
|
|
...versionRecords: EnumMember[]
|
|
) => void;
|
|
|
|
/**
|
|
* Identifies when the target was added.
|
|
*
|
|
* @param version The version that the target was added in.
|
|
* @example
|
|
* ```tsp
|
|
* @added(Versions.v2)
|
|
* op addedInV2(): void;
|
|
*
|
|
* @added(Versions.v2)
|
|
* model AlsoAddedInV2 {}
|
|
*
|
|
* model Foo {
|
|
* name: string;
|
|
*
|
|
* @added(Versions.v3)
|
|
* addedInV3: string;
|
|
* }
|
|
* ```
|
|
*/
|
|
export type AddedDecorator = (
|
|
context: DecoratorContext,
|
|
target:
|
|
| Model
|
|
| ModelProperty
|
|
| Operation
|
|
| Enum
|
|
| EnumMember
|
|
| Union
|
|
| UnionVariant
|
|
| Scalar
|
|
| Interface,
|
|
version: EnumMember,
|
|
) => void;
|
|
|
|
/**
|
|
* Identifies when the target was removed.
|
|
*
|
|
* @param version The version that the target was removed in.
|
|
* @example
|
|
* ```tsp
|
|
* @removed(Versions.v2)
|
|
* op removedInV2(): void;
|
|
*
|
|
* @removed(Versions.v2)
|
|
* model AlsoRemovedInV2 {}
|
|
*
|
|
* model Foo {
|
|
* name: string;
|
|
*
|
|
* @removed(Versions.v3)
|
|
* removedInV3: string;
|
|
* }
|
|
* ```
|
|
*/
|
|
export type RemovedDecorator = (
|
|
context: DecoratorContext,
|
|
target:
|
|
| Model
|
|
| ModelProperty
|
|
| Operation
|
|
| Enum
|
|
| EnumMember
|
|
| Union
|
|
| UnionVariant
|
|
| Scalar
|
|
| Interface,
|
|
version: EnumMember,
|
|
) => void;
|
|
|
|
/**
|
|
* Identifies when the target has been renamed.
|
|
*
|
|
* @param version The version that the target was renamed in.
|
|
* @param oldName The previous name of the target.
|
|
* @example
|
|
* ```tsp
|
|
* @renamedFrom(Versions.v2, "oldName")
|
|
* op newName(): void;
|
|
* ```
|
|
*/
|
|
export type RenamedFromDecorator = (
|
|
context: DecoratorContext,
|
|
target:
|
|
| Model
|
|
| ModelProperty
|
|
| Operation
|
|
| Enum
|
|
| EnumMember
|
|
| Union
|
|
| UnionVariant
|
|
| Scalar
|
|
| Interface,
|
|
version: EnumMember,
|
|
oldName: string,
|
|
) => void;
|
|
|
|
/**
|
|
* Identifies when a target was made optional.
|
|
*
|
|
* @param version The version that the target was made optional in.
|
|
* @example
|
|
* ```tsp
|
|
* model Foo {
|
|
* name: string;
|
|
* @madeOptional(Versions.v2)
|
|
* nickname?: string;
|
|
* }
|
|
* ```
|
|
*/
|
|
export type MadeOptionalDecorator = (
|
|
context: DecoratorContext,
|
|
target: ModelProperty,
|
|
version: EnumMember,
|
|
) => void;
|
|
|
|
/**
|
|
* Identifies when a target was made required.
|
|
*
|
|
* @param version The version that the target was made required in.
|
|
* @example
|
|
* ```tsp
|
|
* model Foo {
|
|
* name: string;
|
|
* @madeRequired(Versions.v2)
|
|
* nickname: string;
|
|
* }
|
|
* ```
|
|
*/
|
|
export type MadeRequiredDecorator = (
|
|
context: DecoratorContext,
|
|
target: ModelProperty,
|
|
version: EnumMember,
|
|
) => void;
|
|
|
|
/**
|
|
* Identifies when the target type changed.
|
|
*
|
|
* @param version The version that the target type changed in.
|
|
* @param oldType The previous type of the target.
|
|
*/
|
|
export type TypeChangedFromDecorator = (
|
|
context: DecoratorContext,
|
|
target: ModelProperty,
|
|
version: EnumMember,
|
|
oldType: Type,
|
|
) => void;
|
|
|
|
/**
|
|
* Identifies when the target type changed.
|
|
*
|
|
* @param version The version that the target type changed in.
|
|
* @param oldType The previous type of the target.
|
|
*/
|
|
export type ReturnTypeChangedFromDecorator = (
|
|
context: DecoratorContext,
|
|
target: Operation,
|
|
version: EnumMember,
|
|
oldType: Type,
|
|
) => void;
|
|
|
|
export type TypeSpecVersioningDecorators = {
|
|
versioned: VersionedDecorator;
|
|
useDependency: UseDependencyDecorator;
|
|
added: AddedDecorator;
|
|
removed: RemovedDecorator;
|
|
renamedFrom: RenamedFromDecorator;
|
|
madeOptional: MadeOptionalDecorator;
|
|
madeRequired: MadeRequiredDecorator;
|
|
typeChangedFrom: TypeChangedFromDecorator;
|
|
returnTypeChangedFrom: ReturnTypeChangedFromDecorator;
|
|
};
|