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/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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsOENBQThDO0FBQzlDLCtCQUErQjtBQUMvQixpQ0FBaUM7QUFDakMseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3Qiw2QkFBNkI7QUFFN0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUUxQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUV4QyxLQUFLLFVBQVUsU0FBUyxDQUFJLEtBQTJCO0lBQzVELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUM5QixNQUFNLE1BQU0sR0FBRyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNoRSxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RCLElBQUk7UUFDRixPQUFPLE1BQU0sS0FBSyxFQUFFLENBQUM7S0FDdEI7WUFBUztRQUNSLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkIsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQ3pCO0FBQ0gsQ0FBQztBQVZELDhCQVVDO0FBUUQsU0FBZ0IsbUJBQW1CLENBQUMsQ0FBa0I7SUFDcEQsUUFBUSxDQUFDLEVBQUU7UUFDVCxLQUFLLGlCQUFpQjtZQUNwQixPQUFPLDRCQUE0QixDQUFDO1FBQ3RDO1lBQ0UsT0FBTyxTQUFTLENBQUM7S0FDcEI7QUFDSCxDQUFDO0FBUEQsa0RBT0M7QUFFTSxLQUFLLFVBQVUsa0JBQWtCLENBQ3RDLEdBQVcsRUFDWCxLQUFrQztJQUVsQyxPQUFPLFNBQVMsQ0FBQyxLQUFLLElBQUksRUFBRTtRQUMxQixHQUFHLENBQUMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBRXhDLElBQUk7WUFDRixxRUFBcUU7WUFDckUsaURBQWlEO1lBQ2pELE1BQU0sSUFBSSxDQUFDLG1DQUFtQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1NBQ3REO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDViw0REFBNEQ7WUFDNUQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUM5QixNQUFNLENBQUMsQ0FBQzthQUNUO1lBQ0QsSUFBSSxNQUFNLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLHFCQUFxQixDQUFDLENBQUM7YUFDOUQ7WUFDRCxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDO1lBQy9DLE9BQU87Z0JBQ0wsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsTUFBTSxFQUFFLGlCQUFpQjthQUNGLENBQUM7U0FDM0I7UUFFRCxNQUFNLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QyxPQUFPO1lBQ0wsT0FBTyxFQUFFLElBQUk7WUFDYixNQUFNLEVBQUUsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQzlDLENBQUM7SUFDNUIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBaENELGdEQWdDQztBQUVELFNBQVMsc0JBQXNCLENBQUMsQ0FBTTtJQUNwQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssU0FBUyxDQUFDO0FBQ3JELENBQUM7QUFFRCxLQUFLLFVBQVUsZ0JBQWdCLENBQUMsR0FBVztJQUN6QyxJQUFJO1FBQ0YsR0FBRyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN6QyxNQUFNLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN2QyxPQUFPLElBQUksQ0FBQztLQUNiO0lBQUMsT0FBTyxDQUFDLEVBQUU7UUFDVixJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDOUIsTUFBTSxDQUFDLENBQUM7U0FDVDtRQUNELE9BQU8sS0FBSyxDQUFDO0tBQ2Q7QUFDSCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLEdBQVc7SUFDcEMsNEVBQTRFO0lBQzVFLFVBQVU7SUFDVixPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3RDLENBQUM7QUFFRCxTQUFnQixPQUFPLENBQU8sRUFBTyxFQUFFLEVBQWlCO0lBQ3RELE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxFQUFLLENBQUM7SUFDM0IsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDbEIsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3BCO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBTkQsMEJBTUM7QUFFRDs7R0FFRztBQUNILE1BQWEsZ0JBQWdCO0lBQTdCO1FBQ21CLGFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBSyxDQUFDO0lBYzNDLENBQUM7SUFaUSxFQUFFLENBQUMsR0FBTSxFQUFFLEtBQWlCO1FBQ2pDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDMUIsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkIsSUFBSTtZQUNGLEtBQUssRUFBRSxDQUFDO1NBQ1Q7Z0JBQVM7WUFDUixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUMzQjtJQUNILENBQUM7Q0FDRjtBQWZELDRDQWVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2hpbGRQcm9jZXNzIGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0ICogYXMgbG9nNGpzIGZyb20gJ2xvZzRqcyc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICd1dGlsJztcblxuY29uc3QgTE9HID0gbG9nNGpzLmdldExvZ2dlcignanNpaS1kaWZmJyk7XG5cbmNvbnN0IGV4ZWMgPSB1dGlsLnByb21pc2lmeShjaGlsZFByb2Nlc3MuZXhlYyk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpblRlbXBEaXI8VD4oYmxvY2s6ICgpID0+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;