@typespec/versioning 0.47.0-dev.1 → 0.47.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,163 +1,147 @@
1
- # `@typespec/versioning` library
1
+ # @typespec/versioning
2
2
 
3
- This package provide [TypeSpec](https://github.com/microsoft/typespec) decorators and projections to define versioning in a service.
3
+ TypeSpec library for declaring and emitting versioned APIs
4
4
 
5
5
  ## Install
6
6
 
7
- Run the following command in your typespec project root directory.
8
-
9
7
  ```bash
10
8
  npm install @typespec/versioning
11
9
  ```
12
10
 
13
11
  ## Usage
14
12
 
15
- ```typespec
16
- import "@typespec/versioning";
17
-
18
- using Versioning;
19
- ```
13
+ ### Consuming versioning library from an emitter
20
14
 
21
- ### Enable versioning for Service or Library
15
+ #### Get the service representation at a given version
22
16
 
23
- Use [`@versioned`](#versioned) decorator to mark a namespace as versioned.
17
+ Versioning library works with projection to project the service at a given version.
24
18
 
25
- ```typespec
26
- @versioned(Versions)
27
- namespace MyService;
19
+ ```ts
20
+ // Get a list of all the different version of the service and the projections
21
+ const projections = buildVersionProjections(program, serviceNamespace);
28
22
 
29
- enum Versions {
30
- v1,
31
- v2,
32
- v3,
23
+ for (const projection of projections) {
24
+ const projectedProgram = projectProgram(program, projection.projections);
25
+ // projectedProgram now contains the representation of the service at the given version.
33
26
  }
34
27
  ```
35
28
 
36
- The following decorators can then be used to provide version evolution of a service.
29
+ #### Get list of versions and version dependency across namespaces
30
+
31
+ Versioning library works with projection to project the service at a given version.
32
+
33
+ ```ts
34
+ const versions = resolveVersions(program, serviceNamespace);
35
+ // versions now contain a list of all the version of the service namespace and what version should all the other dependencies namespace use.
36
+ ```
37
37
 
38
- - [`@added`](#added)
39
- - [`@removed`](#removed)
40
- - [`@renamedFrom`](#renamedfrom)
41
- - [`@madeOptional`](#madeoptional)
38
+ #### Consume versioning manually
42
39
 
43
- ### Consume a versioned library
40
+ 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:
44
41
 
45
- When consuming a versioned library, it is required to indicate which version of the library to use.
46
- See [`@useDependency`](#useDependency) decorator for information about this.
42
+ - `getAddedOn`
43
+ - `getRemovedOn`
44
+ - `getRenamedFromVersion`
45
+ - `getMadeOptionalOn`
47
46
 
48
- ## References
47
+ ## Decorators
49
48
 
50
- Decorators:
49
+ ### TypeSpec.Versioning
51
50
 
52
- - [`@versioned`](#versioned) <!-- no toc -->
53
- - [`@useDependency`](#usedependency)
54
- - [`@added`](#added)
55
- - [`@removed`](#removed)
56
- - [`@renamedFrom`](#renamedfrom)
57
- - [`@madeOptional`](#madeoptional)
51
+ - [`@added`](#@added)
52
+ - [`@madeOptional`](#@madeoptional)
53
+ - [`@removed`](#@removed)
54
+ - [`@renamedFrom`](#@renamedfrom)
55
+ - [`@returnTypeChangedFrom`](#@returntypechangedfrom)
56
+ - [`@typeChangedFrom`](#@typechangedfrom)
57
+ - [`@useDependency`](#@usedependency)
58
+ - [`@versioned`](#@versioned)
58
59
 
59
- ### `@versioned`
60
+ #### `@added`
60
61
 
61
- Mark a namespace as being versioned. It takes as an argument an `enum` of versions for that namespace.
62
+ Identifies when the target was added.
62
63
 
63
64
  ```typespec
64
- @versioned(Versions)
65
- namespace MyService;
66
-
67
- enum Versions {
68
- v1,
69
- v2,
70
- v3,
71
- }
65
+ @TypeSpec.Versioning.added(version: EnumMember)
72
66
  ```
73
67
 
74
- ### `@useDependency`
68
+ ##### Target
75
69
 
76
- When using elements from another versioned namespace, the consuming namespace **MUST** specify which version of the consumed namespace to use even if the consuming namespace is not versioned itself.
70
+ `(intrinsic) unknown`
77
71
 
78
- The decorator can either target:
72
+ ##### Parameters
79
73
 
80
- - an unversioned namespace.
81
- - individual enum members of a versioned namespace's version enum.
74
+ | Name | Type | Description |
75
+ | ------- | ------------ | ----------------------------------------- |
76
+ | version | `EnumMember` | The version that the target was added in. |
82
77
 
83
- If we have a library with the following definition:
78
+ ##### Examples
84
79
 
85
- ```typespec
86
- @versioned(Versions)
87
- namespace MyLib;
88
-
89
- enum Versions {
90
- v1,
91
- v1_1,
92
- v2,
93
- }
94
- ```
80
+ ```tsp
81
+ @added(Versions.v2)
82
+ op addedInV2(): void;
95
83
 
96
- Pick a specific version to be used for all version of the service.
84
+ @added(Versions.v2)
85
+ model AlsoAddedInV2 {}
97
86
 
98
- ```typespec
99
- @versioned(Versions)
100
- @useDependency(MyLib.Versions.v1_1)
101
- namespace MyService1;
87
+ model Foo {
88
+ name: string;
102
89
 
103
- enum Version {
104
- v1,
105
- v2,
106
- v3,
90
+ @added(Versions.v3)
91
+ addedInV3: string;
107
92
  }
108
93
  ```
109
94
 
110
- Service is not versioned, pick which version of `MyLib` should be used.
111
-
112
- ```typespec
113
- @useDependency(MyLib.Versions.v1_1)
114
- namespace NonVersionedService;
115
- ```
95
+ #### `@madeOptional`
116
96
 
117
- Select mapping of version to use
97
+ Identifies when a target was made optional.
118
98
 
119
99
  ```typespec
120
- @versioned(Versions)
121
- namespace MyService1;
122
-
123
- enum Version {
124
- @useDependency(MyLib.Versions.v1_1) // V1 use lib v1_1
125
- v1,
126
- @useDependency(MyLib.Versions.v1_1) // V2 use lib v1_1
127
- v2,
128
- @useDependency(MyLib.Versions.v2) // V3 use lib v2
129
- v3,
130
- }
100
+ @TypeSpec.Versioning.madeOptional(version: EnumMember)
131
101
  ```
132
102
 
133
- ### `@added`
103
+ ##### Target
134
104
 
135
- Specify which version an entity was added. Take the enum version member.
105
+ `(intrinsic) unknown`
136
106
 
137
- Version enum member **MUST** be from the version enum for the containing namespace.
107
+ ##### Parameters
138
108
 
139
- ```typespec
140
- @added(Versions.v2)
141
- op addedInV2(): void;
109
+ | Name | Type | Description |
110
+ | ------- | ------------ | ------------------------------------------------- |
111
+ | version | `EnumMember` | The version that the target was made optional in. |
142
112
 
143
- @added(Versions.v2)
144
- model AlsoAddedInV2 {}
113
+ ##### Examples
145
114
 
115
+ ```tsp
146
116
  model Foo {
147
117
  name: string;
148
118
 
149
- @added(Versions.v3)
150
- addedInV3: string;
119
+ @madeOptional(Versions.v2)
120
+ nickname: string;
151
121
  }
152
122
  ```
153
123
 
154
- ### `@removed`
124
+ #### `@removed`
155
125
 
156
- Specify which version an entity was removed. Take the enum version member.
157
-
158
- Version enum member **MUST** be from the version enum for the containing namespace.
126
+ Identifies when the target was removed.
159
127
 
160
128
  ```typespec
129
+ @TypeSpec.Versioning.removed(version: EnumMember)
130
+ ```
131
+
132
+ ##### Target
133
+
134
+ `(intrinsic) unknown`
135
+
136
+ ##### Parameters
137
+
138
+ | Name | Type | Description |
139
+ | ------- | ------------ | ------------------------------------------- |
140
+ | version | `EnumMember` | The version that the target was removed in. |
141
+
142
+ ##### Examples
143
+
144
+ ```tsp
161
145
  @removed(Versions.v2)
162
146
  op removedInV2(): void;
163
147
 
@@ -172,62 +156,138 @@ model Foo {
172
156
  }
173
157
  ```
174
158
 
175
- ### `@renamedFrom`
159
+ #### `@renamedFrom`
176
160
 
177
- Specify which version an entity was renamed and what is is old name.
178
-
179
- Version enum member **MUST** be from the version enum for the containing namespace.
161
+ Identifies when the target has been renamed.
180
162
 
181
163
  ```typespec
164
+ @TypeSpec.Versioning.renamedFrom(version: EnumMember, oldName: valueof string)
165
+ ```
166
+
167
+ ##### Target
168
+
169
+ `(intrinsic) unknown`
170
+
171
+ ##### Parameters
172
+
173
+ | Name | Type | Description |
174
+ | ------- | ----------------------- | ------------------------------------------- |
175
+ | version | `EnumMember` | The version that the target was renamed in. |
176
+ | oldName | `valueof scalar string` | The previous name of the target. |
177
+
178
+ ##### Examples
179
+
180
+ ```tsp
182
181
  @renamedFrom(Versions.v2, "oldName")
183
182
  op newName(): void;
184
183
  ```
185
184
 
186
- ### `@madeOptional`
185
+ #### `@returnTypeChangedFrom`
186
+
187
+ Identifies when the target type changed.
188
+
189
+ ```typespec
190
+ @TypeSpec.Versioning.returnTypeChangedFrom(version: EnumMember, oldType: unknown)
191
+ ```
192
+
193
+ ##### Target
194
+
195
+ `Operation`
196
+
197
+ ##### Parameters
198
+
199
+ | Name | Type | Description |
200
+ | ------- | --------------------- | -------------------------------------------- |
201
+ | version | `EnumMember` | The version that the target type changed in. |
202
+ | oldType | `(intrinsic) unknown` | The previous type of the target. |
187
203
 
188
- Specify which version a property was made optional
204
+ #### `@typeChangedFrom`
189
205
 
190
- Version enum member **MUST** be from the version enum for the containing namespace.
206
+ Identifies when the target type changed.
191
207
 
192
208
  ```typespec
193
- model Foo {
194
- name: string;
209
+ @TypeSpec.Versioning.typeChangedFrom(version: EnumMember, oldType: unknown)
210
+ ```
195
211
 
196
- @madeOptional(Versions.v2)
197
- nickname: string;
198
- }
212
+ ##### Target
213
+
214
+ `(intrinsic) unknown`
215
+
216
+ ##### Parameters
217
+
218
+ | Name | Type | Description |
219
+ | ------- | --------------------- | -------------------------------------------- |
220
+ | version | `EnumMember` | The version that the target type changed in. |
221
+ | oldType | `(intrinsic) unknown` | The previous type of the target. |
222
+
223
+ #### `@useDependency`
224
+
225
+ Identifies that a namespace or a given versioning enum member relies upon a versioned package.
226
+
227
+ ```typespec
228
+ @TypeSpec.Versioning.useDependency(...versionRecords: EnumMember[])
199
229
  ```
200
230
 
201
- ## Consuming versioning library from an emitter
231
+ ##### Target
202
232
 
203
- ### Get the service representation at a given version
233
+ `union EnumMember | Namespace`
204
234
 
205
- Versioning library works with projection to project the service at a given version.
235
+ ##### Parameters
206
236
 
207
- ```ts
208
- // Get a list of all the different version of the service and the projections
209
- const projections = buildVersionProjections(program, serviceNamespace);
237
+ | Name | Type | Description |
238
+ | -------------- | -------------------- | --------------------------------------------------------------------- |
239
+ | versionRecords | `model EnumMember[]` | The dependent library version(s) for the target namespace or version. |
210
240
 
211
- for (const projection of projections) {
212
- const projectedProgram = projectProgram(program, projection.projections);
213
- // projectedProgram now contains the representation of the service at the given version.
241
+ ##### Examples
242
+
243
+ ###### Select a single version of `MyLib` to use
244
+
245
+ ```tsp
246
+ @useDependency(MyLib.Versions.v1_1)
247
+ namespace NonVersionedService;
248
+ ```
249
+
250
+ ###### Select which version of the library match to which version of the service.
251
+
252
+ ```tsp
253
+ @versioned(Versions)
254
+ namespace MyService1;
255
+ enum Version {
256
+ @useDependency(MyLib.Versions.v1_1) // V1 use lib v1_1
257
+ v1,
258
+ @useDependency(MyLib.Versions.v1_1) // V2 use lib v1_1
259
+ v2,
260
+ @useDependency(MyLib.Versions.v2) // V3 use lib v2
261
+ v3,
214
262
  }
215
263
  ```
216
264
 
217
- ### Get list of versions and version dependency across namespaces
265
+ #### `@versioned`
218
266
 
219
- Versioning library works with projection to project the service at a given version.
267
+ Identifies that the decorated namespace is versioned by the provided enum.
220
268
 
221
- ```ts
222
- const versions = resolveVersions(program, serviceNamespace);
223
- // versions now contain a list of all the version of the service namespace and what version should all the other dependencies namespace use.
269
+ ```typespec
270
+ @TypeSpec.Versioning.versioned(versions: Enum)
224
271
  ```
225
272
 
226
- ### Consume versioning manually
273
+ ##### Target
227
274
 
228
- 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:
275
+ `Namespace`
229
276
 
230
- - `getAddedOn`
231
- - `getRemovedOn`
232
- - `getRenamedFromVersion`
233
- - `getMadeOptionalOn`
277
+ ##### Parameters
278
+
279
+ | Name | Type | Description |
280
+ | -------- | ------ | ----------------------------------------------- |
281
+ | versions | `Enum` | The enum that describes the supported versions. |
282
+
283
+ ##### Examples
284
+
285
+ ```tsp
286
+ @versioned(Versions)
287
+ namespace MyService;
288
+ enum Versions {
289
+ v1,
290
+ v2,
291
+ v3,
292
+ }
293
+ ```
@@ -7,24 +7,91 @@ namespace TypeSpec {
7
7
  /**
8
8
  * Identifies that the decorated namespace is versioned by the provided enum.
9
9
  * @param versions The enum that describes the supported versions.
10
+ *
11
+ * @example
12
+ *
13
+ * ```tsp
14
+ * @versioned(Versions)
15
+ * namespace MyService;
16
+ * enum Versions {
17
+ * v1,
18
+ * v2,
19
+ * v3,
20
+ * }
21
+ * ```
10
22
  */
11
23
  extern dec versioned(target: Namespace, versions: Enum);
12
24
 
13
25
  /**
14
26
  * Identifies that a namespace or a given versioning enum member relies upon a versioned package.
15
27
  * @param versionRecords The dependent library version(s) for the target namespace or version.
28
+ *
29
+ * @example Select a single version of `MyLib` to use
30
+ *
31
+ * ```tsp
32
+ * @useDependency(MyLib.Versions.v1_1)
33
+ * namespace NonVersionedService;
34
+ * ```
35
+ *
36
+ * @example Select which version of the library match to which version of the service.
37
+ *
38
+ * ```tsp
39
+ * @versioned(Versions)
40
+ * namespace MyService1;
41
+ * enum Version {
42
+ * @useDependency(MyLib.Versions.v1_1) // V1 use lib v1_1
43
+ * v1,
44
+ * @useDependency(MyLib.Versions.v1_1) // V2 use lib v1_1
45
+ * v2,
46
+ * @useDependency(MyLib.Versions.v2) // V3 use lib v2
47
+ * v3,
48
+ * }
49
+ * ```
16
50
  */
17
51
  extern dec useDependency(target: EnumMember | Namespace, ...versionRecords: EnumMember[]);
18
52
 
19
53
  /**
20
54
  * Identifies when the target was added.
21
55
  * @param version The version that the target was added in.
56
+ *
57
+ * @example
58
+ *
59
+ * ```tsp
60
+ * @added(Versions.v2)
61
+ * op addedInV2(): void;
62
+ *
63
+ * @added(Versions.v2)
64
+ * model AlsoAddedInV2 {}
65
+ *
66
+ * model Foo {
67
+ * name: string;
68
+ *
69
+ * @added(Versions.v3)
70
+ * addedInV3: string;
71
+ * }
72
+ * ```
22
73
  */
23
74
  extern dec added(target: unknown, version: EnumMember);
24
75
 
25
76
  /**
26
77
  * Identifies when the target was removed.
27
78
  * @param version The version that the target was removed in.
79
+ *
80
+ * @example
81
+ * ```tsp
82
+ * @removed(Versions.v2)
83
+ * op removedInV2(): void;
84
+ *
85
+ * @removed(Versions.v2)
86
+ * model AlsoRemovedInV2 {}
87
+ *
88
+ * model Foo {
89
+ * name: string;
90
+ *
91
+ * @removed(Versions.v3)
92
+ * removedInV3: string;
93
+ * }
94
+ * ```
28
95
  */
29
96
  extern dec removed(target: unknown, version: EnumMember);
30
97
 
@@ -32,12 +99,28 @@ namespace TypeSpec {
32
99
  * Identifies when the target has been renamed.
33
100
  * @param version The version that the target was renamed in.
34
101
  * @param oldName The previous name of the target.
102
+ *
103
+ * @example
104
+ * ```tsp
105
+ * @renamedFrom(Versions.v2, "oldName")
106
+ * op newName(): void;
107
+ * ```
35
108
  */
36
109
  extern dec renamedFrom(target: unknown, version: EnumMember, oldName: valueof string);
37
110
 
38
111
  /**
39
112
  * Identifies when a target was made optional.
40
113
  * @param version The version that the target was made optional in.
114
+ *
115
+ * @example
116
+ *
117
+ * ```tsp
118
+ * model Foo {
119
+ * name: string;
120
+ * @madeOptional(Versions.v2)
121
+ * nickname: string;
122
+ * }
123
+ * ```
41
124
  */
42
125
  extern dec madeOptional(target: unknown, version: EnumMember);
43
126
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@typespec/versioning",
3
- "version": "0.47.0-dev.1",
3
+ "version": "0.47.0",
4
4
  "author": "Microsoft Corporation",
5
5
  "description": "TypeSpec library for declaring and emitting versioned APIs",
6
6
  "homepage": "https://microsoft.github.io/typespec",
@@ -42,16 +42,16 @@
42
42
  "!dist/test/**"
43
43
  ],
44
44
  "peerDependencies": {
45
- "@typespec/compiler": "~0.46.0 || >=0.47.0-dev <0.47.0"
45
+ "@typespec/compiler": "~0.47.0"
46
46
  },
47
47
  "devDependencies": {
48
48
  "@types/mocha": "~10.0.1",
49
49
  "@types/node": "~18.11.9",
50
- "@typespec/compiler": "~0.46.0 || >=0.47.0-dev <0.47.0",
51
- "@typespec/eslint-config-typespec": "~0.46.0 || >=0.47.0-dev <0.47.0",
52
- "@typespec/library-linter": "~0.46.0 || >=0.47.0-dev <0.47.0",
53
- "@typespec/eslint-plugin": "~0.46.0 || >=0.47.0-dev <0.47.0",
54
- "@typespec/tspd": "~0.46.0 || >=0.47.0-dev <0.47.0",
50
+ "@typespec/compiler": "~0.47.0",
51
+ "@typespec/eslint-config-typespec": "~0.47.0",
52
+ "@typespec/library-linter": "~0.47.0",
53
+ "@typespec/eslint-plugin": "~0.47.0",
54
+ "@typespec/tspd": "~0.46.0",
55
55
  "eslint": "^8.42.0",
56
56
  "mocha": "~10.2.0",
57
57
  "mocha-junit-reporter": "~2.2.0",
@@ -60,7 +60,6 @@
60
60
  "rimraf": "~5.0.1",
61
61
  "typescript": "~5.1.3"
62
62
  },
63
- "dependencies": {},
64
63
  "scripts": {
65
64
  "clean": "rimraf ./dist ./temp",
66
65
  "build": "tsc -p . && npm run lint-typespec-library",