jsii-diff 1.35.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 +202 -0
- package/NOTICE +2 -0
- package/README.md +111 -0
- package/bin/jsii-diff +2 -0
- package/bin/jsii-diff.d.ts +1 -0
- package/bin/jsii-diff.js +230 -0
- package/lib/diagnostics.d.ts +17 -0
- package/lib/diagnostics.js +52 -0
- package/lib/index.d.ts +11 -0
- package/lib/index.js +20 -0
- package/lib/stability.d.ts +3 -0
- package/lib/stability.js +52 -0
- package/lib/type-analysis.d.ts +39 -0
- package/lib/type-analysis.js +172 -0
- package/lib/type-comparison.d.ts +195 -0
- package/lib/type-comparison.js +508 -0
- package/lib/types.d.ts +46 -0
- package/lib/types.js +136 -0
- package/lib/util.d.ts +19 -0
- package/lib/util.js +117 -0
- package/lib/validations.d.ts +157 -0
- package/lib/validations.js +487 -0
- package/lib/version.d.ts +2 -0
- package/lib/version.js +7 -0
- package/package.json +57 -0
- package/test/classes.test.d.ts +1 -0
- package/test/classes.test.js +542 -0
- package/test/diagnostics.test.d.ts +1 -0
- package/test/diagnostics.test.js +110 -0
- package/test/enums.test.d.ts +1 -0
- package/test/enums.test.js +41 -0
- package/test/structs.test.d.ts +1 -0
- package/test/structs.test.js +242 -0
- package/test/type-unions.test.d.ts +1 -0
- package/test/type-unions.test.js +101 -0
- package/test/util.d.ts +4 -0
- package/test/util.js +38 -0
package/lib/types.js
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.describeInterfaceType = exports.describeType = exports.apiElementIdentifier = exports.Mismatches = void 0;
|
|
4
|
+
const reflect = require("jsii-reflect");
|
|
5
|
+
class Mismatches {
|
|
6
|
+
constructor(opts) {
|
|
7
|
+
this.mismatches = new Array();
|
|
8
|
+
this.defaultStability = opts.defaultStability;
|
|
9
|
+
}
|
|
10
|
+
report(options) {
|
|
11
|
+
var _a;
|
|
12
|
+
const fqn = apiElementIdentifier(options.violator);
|
|
13
|
+
const key = `${options.ruleKey}:${fqn}`;
|
|
14
|
+
this.mismatches.push({
|
|
15
|
+
violationKey: key,
|
|
16
|
+
message: `${describeApiElement(options.violator)} ${fqn}: ${options.message}`,
|
|
17
|
+
stability: (_a = options.violator.docs.stability) !== null && _a !== void 0 ? _a : this.defaultStability,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
*messages() {
|
|
21
|
+
for (const mis of this.mismatches) {
|
|
22
|
+
yield mis.message;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
get count() {
|
|
26
|
+
return this.mismatches.length;
|
|
27
|
+
}
|
|
28
|
+
filter(pred) {
|
|
29
|
+
const ret = new Mismatches({ defaultStability: this.defaultStability });
|
|
30
|
+
ret.mismatches.push(...this.mismatches.filter(pred));
|
|
31
|
+
return ret;
|
|
32
|
+
}
|
|
33
|
+
withMotivation(motivation) {
|
|
34
|
+
return {
|
|
35
|
+
report: (options) => this.report({
|
|
36
|
+
...options,
|
|
37
|
+
message: `${options.message}: ${motivation}`,
|
|
38
|
+
}),
|
|
39
|
+
withMotivation: (innerMotivation) => this.withMotivation(`${innerMotivation}: ${motivation}`),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.Mismatches = Mismatches;
|
|
44
|
+
function apiElementIdentifier(apiElement) {
|
|
45
|
+
return dispatch(apiElement, {
|
|
46
|
+
method(x) {
|
|
47
|
+
return `${x.parentType.fqn}.${x.name}`;
|
|
48
|
+
},
|
|
49
|
+
init(x) {
|
|
50
|
+
return `${x.parentType.fqn}.${x.name}`;
|
|
51
|
+
},
|
|
52
|
+
property(x) {
|
|
53
|
+
return `${x.parentType.fqn}.${x.name}`;
|
|
54
|
+
},
|
|
55
|
+
enumMember(x) {
|
|
56
|
+
return `${x.enumType.fqn}.${x.name}`;
|
|
57
|
+
},
|
|
58
|
+
enumType(x) {
|
|
59
|
+
return `${x.fqn}`;
|
|
60
|
+
},
|
|
61
|
+
klass(x) {
|
|
62
|
+
return `${x.fqn}`;
|
|
63
|
+
},
|
|
64
|
+
iface(x) {
|
|
65
|
+
return `${x.fqn}`;
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
exports.apiElementIdentifier = apiElementIdentifier;
|
|
70
|
+
function describeApiElement(apiElement) {
|
|
71
|
+
return dispatch(apiElement, {
|
|
72
|
+
method() {
|
|
73
|
+
return 'METHOD';
|
|
74
|
+
},
|
|
75
|
+
init() {
|
|
76
|
+
return 'INITIALIZER';
|
|
77
|
+
},
|
|
78
|
+
property() {
|
|
79
|
+
return 'PROP';
|
|
80
|
+
},
|
|
81
|
+
enumMember() {
|
|
82
|
+
return 'ENUM VALUE';
|
|
83
|
+
},
|
|
84
|
+
enumType() {
|
|
85
|
+
return 'ENUM';
|
|
86
|
+
},
|
|
87
|
+
klass() {
|
|
88
|
+
return 'CLASS';
|
|
89
|
+
},
|
|
90
|
+
iface() {
|
|
91
|
+
return 'IFACE';
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
function dispatch(apiElement, fns) {
|
|
96
|
+
if (apiElement instanceof reflect.Method) {
|
|
97
|
+
return fns.method(apiElement);
|
|
98
|
+
}
|
|
99
|
+
if (apiElement instanceof reflect.Property) {
|
|
100
|
+
return fns.property(apiElement);
|
|
101
|
+
}
|
|
102
|
+
if (apiElement instanceof reflect.EnumMember) {
|
|
103
|
+
return fns.enumMember(apiElement);
|
|
104
|
+
}
|
|
105
|
+
if (apiElement instanceof reflect.ClassType) {
|
|
106
|
+
return fns.klass(apiElement);
|
|
107
|
+
}
|
|
108
|
+
if (apiElement instanceof reflect.InterfaceType) {
|
|
109
|
+
return fns.iface(apiElement);
|
|
110
|
+
}
|
|
111
|
+
if (apiElement instanceof reflect.Initializer) {
|
|
112
|
+
return fns.init(apiElement);
|
|
113
|
+
}
|
|
114
|
+
if (apiElement instanceof reflect.EnumType) {
|
|
115
|
+
return fns.enumType(apiElement);
|
|
116
|
+
}
|
|
117
|
+
throw new Error(`Unrecognized violator: ${apiElement.toString()}`);
|
|
118
|
+
}
|
|
119
|
+
function describeType(type) {
|
|
120
|
+
if (type.isClassType()) {
|
|
121
|
+
return 'CLASS';
|
|
122
|
+
}
|
|
123
|
+
if (type.isInterfaceType()) {
|
|
124
|
+
return 'IFACE';
|
|
125
|
+
}
|
|
126
|
+
if (type.isEnumType()) {
|
|
127
|
+
return 'ENUM';
|
|
128
|
+
}
|
|
129
|
+
return 'TYPE';
|
|
130
|
+
}
|
|
131
|
+
exports.describeType = describeType;
|
|
132
|
+
function describeInterfaceType(dataType) {
|
|
133
|
+
return dataType ? 'struct' : 'regular interface';
|
|
134
|
+
}
|
|
135
|
+
exports.describeInterfaceType = describeInterfaceType;
|
|
136
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSx3Q0FBd0M7QUFxQ3hDLE1BQWEsVUFBVTtJQUlyQixZQUFtQixJQUFxQztRQUh4QyxlQUFVLEdBQUcsSUFBSSxLQUFLLEVBQWUsQ0FBQztRQUlwRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQ2hELENBQUM7SUFFTSxNQUFNLENBQUMsT0FBc0I7O1FBQ2xDLE1BQU0sR0FBRyxHQUFHLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuRCxNQUFNLEdBQUcsR0FBRyxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksR0FBRyxFQUFFLENBQUM7UUFFeEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7WUFDbkIsWUFBWSxFQUFFLEdBQUc7WUFDakIsT0FBTyxFQUFFLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsS0FDckQsT0FBTyxDQUFDLE9BQ1YsRUFBRTtZQUNGLFNBQVMsUUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLG1DQUFJLElBQUksQ0FBQyxnQkFBZ0I7U0FDcEUsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLENBQUMsUUFBUTtRQUNkLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNqQyxNQUFNLEdBQUcsQ0FBQyxPQUFPLENBQUM7U0FDbkI7SUFDSCxDQUFDO0lBRUQsSUFBVyxLQUFLO1FBQ2QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztJQUNoQyxDQUFDO0lBRU0sTUFBTSxDQUFDLElBQWlDO1FBQzdDLE1BQU0sR0FBRyxHQUFHLElBQUksVUFBVSxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMs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Yyc7XG5pbXBvcnQgKiBhcyByZWZsZWN0IGZyb20gJ2pzaWktcmVmbGVjdCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGFyaXNvbk9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byB0cmVhdCBBUEkgZWxlbWVudHMgYXMgZXhwZXJpbWVudGFsIGlmIHVubWFya2VkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBUcmVhdCBhcyBzdGFibGVcbiAgICovXG4gIGRlZmF1bHRFeHBlcmltZW50YWw/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBhcmlzb25Db250ZXh0IGV4dGVuZHMgQ29tcGFyaXNvbk9wdGlvbnMge1xuICAvKipcbiAgICogV2hlcmUgdG8gcmVwb3J0IGVycm9yc1xuICAgKi9cbiAgbWlzbWF0Y2hlczogTWlzbWF0Y2hlcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcGlNaXNtYXRjaCB7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgdmlvbGF0aW9uS2V5OiBzdHJpbmc7XG4gIHN0YWJpbGl0eTogU3RhYmlsaXR5O1xufVxuXG5leHBvcnQgdHlwZSBBcGlFbGVtZW50ID0gcmVmbGVjdC5UeXBlIHwgcmVmbGVjdC5UeXBlTWVtYmVyIHwgcmVmbGVjdC5FbnVtTWVtYmVyO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydE9wdGlvbnMge1xuICBydWxlS2V5OiBzdHJpbmc7XG4gIHZpb2xhdG9yOiBBcGlFbGVtZW50O1xuICBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlcG9ydCB7XG4gIHJlcG9ydChvcHRpb25zOiBSZXBvcnRPcHRpb25zKTogdm9pZDtcbiAgd2l0aE1vdGl2YXRpb24ocmVhc29uOiBzdHJpbmcpOiBJUmVwb3J0O1xufVxuXG5leHBvcnQgY2xhc3MgTWlzbWF0Y2hlcyBpbXBsZW1lbnRzIElSZXBvcnQge1xuICBwdWJsaWMgcmVhZG9ubHkgbWlzbWF0Y2hlcyA9IG5ldyBBcnJheTxBcGlNaXNtYXRjaD4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0U3RhYmlsaXR5OiBTdGFiaWxpdHk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdHM6IHsgZGVmYXVsdFN0YWJpbGl0eTogU3RhYmlsaXR5IH0pIHtcbiAgICB0aGlzLmRlZmF1bHRTdGFiaWxpdHkgPSBvcHRzLmRlZmF1bHRTdGFiaWxpdHk7XG4gIH1cblxuICBwdWJsaWMgcmVwb3J0KG9wdGlvbnM6IFJlcG9ydE9wdGlvbnMpIHtcbiAgICBjb25zdCBmcW4gPSBhcGlFbGVtZW50SWRlbnRpZmllcihvcHRpb25zLnZpb2xhdG9yKTtcbiAgICBjb25zdCBrZXkgPSBgJHtvcHRpb25zLnJ1bGVLZXl9OiR7ZnFufWA7XG5cbiAgICB0aGlzLm1pc21hdGNoZXMucHVzaCh7XG4gICAgICB2aW9sYXRpb25LZXk6IGtleSxcbiAgICAgIG1lc3NhZ2U6IGAke2Rlc2NyaWJlQXBpRWxlbWVudChvcHRpb25zLnZpb2xhdG9yKX0gJHtmcW59OiAke1xuICAgICAgICBvcHRpb25zLm1lc3NhZ2VcbiAgICAgIH1gLFxuICAgICAgc3RhYmlsaXR5OiBvcHRpb25zLnZpb2xhdG9yLmRvY3Muc3RhYmlsaXR5ID8/IHRoaXMuZGVmYXVsdFN0YWJpbGl0eSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyAqbWVzc2FnZXMoKSB7XG4gICAgZm9yIChjb25zdCBtaXMgb2YgdGhpcy5taXNtYXRjaGVzKSB7XG4gICAgICB5aWVsZCBtaXMubWVzc2FnZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvdW50KCkge1xuICAgIHJldHVybiB0aGlzLm1pc21hdGNoZXMubGVuZ3RoO1xuICB9XG5cbiAgcHVibGljIGZpbHRlcihwcmVkOiAoeDogQXBpTWlzbWF0Y2gpID0+IGJvb2xlYW4pOiBNaXNtYXRjaGVzIHtcbiAgICBjb25zdCByZXQgPSBuZXcgTWlzbWF0Y2hlcyh7IGRlZmF1bHRTdGFiaWxpdHk6IHRoaXMuZGVmYXVsdFN0YWJpbGl0eSB9KTtcbiAgICByZXQubWlzbWF0Y2hlcy5wdXNoKC4uLnRoaXMubWlzbWF0Y2hlcy5maWx0ZXIocHJlZCkpO1xuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBwdWJsaWMgd2l0aE1vdGl2YXRpb24obW90aXZhdGlvbjogc3RyaW5nKTogSVJlcG9ydCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlcG9ydDogKG9wdGlvbnMpID0+XG4gICAgICAgIHRoaXMucmVwb3J0KHtcbiAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgIG1lc3NhZ2U6IGAke29wdGlvbnMubWVzc2FnZX06ICR7bW90aXZhdGlvbn1gLFxuICAgICAgICB9KSxcbiAgICAgIHdpdGhNb3RpdmF0aW9uOiAoaW5uZXJNb3RpdmF0aW9uKSA9PlxuICAgICAgICB0aGlzLndpdGhNb3RpdmF0aW9uKGAke2lubmVyTW90aXZhdGlvbn06ICR7bW90aXZhdGlvbn1gKSxcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcGlFbGVtZW50SWRlbnRpZmllcihhcGlFbGVtZW50OiBBcGlFbGVtZW50KSB7XG4gIHJldHVybiBkaXNwYXRjaChhcGlFbGVtZW50LCB7XG4gICAgbWV0aG9kKHgpIHtcbiAgICAgIHJldHVybiBgJHt4LnBhcmVudFR5cGUuZnFufS4ke3gubmFtZX1gO1xuICAgIH0sXG4gICAgaW5pdCh4KSB7XG4gICAgICByZXR1cm4gYCR7eC5wYXJlbnRUeXBlLmZxbn0uJHt4Lm5hbWV9YDtcbiAgICB9LFxuICAgIHByb3BlcnR5KHgpIHtcbiAgICAgIHJldHVybiBgJHt4LnBhcmVudFR5cGUuZnFufS4ke3gubmFtZX1gO1xuICAgIH0sXG4gICAgZW51bU1lbWJlcih4KSB7XG4gICAgICByZXR1cm4gYCR7eC5lbnVtVHlwZS5mcW59LiR7eC5uYW1lfWA7XG4gICAgfSxcbiAgICBlbnVtVHlwZSh4KSB7XG4gICAgICByZXR1cm4gYCR7eC5mcW59YDtcbiAgICB9LFxuICAgIGtsYXNzKHgpIHtcbiAgICAgIHJldHVybiBgJHt4LmZxbn1gO1xuICAgIH0sXG4gICAgaWZhY2UoeCkge1xuICAgICAgcmV0dXJuIGAke3guZnFufWA7XG4gICAgfSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlQXBpRWxlbWVudChhcGlFbGVtZW50OiBBcGlFbGVtZW50KSB7XG4gIHJldHVybiBkaXNwYXRjaChhcGlFbGVtZW50LCB7XG4gICAgbWV0aG9kKCkge1xuICAgICAgcmV0dXJuICdNRVRIT0QnO1xuICAgIH0sXG4gICAgaW5pdCgpIHtcbiAgICAgIHJldHVybiAnSU5JVElBTElaRVInO1xuICAgIH0sXG4gICAgcHJvcGVydHkoKSB7XG4gICAgICByZXR1cm4gJ1BST1AnO1xuICAgIH0sXG4gICAgZW51bU1lbWJlcigpIHtcbiAgICAgIHJldHVybiAnRU5VTSBWQUxVRSc7XG4gICAgfSxcbiAgICBlbnVtVHlwZSgpIHtcbiAgICAgIHJldHVybiAnRU5VTSc7XG4gICAgfSxcbiAgICBrbGFzcygpIHtcbiAgICAgIHJldHVybiAnQ0xBU1MnO1xuICAgIH0sXG4gICAgaWZhY2UoKSB7XG4gICAgICByZXR1cm4gJ0lGQUNFJztcbiAgICB9LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2g8VD4oXG4gIGFwaUVsZW1lbnQ6IEFwaUVsZW1lbnQsXG4gIGZuczoge1xuICAgIG1ldGhvZChtOiByZWZsZWN0Lk1ldGhvZCk6IFQ7XG4gICAgaW5pdChtOiByZWZsZWN0LkluaXRpYWxpemVyKTogVDtcbiAgICBwcm9wZXJ0eShtOiByZWZsZWN0LlByb3BlcnR5KTogVDtcbiAgICBlbnVtTWVtYmVyKG06IHJlZmxlY3QuRW51bU1lbWJlcik6IFQ7XG4gICAgZW51bVR5cGUobTogcmVmbGVjdC5FbnVtVHlwZSk6IFQ7XG4gICAga2xhc3MobTogcmVmbGVjdC5DbGFzc1R5cGUpOiBUO1xuICAgIGlmYWNlKG06IHJlZmxlY3QuSW50ZXJmYWNlVHlwZSk6IFQ7XG4gIH0sXG4pIHtcbiAgaWYgKGFwaUVsZW1lbnQgaW5zdGFuY2VvZiByZWZsZWN0Lk1ldGhvZCkge1xuICAgIHJldHVybiBmbnMubWV0aG9kKGFwaUVsZW1lbnQpO1xuICB9XG4gIGlmIChhcGlFbGVtZW50IGluc3RhbmNlb2YgcmVmbGVjdC5Qcm9wZXJ0eSkge1xuICAgIHJldHVybiBmbnMucHJvcGVydHkoYXBpRWxlbWVudCk7XG4gIH1cbiAgaWYgKGFwaUVsZW1lbnQgaW5zdGFuY2VvZiByZWZsZWN0LkVudW1NZW1iZXIpIHtcbiAgICByZXR1cm4gZm5zLmVudW1NZW1iZXIoYXBpRWxlbWVudCk7XG4gIH1cbiAgaWYgKGFwaUVsZW1lbnQgaW5zdGFuY2VvZiByZWZsZWN0LkNsYXNzVHlwZSkge1xuICAgIHJldHVybiBmbnMua2xhc3MoYXBpRWxlbWVudCk7XG4gIH1cbiAgaWYgKGFwaUVsZW1lbnQgaW5zdGFuY2VvZiByZWZsZWN0LkludGVyZmFjZVR5cGUpIHtcbiAgICByZXR1cm4gZm5zLmlmYWNlKGFwaUVsZW1lbnQpO1xuICB9XG4gIGlmIChhcGlFbGVtZW50IGluc3RhbmNlb2YgcmVmbGVjdC5Jbml0aWFsaXplcikge1xuICAgIHJldHVybiBmbnMuaW5pdChhcGlFbGVtZW50KTtcbiAgfVxuICBpZiAoYXBpRWxlbWVudCBpbnN0YW5jZW9mIHJlZmxlY3QuRW51bVR5cGUpIHtcbiAgICByZXR1cm4gZm5zLmVudW1UeXBlKGFwaUVsZW1lbnQpO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQgdmlvbGF0b3I6ICR7YXBpRWxlbWVudC50b1N0cmluZygpfWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVzY3JpYmVUeXBlKHR5cGU6IHJlZmxlY3QuVHlwZSkge1xuICBpZiAodHlwZS5pc0NsYXNzVHlwZSgpKSB7XG4gICAgcmV0dXJuICdDTEFTUyc7XG4gIH1cbiAgaWYgKHR5cGUuaXNJbnRlcmZhY2VUeXBlKCkpIHtcbiAgICByZXR1cm4gJ0lGQUNFJztcbiAgfVxuICBpZiAodHlwZS5pc0VudW1UeXBlKCkpIHtcbiAgICByZXR1cm4gJ0VOVU0nO1xuICB9XG4gIHJldHVybiAnVFlQRSc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXNjcmliZUludGVyZmFjZVR5cGUoZGF0YVR5cGU6IGJvb2xlYW4pIHtcbiAgcmV0dXJuIGRhdGFUeXBlID8gJ3N0cnVjdCcgOiAncmVndWxhciBpbnRlcmZhY2UnO1xufVxuIl19
|
package/lib/util.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare function inTempDir<T>(block: () => T | Promise<T>): Promise<T>;
|
|
2
|
+
export declare type DownloadFailure = 'no_such_package';
|
|
3
|
+
export declare type NpmDownloadResult<T> = {
|
|
4
|
+
success: true;
|
|
5
|
+
result: T;
|
|
6
|
+
} | {
|
|
7
|
+
success: false;
|
|
8
|
+
reason: DownloadFailure;
|
|
9
|
+
};
|
|
10
|
+
export declare function showDownloadFailure(f: DownloadFailure): "NPM package does not exist" | undefined;
|
|
11
|
+
export declare function downloadNpmPackage<T>(pkg: string, block: (dir: string) => Promise<T>): Promise<NpmDownloadResult<T>>;
|
|
12
|
+
export declare function flatMap<T, U>(xs: T[], fn: (x: T) => U[]): U[];
|
|
13
|
+
/**
|
|
14
|
+
* Don't recurse infinitely by guarding a block with `do()`.
|
|
15
|
+
*/
|
|
16
|
+
export declare class RecursionBreaker<A> {
|
|
17
|
+
private readonly elements;
|
|
18
|
+
do(key: A, block: () => void): void;
|
|
19
|
+
}
|
package/lib/util.js
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RecursionBreaker = exports.flatMap = exports.downloadNpmPackage = exports.showDownloadFailure = exports.inTempDir = void 0;
|
|
4
|
+
const childProcess = require("child_process");
|
|
5
|
+
const fs = require("fs-extra");
|
|
6
|
+
const log4js = require("log4js");
|
|
7
|
+
const os = require("os");
|
|
8
|
+
const path = require("path");
|
|
9
|
+
const util = require("util");
|
|
10
|
+
const LOG = log4js.getLogger('jsii-diff');
|
|
11
|
+
const exec = util.promisify(childProcess.exec);
|
|
12
|
+
async function inTempDir(block) {
|
|
13
|
+
const origDir = process.cwd();
|
|
14
|
+
const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'jsii'));
|
|
15
|
+
process.chdir(tmpDir);
|
|
16
|
+
try {
|
|
17
|
+
return await block();
|
|
18
|
+
}
|
|
19
|
+
finally {
|
|
20
|
+
process.chdir(origDir);
|
|
21
|
+
await fs.remove(tmpDir);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.inTempDir = inTempDir;
|
|
25
|
+
function showDownloadFailure(f) {
|
|
26
|
+
switch (f) {
|
|
27
|
+
case 'no_such_package':
|
|
28
|
+
return 'NPM package does not exist';
|
|
29
|
+
default:
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.showDownloadFailure = showDownloadFailure;
|
|
34
|
+
async function downloadNpmPackage(pkg, block) {
|
|
35
|
+
return inTempDir(async () => {
|
|
36
|
+
LOG.info(`Fetching NPM package ${pkg}`);
|
|
37
|
+
try {
|
|
38
|
+
// Need to install package and dependencies in order for jsii-reflect
|
|
39
|
+
// to not bork when it can find the dependencies.
|
|
40
|
+
await exec(`npm install --silent --prefix . ${pkg}`);
|
|
41
|
+
}
|
|
42
|
+
catch (e) {
|
|
43
|
+
// If this fails, might be because the package doesn't exist
|
|
44
|
+
if (!isSubprocesFailedError(e)) {
|
|
45
|
+
throw e;
|
|
46
|
+
}
|
|
47
|
+
if (await npmPackageExists(pkg)) {
|
|
48
|
+
throw new Error(`NPM fetch failed: ${e}. Please try again.`);
|
|
49
|
+
}
|
|
50
|
+
LOG.warn(`NPM package ${pkg} does not exist.`);
|
|
51
|
+
return {
|
|
52
|
+
success: false,
|
|
53
|
+
reason: 'no_such_package',
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
const pkgDir = trimVersionString(pkg);
|
|
57
|
+
return {
|
|
58
|
+
success: true,
|
|
59
|
+
result: await block(path.join(process.cwd(), 'node_modules', pkgDir)),
|
|
60
|
+
};
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
exports.downloadNpmPackage = downloadNpmPackage;
|
|
64
|
+
function isSubprocesFailedError(e) {
|
|
65
|
+
return e.code !== undefined && e.cmd !== undefined;
|
|
66
|
+
}
|
|
67
|
+
async function npmPackageExists(pkg) {
|
|
68
|
+
try {
|
|
69
|
+
LOG.info(`Checking existence of ${pkg}`);
|
|
70
|
+
await exec(`npm show --silent ${pkg}`);
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
if (!isSubprocesFailedError(e)) {
|
|
75
|
+
throw e;
|
|
76
|
+
}
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Trim an optional version string from an NPM package name
|
|
82
|
+
*/
|
|
83
|
+
function trimVersionString(pkg) {
|
|
84
|
+
// The arbitrary char before the @ prevents matching a @ at the start of the
|
|
85
|
+
// string.
|
|
86
|
+
return pkg.replace(/(.)@.*$/, '$1');
|
|
87
|
+
}
|
|
88
|
+
function flatMap(xs, fn) {
|
|
89
|
+
const ret = new Array();
|
|
90
|
+
for (const x of xs) {
|
|
91
|
+
ret.push(...fn(x));
|
|
92
|
+
}
|
|
93
|
+
return ret;
|
|
94
|
+
}
|
|
95
|
+
exports.flatMap = flatMap;
|
|
96
|
+
/**
|
|
97
|
+
* Don't recurse infinitely by guarding a block with `do()`.
|
|
98
|
+
*/
|
|
99
|
+
class RecursionBreaker {
|
|
100
|
+
constructor() {
|
|
101
|
+
this.elements = new Set();
|
|
102
|
+
}
|
|
103
|
+
do(key, block) {
|
|
104
|
+
if (this.elements.has(key)) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
this.elements.add(key);
|
|
108
|
+
try {
|
|
109
|
+
block();
|
|
110
|
+
}
|
|
111
|
+
finally {
|
|
112
|
+
this.elements.delete(key);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
exports.RecursionBreaker = RecursionBreaker;
|
|
117
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsOENBQThDO0FBQzlDLCtCQUErQjtBQUMvQixpQ0FBaUM7QUFDakMseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3Qiw2QkFBNkI7QUFFN0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUUxQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUV4QyxLQUFLLFVBQVUsU0FBUyxDQUFJLEtBQTJCO0lBQzVELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUM5QixNQUFNLE1BQU0sR0FBRyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNoRSxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RCLElBQUk7UUFDRixPQUFPLE1BQU0sS0FBSyxFQUFFLENBQUM7S0FDdEI7WUFBUztRQUNSLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkIsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQ3pCO0FBQ0gsQ0FBQztBQVZELDhCQVVDO0FBUUQsU0FBZ0IsbUJBQW1CLENBQUMsQ0FBa0I7SUFDcEQsUUFBUSxDQUFDLEVBQUU7UUFDVCxLQUFLLGlCQUFpQjtZQUNwQixPQUFPLDRCQUE0QixDQUFDO1FBQ3RDO1lBQ0UsT0FBTyxTQUFTLENBQUM7S0FDcEI7QUFDSCxDQUFDO0FBUEQsa0RBT0M7QUFFTSxLQUFLLFVBQVUsa0JBQWtCLENBQ3RDLEdBQVcsRUFDWCxLQUFrQztJQUVsQyxPQUFPLFNBQVMsQ0FBQyxLQUFL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QUNILENBQUM7Q0FDRjtBQWZELDRDQWVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2hpbGRQcm9jZXNzIGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0ICogYXMgbG9nNGpzIGZyb20gJ2xvZzRqcyc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICd1dGlsJztcblxuY29uc3QgTE9HID0gbG9nNGpzLmdldExvZ2dlcignanNpaS1kaWZmJyk7XG5cbmNvbnN0IGV4ZWMgPSB1dGlsLnByb21pc2lmeShjaGlsZFByb2Nlc3MuZXhlYyk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpblRlbXBEaXI8VD4oYmxvY2s6ICgpID0+IFQgfCBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IG9yaWdEaXIgPSBwcm9jZXNzLmN3ZCgpO1xuICBjb25zdCB0bXBEaXIgPSBhd2FpdCBmcy5ta2R0ZW1wKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ2pzaWknKSk7XG4gIHByb2Nlc3MuY2hkaXIodG1wRGlyKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgYmxvY2soKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBwcm9jZXNzLmNoZGlyKG9yaWdEaXIpO1xuICAgIGF3YWl0IGZzLnJlbW92ZSh0bXBEaXIpO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIERvd25sb2FkRmFpbHVyZSA9ICdub19zdWNoX3BhY2thZ2UnO1xuXG5leHBvcnQgdHlwZSBOcG1Eb3dubG9hZFJlc3VsdDxUPiA9XG4gIHwgeyBzdWNjZXNzOiB0cnVlOyByZXN1bHQ6IFQgfVxuICB8IHsgc3VjY2VzczogZmFsc2U7IHJlYXNvbjogRG93bmxvYWRGYWlsdXJlIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG93RG93bmxvYWRGYWlsdXJlKGY6IERvd25sb2FkRmFpbHVyZSkge1xuICBzd2l0Y2ggKGYpIHtcbiAgICBjYXNlICdub19zdWNoX3BhY2thZ2UnOlxuICAgICAgcmV0dXJuICdOUE0gcGFja2FnZSBkb2VzIG5vdCBleGlzdCc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRvd25sb2FkTnBtUGFja2FnZTxUPihcbiAgcGtnOiBzdHJpbmcsXG4gIGJsb2NrOiAoZGlyOiBzdHJpbmcpID0+IFByb21pc2U8VD4sXG4pOiBQcm9taXNlPE5wbURvd25sb2FkUmVzdWx0PFQ+PiB7XG4gIHJldHVybiBpblRlbXBEaXIoYXN5bmMgKCkgPT4ge1xuICAgIExPRy5pbmZvKGBGZXRjaGluZyBOUE0gcGFja2FnZSAke3BrZ31gKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBOZWVkIHRvIGluc3RhbGwgcGFja2FnZSBhbmQgZGVwZW5kZW5jaWVzIGluIG9yZGVyIGZvciBqc2lpLXJlZmxlY3RcbiAgICAgIC8vIHRvIG5vdCBib3JrIHdoZW4gaXQgY2FuIGZpbmQgdGhlIGRlcGVuZGVuY2llcy5cbiAgICAgIGF3YWl0IGV4ZWMoYG5wbSBpbnN0YWxsIC0tc2lsZW50IC0tcHJlZml4IC4gJHtwa2d9YCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWYgdGhpcyBmYWlscywgbWlnaHQgYmUgYmVjYXVzZSB0aGUgcGFja2FnZSBkb2Vzbid0IGV4aXN0XG4gICAgICBpZiAoIWlzU3VicHJvY2VzRmFpbGVkRXJyb3IoZSkpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIGlmIChhd2FpdCBucG1QYWNrYWdlRXhpc3RzKHBrZykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOUE0gZmV0Y2ggZmFpbGVkOiAke2V9LiBQbGVhc2UgdHJ5IGFnYWluLmApO1xuICAgICAgfVxuICAgICAgTE9HLndhcm4oYE5QTSBwYWNrYWdlICR7cGtnfSBkb2VzIG5vdCBleGlzdC5gKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICByZWFzb246ICdub19zdWNoX3BhY2thZ2UnLFxuICAgICAgfSBhcyBOcG1Eb3dubG9hZFJlc3VsdDxUPjtcbiAgICB9XG5cbiAgICBjb25zdCBwa2dEaXIgPSB0cmltVmVyc2lvblN0cmluZyhwa2cpO1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgcmVzdWx0OiBhd2FpdCBibG9jayhwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ25vZGVfbW9kdWxlcycsIHBrZ0RpcikpLFxuICAgIH0gYXMgTnBtRG93bmxvYWRSZXN1bHQ8VD47XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpc1N1YnByb2Nlc0ZhaWxlZEVycm9yKGU6IGFueSkge1xuICByZXR1cm4gZS5jb2RlICE9PSB1bmRlZmluZWQgJiYgZS5jbWQgIT09IHVuZGVmaW5lZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbnBtUGFja2FnZUV4aXN0cyhwa2c6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIExPRy5pbmZvKGBDaGVja2luZyBleGlzdGVuY2Ugb2YgJHtwa2d9YCk7XG4gICAgYXdhaXQgZXhlYyhgbnBtIHNob3cgLS1zaWxlbnQgJHtwa2d9YCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIWlzU3VicHJvY2VzRmFpbGVkRXJyb3IoZSkpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFRyaW0gYW4gb3B0aW9uYWwgdmVyc2lvbiBzdHJpbmcgZnJvbSBhbiBOUE0gcGFja2FnZSBuYW1lXG4gKi9cbmZ1bmN0aW9uIHRyaW1WZXJzaW9uU3RyaW5nKHBrZzogc3RyaW5nKSB7XG4gIC8vIFRoZSBhcmJpdHJhcnkgY2hhciBiZWZvcmUgdGhlIEAgcHJldmVudHMgbWF0Y2hpbmcgYSBAIGF0IHRoZSBzdGFydCBvZiB0aGVcbiAgLy8gc3RyaW5nLlxuICByZXR1cm4gcGtnLnJlcGxhY2UoLyguKUAuKiQvLCAnJDEnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZsYXRNYXA8VCwgVT4oeHM6IFRbXSwgZm46ICh4OiBUKSA9PiBVW10pOiBVW10ge1xuICBjb25zdCByZXQgPSBuZXcgQXJyYXk8VT4oKTtcbiAgZm9yIChjb25zdCB4IG9mIHhzKSB7XG4gICAgcmV0LnB1c2goLi4uZm4oeCkpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbi8qKlxuICogRG9uJ3QgcmVjdXJzZSBpbmZpbml0ZWx5IGJ5IGd1YXJkaW5nIGEgYmxvY2sgd2l0aCBgZG8oKWAuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWN1cnNpb25CcmVha2VyPEE+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50cyA9IG5ldyBTZXQ8QT4oKTtcblxuICBwdWJsaWMgZG8oa2V5OiBBLCBibG9jazogKCkgPT4gdm9pZCkge1xuICAgIGlmICh0aGlzLmVsZW1lbnRzLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5lbGVtZW50cy5hZGQoa2V5KTtcbiAgICB0cnkge1xuICAgICAgYmxvY2soKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5lbGVtZW50cy5kZWxldGUoa2V5KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import * as reflect from 'jsii-reflect';
|
|
2
|
+
import { IReport } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* The updated type is still nominally assignable to all original base types
|
|
5
|
+
*
|
|
6
|
+
* Make sure the following remains compilable:
|
|
7
|
+
*
|
|
8
|
+
* ```
|
|
9
|
+
* BASE instance = new CLASS();
|
|
10
|
+
* ```
|
|
11
|
+
*
|
|
12
|
+
* Where CLASS ≤: BASE.
|
|
13
|
+
*/
|
|
14
|
+
export declare function validateBaseTypeAssignability<T extends reflect.ReferenceType>(original: T, updated: T, mismatches: IReport): void;
|
|
15
|
+
/**
|
|
16
|
+
* The updated type has not been newly made abstract
|
|
17
|
+
*
|
|
18
|
+
* Make sure the following remains compilable:
|
|
19
|
+
*
|
|
20
|
+
* ```
|
|
21
|
+
* new CLASS();
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare function validateNotMadeAbstract(original: reflect.ClassType, updated: reflect.ClassType, mismatches: IReport): void;
|
|
25
|
+
/**
|
|
26
|
+
* The updated type has not had its @subclassable attribute removed
|
|
27
|
+
*
|
|
28
|
+
* This would lift a restriction we can't afford.
|
|
29
|
+
*/
|
|
30
|
+
export declare function validateSubclassableNotRemoved<T extends reflect.ReferenceType>(original: T, updated: T, mismatches: IReport): void;
|
|
31
|
+
/**
|
|
32
|
+
* Check that the `static`-ness of a member hasn't changed
|
|
33
|
+
*/
|
|
34
|
+
export declare function validateStaticSame<T extends reflect.Method | reflect.Property>(original: T, updated: T, mismatches: IReport): void;
|
|
35
|
+
/**
|
|
36
|
+
* Check that the `async`-ness of a method hasn't changed
|
|
37
|
+
*/
|
|
38
|
+
export declare function validateAsyncSame(original: reflect.Method, updated: reflect.Method, mismatches: IReport): void;
|
|
39
|
+
/**
|
|
40
|
+
* Once variadic, can never be made non-variadic anymore (because I could always have been passing N+1 arguments)
|
|
41
|
+
*/
|
|
42
|
+
export declare function validateNotMadeNonVariadic<T extends reflect.Method | reflect.Initializer>(original: T, updated: T, mismatches: IReport): void;
|
|
43
|
+
/**
|
|
44
|
+
* Check that no new abstract members were added to a subclassable type
|
|
45
|
+
*
|
|
46
|
+
* You cannot have added abstract members to the class/interface, as they are
|
|
47
|
+
* an added burden on potential implementors.
|
|
48
|
+
*/
|
|
49
|
+
export declare function validateNoNewAbstractMembers<T extends reflect.ReferenceType>(original: T, updated: T, mismatches: IReport): void;
|
|
50
|
+
/**
|
|
51
|
+
* Validate that a method return type is the same or strengthened
|
|
52
|
+
*
|
|
53
|
+
* Make sure the following remains compilable:
|
|
54
|
+
*
|
|
55
|
+
* ```
|
|
56
|
+
* T value = object.method();
|
|
57
|
+
* ```
|
|
58
|
+
*
|
|
59
|
+
* Where RETURN_TYPE(method) ≤: T.
|
|
60
|
+
*/
|
|
61
|
+
export declare function validateReturnTypeNotWeakened(original: reflect.Method, updated: reflect.Method, mismatches: IReport): void;
|
|
62
|
+
/**
|
|
63
|
+
* Validate that a method return type is the exact same
|
|
64
|
+
*
|
|
65
|
+
* Necessary for subclassable types in C#.
|
|
66
|
+
*/
|
|
67
|
+
export declare function validateReturnTypeSame(original: reflect.Method, updated: reflect.Method, mismatches: IReport): void;
|
|
68
|
+
/**
|
|
69
|
+
* Validate that a property type is the same or strengthened
|
|
70
|
+
*
|
|
71
|
+
* Make sure the following remains compilable:
|
|
72
|
+
*
|
|
73
|
+
* ```
|
|
74
|
+
* T value = object.prop;
|
|
75
|
+
* ```
|
|
76
|
+
*
|
|
77
|
+
* Where RETURN_TYPE(prop) ≤: T.
|
|
78
|
+
*/
|
|
79
|
+
export declare function validatePropertyTypeNotWeakened(original: reflect.Property, updated: reflect.Property, mismatches: IReport): void;
|
|
80
|
+
/**
|
|
81
|
+
* Validate that a property type is the exact same
|
|
82
|
+
*
|
|
83
|
+
* Necessary for subclassable types in C#.
|
|
84
|
+
*/
|
|
85
|
+
export declare function validatePropertyTypeSame(original: reflect.Property, updated: reflect.Property, mismatches: IReport): void;
|
|
86
|
+
/**
|
|
87
|
+
* Validate that a method return type is the same or weakened
|
|
88
|
+
*
|
|
89
|
+
* Make sure the following remains compilable if U is changed:
|
|
90
|
+
*
|
|
91
|
+
* ```
|
|
92
|
+
* function method(arg: U) { ... }
|
|
93
|
+
*
|
|
94
|
+
* object.method(<T>value);
|
|
95
|
+
* ```
|
|
96
|
+
*
|
|
97
|
+
* Where T ≤: U.
|
|
98
|
+
*/
|
|
99
|
+
export declare function validateParameterTypeWeakened(method: reflect.Method | reflect.Initializer, original: reflect.Parameter, updated: reflect.Parameter, mismatches: IReport): void;
|
|
100
|
+
/**
|
|
101
|
+
* Validate that a method parameter type is the exact same
|
|
102
|
+
*
|
|
103
|
+
* Necessary for subclassable types in C#.
|
|
104
|
+
*/
|
|
105
|
+
export declare function validateParameterTypeSame(method: reflect.Method | reflect.Initializer, original: reflect.Parameter, updated: reflect.Parameter, mismatches: IReport): void;
|
|
106
|
+
/**
|
|
107
|
+
* Validate that each param in the old callable is still available in the new callable, and apply custom validation to the pairs
|
|
108
|
+
*
|
|
109
|
+
* Make sure the following remains compilable:
|
|
110
|
+
*
|
|
111
|
+
* ```
|
|
112
|
+
* object.method(a1, a2, ..., aN);
|
|
113
|
+
* ```
|
|
114
|
+
*
|
|
115
|
+
* (All types still assignable)
|
|
116
|
+
*/
|
|
117
|
+
export declare function validateExistingParams<T extends reflect.Initializer | reflect.Method>(original: T, updated: T, mismatches: IReport, validateParam: (oldParam: reflect.Parameter, newParam: reflect.Parameter) => void): void;
|
|
118
|
+
/**
|
|
119
|
+
* Validate that no new required params got added to the end of the method
|
|
120
|
+
*
|
|
121
|
+
* Make sure the following remains compilable:
|
|
122
|
+
*
|
|
123
|
+
* ```
|
|
124
|
+
* object.method(a1, a2, ..., aN);
|
|
125
|
+
* ```
|
|
126
|
+
*
|
|
127
|
+
* (Not too few arguments)
|
|
128
|
+
*/
|
|
129
|
+
export declare function validateNoNewRequiredParams<T extends reflect.Initializer | reflect.Method>(original: T, updated: T, mismatches: IReport): void;
|
|
130
|
+
export declare function validateMethodCompatible<T extends reflect.Method | reflect.Initializer>(original: T, updated: T, mismatches: IReport): void;
|
|
131
|
+
/**
|
|
132
|
+
* Check if a class/interface has been marked as @subclassable
|
|
133
|
+
*/
|
|
134
|
+
export declare function subclassableType(x: reflect.Documentable): boolean;
|
|
135
|
+
/**
|
|
136
|
+
* Validate that a previously mutable property is not made immutable
|
|
137
|
+
*
|
|
138
|
+
* Make sure the following remains compilable:
|
|
139
|
+
*
|
|
140
|
+
* ```
|
|
141
|
+
* object.prop = value;
|
|
142
|
+
* ```
|
|
143
|
+
*/
|
|
144
|
+
export declare function validateNotMadeImmutable(original: reflect.Property, updated: reflect.Property, mismatches: IReport): void;
|
|
145
|
+
export declare function memberPairs<T extends reflect.TypeMember, U extends reflect.ReferenceType>(origClass: U, xs: T[], updatedClass: U, mismatches: IReport): IterableIterator<[T, reflect.TypeMember]>;
|
|
146
|
+
/**
|
|
147
|
+
* Validate that each enum member in the old enum enum, and apply custom validation to the enums
|
|
148
|
+
*
|
|
149
|
+
* Make sure the following remains compilable:
|
|
150
|
+
*
|
|
151
|
+
* ```
|
|
152
|
+
* T x = ENUM.member;
|
|
153
|
+
* ```
|
|
154
|
+
*
|
|
155
|
+
* (For every member of enum)
|
|
156
|
+
*/
|
|
157
|
+
export declare function validateExistingMembers(original: reflect.EnumType, updated: reflect.EnumType, mismatches: IReport, validateMember: (oldParam: reflect.EnumMember, newParam: reflect.EnumMember) => void): void;
|