@typespec/versioning 0.41.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/LICENSE +21 -0
- package/README.md +233 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +3 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/lib.d.ts +82 -0
- package/dist/src/lib.d.ts.map +1 -0
- package/dist/src/lib.js +80 -0
- package/dist/src/lib.js.map +1 -0
- package/dist/src/testing/index.d.ts +3 -0
- package/dist/src/testing/index.d.ts.map +1 -0
- package/dist/src/testing/index.js +8 -0
- package/dist/src/testing/index.js.map +1 -0
- package/dist/src/validate.d.ts +3 -0
- package/dist/src/validate.d.ts.map +1 -0
- package/dist/src/validate.js +408 -0
- package/dist/src/validate.js.map +1 -0
- package/dist/src/versioning.d.ts +159 -0
- package/dist/src/versioning.d.ts.map +1 -0
- package/dist/src/versioning.js +782 -0
- package/dist/src/versioning.js.map +1 -0
- package/lib/decorators.tsp +20 -0
- package/lib/versioning.tsp +200 -0
- package/package.json +71 -0
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
import { getNamespaceFullName, getTypeName, isTemplateInstance, navigateProgram, NoTarget, } from "@typespec/compiler";
|
|
2
|
+
import { reportDiagnostic } from "./lib.js";
|
|
3
|
+
import { Availability, findVersionedNamespace, getAvailabilityMap, getMadeOptionalOn, getUseDependencies, getVersionDependencies, getVersions, } from "./versioning.js";
|
|
4
|
+
export function $onValidate(program) {
|
|
5
|
+
const namespaceDependencies = new Map();
|
|
6
|
+
function addDependency(source, target) {
|
|
7
|
+
var _a;
|
|
8
|
+
if (!target || !("namespace" in target) || !target.namespace) {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
const set = (_a = namespaceDependencies.get(source)) !== null && _a !== void 0 ? _a : new Set();
|
|
12
|
+
if (target.namespace !== source) {
|
|
13
|
+
set.add(target.namespace);
|
|
14
|
+
}
|
|
15
|
+
namespaceDependencies.set(source, set);
|
|
16
|
+
}
|
|
17
|
+
navigateProgram(program, {
|
|
18
|
+
model: (model) => {
|
|
19
|
+
// If this is an instantiated type we don't want to keep the mapping.
|
|
20
|
+
if (isTemplateInstance(model)) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
addDependency(model.namespace, model.baseModel);
|
|
24
|
+
for (const prop of model.properties.values()) {
|
|
25
|
+
addDependency(model.namespace, prop.type);
|
|
26
|
+
// Validate model -> property have correct versioning
|
|
27
|
+
validateTargetVersionCompatible(program, model, prop, { isTargetADependent: true });
|
|
28
|
+
// Validate model property -> type have correct versioning
|
|
29
|
+
validateReference(program, prop, prop.type);
|
|
30
|
+
// Validate model property type is correct when madeOptional
|
|
31
|
+
validateMadeOptional(program, prop);
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
union: (union) => {
|
|
35
|
+
if (union.namespace === undefined) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
for (const option of union.options.values()) {
|
|
39
|
+
addDependency(union.namespace, option);
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
operation: (op) => {
|
|
43
|
+
var _a, _b;
|
|
44
|
+
const namespace = (_a = op.namespace) !== null && _a !== void 0 ? _a : (_b = op.interface) === null || _b === void 0 ? void 0 : _b.namespace;
|
|
45
|
+
addDependency(namespace, op.parameters);
|
|
46
|
+
addDependency(namespace, op.returnType);
|
|
47
|
+
if (op.interface) {
|
|
48
|
+
// Validate model -> property have correct versioning
|
|
49
|
+
validateTargetVersionCompatible(program, op.interface, op, { isTargetADependent: true });
|
|
50
|
+
}
|
|
51
|
+
validateTargetVersionCompatible(program, op, op.returnType);
|
|
52
|
+
},
|
|
53
|
+
namespace: (namespace) => {
|
|
54
|
+
const versionedNamespace = findVersionedNamespace(program, namespace);
|
|
55
|
+
const dependencies = getVersionDependencies(program, namespace);
|
|
56
|
+
if (dependencies === undefined) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
for (const [dependencyNs, value] of dependencies.entries()) {
|
|
60
|
+
if (versionedNamespace) {
|
|
61
|
+
const usingUseDependency = getUseDependencies(program, namespace, false) !== undefined;
|
|
62
|
+
if (usingUseDependency) {
|
|
63
|
+
reportDiagnostic(program, {
|
|
64
|
+
code: "incompatible-versioned-namespace-use-dependency",
|
|
65
|
+
target: namespace,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
else if (!(value instanceof Map)) {
|
|
69
|
+
reportDiagnostic(program, {
|
|
70
|
+
code: "versioned-dependency-record-not-mapping",
|
|
71
|
+
format: { dependency: getNamespaceFullName(dependencyNs) },
|
|
72
|
+
target: namespace,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
if (value instanceof Map) {
|
|
78
|
+
reportDiagnostic(program, {
|
|
79
|
+
code: "versioned-dependency-not-picked",
|
|
80
|
+
format: { dependency: getNamespaceFullName(dependencyNs) },
|
|
81
|
+
target: namespace,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
enum: (en) => {
|
|
88
|
+
// construct the list of tuples in the old format if version
|
|
89
|
+
// information is placed in the Version enum members
|
|
90
|
+
const useDependencies = getUseDependencies(program, en);
|
|
91
|
+
if (!useDependencies) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
for (const [depNs, deps] of useDependencies) {
|
|
95
|
+
const set = new Set();
|
|
96
|
+
if (deps instanceof Map) {
|
|
97
|
+
for (const val of deps.values()) {
|
|
98
|
+
set.add(val.namespace);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
set.add(deps.namespace);
|
|
103
|
+
}
|
|
104
|
+
namespaceDependencies.set(depNs, set);
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
}, { includeTemplateDeclaration: true });
|
|
108
|
+
validateVersionedNamespaceUsage(program, namespaceDependencies);
|
|
109
|
+
}
|
|
110
|
+
function validateVersionedNamespaceUsage(program, namespaceDependencies) {
|
|
111
|
+
for (const [source, targets] of namespaceDependencies.entries()) {
|
|
112
|
+
const dependencies = source && getVersionDependencies(program, source);
|
|
113
|
+
for (const target of targets) {
|
|
114
|
+
const targetVersionedNamespace = findVersionedNamespace(program, target);
|
|
115
|
+
if (targetVersionedNamespace !== undefined &&
|
|
116
|
+
!(source && (isSubNamespace(target, source) || isSubNamespace(source, target))) &&
|
|
117
|
+
(dependencies === null || dependencies === void 0 ? void 0 : dependencies.get(targetVersionedNamespace)) === undefined) {
|
|
118
|
+
reportDiagnostic(program, {
|
|
119
|
+
code: "using-versioned-library",
|
|
120
|
+
format: {
|
|
121
|
+
sourceNs: source ? getNamespaceFullName(source) : "global",
|
|
122
|
+
targetNs: getNamespaceFullName(target),
|
|
123
|
+
},
|
|
124
|
+
target: source !== null && source !== void 0 ? source : NoTarget,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
function isSubNamespace(parent, child) {
|
|
131
|
+
let current = child;
|
|
132
|
+
while (current && current.name !== "") {
|
|
133
|
+
if (current === parent) {
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
current = current.namespace;
|
|
137
|
+
}
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
function validateMadeOptional(program, target) {
|
|
141
|
+
if (target.kind === "ModelProperty") {
|
|
142
|
+
const madeOptionalOn = getMadeOptionalOn(program, target);
|
|
143
|
+
if (!madeOptionalOn) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
// if the @madeOptional decorator is on a property it MUST be optional
|
|
147
|
+
if (!target.optional) {
|
|
148
|
+
reportDiagnostic(program, {
|
|
149
|
+
code: "made-optional-not-optional",
|
|
150
|
+
format: {
|
|
151
|
+
name: target.name,
|
|
152
|
+
},
|
|
153
|
+
target: target,
|
|
154
|
+
});
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Validate the target reference versioning is compatible with the source versioning.
|
|
161
|
+
* This will also validate any template arguments used in the reference.
|
|
162
|
+
* e.g. The target cannot be added after the source was added.
|
|
163
|
+
* @param source Source type referencing the target type.
|
|
164
|
+
* @param target Type being referenced from the source
|
|
165
|
+
*/
|
|
166
|
+
function validateReference(program, source, target) {
|
|
167
|
+
validateTargetVersionCompatible(program, source, target);
|
|
168
|
+
if (target.kind === "Model" && target.templateArguments) {
|
|
169
|
+
for (const param of target.templateArguments) {
|
|
170
|
+
validateTargetVersionCompatible(program, source, param);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
function getAvailabilityMapWithParentInfo(program, type) {
|
|
175
|
+
const base = getAvailabilityMap(program, type);
|
|
176
|
+
// get any parent availability information
|
|
177
|
+
let parentMap = undefined;
|
|
178
|
+
switch (type.kind) {
|
|
179
|
+
case "Operation":
|
|
180
|
+
const parentInterface = type.interface;
|
|
181
|
+
if (parentInterface) {
|
|
182
|
+
parentMap = getAvailabilityMap(program, parentInterface);
|
|
183
|
+
}
|
|
184
|
+
break;
|
|
185
|
+
case "ModelProperty":
|
|
186
|
+
const parentModel = type.model;
|
|
187
|
+
if (parentModel) {
|
|
188
|
+
parentMap = getAvailabilityMap(program, parentModel);
|
|
189
|
+
}
|
|
190
|
+
break;
|
|
191
|
+
default:
|
|
192
|
+
break;
|
|
193
|
+
}
|
|
194
|
+
if (!base && !parentMap)
|
|
195
|
+
return undefined;
|
|
196
|
+
else if (!base && parentMap)
|
|
197
|
+
return parentMap;
|
|
198
|
+
else
|
|
199
|
+
return base;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Validate the target versioning is compatible with the versioning of the source.
|
|
203
|
+
* e.g. The target cannot be added after the source was added.
|
|
204
|
+
* @param source Source type referencing the target type.
|
|
205
|
+
* @param target Type being referenced from the source
|
|
206
|
+
*/
|
|
207
|
+
function validateTargetVersionCompatible(program, source, target, validateOptions = {}) {
|
|
208
|
+
const sourceAvailability = getAvailabilityMapWithParentInfo(program, source);
|
|
209
|
+
const [sourceNamespace] = getVersions(program, source);
|
|
210
|
+
let targetAvailability = getAvailabilityMapWithParentInfo(program, target);
|
|
211
|
+
const [targetNamespace] = getVersions(program, target);
|
|
212
|
+
if (!targetAvailability || !targetNamespace)
|
|
213
|
+
return;
|
|
214
|
+
if (sourceNamespace !== targetNamespace) {
|
|
215
|
+
const dependencies = getVersionDependencies(program, source.namespace);
|
|
216
|
+
const versionMap = dependencies === null || dependencies === void 0 ? void 0 : dependencies.get(targetNamespace);
|
|
217
|
+
if (versionMap === undefined)
|
|
218
|
+
return;
|
|
219
|
+
targetAvailability = translateAvailability(program, targetAvailability, versionMap, source, target);
|
|
220
|
+
if (!targetAvailability) {
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
if (validateOptions.isTargetADependent) {
|
|
225
|
+
validateAvailabilityForContains(program, sourceAvailability, targetAvailability, source, target);
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
validateAvailabilityForRef(program, sourceAvailability, targetAvailability, source, target);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
function translateAvailability(program, avail, versionMap, source, target) {
|
|
232
|
+
if (!(versionMap instanceof Map)) {
|
|
233
|
+
const version = versionMap;
|
|
234
|
+
if ([Availability.Removed, Availability.Unavailable].includes(avail.get(version.name))) {
|
|
235
|
+
const addedAfter = findAvailabilityAfterVersion(version.name, Availability.Added, avail);
|
|
236
|
+
const removedBefore = findAvailabilityOnOrBeforeVersion(version.name, Availability.Removed, avail);
|
|
237
|
+
if (addedAfter) {
|
|
238
|
+
reportDiagnostic(program, {
|
|
239
|
+
code: "incompatible-versioned-reference",
|
|
240
|
+
messageId: "versionedDependencyAddedAfter",
|
|
241
|
+
format: {
|
|
242
|
+
sourceName: getTypeName(source),
|
|
243
|
+
targetName: getTypeName(target),
|
|
244
|
+
dependencyVersion: prettyVersion(version),
|
|
245
|
+
targetAddedOn: addedAfter,
|
|
246
|
+
},
|
|
247
|
+
target: source,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
if (removedBefore) {
|
|
251
|
+
reportDiagnostic(program, {
|
|
252
|
+
code: "incompatible-versioned-reference",
|
|
253
|
+
messageId: "versionedDependencyRemovedBefore",
|
|
254
|
+
format: {
|
|
255
|
+
sourceName: getTypeName(source),
|
|
256
|
+
targetName: getTypeName(target),
|
|
257
|
+
dependencyVersion: prettyVersion(version),
|
|
258
|
+
targetAddedOn: removedBefore,
|
|
259
|
+
},
|
|
260
|
+
target: source,
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return undefined;
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
const newAvail = new Map();
|
|
268
|
+
for (const [key, val] of versionMap) {
|
|
269
|
+
const isAvail = avail.get(val.name);
|
|
270
|
+
newAvail.set(key.name, isAvail);
|
|
271
|
+
}
|
|
272
|
+
return newAvail;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
function findAvailabilityAfterVersion(version, status, avail) {
|
|
276
|
+
let search = false;
|
|
277
|
+
for (const [key, val] of avail) {
|
|
278
|
+
if (version === key) {
|
|
279
|
+
search = true;
|
|
280
|
+
continue;
|
|
281
|
+
}
|
|
282
|
+
if (!search)
|
|
283
|
+
continue;
|
|
284
|
+
if (val === status)
|
|
285
|
+
return key;
|
|
286
|
+
}
|
|
287
|
+
return undefined;
|
|
288
|
+
}
|
|
289
|
+
function findAvailabilityOnOrBeforeVersion(version, status, avail) {
|
|
290
|
+
let search = false;
|
|
291
|
+
for (const [key, val] of avail) {
|
|
292
|
+
if ([Availability.Added, Availability.Added].includes(val)) {
|
|
293
|
+
search = true;
|
|
294
|
+
}
|
|
295
|
+
if (!search)
|
|
296
|
+
continue;
|
|
297
|
+
if (val === status) {
|
|
298
|
+
return key;
|
|
299
|
+
}
|
|
300
|
+
if (key === version) {
|
|
301
|
+
break;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
return undefined;
|
|
305
|
+
}
|
|
306
|
+
function validateAvailabilityForRef(program, sourceAvail, targetAvail, source, target) {
|
|
307
|
+
// if source is unversioned and target is versioned
|
|
308
|
+
if (sourceAvail === undefined) {
|
|
309
|
+
if (!isAvailableInAllVersion(targetAvail)) {
|
|
310
|
+
reportDiagnostic(program, {
|
|
311
|
+
code: "incompatible-versioned-reference",
|
|
312
|
+
messageId: "default",
|
|
313
|
+
format: {
|
|
314
|
+
sourceName: getTypeName(source),
|
|
315
|
+
targetName: getTypeName(target),
|
|
316
|
+
},
|
|
317
|
+
target: source,
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
const keySet = new Set([...sourceAvail.keys(), ...targetAvail.keys()]);
|
|
323
|
+
for (const key of keySet) {
|
|
324
|
+
const sourceVal = sourceAvail.get(key);
|
|
325
|
+
const targetVal = targetAvail.get(key);
|
|
326
|
+
if ([Availability.Added].includes(sourceVal) &&
|
|
327
|
+
[Availability.Removed, Availability.Unavailable].includes(targetVal)) {
|
|
328
|
+
const targetAddedOn = findAvailabilityAfterVersion(key, Availability.Added, targetAvail);
|
|
329
|
+
reportDiagnostic(program, {
|
|
330
|
+
code: "incompatible-versioned-reference",
|
|
331
|
+
messageId: "addedAfter",
|
|
332
|
+
format: {
|
|
333
|
+
sourceName: getTypeName(source),
|
|
334
|
+
targetName: getTypeName(target),
|
|
335
|
+
sourceAddedOn: key,
|
|
336
|
+
targetAddedOn: targetAddedOn,
|
|
337
|
+
},
|
|
338
|
+
target: source,
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
if ([Availability.Removed].includes(sourceVal) &&
|
|
342
|
+
[Availability.Unavailable].includes(targetVal)) {
|
|
343
|
+
const targetRemovedOn = findAvailabilityOnOrBeforeVersion(key, Availability.Removed, targetAvail);
|
|
344
|
+
reportDiagnostic(program, {
|
|
345
|
+
code: "incompatible-versioned-reference",
|
|
346
|
+
messageId: "removedBefore",
|
|
347
|
+
format: {
|
|
348
|
+
sourceName: getTypeName(source),
|
|
349
|
+
targetName: getTypeName(target),
|
|
350
|
+
sourceRemovedOn: key,
|
|
351
|
+
targetRemovedOn: targetRemovedOn,
|
|
352
|
+
},
|
|
353
|
+
target: source,
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
function validateAvailabilityForContains(program, sourceAvail, targetAvail, source, target) {
|
|
359
|
+
if (!sourceAvail)
|
|
360
|
+
return;
|
|
361
|
+
const keySet = new Set([...sourceAvail.keys(), ...targetAvail.keys()]);
|
|
362
|
+
for (const key of keySet) {
|
|
363
|
+
const sourceVal = sourceAvail.get(key);
|
|
364
|
+
const targetVal = targetAvail.get(key);
|
|
365
|
+
if ([Availability.Added].includes(targetVal) &&
|
|
366
|
+
[Availability.Removed, Availability.Unavailable].includes(sourceVal)) {
|
|
367
|
+
const sourceAddedOn = findAvailabilityOnOrBeforeVersion(key, Availability.Added, sourceAvail);
|
|
368
|
+
reportDiagnostic(program, {
|
|
369
|
+
code: "incompatible-versioned-reference",
|
|
370
|
+
messageId: "dependentAddedAfter",
|
|
371
|
+
format: {
|
|
372
|
+
sourceName: getTypeName(source),
|
|
373
|
+
targetName: getTypeName(target),
|
|
374
|
+
sourceAddedOn: sourceAddedOn,
|
|
375
|
+
targetAddedOn: key,
|
|
376
|
+
},
|
|
377
|
+
target: target,
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
if ([Availability.Removed].includes(sourceVal) &&
|
|
381
|
+
[Availability.Added, Availability.Available].includes(targetVal)) {
|
|
382
|
+
const targetRemovedOn = findAvailabilityAfterVersion(key, Availability.Removed, targetAvail);
|
|
383
|
+
reportDiagnostic(program, {
|
|
384
|
+
code: "incompatible-versioned-reference",
|
|
385
|
+
messageId: "dependentRemovedBefore",
|
|
386
|
+
format: {
|
|
387
|
+
sourceName: getTypeName(source),
|
|
388
|
+
targetName: getTypeName(target),
|
|
389
|
+
sourceRemovedOn: key,
|
|
390
|
+
targetRemovedOn: targetRemovedOn,
|
|
391
|
+
},
|
|
392
|
+
target: target,
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
function isAvailableInAllVersion(avail) {
|
|
398
|
+
for (const val of avail.values()) {
|
|
399
|
+
if ([Availability.Removed, Availability.Unavailable].includes(val))
|
|
400
|
+
return false;
|
|
401
|
+
}
|
|
402
|
+
return true;
|
|
403
|
+
}
|
|
404
|
+
function prettyVersion(version) {
|
|
405
|
+
var _a;
|
|
406
|
+
return (_a = version === null || version === void 0 ? void 0 : version.value) !== null && _a !== void 0 ? _a : "<n/a>";
|
|
407
|
+
}
|
|
408
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { DecoratorContext, Enum, EnumMember, ModelProperty, Namespace, ObjectType, Operation, Program, ProjectionApplication, Tuple, Type } from "@typespec/compiler";
|
|
2
|
+
export declare const namespace = "TypeSpec.Versioning";
|
|
3
|
+
export declare function $added(context: DecoratorContext, t: Type, v: EnumMember): void;
|
|
4
|
+
export declare function $removed(context: DecoratorContext, t: Type, v: EnumMember): void;
|
|
5
|
+
/**
|
|
6
|
+
* Returns the mapping of versions to old type values, if applicable
|
|
7
|
+
* @param p TypeSpec program
|
|
8
|
+
* @param t type to query
|
|
9
|
+
* @returns Map of versions to old types, if any
|
|
10
|
+
*/
|
|
11
|
+
export declare function getTypeChangedFrom(p: Program, t: Type): Map<Version, Type> | undefined;
|
|
12
|
+
export declare function $typeChangedFrom(context: DecoratorContext, prop: ModelProperty, v: EnumMember, oldType: any): void;
|
|
13
|
+
/**
|
|
14
|
+
* Returns the mapping of versions to old return type values, if applicable
|
|
15
|
+
* @param p TypeSpec program
|
|
16
|
+
* @param t type to query
|
|
17
|
+
* @returns Map of versions to old types, if any
|
|
18
|
+
*/
|
|
19
|
+
export declare function getReturnTypeChangedFrom(p: Program, t: Type): Map<Version, Type> | undefined;
|
|
20
|
+
export declare function $returnTypeChangedFrom(context: DecoratorContext, op: Operation, v: EnumMember, oldReturnType: any): void;
|
|
21
|
+
export declare function $renamedFrom(context: DecoratorContext, t: Type, v: EnumMember, oldName: string): void;
|
|
22
|
+
export declare function $madeOptional(context: DecoratorContext, t: ModelProperty, v: EnumMember): void;
|
|
23
|
+
/**
|
|
24
|
+
* @deprecated since version 0.39.0. Use getRenamedFromVersions
|
|
25
|
+
* @returns version when the given type was added if applicable.
|
|
26
|
+
*/
|
|
27
|
+
export declare function getRenamedFromVersion(p: Program, t: Type): Version | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* @returns the list of versions for which this decorator has been applied
|
|
30
|
+
*/
|
|
31
|
+
export declare function getRenamedFromVersions(p: Program, t: Type): Version[] | undefined;
|
|
32
|
+
/**
|
|
33
|
+
* @deprecated since version 0.39.0. Use getNameAtVersion instead.
|
|
34
|
+
* @returns get old renamed name if applicable.
|
|
35
|
+
*/
|
|
36
|
+
export declare function getRenamedFromOldName(p: Program, t: Type, v: ObjectType): string;
|
|
37
|
+
/**
|
|
38
|
+
* @returns get old name if applicable.
|
|
39
|
+
*/
|
|
40
|
+
export declare function getNameAtVersion(p: Program, t: Type, v: ObjectType): string;
|
|
41
|
+
/**
|
|
42
|
+
* @returns get old type if applicable.
|
|
43
|
+
*/
|
|
44
|
+
export declare function getTypeBeforeVersion(p: Program, t: Type, v: ObjectType): Type | undefined;
|
|
45
|
+
/**
|
|
46
|
+
* @returns get old type if applicable.
|
|
47
|
+
*/
|
|
48
|
+
export declare function getReturnTypeBeforeVersion(p: Program, t: Type, v: ObjectType): any;
|
|
49
|
+
/**
|
|
50
|
+
* @deprecated since version 0.39.0.
|
|
51
|
+
* @returns version when the given type was added if applicable.
|
|
52
|
+
*/
|
|
53
|
+
export declare function getAddedOn(p: Program, t: Type): Version | undefined;
|
|
54
|
+
/**
|
|
55
|
+
* @deprecated since version 0.39.0.
|
|
56
|
+
* @returns version when the given type was removed if applicable.
|
|
57
|
+
*/
|
|
58
|
+
export declare function getRemovedOn(p: Program, t: Type): Version | undefined;
|
|
59
|
+
export declare function getAddedOnVersions(p: Program, t: Type): Version[] | undefined;
|
|
60
|
+
export declare function getRemovedOnVersions(p: Program, t: Type): Version[] | undefined;
|
|
61
|
+
/**
|
|
62
|
+
* @returns version when the given type was made optional if applicable.
|
|
63
|
+
*/
|
|
64
|
+
export declare function getMadeOptionalOn(p: Program, t: Type): Version | undefined;
|
|
65
|
+
export declare class VersionMap {
|
|
66
|
+
private map;
|
|
67
|
+
constructor(namespace: Namespace, enumType: Enum);
|
|
68
|
+
getVersionForEnumMember(member: EnumMember): Version | undefined;
|
|
69
|
+
getVersions(): Version[];
|
|
70
|
+
get size(): number;
|
|
71
|
+
}
|
|
72
|
+
export declare function $versioned(context: DecoratorContext, t: Namespace, versions: Enum): void;
|
|
73
|
+
/**
|
|
74
|
+
* Get the version map of the namespace.
|
|
75
|
+
*/
|
|
76
|
+
export declare function getVersion(program: Program, namespace: Namespace): VersionMap | undefined;
|
|
77
|
+
export declare function findVersionedNamespace(program: Program, namespace: Namespace): Namespace | undefined;
|
|
78
|
+
export declare function $useDependency(context: DecoratorContext, target: EnumMember | Namespace, ...versionRecords: EnumMember[]): void;
|
|
79
|
+
export declare function getUseDependencies(program: Program, target: Namespace | Enum, searchEnum?: boolean): Map<Namespace, Map<Version, Version> | Version> | undefined;
|
|
80
|
+
export declare function $versionedDependency(context: DecoratorContext, referenceNamespace: Namespace, versionRecord: Tuple | EnumMember): void;
|
|
81
|
+
export declare function getVersionDependencies(program: Program, namespace: Namespace): Map<Namespace, Map<Version, Version> | Version> | undefined;
|
|
82
|
+
export interface VersionResolution {
|
|
83
|
+
/**
|
|
84
|
+
* Version for the root namespace. `undefined` if not versioned.
|
|
85
|
+
*/
|
|
86
|
+
rootVersion: Version | undefined;
|
|
87
|
+
/**
|
|
88
|
+
* Resolved version for all the referenced namespaces.
|
|
89
|
+
*/
|
|
90
|
+
versions: Map<Namespace, Version>;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Resolve the version to use for all namespace for each of the root namespace versions.
|
|
94
|
+
* @param program
|
|
95
|
+
* @param rootNs Root namespace.
|
|
96
|
+
*/
|
|
97
|
+
export declare function resolveVersions(program: Program, rootNs: Namespace): VersionResolution[];
|
|
98
|
+
/**
|
|
99
|
+
* Represent the set of projections used to project to that version.
|
|
100
|
+
*/
|
|
101
|
+
interface VersionProjections {
|
|
102
|
+
version: string | undefined;
|
|
103
|
+
projections: ProjectionApplication[];
|
|
104
|
+
}
|
|
105
|
+
export declare function buildVersionProjections(program: Program, rootNs: Namespace): VersionProjections[];
|
|
106
|
+
export declare function getVersionsForEnum(program: Program, en: Enum): [Namespace, VersionMap] | [];
|
|
107
|
+
export declare function getVersions(p: Program, t: Type): [Namespace, VersionMap] | [];
|
|
108
|
+
/**
|
|
109
|
+
* @deprecated since version 0.39.0. Use existsAtVersion instead.
|
|
110
|
+
* @param p
|
|
111
|
+
* @param type
|
|
112
|
+
* @param version
|
|
113
|
+
* @returns
|
|
114
|
+
*/
|
|
115
|
+
export declare function addedAfter(p: Program, type: Type, version: ObjectType): boolean;
|
|
116
|
+
/**
|
|
117
|
+
* @deprecated since version 0.39.0. Use existsAtVersion instead.
|
|
118
|
+
* @param p
|
|
119
|
+
* @param type
|
|
120
|
+
* @param version
|
|
121
|
+
* @returns
|
|
122
|
+
*/
|
|
123
|
+
export declare function removedOnOrBefore(p: Program, type: Type, version: ObjectType): boolean;
|
|
124
|
+
export declare enum Availability {
|
|
125
|
+
Unavailable = "Unavailable",
|
|
126
|
+
Added = "Added",
|
|
127
|
+
Available = "Available",
|
|
128
|
+
Removed = "Removed"
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Returns a map of version names and whether a given type is available in that version
|
|
132
|
+
* @param program TypeSpec program
|
|
133
|
+
* @param type Type to get the availability map for
|
|
134
|
+
* @returns the availability map for the type, if applicable
|
|
135
|
+
*/
|
|
136
|
+
export declare function getAvailabilityMap(program: Program, type: Type): Map<string, Availability> | undefined;
|
|
137
|
+
export declare function existsAtVersion(p: Program, type: Type, versionKey: ObjectType): boolean;
|
|
138
|
+
/**
|
|
139
|
+
* @deprecated since version 0.39.0. Use hasDifferentNameAtVersion instead.
|
|
140
|
+
* @param p
|
|
141
|
+
* @param type
|
|
142
|
+
* @param version
|
|
143
|
+
* @returns
|
|
144
|
+
*/
|
|
145
|
+
export declare function renamedAfter(p: Program, type: Type, version: ObjectType): boolean;
|
|
146
|
+
export declare function hasDifferentNameAtVersion(p: Program, type: Type, version: ObjectType): boolean;
|
|
147
|
+
export declare function madeOptionalAfter(p: Program, type: Type, version: ObjectType): boolean;
|
|
148
|
+
export declare function hasDifferentTypeAtVersion(p: Program, type: Type, version: ObjectType): boolean;
|
|
149
|
+
export declare function hasDifferentReturnTypeAtVersion(p: Program, type: Type, version: ObjectType): boolean;
|
|
150
|
+
export declare function getVersionForEnumMember(program: Program, member: EnumMember): Version | undefined;
|
|
151
|
+
export interface Version {
|
|
152
|
+
name: string;
|
|
153
|
+
value: string;
|
|
154
|
+
namespace: Namespace;
|
|
155
|
+
enumMember: EnumMember;
|
|
156
|
+
index: number;
|
|
157
|
+
}
|
|
158
|
+
export {};
|
|
159
|
+
//# sourceMappingURL=versioning.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versioning.d.ts","sourceRoot":"","sources":["../../src/versioning.ts"],"names":[],"mappings":"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"}
|