awslint 2.99.1-alpha.0 → 2.101.0-alpha.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/bin/awslint.js +6 -4
- package/bin/awslint.ts +7 -4
- package/lib/index.d.ts +1 -0
- package/lib/index.js +2 -1
- package/lib/index.ts +1 -0
- package/lib/linter.d.ts +3 -2
- package/lib/linter.js +6 -29
- package/lib/linter.ts +8 -34
- package/lib/rule-specs.d.ts +24 -0
- package/lib/rule-specs.js +99 -0
- package/lib/rule-specs.ts +110 -0
- package/package.json +8 -8
package/bin/awslint.js
CHANGED
|
@@ -37,7 +37,7 @@ async function main() {
|
|
|
37
37
|
.example('awslint', 'lints the current module against all rules')
|
|
38
38
|
.example('awslint -v -i "resource*" -i "import*"', 'lints against all rules that start with "resource" or "import" and print successes')
|
|
39
39
|
.example('awslint -x "*:@aws-cdk/aws-s3*"', 'evaluate all rules in all scopes besides ones that begin with "@aws-cdk/aws-s3"')
|
|
40
|
-
.example('awslint --save', 'updated "
|
|
40
|
+
.example('awslint --save', 'updated "awslint.json" with "exclude"s for all failing rules');
|
|
41
41
|
if (!process.stdout.isTTY) {
|
|
42
42
|
// Disable chalk color highlighting
|
|
43
43
|
process.env.FORCE_COLOR = '0';
|
|
@@ -100,10 +100,12 @@ async function main() {
|
|
|
100
100
|
}
|
|
101
101
|
const excludesToSave = new Array();
|
|
102
102
|
let errors = 0;
|
|
103
|
+
const includeRules = new lib_1.RuleFilterSet(args.include);
|
|
104
|
+
const excludeRules = new lib_1.RuleFilterSet(args.exclude);
|
|
103
105
|
const results = [];
|
|
104
106
|
results.push(...lib_1.ALL_RULES_LINTER.eval(assembly, {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
+
includeRules: includeRules,
|
|
108
|
+
excludeRules: excludeRules,
|
|
107
109
|
}));
|
|
108
110
|
// Sort errors to the top (highest severity first)
|
|
109
111
|
results.sort((a, b) => b.level - a.level);
|
|
@@ -254,4 +256,4 @@ async function shell(command) {
|
|
|
254
256
|
child.once('error', ko);
|
|
255
257
|
});
|
|
256
258
|
}
|
|
257
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzbGludC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImF3c2xpbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw0QkFBNEI7QUFDNUIsK0JBQStCO0FBQy9CLCtDQUErQztBQUMvQyw2QkFBNkI7QUFDN0IsK0JBQStCO0FBQy9CLCtCQUErQjtBQUMvQix3Q0FBd0M7QUFDeEMsK0JBQStCO0FBQy9CLGdDQUEyRDtBQUUzRCxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7QUFFdkIsS0FBSyxVQUFVLElBQUk7SUFDakIsTUFBTSxJQUFJLEdBQUcsS0FBSztTQUNmLEdBQUcsQ0FBQyxTQUFTLENBQUM7U0FDZCxLQUFLLENBQUMsNkJBQTZCLENBQUM7U0FDcEMsY0FBYyxDQUFDLElBQUksQ0FBQztTQUNwQixPQUFPLENBQUMsSUFBSSxFQUFFLG1DQUFtQyxDQUFDO1NBQ2xELE9BQU8sQ0FBQyxNQUFNLEVBQUUsMEJBQTBCLENBQUM7U0FDM0MsTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsNEJBQTRCLEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztTQUNwRyxNQUFNLENBQUMsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSw2REFBNkQsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUM7U0FDbEksTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLHFHQUFxRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQztTQUNoSyxNQUFNLENBQUMsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSx3Q0FBd0MsRUFBRSxPQUFPLEVBQUUsS0FBSyxF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SyxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDN0YsT0FBTyxJQUFJLE9BQU8sQ0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtRQUNsQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQVcsRUFBRSxFQUFFO1lBQ2pDLElBQUksTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDaEIsT0FBTyxFQUFFLEVBQUUsQ0FBQzthQUNiO2lCQUFNO2dCQUNMLE9BQU8sRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEdBQUcsT0FBTyx1QkFBdUIsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ2pFO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMxQixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5pbXBvcnQgKiBhcyBjaGlsZF9wcm9jZXNzIGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCAqIGFzIHJlZmxlY3QgZnJvbSAnanNpaS1yZWZsZWN0JztcbmltcG9ydCAqIGFzIHlhcmdzIGZyb20gJ3lhcmdzJztcbmltcG9ydCB7IEFMTF9SVUxFU19MSU5URVIsIERpYWdub3N0aWNMZXZlbCB9IGZyb20gJy4uL2xpYic7XG5cbmxldCBzdGFja1RyYWNlID0gZmFsc2U7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKSB7XG4gIGNvbnN0IGFyZ3YgPSB5YXJnc1xuICAgIC5lbnYoJ0FXU0xJTlQnKVxuICAgIC51c2FnZSgnYXdzbGludCBbb3B0aW9uc10gW2NvbW1hbmRdJylcbiAgICAuc2hvd0hlbHBPbkZhaWwodHJ1ZSlcbiAgICAuY29tbWFuZCgnJDAnLCAnbGludCB0aGUgY3VycmVudCBtb2R1bGUgKGRlZmF1bHQpJylcbiAgICAuY29tbWFuZCgnbGlzdCcsICdsaXN0IGFsbCBhdmFpbGFibGUgcnVsZXMnKVxuICAgIC5vcHRpb24oJ2luY2x1ZGUnLCB7IGFsaWFzOiAnaScsIHR5cGU6ICdhcnJheScsIGRlc2M6ICdldmFsdWF0ZSBvbmx5IHRoaXMgcnVsZShzKScsIGRlZmF1bHQ6IFsnKiddIH0pXG4gICAgLm9wdGlvbignZXhjbHVkZScsIHsgYWxpYXM6ICd4JywgdHlwZTogJ2FycmF5JywgZGVzYzogJ2RvIG5vdCBldmFsdWF0ZSB0aGVzZSBydWxlcyAodGFrZXMgcHJpb3JpdHkgb3ZlciAtLWluY2x1ZGUpJywgZGVmYXVsdDogW10gfSlcbiAgICAub3B0aW9uKCdzYXZlJywgeyB0eXBlOiAnYm9vbGVhbicsIGRlc2M6ICd1cGRhdGVzIHBhY2thZ2UuanNvbiAob3IgYXdzbGludC5qc29uIGlmIGl0IGV4aXN0cykgd2l0aCBcImV4Y2x1ZGVcIiBzdGF0ZW1lbnRzIGZvciBhbGwgZmFpbGluZyBydWxlcycsIGRlZmF1bHQ6IGZhbHNlIH0pXG4gICAgLm9wdGlvbigndmVyYm9zZScsIHsgYWxpYXM6ICd2JywgdHlwZTogJ2Jvb2xlYW4nLCBkZXNjOiAndmVyYm9zZSBvdXRwdXQgKHByaW50cyBhbGwgYXNzZXJ0aW9ucyknLCBkZWZhdWx0OiBmYWxzZSB9KVxuICAgIC5vcHRpb24oJ3F1aWV0JywgeyBhbGlhczogJ3EnLCB0eXBlOiAnYm9vbGVhbicsIGRlc2M6ICdxdWlldCBtb2RlIC0gc2hvd3Mgb25seSBlcnJvcnMnLCBkZWZhdWx0OiB0cnVlIH0pXG4gICAgLm9wdGlvbignZm9yY2UnLCB7IHR5cGU6ICdib29sZWFuJywgZGVzYzogJ3N1Y2NlZWQgc2lsZW50bHkgaWYgdGhpcyBpcyBub3QgYSBqc2lpIG1vZHVsZScsIGRlZmF1bHQ6IHRydWUgfSlcbiAgICAub3B0aW9uKCdjb25maWcnLCB7IHR5cGU6ICdib29sZWFuJywgZGVzYzogJ3JlYWRzIG9wdGlvbnMgZnJvbSBcImF3c2xpbnQuanNvblwiIGlmIGl0IGV4aXN0cywgYW5kIG90aGVyd2lzZSBmcm9tIHRoZSBcImF3c2xpbnRcIiBzZWN0aW9uIGluIHBhY2thZ2UuanNvbicsIGRlZmF1bHQ6IHRydWUgfSlcbiAgICAub3B0aW9uKCdkZWJ1ZycsIHsgdHlwZTogJ2Jvb2xlYW4nLCBkZXNjOiAnZGVidWcgb3V0cHV0JywgZGVmYXVsdDogZmFsc2UgfSlcbiAgICAub3B0aW9uKCdjb21waWxlJywgeyBhbGlhczogJ2MnLCB0eXBlOiAnYm9vbGVhbicsIGRlc2M6ICdhbHdheXMgcnVuIHRoZSBqc2lpIGNvbXBpbGVyICh1c2UgXCItLW5vLWNvbXBpbGVcIiB0byBuZXZlciBydW4gdGhlIGNvbXBpbGVyLCBldmVuIGlmIC5qc2lpIGRvZXNuXFwndCBleGlzdCknIH0pXG4gICAgLmdyb3VwKCdpbmNsdWRlJywgJ0ZpbHRlcmluZycpXG4gICAgLmdyb3VwKCdleGNsdWRlJywgJ0ZpbHRlcmluZycpXG4gICAgLmdyb3VwKCdjb25maWcnLCAnQ29uZmlndXJhdGlvbicpXG4gICAgLmdyb3VwKCdzYXZlJywgJ0NvbmZpZ3VyYXRpb24nKVxuICAgIC5ncm91cCgndmVyYm9zZScsICdPdXRwdXQnKVxuICAgIC5ncm91cCgncXVpZXQnLCAnT3V0cHV0JylcbiAgICAuZ3JvdXAoJ2RlYnVnJywgJ091dHB1dCcpXG4gICAgLmdyb3VwKCdjb21waWxlJywgJ0J1aWxkJylcbiAgICAuZXhhbXBsZSgnYXdzbGludCcsICdsaW50cyB0aGUgY3VycmVudCBtb2R1bGUgYWdhaW5zdCBhbGwgcnVsZXMnKVxuICAgIC5leGFtcGxlKCdhd3NsaW50IC12IC1pIFwicmVzb3VyY2UqXCIgLWkgXCJpbXBvcnQqXCInLCAnbGludHMgYWdhaW5zdCBhbGwgcnVsZXMgdGhhdCBzdGFydCB3aXRoIFwicmVzb3VyY2VcIiBvciBcImltcG9ydFwiIGFuZCBwcmludCBzdWNjZXNzZXMnKVxuICAgIC5leGFtcGxlKCdhd3NsaW50IC14IFwiKjpAYXdzLWNkay9hd3MtczMqXCInLCAnZXZhbHVhdGUgYWxsIHJ1bGVzIGluIGFsbCBzY29wZXMgYmVzaWRlcyBvbmVzIHRoYXQgYmVnaW4gd2l0aCBcIkBhd3MtY2RrL2F3cy1zM1wiJylcbiAgICAuZXhhbXBsZSgnYXdzbGludCAtLXNhdmUnLCAndXBkYXRlZCBcInBhY2thZ2UuanNvblwiIHdpdGggXCJleGNsdWRlXCJzIGZvciBhbGwgZmFpbGluZyBydWxlcycpO1xuXG4gIGlmICghcHJvY2Vzcy5zdGRvdXQuaXNUVFkpIHtcbiAgICAvLyBEaXNhYmxlIGNoYWxrIGNvbG9yIGhpZ2hsaWdodGluZ1xuICAgIHByb2Nlc3MuZW52LkZPUkNFX0NPTE9SID0gJzAnO1xuICB9XG5cbiAgY29uc3QgYXJncyA9IGFyZ3YuYXJndjtcblxuICBzdGFja1RyYWNlID0gYXJncy52ZXJib3NlIHx8IGFyZ3MuZGVidWc7XG5cbiAgaWYgKGFyZ3MuXy5sZW5ndGggPiAxKSB7XG4gICAgYXJndi5zaG93SGVscCgpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IGNvbW1hbmQgPSBhcmdzLl9bMF0gfHwgJ2xpbnQnO1xuICBjb25zdCB3b3JrZGlyID0gcHJvY2Vzcy5jd2QoKTtcblxuICBjb25zdCBwa2dDb25maWcgPSBwYXRoLmpvaW4od29ya2RpciwgJ3BhY2thZ2UuanNvbicpO1xuICBjb25zdCBhd3NsaW50Q29uZmlnID0gcGF0aC5qb2luKHdvcmtkaXIsICdhd3NsaW50Lmpzb24nKTtcblxuICBpZiAoY29tbWFuZCA9PT0gJ2xpc3QnKSB7XG4gICAgZm9yIChjb25zdCBydWxlIG9mIEFMTF9SVUxFU19MSU5URVIucnVsZXMpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgJHtjaGFsay5jeWFuKHJ1bGUuY29kZSl9OiAke3J1bGUubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gaWYgbm8gcGFja2FnZS5qc29uIGFuZCBmb3JjZSBpcyB0cnVlIChkZWZhdWx0KSwganVzdCBkb24ndCBkbyBhbnl0aGluZ1xuICBpZiAoIWF3YWl0IGZzLnBhdGhFeGlzdHMocGtnQ29uZmlnKSAmJiBhcmdzLmZvcmNlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcGtnID0gYXdhaXQgZnMucmVhZEpTT04ocGtnQ29uZmlnKTtcblxuICAvLyBpZiB0aGlzIGlzIG5vdCBhIGpzaWkgbW9kdWxlIHdlIGhhdmUgbm90aGluZyB0byBsb29rIGZvclxuICBpZiAoIXBrZy5qc2lpKSB7XG4gICAgaWYgKGFyZ3MuZm9yY2UpIHtcbiAgICAgIHJldHVybjsgLy8ganVzdCBzaWxlbnRseSBzdWNjZWVkXG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBNb2R1bGUgaW4gJHt3b3JrZGlyfSBpcyBub3QgYSBqc2lpIG1vZHVsZSAobm8gXCJqc2lpXCIgc2VjdGlvbiBpbiBwYWNrYWdlLmpzb24pYCk7XG4gIH1cblxuICAvLyBpZiBwYWNrYWdlLmpzb24gY29udGFpbnMgYSBganNpaWAgc2VjdGlvbiBidXQgdGhlcmUgaXMgbm8gLmpzaWkgZmlsZVxuICAvLyBpdCBtZWFucyB3ZSBoYXZlbid0IGNvbXBpbGVkIHRoZSBtb2R1bGUuXG4gIGlmIChhd2FpdCBzaG91bGRDb21waWxlKCkpIHtcbiAgICBhd2FpdCBzaGVsbCgnanNpaScpO1xuICB9XG5cbiAgLy8gYXdzbGludC5qc29uIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBwYWNrYWdlLmpzb24gZm9yIGF3c2xpbnQgb3B0aW9ucy5cbiAgY29uc3Qgc3RhbmRsb25lT3B0aW9ucyA9IGF3YWl0IHJlYWRTdGFuZGFsb25lT3B0aW9ucyhhd3NsaW50Q29uZmlnKTtcblxuICAvLyByZWFkIFwiYXdzbGludFwiIGZyb20gcGFja2FnZS5qc29uXG4gIGlmIChhcmdzLmNvbmZpZykge1xuICAgIGlmIChzdGFuZGxvbmVPcHRpb25zKSB7XG4gICAgICBpZiAocGtnLmF3c2xpbnQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdhd3NsaW50IG9wdGlvbnMgaW4gcGFja2FnZS5qc29uIHdpbGwgYmUgaWdub3JlZCBzaW5jZSBhd3NsaW50Lmpzb24gZXhpc3RzLicpO1xuICAgICAgfVxuICAgICAgbWVyZ2VPcHRpb25zKGFyZ3MsIHN0YW5kbG9uZU9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtZXJnZU9wdGlvbnMoYXJncywgcGtnLmF3c2xpbnQpO1xuICAgIH1cbiAgfVxuXG5cbiAgaWYgKGFyZ3MuZGVidWcpIHtcbiAgICBjb25zb2xlLmVycm9yKCdjb21tYW5kOiAnICsgY29tbWFuZCk7XG4gICAgY29uc29sZS5lcnJvcignb3B0aW9uczogJyArIEpTT04uc3RyaW5naWZ5KGFyZ3MsIHVuZGVmaW5lZCwgMikpO1xuICB9XG5cbiAgaWYgKGNvbW1hbmQgPT09ICdsaW50Jykge1xuICAgIGNvbnN0IGFzc2VtYmx5ID0gYXdhaXQgbG9hZE1vZHVsZSh3b3JrZGlyKTtcbiAgICBpZiAoIWFzc2VtYmx5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZXhjbHVkZXNUb1NhdmUgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIGxldCBlcnJvcnMgPSAwO1xuXG4gICAgY29uc3QgcmVzdWx0cyA9IFtdO1xuXG4gICAgcmVzdWx0cy5wdXNoKC4uLkFMTF9SVUxFU19MSU5URVIuZXZhbChhc3NlbWJseSwge1xuICAgICAgaW5jbHVkZTogYXJncy5pbmNsdWRlLFxuICAgICAgZXhjbHVkZTogYXJncy5leGNsdWRlLFxuICAgIH0pKTtcblxuICAgIC8vIFNvcnQgZXJyb3JzIHRvIHRoZSB0b3AgKGhpZ2hlc3Qgc2V2ZXJpdHkgZmlyc3QpXG4gICAgcmVzdWx0cy5zb3J0KChhLCBiKSA9PiBiLmxldmVsIC0gYS5sZXZlbCk7XG5cbiAgICAvLyBwcm9jZXNzIHJlc3VsdHNcblxuICAgIGZvciAoY29uc3QgZGlhZyBvZiByZXN1bHRzKSB7XG4gICAgICBjb25zdCBzdXBwcmVzc2lvbktleSA9IGAke2RpYWcucnVsZS5jb2RlfToke2RpYWcuc2NvcGV9YDtcblxuICAgICAgbGV0IGNvbG9yO1xuICAgICAgc3dpdGNoIChkaWFnLmxldmVsKSB7XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY0xldmVsLlN1Y2Nlc3M6XG4gICAgICAgICAgaWYgKGFyZ3MudmVyYm9zZSkge1xuICAgICAgICAgICAgY29sb3IgPSBjaGFsay5ncmF5O1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBEaWFnbm9zdGljTGV2ZWwuRXJyb3I6XG4gICAgICAgICAgZXJyb3JzKys7XG4gICAgICAgICAgY29sb3IgPSBjaGFsay5yZWQ7XG4gICAgICAgICAgaWYgKGFyZ3Muc2F2ZSkge1xuICAgICAgICAgICAgZXhjbHVkZXNUb1NhdmUucHVzaChzdXBwcmVzc2lvbktleSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIERpYWdub3N0aWNMZXZlbC5XYXJuaW5nOlxuICAgICAgICAgIGlmICghYXJncy5xdWlldCkge1xuICAgICAgICAgICAgY29sb3IgPSBjaGFsay55ZWxsb3c7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIERpYWdub3N0aWNMZXZlbC5Ta2lwcGVkOlxuICAgICAgICAgIGlmICghYXJncy5xdWlldCkge1xuICAgICAgICAgICAgY29sb3IgPSBjaGFsay5ibHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbG9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY29sb3IoYCR7RGlhZ25vc3RpY0xldmVsW2RpYWcubGV2ZWxdLnRvTG93ZXJDYXNlKCl9OiBbJHtjaGFsay5ib2xkKGBhd3NsaW50OiR7ZGlhZy5ydWxlLmNvZGV9YCl9OiR7Y2hhbGsuYm9sZChkaWFnLnNjb3BlKX1dICR7ZGlhZy5tZXNzYWdlfWApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXhjbHVkZXNUb1NhdmUubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHN0YW5kbG9uZU9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCFzdGFuZGxvbmVPcHRpb25zLmV4Y2x1ZGUpIHtcbiAgICAgICAgICBzdGFuZGxvbmVPcHRpb25zLmV4Y2x1ZGUgPSBbXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFwa2cuYXdzbGludCkge1xuICAgICAgICAgIHBrZy5hd3NsaW50ID0geyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwa2cuYXdzbGludC5leGNsdWRlKSB7XG4gICAgICAgICAgcGtnLmF3c2xpbnQuZXhjbHVkZSA9IFtdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4Y2x1ZGVzOiBzdHJpbmdbXSA9IHN0YW5kbG9uZU9wdGlvbnMgPyBzdGFuZGxvbmVPcHRpb25zLmV4Y2x1ZGUgOiBwa2cuYXdzbGludC5leGNsdWRlO1xuXG4gICAgICBmb3IgKGNvbnN0IGV4Y2x1ZGUgb2YgZXhjbHVkZXNUb1NhdmUpIHtcbiAgICAgICAgaWYgKGV4Y2x1ZGVzLmluZGV4T2YoZXhjbHVkZSkgPT09IC0xKSB7XG4gICAgICAgICAgZXhjbHVkZXMucHVzaChleGNsdWRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZXhjbHVkZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoc3RhbmRsb25lT3B0aW9ucykge1xuICAgICAgICAgIC8vIElmIGF3c2xpbnQuanNvbiBleGlzdHMsIHdyaXRlIHRoZSBleGNsdWRlcyB0aGVyZSBpbnN0ZWFkIG9mIHRoZSBvbGQgcGFja2FnZS5qc29uIChsZWdhY3kgZm9ybWF0KS5cbiAgICAgICAgICBpZiAocGtnLmF3c2xpbnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignRXhjbHVkZXMgd2lsbCBiZSB3cml0dGVuIHRvIGF3c2xpbnQuanNvbi4nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgZnMud3JpdGVKU09OKGF3c2xpbnRDb25maWcsIHN0YW5kbG9uZU9wdGlvbnMsIHsgc3BhY2VzOiAyIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IGZzLndyaXRlSlNPTihwa2dDb25maWcsIHBrZywgeyBzcGFjZXM6IDIgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXJyb3JzICYmICFhcmdzLnNhdmUpIHtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICBhcmd2LnNob3dIZWxwKCk7XG4gIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjb21tYW5kOiAke2NvbW1hbmR9YCk7XG5cbiAgYXN5bmMgZnVuY3Rpb24gc2hvdWxkQ29tcGlsZSgpIHtcblxuICAgIC8vIGlmIC0tY29tcGlsZSBpcyBleHBsaWNpdGx5IGVuYWJsZWQgdGhlbiBqdXN0IGNvbXBpbGUgYWx3YXlzXG4gICAgaWYgKGFyZ3MuY29tcGlsZSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gaWYgd2UgaGF2ZSBhIC5qc2lpIGZpbGUgYW5kIHdlIGFyZSBub3QgZm9yY2VkIHRvIGNvbXBpbGUsIHRoZW4gZG9uJ3QgY29tcGlsZVxuICAgIGlmIChhd2FpdCBmcy5wYXRoRXhpc3RzKHBhdGguam9pbih3b3JrZGlyLCAnLmpzaWknKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyB3ZSBkb24ndCBoYXZlIGEgLmpzaWkgZmlsZSwgYW5kIC0tbm8tY29tcGlsZSBpcyBleHBsaWNpbHkgc2V0LCB0aGVuIGl0J3MgYW4gZXJyb3JcbiAgICBpZiAoYXJncy5jb21waWxlID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyAuanNpaSBmaWxlIGFuZCAtLW5vLWNvbXBpbGUgaXMgc2V0Jyk7XG4gICAgfVxuXG4gICAgLy8gY29tcGlsZSFcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG59XG5cbm1haW4oKS5jYXRjaChlID0+IHtcbiAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoZS5tZXNzYWdlKSk7XG4gIGlmIChzdGFja1RyYWNlKSB7XG4gICAgY29uc29sZS5lcnJvcihlLnN0YWNrKTtcbiAgfVxuICBwcm9jZXNzLmV4aXQoMSk7XG59KTtcblxuYXN5bmMgZnVuY3Rpb24gbG9hZE1vZHVsZShkaXI6IHN0cmluZykge1xuICBjb25zdCB0cyA9IG5ldyByZWZsZWN0LlR5cGVTeXN0ZW0oKTtcbiAgYXdhaXQgdHMubG9hZChkaXIsIHsgdmFsaWRhdGU6IGZhbHNlIH0pOyAvLyBEb24ndCB2YWxpZGF0ZSB0byBzYXZlIDY2JSBvZiBleGVjdXRpb24gdGltZSAoMjBzIHZzIDFtaW4pLlxuICAvLyBXZSBydW4gJ2F3c2xpbnQnIGR1cmluZyBidWlsZCB0aW1lLCBhc3NlbWJsaWVzIGFyZSBndWFyYW50ZWVkIHRvIGJlIG9rLlxuXG4gIGlmICh0cy5yb290cy5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGluZyBvbmx5IGEgc2luZ2xlIHJvb3QgYXNzZW1ibHknKTtcbiAgfVxuXG4gIHJldHVybiB0cy5yb290c1swXTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VPcHRpb25zKGRlc3Q6IGFueSwgcGtnPzogYW55KSB7XG4gIGlmICghcGtnKSB7IHJldHVybjsgfSAvLyBubyBvcHRpb25zIGluIHBhY2thZ2UuanNvblxuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBrZykpIHtcblxuICAgIC8vIGlmIHRoaXMgaXMgYW4gYXJyYXkgb3B0aW9uLCB0aGVuIGFkZCB2YWx1ZXMgdG8gZGVzdGluYXRpb25cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IGFyciA9IGRlc3Rba2V5XSB8fCBbXTtcbiAgICAgIGFyci5wdXNoKC4uLnZhbHVlKTtcbiAgICAgIGRlc3Rba2V5XSA9IGFycjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIG9iamVjdHMgYXJlIG5vdCBhbGxvd2VkXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBvcHRpb24gXCIke2tleX1cIiBpbiBwYWNrYWdlLmpzb246ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWApO1xuICAgIH1cblxuICAgIC8vIHByaW1pdGl2ZXMgc2ltcGx5IG92ZXJyaWRlXG4gICAgZGVzdFtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gZGVzdDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFN0YW5kYWxvbmVPcHRpb25zKGF3c2xpbnRDb25maWc6IHN0cmluZykge1xuICBpZiAoIWF3YWl0IGZzLnBhdGhFeGlzdHMoYXdzbGludENvbmZpZykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBvcHRpb25zID0gYXdhaXQgZnMucmVhZEpTT04oYXdzbGludENvbmZpZyk7XG4gIHJldHVybiBvcHRpb25zO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzaGVsbChjb21tYW5kOiBzdHJpbmcpIHtcbiAgY29uc3QgY2hpbGQgPSBjaGlsZF9wcm9jZXNzLnNwYXduKGNvbW1hbmQsIFtdLCB7IHN0ZGlvOiBbJ2luaGVyaXQnLCAnaW5oZXJpdCcsICdpbmhlcml0J10gfSk7XG4gIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigob2ssIGtvKSA9PiB7XG4gICAgY2hpbGQub25jZSgnZXhpdCcsIChzdGF0dXM6IGFueSkgPT4ge1xuICAgICAgaWYgKHN0YXR1cyA9PT0gMCkge1xuICAgICAgICByZXR1cm4gb2soKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBrbyhuZXcgRXJyb3IoYCR7Y29tbWFuZH0gZXhpdGVkIHdpdGggc3RhdHVzICR7c3RhdHVzfWApKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjaGlsZC5vbmNlKCdlcnJvcicsIGtvKTtcbiAgfSk7XG59XG4iXX0=
|
|
259
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzbGludC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImF3c2xpbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw0QkFBNEI7QUFDNUIsK0JBQStCO0FBQy9CLCtDQUErQztBQUMvQyw2QkFBNkI7QUFDN0IsK0JBQStCO0FBQy9CLCtCQUErQjtBQUMvQix3Q0FBd0M7QUFDeEMsK0JBQStCO0FBQy9CLGdDQUEwRTtBQUUxRSxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7QUFFdkIsS0FBSyxVQUFVLElBQUk7SUFDakIsTUFBTSxJQUFJLEdBQUcsS0FBSztTQUNmLEdBQUcsQ0FBQyxTQUFTLENBQUM7U0FDZCxLQUFLLENBQUMsNkJBQTZCLENBQUM7U0FDcEMsY0FBYyxDQUFDLElBQUksQ0FBQztTQUNwQixPQUFPLENBQUMsSUFBSSxFQUFFLG1DQUFtQyxDQUFDO1NBQ2xELE9BQU8sQ0FBQyxNQUFNLEVBQUUsMEJBQTBCLENBQUM7U0FDM0MsTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsNEJBQTRCLEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztTQUNwRyxNQUFNLENBQUMsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSw2REFBNkQsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUM7U0FDbEksTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLHFHQUFxRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQztTQUNoSyxNQUFNLENBQUMsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSx3Q0FBd0MsRUFBRSxPQUFPLEVBQUUsS0FBSyxF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Q0FBQztBQUVELEtBQUssVUFBVSxLQUFLLENBQUMsT0FBZTtJQUNsQyxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3RixPQUFPLElBQUksT0FBTyxDQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO1FBQ2xDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBVyxFQUFFLEVBQUU7WUFDakMsSUFBSSxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUNoQixPQUFPLEVBQUUsRUFBRSxDQUFDO2FBQ2I7aUJBQU07Z0JBQ0wsT0FBTyxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyxPQUFPLHVCQUF1QixNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDakU7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzFCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbmltcG9ydCAqIGFzIGNoaWxkX3Byb2Nlc3MgZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0ICogYXMgcmVmbGVjdCBmcm9tICdqc2lpLXJlZmxlY3QnO1xuaW1wb3J0ICogYXMgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0IHsgQUxMX1JVTEVTX0xJTlRFUiwgRGlhZ25vc3RpY0xldmVsLCBSdWxlRmlsdGVyU2V0IH0gZnJvbSAnLi4vbGliJztcblxubGV0IHN0YWNrVHJhY2UgPSBmYWxzZTtcblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpIHtcbiAgY29uc3QgYXJndiA9IHlhcmdzXG4gICAgLmVudignQVdTTElOVCcpXG4gICAgLnVzYWdlKCdhd3NsaW50IFtvcHRpb25zXSBbY29tbWFuZF0nKVxuICAgIC5zaG93SGVscE9uRmFpbCh0cnVlKVxuICAgIC5jb21tYW5kKCckMCcsICdsaW50IHRoZSBjdXJyZW50IG1vZHVsZSAoZGVmYXVsdCknKVxuICAgIC5jb21tYW5kKCdsaXN0JywgJ2xpc3QgYWxsIGF2YWlsYWJsZSBydWxlcycpXG4gICAgLm9wdGlvbignaW5jbHVkZScsIHsgYWxpYXM6ICdpJywgdHlwZTogJ2FycmF5JywgZGVzYzogJ2V2YWx1YXRlIG9ubHkgdGhpcyBydWxlKHMpJywgZGVmYXVsdDogWycqJ10gfSlcbiAgICAub3B0aW9uKCdleGNsdWRlJywgeyBhbGlhczogJ3gnLCB0eXBlOiAnYXJyYXknLCBkZXNjOiAnZG8gbm90IGV2YWx1YXRlIHRoZXNlIHJ1bGVzICh0YWtlcyBwcmlvcml0eSBvdmVyIC0taW5jbHVkZSknLCBkZWZhdWx0OiBbXSB9KVxuICAgIC5vcHRpb24oJ3NhdmUnLCB7IHR5cGU6ICdib29sZWFuJywgZGVzYzogJ3VwZGF0ZXMgcGFja2FnZS5qc29uIChvciBhd3NsaW50Lmpzb24gaWYgaXQgZXhpc3RzKSB3aXRoIFwiZXhjbHVkZVwiIHN0YXRlbWVudHMgZm9yIGFsbCBmYWlsaW5nIHJ1bGVzJywgZGVmYXVsdDogZmFsc2UgfSlcbiAgICAub3B0aW9uKCd2ZXJib3NlJywgeyBhbGlhczogJ3YnLCB0eXBlOiAnYm9vbGVhbicsIGRlc2M6ICd2ZXJib3NlIG91dHB1dCAocHJpbnRzIGFsbCBhc3NlcnRpb25zKScsIGRlZmF1bHQ6IGZhbHNlIH0pXG4gICAgLm9wdGlvbigncXVpZXQnLCB7IGFsaWFzOiAncScsIHR5cGU6ICdib29sZWFuJywgZGVzYzogJ3F1aWV0IG1vZGUgLSBzaG93cyBvbmx5IGVycm9ycycsIGRlZmF1bHQ6IHRydWUgfSlcbiAgICAub3B0aW9uKCdmb3JjZScsIHsgdHlwZTogJ2Jvb2xlYW4nLCBkZXNjOiAnc3VjY2VlZCBzaWxlbnRseSBpZiB0aGlzIGlzIG5vdCBhIGpzaWkgbW9kdWxlJywgZGVmYXVsdDogdHJ1ZSB9KVxuICAgIC5vcHRpb24oJ2NvbmZpZycsIHsgdHlwZTogJ2Jvb2xlYW4nLCBkZXNjOiAncmVhZHMgb3B0aW9ucyBmcm9tIFwiYXdzbGludC5qc29uXCIgaWYgaXQgZXhpc3RzLCBhbmQgb3RoZXJ3aXNlIGZyb20gdGhlIFwiYXdzbGludFwiIHNlY3Rpb24gaW4gcGFja2FnZS5qc29uJywgZGVmYXVsdDogdHJ1ZSB9KVxuICAgIC5vcHRpb24oJ2RlYnVnJywgeyB0eXBlOiAnYm9vbGVhbicsIGRlc2M6ICdkZWJ1ZyBvdXRwdXQnLCBkZWZhdWx0OiBmYWxzZSB9KVxuICAgIC5vcHRpb24oJ2NvbXBpbGUnLCB7IGFsaWFzOiAnYycsIHR5cGU6ICdib29sZWFuJywgZGVzYzogJ2Fsd2F5cyBydW4gdGhlIGpzaWkgY29tcGlsZXIgKHVzZSBcIi0tbm8tY29tcGlsZVwiIHRvIG5ldmVyIHJ1biB0aGUgY29tcGlsZXIsIGV2ZW4gaWYgLmpzaWkgZG9lc25cXCd0IGV4aXN0KScgfSlcbiAgICAuZ3JvdXAoJ2luY2x1ZGUnLCAnRmlsdGVyaW5nJylcbiAgICAuZ3JvdXAoJ2V4Y2x1ZGUnLCAnRmlsdGVyaW5nJylcbiAgICAuZ3JvdXAoJ2NvbmZpZycsICdDb25maWd1cmF0aW9uJylcbiAgICAuZ3JvdXAoJ3NhdmUnLCAnQ29uZmlndXJhdGlvbicpXG4gICAgLmdyb3VwKCd2ZXJib3NlJywgJ091dHB1dCcpXG4gICAgLmdyb3VwKCdxdWlldCcsICdPdXRwdXQnKVxuICAgIC5ncm91cCgnZGVidWcnLCAnT3V0cHV0JylcbiAgICAuZ3JvdXAoJ2NvbXBpbGUnLCAnQnVpbGQnKVxuICAgIC5leGFtcGxlKCdhd3NsaW50JywgJ2xpbnRzIHRoZSBjdXJyZW50IG1vZHVsZSBhZ2FpbnN0IGFsbCBydWxlcycpXG4gICAgLmV4YW1wbGUoJ2F3c2xpbnQgLXYgLWkgXCJyZXNvdXJjZSpcIiAtaSBcImltcG9ydCpcIicsICdsaW50cyBhZ2FpbnN0IGFsbCBydWxlcyB0aGF0IHN0YXJ0IHdpdGggXCJyZXNvdXJjZVwiIG9yIFwiaW1wb3J0XCIgYW5kIHByaW50IHN1Y2Nlc3NlcycpXG4gICAgLmV4YW1wbGUoJ2F3c2xpbnQgLXggXCIqOkBhd3MtY2RrL2F3cy1zMypcIicsICdldmFsdWF0ZSBhbGwgcnVsZXMgaW4gYWxsIHNjb3BlcyBiZXNpZGVzIG9uZXMgdGhhdCBiZWdpbiB3aXRoIFwiQGF3cy1jZGsvYXdzLXMzXCInKVxuICAgIC5leGFtcGxlKCdhd3NsaW50IC0tc2F2ZScsICd1cGRhdGVkIFwiYXdzbGludC5qc29uXCIgd2l0aCBcImV4Y2x1ZGVcInMgZm9yIGFsbCBmYWlsaW5nIHJ1bGVzJyk7XG5cbiAgaWYgKCFwcm9jZXNzLnN0ZG91dC5pc1RUWSkge1xuICAgIC8vIERpc2FibGUgY2hhbGsgY29sb3IgaGlnaGxpZ2h0aW5nXG4gICAgcHJvY2Vzcy5lbnYuRk9SQ0VfQ09MT1IgPSAnMCc7XG4gIH1cblxuICBjb25zdCBhcmdzID0gYXJndi5hcmd2O1xuXG4gIHN0YWNrVHJhY2UgPSBhcmdzLnZlcmJvc2UgfHwgYXJncy5kZWJ1ZztcblxuICBpZiAoYXJncy5fLmxlbmd0aCA+IDEpIHtcbiAgICBhcmd2LnNob3dIZWxwKCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgY29tbWFuZCA9IGFyZ3MuX1swXSB8fCAnbGludCc7XG4gIGNvbnN0IHdvcmtkaXIgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gIGNvbnN0IHBrZ0NvbmZpZyA9IHBhdGguam9pbih3b3JrZGlyLCAncGFja2FnZS5qc29uJyk7XG4gIGNvbnN0IGF3c2xpbnRDb25maWcgPSBwYXRoLmpvaW4od29ya2RpciwgJ2F3c2xpbnQuanNvbicpO1xuXG4gIGlmIChjb21tYW5kID09PSAnbGlzdCcpIHtcbiAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgQUxMX1JVTEVTX0xJTlRFUi5ydWxlcykge1xuICAgICAgY29uc29sZS5pbmZvKGAke2NoYWxrLmN5YW4ocnVsZS5jb2RlKX06ICR7cnVsZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBpZiBubyBwYWNrYWdlLmpzb24gYW5kIGZvcmNlIGlzIHRydWUgKGRlZmF1bHQpLCBqdXN0IGRvbid0IGRvIGFueXRoaW5nXG4gIGlmICghYXdhaXQgZnMucGF0aEV4aXN0cyhwa2dDb25maWcpICYmIGFyZ3MuZm9yY2UpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwa2cgPSBhd2FpdCBmcy5yZWFkSlNPTihwa2dDb25maWcpO1xuXG4gIC8vIGlmIHRoaXMgaXMgbm90IGEganNpaSBtb2R1bGUgd2UgaGF2ZSBub3RoaW5nIHRvIGxvb2sgZm9yXG4gIGlmICghcGtnLmpzaWkpIHtcbiAgICBpZiAoYXJncy5mb3JjZSkge1xuICAgICAgcmV0dXJuOyAvLyBqdXN0IHNpbGVudGx5IHN1Y2NlZWRcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZHVsZSBpbiAke3dvcmtkaXJ9IGlzIG5vdCBhIGpzaWkgbW9kdWxlIChubyBcImpzaWlcIiBzZWN0aW9uIGluIHBhY2thZ2UuanNvbilgKTtcbiAgfVxuXG4gIC8vIGlmIHBhY2thZ2UuanNvbiBjb250YWlucyBhIGBqc2lpYCBzZWN0aW9uIGJ1dCB0aGVyZSBpcyBubyAuanNpaSBmaWxlXG4gIC8vIGl0IG1lYW5zIHdlIGhhdmVuJ3QgY29tcGlsZWQgdGhlIG1vZHVsZS5cbiAgaWYgKGF3YWl0IHNob3VsZENvbXBpbGUoKSkge1xuICAgIGF3YWl0IHNoZWxsKCdqc2lpJyk7XG4gIH1cblxuICAvLyBhd3NsaW50Lmpzb24gdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHBhY2thZ2UuanNvbiBmb3IgYXdzbGludCBvcHRpb25zLlxuICBjb25zdCBzdGFuZGxvbmVPcHRpb25zID0gYXdhaXQgcmVhZFN0YW5kYWxvbmVPcHRpb25zKGF3c2xpbnRDb25maWcpO1xuXG4gIC8vIHJlYWQgXCJhd3NsaW50XCIgZnJvbSBwYWNrYWdlLmpzb25cbiAgaWYgKGFyZ3MuY29uZmlnKSB7XG4gICAgaWYgKHN0YW5kbG9uZU9wdGlvbnMpIHtcbiAgICAgIGlmIChwa2cuYXdzbGludCkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ2F3c2xpbnQgb3B0aW9ucyBpbiBwYWNrYWdlLmpzb24gd2lsbCBiZSBpZ25vcmVkIHNpbmNlIGF3c2xpbnQuanNvbiBleGlzdHMuJyk7XG4gICAgICB9XG4gICAgICBtZXJnZU9wdGlvbnMoYXJncywgc3RhbmRsb25lT3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lcmdlT3B0aW9ucyhhcmdzLCBwa2cuYXdzbGludCk7XG4gICAgfVxuICB9XG5cblxuICBpZiAoYXJncy5kZWJ1Zykge1xuICAgIGNvbnNvbGUuZXJyb3IoJ2NvbW1hbmQ6ICcgKyBjb21tYW5kKTtcbiAgICBjb25zb2xlLmVycm9yKCdvcHRpb25zOiAnICsgSlNPTi5zdHJpbmdpZnkoYXJncywgdW5kZWZpbmVkLCAyKSk7XG4gIH1cblxuICBpZiAoY29tbWFuZCA9PT0gJ2xpbnQnKSB7XG4gICAgY29uc3QgYXNzZW1ibHkgPSBhd2FpdCBsb2FkTW9kdWxlKHdvcmtkaXIpO1xuICAgIGlmICghYXNzZW1ibHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBleGNsdWRlc1RvU2F2ZSA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgbGV0IGVycm9ycyA9IDA7XG5cbiAgICBjb25zdCBpbmNsdWRlUnVsZXMgPSBuZXcgUnVsZUZpbHRlclNldChhcmdzLmluY2x1ZGUpO1xuICAgIGNvbnN0IGV4Y2x1ZGVSdWxlcyA9IG5ldyBSdWxlRmlsdGVyU2V0KGFyZ3MuZXhjbHVkZSk7XG5cbiAgICBjb25zdCByZXN1bHRzID0gW107XG5cbiAgICByZXN1bHRzLnB1c2goLi4uQUxMX1JVTEVTX0xJTlRFUi5ldmFsKGFzc2VtYmx5LCB7XG4gICAgICBpbmNsdWRlUnVsZXM6IGluY2x1ZGVSdWxlcyxcbiAgICAgIGV4Y2x1ZGVSdWxlczogZXhjbHVkZVJ1bGVzLFxuICAgIH0pKTtcblxuICAgIC8vIFNvcnQgZXJyb3JzIHRvIHRoZSB0b3AgKGhpZ2hlc3Qgc2V2ZXJpdHkgZmlyc3QpXG4gICAgcmVzdWx0cy5zb3J0KChhLCBiKSA9PiBiLmxldmVsIC0gYS5sZXZlbCk7XG5cbiAgICAvLyBwcm9jZXNzIHJlc3VsdHNcblxuICAgIGZvciAoY29uc3QgZGlhZyBvZiByZXN1bHRzKSB7XG4gICAgICBjb25zdCBzdXBwcmVzc2lvbktleSA9IGAke2RpYWcucnVsZS5jb2RlfToke2RpYWcuc2NvcGV9YDtcblxuICAgICAgbGV0IGNvbG9yO1xuICAgICAgc3dpdGNoIChkaWFnLmxldmVsKSB7XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY0xldmVsLlN1Y2Nlc3M6XG4gICAgICAgICAgaWYgKGFyZ3MudmVyYm9zZSkge1xuICAgICAgICAgICAgY29sb3IgPSBjaGFsay5ncmF5O1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBEaWFnbm9zdGljTGV2ZWwuRXJyb3I6XG4gICAgICAgICAgZXJyb3JzKys7XG4gICAgICAgICAgY29sb3IgPSBjaGFsay5yZWQ7XG4gICAgICAgICAgaWYgKGFyZ3Muc2F2ZSkge1xuICAgICAgICAgICAgZXhjbHVkZXNUb1NhdmUucHVzaChzdXBwcmVzc2lvbktleSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIERpYWdub3N0aWNMZXZlbC5XYXJuaW5nOlxuICAgICAgICAgIGlmICghYXJncy5xdWlldCkge1xuICAgICAgICAgICAgY29sb3IgPSBjaGFsay55ZWxsb3c7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIERpYWdub3N0aWNMZXZlbC5Ta2lwcGVkOlxuICAgICAgICAgIGlmICghYXJncy5xdWlldCkge1xuICAgICAgICAgICAgY29sb3IgPSBjaGFsay5ibHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbG9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY29sb3IoYCR7RGlhZ25vc3RpY0xldmVsW2RpYWcubGV2ZWxdLnRvTG93ZXJDYXNlKCl9OiBbJHtjaGFsay5ib2xkKGBhd3NsaW50OiR7ZGlhZy5ydWxlLmNvZGV9YCl9OiR7Y2hhbGsuYm9sZChkaWFnLnNjb3BlKX1dICR7ZGlhZy5tZXNzYWdlfWApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXhjbHVkZXNUb1NhdmUubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHN0YW5kbG9uZU9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCFzdGFuZGxvbmVPcHRpb25zLmV4Y2x1ZGUpIHtcbiAgICAgICAgICBzdGFuZGxvbmVPcHRpb25zLmV4Y2x1ZGUgPSBbXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFwa2cuYXdzbGludCkge1xuICAgICAgICAgIHBrZy5hd3NsaW50ID0geyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwa2cuYXdzbGludC5leGNsdWRlKSB7XG4gICAgICAgICAgcGtnLmF3c2xpbnQuZXhjbHVkZSA9IFtdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4Y2x1ZGVzOiBzdHJpbmdbXSA9IHN0YW5kbG9uZU9wdGlvbnMgPyBzdGFuZGxvbmVPcHRpb25zLmV4Y2x1ZGUgOiBwa2cuYXdzbGludC5leGNsdWRlO1xuXG4gICAgICBmb3IgKGNvbnN0IGV4Y2x1ZGUgb2YgZXhjbHVkZXNUb1NhdmUpIHtcbiAgICAgICAgaWYgKGV4Y2x1ZGVzLmluZGV4T2YoZXhjbHVkZSkgPT09IC0xKSB7XG4gICAgICAgICAgZXhjbHVkZXMucHVzaChleGNsdWRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZXhjbHVkZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoc3RhbmRsb25lT3B0aW9ucykge1xuICAgICAgICAgIC8vIElmIGF3c2xpbnQuanNvbiBleGlzdHMsIHdyaXRlIHRoZSBleGNsdWRlcyB0aGVyZSBpbnN0ZWFkIG9mIHRoZSBvbGQgcGFja2FnZS5qc29uIChsZWdhY3kgZm9ybWF0KS5cbiAgICAgICAgICBpZiAocGtnLmF3c2xpbnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignRXhjbHVkZXMgd2lsbCBiZSB3cml0dGVuIHRvIGF3c2xpbnQuanNvbi4nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgZnMud3JpdGVKU09OKGF3c2xpbnRDb25maWcsIHN0YW5kbG9uZU9wdGlvbnMsIHsgc3BhY2VzOiAyIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IGZzLndyaXRlSlNPTihwa2dDb25maWcsIHBrZywgeyBzcGFjZXM6IDIgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXJyb3JzICYmICFhcmdzLnNhdmUpIHtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICBhcmd2LnNob3dIZWxwKCk7XG4gIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjb21tYW5kOiAke2NvbW1hbmR9YCk7XG5cbiAgYXN5bmMgZnVuY3Rpb24gc2hvdWxkQ29tcGlsZSgpIHtcblxuICAgIC8vIGlmIC0tY29tcGlsZSBpcyBleHBsaWNpdGx5IGVuYWJsZWQgdGhlbiBqdXN0IGNvbXBpbGUgYWx3YXlzXG4gICAgaWYgKGFyZ3MuY29tcGlsZSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gaWYgd2UgaGF2ZSBhIC5qc2lpIGZpbGUgYW5kIHdlIGFyZSBub3QgZm9yY2VkIHRvIGNvbXBpbGUsIHRoZW4gZG9uJ3QgY29tcGlsZVxuICAgIGlmIChhd2FpdCBmcy5wYXRoRXhpc3RzKHBhdGguam9pbih3b3JrZGlyLCAnLmpzaWknKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyB3ZSBkb24ndCBoYXZlIGEgLmpzaWkgZmlsZSwgYW5kIC0tbm8tY29tcGlsZSBpcyBleHBsaWNpbHkgc2V0LCB0aGVuIGl0J3MgYW4gZXJyb3JcbiAgICBpZiAoYXJncy5jb21waWxlID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyAuanNpaSBmaWxlIGFuZCAtLW5vLWNvbXBpbGUgaXMgc2V0Jyk7XG4gICAgfVxuXG4gICAgLy8gY29tcGlsZSFcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG59XG5cbm1haW4oKS5jYXRjaChlID0+IHtcbiAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoZS5tZXNzYWdlKSk7XG4gIGlmIChzdGFja1RyYWNlKSB7XG4gICAgY29uc29sZS5lcnJvcihlLnN0YWNrKTtcbiAgfVxuICBwcm9jZXNzLmV4aXQoMSk7XG59KTtcblxuYXN5bmMgZnVuY3Rpb24gbG9hZE1vZHVsZShkaXI6IHN0cmluZykge1xuICBjb25zdCB0cyA9IG5ldyByZWZsZWN0LlR5cGVTeXN0ZW0oKTtcbiAgYXdhaXQgdHMubG9hZChkaXIsIHsgdmFsaWRhdGU6IGZhbHNlIH0pOyAvLyBEb24ndCB2YWxpZGF0ZSB0byBzYXZlIDY2JSBvZiBleGVjdXRpb24gdGltZSAoMjBzIHZzIDFtaW4pLlxuICAvLyBXZSBydW4gJ2F3c2xpbnQnIGR1cmluZyBidWlsZCB0aW1lLCBhc3NlbWJsaWVzIGFyZSBndWFyYW50ZWVkIHRvIGJlIG9rLlxuXG4gIGlmICh0cy5yb290cy5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGluZyBvbmx5IGEgc2luZ2xlIHJvb3QgYXNzZW1ibHknKTtcbiAgfVxuXG4gIHJldHVybiB0cy5yb290c1swXTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VPcHRpb25zKGRlc3Q6IGFueSwgcGtnPzogYW55KSB7XG4gIGlmICghcGtnKSB7IHJldHVybjsgfSAvLyBubyBvcHRpb25zIGluIHBhY2thZ2UuanNvblxuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBrZykpIHtcblxuICAgIC8vIGlmIHRoaXMgaXMgYW4gYXJyYXkgb3B0aW9uLCB0aGVuIGFkZCB2YWx1ZXMgdG8gZGVzdGluYXRpb25cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IGFyciA9IGRlc3Rba2V5XSB8fCBbXTtcbiAgICAgIGFyci5wdXNoKC4uLnZhbHVlKTtcbiAgICAgIGRlc3Rba2V5XSA9IGFycjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIG9iamVjdHMgYXJlIG5vdCBhbGxvd2VkXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBvcHRpb24gXCIke2tleX1cIiBpbiBwYWNrYWdlLmpzb246ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWApO1xuICAgIH1cblxuICAgIC8vIHByaW1pdGl2ZXMgc2ltcGx5IG92ZXJyaWRlXG4gICAgZGVzdFtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gZGVzdDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFN0YW5kYWxvbmVPcHRpb25zKGF3c2xpbnRDb25maWc6IHN0cmluZykge1xuICBpZiAoIWF3YWl0IGZzLnBhdGhFeGlzdHMoYXdzbGludENvbmZpZykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBvcHRpb25zID0gYXdhaXQgZnMucmVhZEpTT04oYXdzbGludENvbmZpZyk7XG4gIHJldHVybiBvcHRpb25zO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzaGVsbChjb21tYW5kOiBzdHJpbmcpIHtcbiAgY29uc3QgY2hpbGQgPSBjaGlsZF9wcm9jZXNzLnNwYXduKGNvbW1hbmQsIFtdLCB7IHN0ZGlvOiBbJ2luaGVyaXQnLCAnaW5oZXJpdCcsICdpbmhlcml0J10gfSk7XG4gIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigob2ssIGtvKSA9PiB7XG4gICAgY2hpbGQub25jZSgnZXhpdCcsIChzdGF0dXM6IGFueSkgPT4ge1xuICAgICAgaWYgKHN0YXR1cyA9PT0gMCkge1xuICAgICAgICByZXR1cm4gb2soKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBrbyhuZXcgRXJyb3IoYCR7Y29tbWFuZH0gZXhpdGVkIHdpdGggc3RhdHVzICR7c3RhdHVzfWApKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjaGlsZC5vbmNlKCdlcnJvcicsIGtvKTtcbiAgfSk7XG59XG4iXX0=
|
package/bin/awslint.ts
CHANGED
|
@@ -6,7 +6,7 @@ import * as chalk from 'chalk';
|
|
|
6
6
|
import * as fs from 'fs-extra';
|
|
7
7
|
import * as reflect from 'jsii-reflect';
|
|
8
8
|
import * as yargs from 'yargs';
|
|
9
|
-
import { ALL_RULES_LINTER, DiagnosticLevel } from '../lib';
|
|
9
|
+
import { ALL_RULES_LINTER, DiagnosticLevel, RuleFilterSet } from '../lib';
|
|
10
10
|
|
|
11
11
|
let stackTrace = false;
|
|
12
12
|
|
|
@@ -37,7 +37,7 @@ async function main() {
|
|
|
37
37
|
.example('awslint', 'lints the current module against all rules')
|
|
38
38
|
.example('awslint -v -i "resource*" -i "import*"', 'lints against all rules that start with "resource" or "import" and print successes')
|
|
39
39
|
.example('awslint -x "*:@aws-cdk/aws-s3*"', 'evaluate all rules in all scopes besides ones that begin with "@aws-cdk/aws-s3"')
|
|
40
|
-
.example('awslint --save', 'updated "
|
|
40
|
+
.example('awslint --save', 'updated "awslint.json" with "exclude"s for all failing rules');
|
|
41
41
|
|
|
42
42
|
if (!process.stdout.isTTY) {
|
|
43
43
|
// Disable chalk color highlighting
|
|
@@ -118,11 +118,14 @@ async function main() {
|
|
|
118
118
|
const excludesToSave = new Array<string>();
|
|
119
119
|
let errors = 0;
|
|
120
120
|
|
|
121
|
+
const includeRules = new RuleFilterSet(args.include);
|
|
122
|
+
const excludeRules = new RuleFilterSet(args.exclude);
|
|
123
|
+
|
|
121
124
|
const results = [];
|
|
122
125
|
|
|
123
126
|
results.push(...ALL_RULES_LINTER.eval(assembly, {
|
|
124
|
-
|
|
125
|
-
|
|
127
|
+
includeRules: includeRules,
|
|
128
|
+
excludeRules: excludeRules,
|
|
126
129
|
}));
|
|
127
130
|
|
|
128
131
|
// Sort errors to the top (highest severity first)
|
package/lib/index.d.ts
CHANGED
package/lib/index.js
CHANGED
|
@@ -16,4 +16,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./linter"), exports);
|
|
18
18
|
__exportStar(require("./rules"), exports);
|
|
19
|
-
|
|
19
|
+
__exportStar(require("./rule-specs"), exports);
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQXlCO0FBQ3pCLDBDQUF3QjtBQUN4QiwrQ0FBNkIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2xpbnRlcic7XG5leHBvcnQgKiBmcm9tICcuL3J1bGVzJztcbmV4cG9ydCAqIGZyb20gJy4vcnVsZS1zcGVjcyc7XG4iXX0=
|
package/lib/index.ts
CHANGED
package/lib/linter.d.ts
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import * as reflect from 'jsii-reflect';
|
|
2
|
+
import { RuleFilterSet } from './rule-specs';
|
|
2
3
|
export interface LinterOptions {
|
|
3
4
|
/**
|
|
4
5
|
* List of rules to include.
|
|
5
6
|
* @default all rules
|
|
6
7
|
*/
|
|
7
|
-
|
|
8
|
+
includeRules?: RuleFilterSet;
|
|
8
9
|
/**
|
|
9
10
|
* List of rules to exclude (takes precedence on "include")
|
|
10
11
|
* @default none
|
|
11
12
|
*/
|
|
12
|
-
|
|
13
|
+
excludeRules?: RuleFilterSet;
|
|
13
14
|
}
|
|
14
15
|
export declare abstract class LinterBase {
|
|
15
16
|
abstract rules: Rule[];
|
package/lib/linter.js
CHANGED
|
@@ -179,39 +179,16 @@ class Evaluation {
|
|
|
179
179
|
* Evaluates whether the rule should be evaluated based on the filters applied.
|
|
180
180
|
*/
|
|
181
181
|
shouldEvaluate(code, scope) {
|
|
182
|
-
if (!this.options.
|
|
182
|
+
if (!this.options.includeRules || this.options.includeRules.isEmpty()) {
|
|
183
183
|
return true;
|
|
184
184
|
}
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
for (const exclude of this.options.exclude || []) {
|
|
189
|
-
// match exclude
|
|
190
|
-
if (matchRule(exclude)) {
|
|
191
|
-
return false;
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
return true;
|
|
185
|
+
if (this.options.includeRules.matches(code, scope)) {
|
|
186
|
+
if (this.options.excludeRules?.matches(code, scope)) {
|
|
187
|
+
return false;
|
|
195
188
|
}
|
|
189
|
+
return true;
|
|
196
190
|
}
|
|
197
191
|
return false;
|
|
198
|
-
function matchRule(filter) {
|
|
199
|
-
if (filter.indexOf(':') === -1) {
|
|
200
|
-
filter += ':*'; // add "*" scope filter if there isn't one
|
|
201
|
-
}
|
|
202
|
-
// filter format is "code:scope" and both support "*" suffix to indicate startsWith
|
|
203
|
-
const [codeFilter, scopeFilter] = filter.split(':');
|
|
204
|
-
return matchPattern(code, codeFilter) && matchPattern(scope, scopeFilter);
|
|
205
|
-
}
|
|
206
|
-
function matchPattern(s, pattern) {
|
|
207
|
-
if (pattern.endsWith('*')) {
|
|
208
|
-
const prefix = pattern.slice(0, -1);
|
|
209
|
-
return s.startsWith(prefix);
|
|
210
|
-
}
|
|
211
|
-
else {
|
|
212
|
-
return s === pattern;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
192
|
}
|
|
216
193
|
}
|
|
217
194
|
exports.Evaluation = Evaluation;
|
|
@@ -242,4 +219,4 @@ function typeReferenceFrom(ts, x) {
|
|
|
242
219
|
function isTypeReference(x) {
|
|
243
220
|
return x instanceof reflect.TypeReference;
|
|
244
221
|
}
|
|
245
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGludGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibGludGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZCQUE2QjtBQUU3Qix3Q0FBd0M7QUFnQnhDLE1BQXNCLFVBQVU7Q0FHL0I7QUFIRCxnQ0FHQztBQUVELE1BQWEsZUFBZ0IsU0FBUSxVQUFVO0lBRzdDLFlBQVksR0FBRyxPQUFxQjtRQUNsQyxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJQUFXLEtBQUs7UUFDZCxNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssRUFBUSxDQUFDO1FBQzlCLEtBQUssTUFBTSxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNqQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzNCO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRU0sSUFBSSxDQUFDLFFBQTBCLEVBQUUsT0FBa0M7UUFDeEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQWMsQ0FBQztRQUN0QyxLQUFLLE1BQU0sTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDakMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDL0M7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Q0FDRjtBQXZCRCwwQ0F1QkM7QUFFRDs7R0FFRztBQUNILE1BQWEsTUFBVSxTQUFRLFVBQVU7SUFHdkMsWUFBNkIsSUFBa0U7UUFDN0YsS0FBSyxFQUFFLENBQUM7UUFEbUIsU0FBSSxHQUFKLElBQUksQ0FBOEQ7UUFGOUUsV0FBTSxHQUF3QyxFQUFHLENBQUM7SUFJbkUsQ0FBQztJQUVELElBQVcsS0FBSztRQUNkLE9BQU8sTUFBTSxDQUFDLE1BQU0s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cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgdXRpbCBmcm9tICd1dGlsJztcbmltcG9ydCB7IFByaW1pdGl2ZVR5cGUgfSBmcm9tICdAanNpaS9zcGVjJztcbmltcG9ydCAqIGFzIHJlZmxlY3QgZnJvbSAnanNpaS1yZWZsZWN0JztcblxuZXhwb3J0IGludGVyZmFjZSBMaW50ZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIExpc3Qgb2YgcnVsZXMgdG8gaW5jbHVkZS5cbiAgICogQGRlZmF1bHQgYWxsIHJ1bGVzXG4gICAqL1xuICBpbmNsdWRlPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgcnVsZXMgdG8gZXhjbHVkZSAodGFrZXMgcHJlY2VkZW5jZSBvbiBcImluY2x1ZGVcIilcbiAgICogQGRlZmF1bHQgbm9uZVxuICAgKi9cbiAgZXhjbHVkZT86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTGludGVyQmFzZSB7XG4gIHB1YmxpYyBhYnN0cmFjdCBydWxlczogUnVsZVtdO1xuICBwdWJsaWMgYWJzdHJhY3QgZXZhbChhc3NlbWJseTogcmVmbGVjdC5Bc3NlbWJseSwgb3B0aW9uczogTGludGVyT3B0aW9ucyB8IHVuZGVmaW5lZCk6IERpYWdub3N0aWNbXTtcbn1cblxuZXhwb3J0IGNsYXNzIEFnZ3JlZ2F0ZUxpbnRlciBleHRlbmRzIExpbnRlckJhc2Uge1xuICBwcml2YXRlIGxpbnRlcnM6IExpbnRlckJhc2VbXTtcblxuICBjb25zdHJ1Y3RvciguLi5saW50ZXJzOiBMaW50ZXJCYXNlW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubGludGVycyA9IGxpbnRlcnM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJ1bGVzKCk6IFJ1bGVbXSB7XG4gICAgY29uc3QgcmV0ID0gbmV3IEFycmF5PFJ1bGU+KCk7XG4gICAgZm9yIChjb25zdCBsaW50ZXIgb2YgdGhpcy5saW50ZXJzKSB7XG4gICAgICByZXQucHVzaCguLi5saW50ZXIucnVsZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgcHVibGljIGV2YWwoYXNzZW1ibHk6IHJlZmxlY3QuQXNzZW1ibHksIG9wdGlvbnM6IExpbnRlck9wdGlvbnMgfCB1bmRlZmluZWQpOiBEaWFnbm9zdGljW10ge1xuICAgIGNvbnN0IGRpYWdzID0gbmV3IEFycmF5PERpYWdub3N0aWM+KCk7XG4gICAgZm9yIChjb25zdCBsaW50ZXIgb2YgdGhpcy5saW50ZXJzKSB7XG4gICAgICBkaWFncy5wdXNoKC4uLmxpbnRlci5ldmFsKGFzc2VtYmx5LCBvcHRpb25zKSk7XG4gICAgfVxuICAgIHJldHVybiBkaWFncztcbiAgfVxufVxuXG4vKipcbiAqIEV2YWx1YXRlcyBhIGJ1bmNoIG9mIHJ1bGVzIGFnYWluc3Qgc29tZSBjb250ZXh0LlxuICovXG5leHBvcnQgY2xhc3MgTGludGVyPFQ+IGV4dGVuZHMgTGludGVyQmFzZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3J1bGVzOiB7IFtuYW1lOiBzdHJpbmddOiBDb25jcmV0ZVJ1bGU8VD4gfSA9IHsgfTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGluaXQ6IChhc3NlbWJseTogcmVmbGVjdC5Bc3NlbWJseSkgPT4gVCB8IHJlYWRvbmx5IFRbXSB8IHVuZGVmaW5lZCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJ1bGVzKCkge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuX3J1bGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIGFub3RoZXIgcnVsZS5cbiAgICovXG4gIHB1YmxpYyBhZGQocnVsZTogQ29uY3JldGVSdWxlPFQ+KSB7XG4gICAgaWYgKHJ1bGUuY29kZSBpbiB0aGlzLl9ydWxlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBydWxlIFwiJHtydWxlLmNvZGV9XCIgYWxyZWFkeSBleGlzdHNgKTtcbiAgICB9XG5cbiAgICB0aGlzLl9ydWxlc1tydWxlLmNvZGVdID0gcnVsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZSBhbGwgcnVsZXMgYWdhaW5zdCB0aGUgY29udGV4dC5cbiAgICovXG4gIHB1YmxpYyBldmFsKGFzc2VtYmx5OiByZWZsZWN0LkFzc2VtYmx5LCBvcHRpb25zOiBMaW50ZXJPcHRpb25zIHwgdW5kZWZpbmVkKTogRGlhZ25vc3RpY1tdIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7IH07XG5cbiAgICBsZXQgY3R4cyA9IHRoaXMuaW5pdChhc3NlbWJseSk7XG4gICAgaWYgKCFjdHhzKSB7XG4gICAgICByZXR1cm4gW107IC8vIHNraXBcbiAgICB9XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoY3R4cykpIHtcbiAgICAgIGN0eHMgPSBbY3R4c10gYXMgcmVhZG9ubHkgVFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGRpYWcgPSBuZXcgQXJyYXk8RGlhZ25vc3RpYz4oKTtcblxuICAgIGZvciAoY29uc3QgY3R4IG9mIGN0eHMpIHtcbiAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBPYmplY3QudmFsdWVzKHRoaXMuX3J1bGVzKSkge1xuICAgICAgICBjb25zdCBldmFsdWF0aW9uID0gbmV3IEV2YWx1YXRpb24oY3R4LCBydWxlLCBkaWFnLCBvcHRpb25zKTtcbiAgICAgICAgcnVsZS5ldmFsKGV2YWx1YXRpb24pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkaWFnO1xuICB9XG59XG5cbi8qKlxuICogUGFzc2VkIGluIHRvIGVhY2ggcnVsZSBkdXJpbmcgZXZhbHVhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIEV2YWx1YXRpb248VD4ge1xuICBwdWJsaWMgcmVhZG9ubHkgY3R4OiBUO1xuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uczogTGludGVyT3B0aW9ucztcblxuICBwcml2YXRlIHJlYWRvbmx5IGN1cnI6IENvbmNyZXRlUnVsZTxUPjtcbiAgcHJpdmF0ZSByZWFkb25seSBkaWFnbm9zdGljczogRGlhZ25vc3RpY1tdO1xuXG4gIGNvbnN0cnVjdG9yKGN0eDogVCwgcnVsZTogQ29uY3JldGVSdWxlPFQ+LCBkaWFnbm9zdGljczogRGlhZ25vc3RpY1tdLCBvcHRpb25zOiBMaW50ZXJPcHRpb25zKSB7XG4gICAgdGhpcy5jdHggPSBjdHg7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLmN1cnIgPSBydWxlO1xuICAgIHRoaXMuZGlhZ25vc3RpY3MgPSBkaWFnbm9zdGljcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgYSBmYWlsdXJlIGlmIGBjb25kaXRpb25gIGlzIG5vdCB0cnV0aHkuXG4gICAqXG4gICAqIEBwYXJhbSBjb25kaXRpb24gVGhlIGNvbmRpdGlvbiB0byBhc3NlcnQuXG4gICAqIEBwYXJhbSBzY29wZSBVc2VkIHRvIGRpYWdub3NlIHRoZSBsb2NhdGlvbiBpbiB0aGUgc291cmNlLCBhbmQgaXMgdXNlZCBpbiB0aGVcbiAgICogaWdub3JlIHBhdHRlcm4uXG4gICAqIEBwYXJhbSBleHRyYSBVc2VkIHRvIHJlcGxhY2UgJXMgaW4gdGhlIGRlZmF1bHQgbWVzc2FnZSBmb3JtYXQgc3RyaW5nLlxuICAgKi9cbiAgcHVibGljIGFzc2VydChjb25kaXRpb246IGFueSwgc2NvcGU6IHN0cmluZywgZXh0cmE/OiBzdHJpbmcpOiBjb25kaXRpb24gaXMgdHJ1ZSB7XG4gICAgLy8gZGVkdXBsaWNhdGU6IHNraXAgaWYgdGhpcyBzcGVjaWZpYyBhc3NlcnRpb24gKFwicnVsZTpzY29wZVwiKSB3YXMgYWxyZWFkeSBleGFtaW5lZFxuICAgIGlmICh0aGlzLmRpYWdub3N0aWNzLmZpbmQoZCA9PiBkLnJ1bGUuY29kZSA9PT0gdGhpcy5jdXJyLmNvZGUgJiYgZC5zY29wZSA9PT0gc2NvcGUpKSB7XG4gICAgICByZXR1cm4gY29uZGl0aW9uO1xuICAgIH1cblxuICAgIGNvbnN0IGluY2x1ZGUgPSB0aGlzLnNob3VsZEV2YWx1YXRlKHRoaXMuY3Vyci5jb2RlLCBzY29wZSk7XG4gICAgY29uc3QgbWVzc2FnZSA9IHV0aWwuZm9ybWF0KHRoaXMuY3Vyci5tZXNzYWdlLCBleHRyYSB8fCAnJyk7XG5cbiAgICAvLyBEb24ndCBhZGQgYSBcIlN1Y2Nlc3NcIiBkaWFnbm9zdGljLiBJdCB3aWxsIGJyZWFrIGlmIHdlIHJ1biBhIGNvbXBvdW5kXG4gICAgLy8gbGludGVyIHJ1bGUgd2hpY2ggY29uc2lzdHMgb2YgMyBjaGVja3Mgd2l0aCB0aGUgc2FtZSBzY29wZSAoc3VjaFxuICAgIC8vIGFzIGZvciBleGFtcGxlIGBhc3NlcnRTaWduYXR1cmUoKWApLiBJZiB0aGUgZmlyc3QgY2hlY2sgZmFpbHMsIHdlIHdvdWxkXG4gICAgLy8gYWRkIGEgXCJTdWNjZXNzXCIgZGlhZ25vc3RpYyBhbmQgYWxsIG90aGVyIGRpYWdub3N0aWNzIHdvdWxkIGJlIHNraXBwZWQgYmVjYXVzZVxuICAgIC8vIG9mIHRoZSBkZWR1cGxpY2F0aW9uIGNoZWNrIGFib3ZlLiBDaGFuZ2luZyB0aGUgc2NvcGUgbWFrZXMgaXQgd29yc2UsIHNpbmNlXG4gICAgLy8gdGhlIHNjb3BlIGlzIGFsc28gdGhlIGlnbm9yZSBwYXR0ZXJuIGFuZCB0aGV5J3JlIGFsbCBjb25jZXB0dWFsbHkgdGhlIHNhbWUgcnVsZS5cbiAgICAvL1xuICAgIC8vIFNpbXBsZXN0IHNvbHV0aW9uIGlzIHRvIG5vdCByZWNvcmQgc3VjY2Vzc2VzIC0tIHdoeSBkbyB3ZSBldmVuIG5lZWQgdGhlbT9cbiAgICBpZiAoaW5jbHVkZSAmJiBjb25kaXRpb24pIHsgcmV0dXJuIGNvbmRpdGlvbjsgfVxuXG4gICAgbGV0IGxldmVsOiBEaWFnbm9zdGljTGV2ZWw7XG4gICAgaWYgKCFpbmNsdWRlKSB7XG4gICAgICBsZXZlbCA9IERpYWdub3N0aWNMZXZlbC5Ta2lwcGVkO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyLndhcm5pbmcpIHtcbiAgICAgIGxldmVsID0gRGlhZ25vc3RpY0xldmVsLldhcm5pbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldmVsID0gRGlhZ25vc3RpY0xldmVsLkVycm9yO1xuICAgIH1cblxuICAgIGNvbnN0IGRpYWc6IERpYWdub3N0aWMgPSB7XG4gICAgICBsZXZlbCxcbiAgICAgIHJ1bGU6IHRoaXMuY3VycixcbiAgICAgIHNjb3BlLFxuICAgICAgbWVzc2FnZSxcbiAgICB9O1xuXG4gICAgdGhpcy5kaWFnbm9zdGljcy5wdXNoKGRpYWcpO1xuXG4gICAgcmV0dXJuIGNvbmRpdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBhc3NlcnRFcXVhbHMoYWN0dWFsOiBhbnksIGV4cGVjdGVkOiBhbnksIHNjb3BlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5hc3NlcnQoYWN0dWFsID09PSBleHBlY3RlZCwgc2NvcGUsIGAgKGV4cGVjdGVkPVwiJHtleHBlY3RlZH1cIixhY3R1YWw9XCIke2FjdHVhbH1cIilgKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3NlcnRUeXBlc0VxdWFsKHRzOiByZWZsZWN0LlR5cGVTeXN0ZW0sIGFjdHVhbDogVHlwZVNwZWNpZmllciwgZXhwZWN0ZWQ6IFR5cGVTcGVjaWZpZXIsIHNjb3BlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhID0gdHlwZVJlZmVyZW5jZUZyb20odHMsIGFjdHVhbCk7XG4gICAgY29uc3QgZSA9IHR5cGVSZWZlcmVuY2VGcm9tKHRzLCBleHBlY3RlZCk7XG4gICAgcmV0dXJuIHRoaXMuYXNzZXJ0KGEudG9TdHJpbmcoKSA9PT0gZS50b1N0cmluZygpLCBzY29wZSwgYCAoZXhwZWN0ZWQ9XCIke2V9XCIsYWN0dWFsPVwiJHthfVwiKWApO1xuICB9XG5cbiAgcHVibGljIGFzc2VydFR5cGVzQXNzaWduYWJsZSh0czogcmVmbGVjdC5UeXBlU3lzdGVtLCBhY3R1YWw6IFR5cGVTcGVjaWZpZXIsIGV4cGVjdGVkOiBUeXBlU3BlY2lmaWVyLCBzY29wZTogc3RyaW5nKSB7XG4gICAgY29uc3QgYSA9IHR5cGVSZWZlcmVuY2VGcm9tKHRzLCBhY3R1YWwpO1xuICAgIGNvbnN0IGUgPSB0eXBlUmVmZXJlbmNlRnJvbSh0cywgZXhwZWN0ZWQpO1xuICAgIHJldHVybiB0aGlzLmFzc2VydChhLnRvU3RyaW5nKCkgPT09IGUudG9TdHJpbmcoKSB8fCAoYS5mcW4gJiYgZS5mcW4gJiYgYS50eXBlIS5leHRlbmRzKGUudHlwZSEpKSwgc2NvcGUsIGAgKFwiJHthfVwiIG5vdCBhc3NpZ25hYmxlIHRvIFwiJHtlfVwiKWApO1xuICB9XG5cbiAgcHVibGljIGFzc2VydFBhcmFtZXRlck9wdGlvbmFsKGFjdHVhbDogYm9vbGVhbiwgZXhwZWN0ZWQ6IGJvb2xlYW4sIHNjb3BlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5hc3NlcnQoYWN0dWFsID09PSBleHBlY3RlZCwgc2NvcGUsIGAgKCR7c2NvcGV9IHNob3VsZCBiZSAke2V4cGVjdGVkID8gJ29wdGlvbmFsJyA6ICdtYW5kYXRvcnknfSlgKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3NlcnRTaWduYXR1cmUobWV0aG9kOiByZWZsZWN0LkNhbGxhYmxlLCBleHBlY3RhdGlvbnM6IE1ldGhvZFNpZ25hdHVyZUV4cGVjdGF0aW9ucykge1xuICAgIGNvbnN0IHNjb3BlID0gbWV0aG9kLnBhcmVudFR5cGUuZnFuICsgJy4nICsgbWV0aG9kLm5hbWU7XG4gICAgaWYgKGV4cGVjdGF0aW9ucy5yZXR1cm5zICYmIHJlZmxlY3QuTWV0aG9kLmlzTWV0aG9kKG1ldGhvZCkpIHtcbiAgICAgIHRoaXMuYXNzZXJ0VHlwZXNFcXVhbChtZXRob2Quc3lzdGVtLCBtZXRob2QucmV0dXJucy50eXBlLCBleHBlY3RhdGlvbnMucmV0dXJucywgc2NvcGUpO1xuICAgIH1cblxuICAgIGlmIChleHBlY3RhdGlvbnMucGFyYW1ldGVycykge1xuICAgICAgY29uc3QgZXhwZWN0ZWRDb3VudCA9IGV4cGVjdGF0aW9ucy5wYXJhbWV0ZXJzLmxlbmd0aDtcbiAgICAgIGNvbnN0IGFjdHVhbENvdW50ID0gbWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RoO1xuICAgICAgaWYgKHRoaXMuYXNzZXJ0RXF1YWxzKGFjdHVhbENvdW50LCBleHBlY3RlZENvdW50LCBzY29wZSkpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHBlY3RhdGlvbnMucGFyYW1ldGVycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGNvbnN0IGV4cGVjdCA9IGV4cGVjdGF0aW9ucy5wYXJhbWV0ZXJzW2ldO1xuICAgICAgICAgIGNvbnN0IGFjdHVhbCA9IG1ldGhvZC5wYXJhbWV0ZXJzW2ldO1xuICAgICAgICAgIGNvbnN0IHBzY29wZSA9IHNjb3BlICsgYC5wYXJhbXNbJHtpfV1gO1xuICAgICAgICAgIGlmIChleHBlY3QubmFtZSkge1xuICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWROYW1lID0gZXhwZWN0Lm5hbWU7XG4gICAgICAgICAgICBjb25zdCBhY3R1YWxOYW1lID0gYWN0dWFsLm5hbWU7XG4gICAgICAgICAgICB0aGlzLmFzc2VydEVxdWFscyhhY3R1YWxOYW1lLCBleHBlY3RlZE5hbWUsIHBzY29wZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChleHBlY3QudHlwZSkge1xuICAgICAgICAgICAgaWYgKGV4cGVjdC5zdWJ0eXBlQWxsb3dlZCkge1xuICAgICAgICAgICAgICB0aGlzLmFzc2VydFR5cGVzQXNzaWduYWJsZShtZXRob2Quc3lzdGVtLCBhY3R1YWwudHlwZSwgZXhwZWN0LnR5cGUsIHBzY29wZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmFzc2VydFR5cGVzRXF1YWwobWV0aG9kLnN5c3RlbSwgYWN0dWFsLnR5cGUsIGV4cGVjdC50eXBlLCBwc2NvcGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZXhwZWN0Lm9wdGlvbmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0UGFyYW1ldGVyT3B0aW9uYWwoYWN0dWFsLm9wdGlvbmFsLCBleHBlY3Qub3B0aW9uYWwsIHBzY29wZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlcyB3aGV0aGVyIHRoZSBydWxlIHNob3VsZCBiZSBldmFsdWF0ZWQgYmFzZWQgb24gdGhlIGZpbHRlcnMgYXBwbGllZC5cbiAgICovXG4gIHByaXZhdGUgc2hvdWxkRXZhbHVhdGUoY29kZTogc3RyaW5nLCBzY29wZTogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuaW5jbHVkZSB8fCB0aGlzLm9wdGlvbnMuaW5jbHVkZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgaW5jbHVkZSBvZiB0aGlzLm9wdGlvbnMuaW5jbHVkZSkge1xuICAgICAgLy8gbWF0Y2ggaW5jbHVkZVxuICAgICAgaWYgKG1hdGNoUnVsZShpbmNsdWRlKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGV4Y2x1ZGUgb2YgdGhpcy5vcHRpb25zLmV4Y2x1ZGUgfHwgW10pIHtcbiAgICAgICAgICAvLyBtYXRjaCBleGNsdWRlXG4gICAgICAgICAgaWYgKG1hdGNoUnVsZShleGNsdWRlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBmdW5jdGlvbiBtYXRjaFJ1bGUoZmlsdGVyOiBzdHJpbmcpIHtcbiAgICAgIGlmIChmaWx0ZXIuaW5kZXhPZignOicpID09PSAtMSkge1xuICAgICAgICBmaWx0ZXIgKz0gJzoqJzsgLy8gYWRkIFwiKlwiIHNjb3BlIGZpbHRlciBpZiB0aGVyZSBpc24ndCBvbmVcbiAgICAgIH1cblxuICAgICAgLy8gZmlsdGVyIGZvcm1hdCBpcyBcImNvZGU6c2NvcGVcIiBhbmQgYm90aCBzdXBwb3J0IFwiKlwiIHN1ZmZpeCB0byBpbmRpY2F0ZSBzdGFydHNXaXRoXG4gICAgICBjb25zdCBbY29kZUZpbHRlciwgc2NvcGVGaWx0ZXJdID0gZmlsdGVyLnNwbGl0KCc6Jyk7XG4gICAgICByZXR1cm4gbWF0Y2hQYXR0ZXJuKGNvZGUsIGNvZGVGaWx0ZXIpICYmIG1hdGNoUGF0dGVybihzY29wZSwgc2NvcGVGaWx0ZXIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1hdGNoUGF0dGVybihzOiBzdHJpbmcsIHBhdHRlcm46IHN0cmluZykge1xuICAgICAgaWYgKHBhdHRlcm4uZW5kc1dpdGgoJyonKSkge1xuICAgICAgICBjb25zdCBwcmVmaXggPSBwYXR0ZXJuLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgcmV0dXJuIHMuc3RhcnRzV2l0aChwcmVmaXgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHMgPT09IHBhdHRlcm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdWxlIHtcbiAgY29kZTogc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmc7XG4gIHdhcm5pbmc/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbmNyZXRlUnVsZTxUPiBleHRlbmRzIFJ1bGUge1xuICBldmFsKGxpbnRlcjogRXZhbHVhdGlvbjxUPik6IHZvaWQ7XG59XG5cbi8qKlxuICogQSB0eXBlIGNvbnN0cmFpbnRcbiAqXG4gKiBCZSBzdXBlciBmbGV4aWJsZSBhYm91dCBob3cgdHlwZXMgY2FuIGJlIHJlcHJlc2VudGVkLiBVbHRpbWF0ZWx5LCB3ZSB3aWxsXG4gKiBjb21wYXJlIHdoYXQgeW91IGdpdmUgdG8gYSBUeXBlUmVmZXJlbmNlLCBiZWNhdXNlIHRoYXQncyB3aGF0J3MgaW4gdGhlIEpTSUlcbiAqIFJlZmxlY3QgbW9kZWwuIEhvd2V2ZXIsIGlmIHlvdSBhbHJlYWR5IGhhdmUgYSByZWFsIFR5cGUsIG9yIGp1c3QgYSBzdHJpbmcgdG9cbiAqIGEgdXNlci1kZWZpbmVkIHR5cGUsIHRoYXQncyBmaW5lIHRvby4gV2UnbGwgRG8gVGhlIFJpZ2h0IFRoaW5nLlxuICovXG5leHBvcnQgdHlwZSBUeXBlU3BlY2lmaWVyID0gcmVmbGVjdC5UeXBlUmVmZXJlbmNlIHwgcmVmbGVjdC5UeXBlIHwgc3RyaW5nO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1ldGhvZFNpZ25hdHVyZVBhcmFtZXRlckV4cGVjdGF0aW9uIHtcbiAgbmFtZT86IHN0cmluZztcbiAgdHlwZT86IFR5cGVTcGVjaWZpZXI7XG4gIHN1YnR5cGVBbGxvd2VkPzogYm9vbGVhbjtcblxuICAvKiogc2hvdWxkIHRoaXMgcGFyYW0gYmUgb3B0aW9uYWw/ICovXG4gIG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZXRob2RTaWduYXR1cmVFeHBlY3RhdGlvbnMge1xuICBwYXJhbWV0ZXJzPzogTWV0aG9kU2lnbmF0dXJlUGFyYW1ldGVyRXhwZWN0YXRpb25bXTtcbiAgcmV0dXJucz86IFR5cGVTcGVjaWZpZXI7XG59XG5cbmV4cG9ydCBlbnVtIERpYWdub3N0aWNMZXZlbCB7XG4gIFNraXBwZWQsXG4gIFN1Y2Nlc3MsXG4gIFdhcm5pbmcsXG4gIEVycm9yLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIERpYWdub3N0aWMge1xuICBsZXZlbDogRGlhZ25vc3RpY0xldmVsO1xuICBydWxlOiBSdWxlO1xuICBzY29wZTogc3RyaW5nO1xuICBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydCBhIHR5cGUgc3BlY2lmaWVyIHRvIGEgVHlwZVJlZmVyZW5jZVxuICovXG5mdW5jdGlvbiB0eXBlUmVmZXJlbmNlRnJvbSh0czogcmVmbGVjdC5UeXBlU3lzdGVtLCB4OiBUeXBlU3BlY2lmaWVyKTogcmVmbGVjdC5UeXBlUmVmZXJlbmNlIHtcbiAgaWYgKGlzVHlwZVJlZmVyZW5jZSh4KSkgeyByZXR1cm4geDsgfVxuXG4gIGlmICh0eXBlb2YgeCA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoeC5pbmRleE9mKCcuJykgPT09IC0xKSB7XG4gICAgICByZXR1cm4gbmV3IHJlZmxlY3QuVHlwZVJlZmVyZW5jZSh0cywgeyBwcmltaXRpdmU6IHggYXMgUHJpbWl0aXZlVHlwZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyByZWZsZWN0LlR5cGVSZWZlcmVuY2UodHMsIHsgZnFuOiB4IH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgcmVmbGVjdC5UeXBlUmVmZXJlbmNlKHRzLCB4KTtcbn1cblxuZnVuY3Rpb24gaXNUeXBlUmVmZXJlbmNlKHg6IGFueSk6IHggaXMgcmVmbGVjdC5UeXBlUmVmZXJlbmNlIHtcbiAgcmV0dXJuIHggaW5zdGFuY2VvZiByZWZsZWN0LlR5cGVSZWZlcmVuY2U7XG59XG4iXX0=
|
|
222
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGludGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibGludGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZCQUE2QjtBQUU3Qix3Q0FBd0M7QUFpQnhDLE1BQXNCLFVBQVU7Q0FHL0I7QUFIRCxnQ0FHQztBQUVELE1BQWEsZUFBZ0IsU0FBUSxVQUFVO0lBRzdDLFlBQVksR0FBRyxPQUFxQjtRQUNsQyxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJQUFXLEtBQUs7UUFDZCxNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssRUFBUSxDQUFDO1FBQzlCLEtBQUssTUFBTSxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNqQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzNCO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRU0sSUFBSSxDQUFDLFFBQTBCLEVBQUUsT0FBa0M7UUFDeEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQWMsQ0FBQztRQUN0QyxLQUFLLE1BQU0sTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDakMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDL0M7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Q0FDRjtBQXZCRCwwQ0F1QkM7QUFFRDs7R0FFRztBQUNILE1BQWEsTUFBVSxTQUFRLFVBQVU7SUFHdkMsWUFBNkIsSUFBa0U7UUFDN0YsS0FBSyxFQUFFLENBQUM7UUFEbUIsU0FBSSxHQUFKLElBQUksQ0FBOEQ7UUFGOUUsV0FBTSxHQUF3QyxFQUFHLENBQUM7SUFJbkUsQ0FBQztJQUVELElBQVcsS0FBSztRQUNkLE9BQU8sTUFBTSxDQUFDLE1BQU0s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TCxPQUFPLElBQUksT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNsRDtLQUNGO0lBRUQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzFDLENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FBQyxDQUFNO0lBQzdCLE9BQU8sQ0FBQyxZQUFZLE9BQU8sQ0FBQyxhQUFhLENBQUM7QUFDNUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHV0aWwgZnJvbSAndXRpbCc7XG5pbXBvcnQgeyBQcmltaXRpdmVUeXBlIH0gZnJvbSAnQGpzaWkvc3BlYyc7XG5pbXBvcnQgKiBhcyByZWZsZWN0IGZyb20gJ2pzaWktcmVmbGVjdCc7XG5pbXBvcnQgeyBSdWxlRmlsdGVyU2V0IH0gZnJvbSAnLi9ydWxlLXNwZWNzJztcblxuZXhwb3J0IGludGVyZmFjZSBMaW50ZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIExpc3Qgb2YgcnVsZXMgdG8gaW5jbHVkZS5cbiAgICogQGRlZmF1bHQgYWxsIHJ1bGVzXG4gICAqL1xuICBpbmNsdWRlUnVsZXM/OiBSdWxlRmlsdGVyU2V0O1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIHJ1bGVzIHRvIGV4Y2x1ZGUgKHRha2VzIHByZWNlZGVuY2Ugb24gXCJpbmNsdWRlXCIpXG4gICAqIEBkZWZhdWx0IG5vbmVcbiAgICovXG4gIGV4Y2x1ZGVSdWxlcz86IFJ1bGVGaWx0ZXJTZXQ7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBMaW50ZXJCYXNlIHtcbiAgcHVibGljIGFic3RyYWN0IHJ1bGVzOiBSdWxlW107XG4gIHB1YmxpYyBhYnN0cmFjdCBldmFsKGFzc2VtYmx5OiByZWZsZWN0LkFzc2VtYmx5LCBvcHRpb25zOiBMaW50ZXJPcHRpb25zIHwgdW5kZWZpbmVkKTogRGlhZ25vc3RpY1tdO1xufVxuXG5leHBvcnQgY2xhc3MgQWdncmVnYXRlTGludGVyIGV4dGVuZHMgTGludGVyQmFzZSB7XG4gIHByaXZhdGUgbGludGVyczogTGludGVyQmFzZVtdO1xuXG4gIGNvbnN0cnVjdG9yKC4uLmxpbnRlcnM6IExpbnRlckJhc2VbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5saW50ZXJzID0gbGludGVycztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcnVsZXMoKTogUnVsZVtdIHtcbiAgICBjb25zdCByZXQgPSBuZXcgQXJyYXk8UnVsZT4oKTtcbiAgICBmb3IgKGNvbnN0IGxpbnRlciBvZiB0aGlzLmxpbnRlcnMpIHtcbiAgICAgIHJldC5wdXNoKC4uLmxpbnRlci5ydWxlcyk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBwdWJsaWMgZXZhbChhc3NlbWJseTogcmVmbGVjdC5Bc3NlbWJseSwgb3B0aW9uczogTGludGVyT3B0aW9ucyB8IHVuZGVmaW5lZCk6IERpYWdub3N0aWNbXSB7XG4gICAgY29uc3QgZGlhZ3MgPSBuZXcgQXJyYXk8RGlhZ25vc3RpYz4oKTtcbiAgICBmb3IgKGNvbnN0IGxpbnRlciBvZiB0aGlzLmxpbnRlcnMpIHtcbiAgICAgIGRpYWdzLnB1c2goLi4ubGludGVyLmV2YWwoYXNzZW1ibHksIG9wdGlvbnMpKTtcbiAgICB9XG4gICAgcmV0dXJuIGRpYWdzO1xuICB9XG59XG5cbi8qKlxuICogRXZhbHVhdGVzIGEgYnVuY2ggb2YgcnVsZXMgYWdhaW5zdCBzb21lIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBjbGFzcyBMaW50ZXI8VD4gZXh0ZW5kcyBMaW50ZXJCYXNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBfcnVsZXM6IHsgW25hbWU6IHN0cmluZ106IENvbmNyZXRlUnVsZTxUPiB9ID0geyB9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgaW5pdDogKGFzc2VtYmx5OiByZWZsZWN0LkFzc2VtYmx5KSA9PiBUIHwgcmVhZG9ubHkgVFtdIHwgdW5kZWZpbmVkKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcnVsZXMoKSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5fcnVsZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGwgYW5vdGhlciBydWxlLlxuICAgKi9cbiAgcHVibGljIGFkZChydWxlOiBDb25jcmV0ZVJ1bGU8VD4pIHtcbiAgICBpZiAocnVsZS5jb2RlIGluIHRoaXMuX3J1bGVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHJ1bGUgXCIke3J1bGUuY29kZX1cIiBhbHJlYWR5IGV4aXN0c2ApO1xuICAgIH1cblxuICAgIHRoaXMuX3J1bGVzW3J1bGUuY29kZV0gPSBydWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlIGFsbCBydWxlcyBhZ2FpbnN0IHRoZSBjb250ZXh0LlxuICAgKi9cbiAgcHVibGljIGV2YWwoYXNzZW1ibHk6IHJlZmxlY3QuQXNzZW1ibHksIG9wdGlvbnM6IExpbnRlck9wdGlvbnMgfCB1bmRlZmluZWQpOiBEaWFnbm9zdGljW10ge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHsgfTtcblxuICAgIGxldCBjdHhzID0gdGhpcy5pbml0KGFzc2VtYmx5KTtcbiAgICBpZiAoIWN0eHMpIHtcbiAgICAgIHJldHVybiBbXTsgLy8gc2tpcFxuICAgIH1cblxuICAgIGlmICghQXJyYXkuaXNBcnJheShjdHhzKSkge1xuICAgICAgY3R4cyA9IFtjdHhzXSBhcyByZWFkb25seSBUW107XG4gICAgfVxuXG4gICAgY29uc3QgZGlhZyA9IG5ldyBBcnJheTxEaWFnbm9zdGljPigpO1xuXG4gICAgZm9yIChjb25zdCBjdHggb2YgY3R4cykge1xuICAgICAgZm9yIChjb25zdCBydWxlIG9mIE9iamVjdC52YWx1ZXModGhpcy5fcnVsZXMpKSB7XG4gICAgICAgIGNvbnN0IGV2YWx1YXRpb24gPSBuZXcgRXZhbHVhdGlvbihjdHgsIHJ1bGUsIGRpYWcsIG9wdGlvbnMpO1xuICAgICAgICBydWxlLmV2YWwoZXZhbHVhdGlvbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpYWc7XG4gIH1cbn1cblxuLyoqXG4gKiBQYXNzZWQgaW4gdG8gZWFjaCBydWxlIGR1cmluZyBldmFsdWF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgRXZhbHVhdGlvbjxUPiB7XG4gIHB1YmxpYyByZWFkb25seSBjdHg6IFQ7XG4gIHB1YmxpYyByZWFkb25seSBvcHRpb25zOiBMaW50ZXJPcHRpb25zO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY3VycjogQ29uY3JldGVSdWxlPFQ+O1xuICBwcml2YXRlIHJlYWRvbmx5IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW107XG5cbiAgY29uc3RydWN0b3IoY3R4OiBULCBydWxlOiBDb25jcmV0ZVJ1bGU8VD4sIGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10sIG9wdGlvbnM6IExpbnRlck9wdGlvbnMpIHtcbiAgICB0aGlzLmN0eCA9IGN0eDtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMuY3VyciA9IHJ1bGU7XG4gICAgdGhpcy5kaWFnbm9zdGljcyA9IGRpYWdub3N0aWNzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCBhIGZhaWx1cmUgaWYgYGNvbmRpdGlvbmAgaXMgbm90IHRydXRoeS5cbiAgICpcbiAgICogQHBhcmFtIGNvbmRpdGlvbiBUaGUgY29uZGl0aW9uIHRvIGFzc2VydC5cbiAgICogQHBhcmFtIHNjb3BlIFVzZWQgdG8gZGlhZ25vc2UgdGhlIGxvY2F0aW9uIGluIHRoZSBzb3VyY2UsIGFuZCBpcyB1c2VkIGluIHRoZVxuICAgKiBpZ25vcmUgcGF0dGVybi5cbiAgICogQHBhcmFtIGV4dHJhIFVzZWQgdG8gcmVwbGFjZSAlcyBpbiB0aGUgZGVmYXVsdCBtZXNzYWdlIGZvcm1hdCBzdHJpbmcuXG4gICAqL1xuICBwdWJsaWMgYXNzZXJ0KGNvbmRpdGlvbjogYW55LCBzY29wZTogc3RyaW5nLCBleHRyYT86IHN0cmluZyk6IGNvbmRpdGlvbiBpcyB0cnVlIHtcbiAgICAvLyBkZWR1cGxpY2F0ZTogc2tpcCBpZiB0aGlzIHNwZWNpZmljIGFzc2VydGlvbiAoXCJydWxlOnNjb3BlXCIpIHdhcyBhbHJlYWR5IGV4YW1pbmVkXG4gICAgaWYgKHRoaXMuZGlhZ25vc3RpY3MuZmluZChkID0+IGQucnVsZS5jb2RlID09PSB0aGlzLmN1cnIuY29kZSAmJiBkLnNjb3BlID09PSBzY29wZSkpIHtcbiAgICAgIHJldHVybiBjb25kaXRpb247XG4gICAgfVxuXG4gICAgY29uc3QgaW5jbHVkZSA9IHRoaXMuc2hvdWxkRXZhbHVhdGUodGhpcy5jdXJyLmNvZGUsIHNjb3BlKTtcbiAgICBjb25zdCBtZXNzYWdlID0gdXRpbC5mb3JtYXQodGhpcy5jdXJyLm1lc3NhZ2UsIGV4dHJhIHx8ICcnKTtcblxuICAgIC8vIERvbid0IGFkZCBhIFwiU3VjY2Vzc1wiIGRpYWdub3N0aWMuIEl0IHdpbGwgYnJlYWsgaWYgd2UgcnVuIGEgY29tcG91bmRcbiAgICAvLyBsaW50ZXIgcnVsZSB3aGljaCBjb25zaXN0cyBvZiAzIGNoZWNrcyB3aXRoIHRoZSBzYW1lIHNjb3BlIChzdWNoXG4gICAgLy8gYXMgZm9yIGV4YW1wbGUgYGFzc2VydFNpZ25hdHVyZSgpYCkuIElmIHRoZSBmaXJzdCBjaGVjayBmYWlscywgd2Ugd291bGRcbiAgICAvLyBhZGQgYSBcIlN1Y2Nlc3NcIiBkaWFnbm9zdGljIGFuZCBhbGwgb3RoZXIgZGlhZ25vc3RpY3Mgd291bGQgYmUgc2tpcHBlZCBiZWNhdXNlXG4gICAgLy8gb2YgdGhlIGRlZHVwbGljYXRpb24gY2hlY2sgYWJvdmUuIENoYW5naW5nIHRoZSBzY29wZSBtYWtlcyBpdCB3b3JzZSwgc2luY2VcbiAgICAvLyB0aGUgc2NvcGUgaXMgYWxzbyB0aGUgaWdub3JlIHBhdHRlcm4gYW5kIHRoZXkncmUgYWxsIGNvbmNlcHR1YWxseSB0aGUgc2FtZSBydWxlLlxuICAgIC8vXG4gICAgLy8gU2ltcGxlc3Qgc29sdXRpb24gaXMgdG8gbm90IHJlY29yZCBzdWNjZXNzZXMgLS0gd2h5IGRvIHdlIGV2ZW4gbmVlZCB0aGVtP1xuICAgIGlmIChpbmNsdWRlICYmIGNvbmRpdGlvbikgeyByZXR1cm4gY29uZGl0aW9uOyB9XG5cbiAgICBsZXQgbGV2ZWw6IERpYWdub3N0aWNMZXZlbDtcbiAgICBpZiAoIWluY2x1ZGUpIHtcbiAgICAgIGxldmVsID0gRGlhZ25vc3RpY0xldmVsLlNraXBwZWQ7XG4gICAgfSBlbHNlIGlmICh0aGlzLmN1cnIud2FybmluZykge1xuICAgICAgbGV2ZWwgPSBEaWFnbm9zdGljTGV2ZWwuV2FybmluZztcbiAgICB9IGVsc2Uge1xuICAgICAgbGV2ZWwgPSBEaWFnbm9zdGljTGV2ZWwuRXJyb3I7XG4gICAgfVxuXG4gICAgY29uc3QgZGlhZzogRGlhZ25vc3RpYyA9IHtcbiAgICAgIGxldmVsLFxuICAgICAgcnVsZTogdGhpcy5jdXJyLFxuICAgICAgc2NvcGUsXG4gICAgICBtZXNzYWdlLFxuICAgIH07XG5cbiAgICB0aGlzLmRpYWdub3N0aWNzLnB1c2goZGlhZyk7XG5cbiAgICByZXR1cm4gY29uZGl0aW9uO1xuICB9XG5cbiAgcHVibGljIGFzc2VydEVxdWFscyhhY3R1YWw6IGFueSwgZXhwZWN0ZWQ6IGFueSwgc2NvcGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmFzc2VydChhY3R1YWwgPT09IGV4cGVjdGVkLCBzY29wZSwgYCAoZXhwZWN0ZWQ9XCIke2V4cGVjdGVkfVwiLGFjdHVhbD1cIiR7YWN0dWFsfVwiKWApO1xuICB9XG5cbiAgcHVibGljIGFzc2VydFR5cGVzRXF1YWwodHM6IHJlZmxlY3QuVHlwZVN5c3RlbSwgYWN0dWFsOiBUeXBlU3BlY2lmaWVyLCBleHBlY3RlZDogVHlwZVNwZWNpZmllciwgc2NvcGU6IHN0cmluZykge1xuICAgIGNvbnN0IGEgPSB0eXBlUmVmZXJlbmNlRnJvbSh0cywgYWN0dWFsKTtcbiAgICBjb25zdCBlID0gdHlwZVJlZmVyZW5jZUZyb20odHMsIGV4cGVjdGVkKTtcbiAgICByZXR1cm4gdGhpcy5hc3NlcnQoYS50b1N0cmluZygpID09PSBlLnRvU3RyaW5nKCksIHNjb3BlLCBgIChleHBlY3RlZD1cIiR7ZX1cIixhY3R1YWw9XCIke2F9XCIpYCk7XG4gIH1cblxuICBwdWJsaWMgYXNzZXJ0VHlwZXNBc3NpZ25hYmxlKHRzOiByZWZsZWN0LlR5cGVTeXN0ZW0sIGFjdHVhbDogVHlwZVNwZWNpZmllciwgZXhwZWN0ZWQ6IFR5cGVTcGVjaWZpZXIsIHNjb3BlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhID0gdHlwZVJlZmVyZW5jZUZyb20odHMsIGFjdHVhbCk7XG4gICAgY29uc3QgZSA9IHR5cGVSZWZlcmVuY2VGcm9tKHRzLCBleHBlY3RlZCk7XG4gICAgcmV0dXJuIHRoaXMuYXNzZXJ0KGEudG9TdHJpbmcoKSA9PT0gZS50b1N0cmluZygpIHx8IChhLmZxbiAmJiBlLmZxbiAmJiBhLnR5cGUhLmV4dGVuZHMoZS50eXBlISkpLCBzY29wZSwgYCAoXCIke2F9XCIgbm90IGFzc2lnbmFibGUgdG8gXCIke2V9XCIpYCk7XG4gIH1cblxuICBwdWJsaWMgYXNzZXJ0UGFyYW1ldGVyT3B0aW9uYWwoYWN0dWFsOiBib29sZWFuLCBleHBlY3RlZDogYm9vbGVhbiwgc2NvcGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmFzc2VydChhY3R1YWwgPT09IGV4cGVjdGVkLCBzY29wZSwgYCAoJHtzY29wZX0gc2hvdWxkIGJlICR7ZXhwZWN0ZWQgPyAnb3B0aW9uYWwnIDogJ21hbmRhdG9yeSd9KWApO1xuICB9XG5cbiAgcHVibGljIGFzc2VydFNpZ25hdHVyZShtZXRob2Q6IHJlZmxlY3QuQ2FsbGFibGUsIGV4cGVjdGF0aW9uczogTWV0aG9kU2lnbmF0dXJlRXhwZWN0YXRpb25zKSB7XG4gICAgY29uc3Qgc2NvcGUgPSBtZXRob2QucGFyZW50VHlwZS5mcW4gKyAnLicgKyBtZXRob2QubmFtZTtcbiAgICBpZiAoZXhwZWN0YXRpb25zLnJldHVybnMgJiYgcmVmbGVjdC5NZXRob2QuaXNNZXRob2QobWV0aG9kKSkge1xuICAgICAgdGhpcy5hc3NlcnRUeXBlc0VxdWFsKG1ldGhvZC5zeXN0ZW0sIG1ldGhvZC5yZXR1cm5zLnR5cGUsIGV4cGVjdGF0aW9ucy5yZXR1cm5zLCBzY29wZSk7XG4gICAgfVxuXG4gICAgaWYgKGV4cGVjdGF0aW9ucy5wYXJhbWV0ZXJzKSB7XG4gICAgICBjb25zdCBleHBlY3RlZENvdW50ID0gZXhwZWN0YXRpb25zLnBhcmFtZXRlcnMubGVuZ3RoO1xuICAgICAgY29uc3QgYWN0dWFsQ291bnQgPSBtZXRob2QucGFyYW1ldGVycy5sZW5ndGg7XG4gICAgICBpZiAodGhpcy5hc3NlcnRFcXVhbHMoYWN0dWFsQ291bnQsIGV4cGVjdGVkQ291bnQsIHNjb3BlKSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cGVjdGF0aW9ucy5wYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgY29uc3QgZXhwZWN0ID0gZXhwZWN0YXRpb25zLnBhcmFtZXRlcnNbaV07XG4gICAgICAgICAgY29uc3QgYWN0dWFsID0gbWV0aG9kLnBhcmFtZXRlcnNbaV07XG4gICAgICAgICAgY29uc3QgcHNjb3BlID0gc2NvcGUgKyBgLnBhcmFtc1ske2l9XWA7XG4gICAgICAgICAgaWYgKGV4cGVjdC5uYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBleHBlY3RlZE5hbWUgPSBleHBlY3QubmFtZTtcbiAgICAgICAgICAgIGNvbnN0IGFjdHVhbE5hbWUgPSBhY3R1YWwubmFtZTtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0RXF1YWxzKGFjdHVhbE5hbWUsIGV4cGVjdGVkTmFtZSwgcHNjb3BlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGV4cGVjdC50eXBlKSB7XG4gICAgICAgICAgICBpZiAoZXhwZWN0LnN1YnR5cGVBbGxvd2VkKSB7XG4gICAgICAgICAgICAgIHRoaXMuYXNzZXJ0VHlwZXNBc3NpZ25hYmxlKG1ldGhvZC5zeXN0ZW0sIGFjdHVhbC50eXBlLCBleHBlY3QudHlwZSwgcHNjb3BlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuYXNzZXJ0VHlwZXNFcXVhbChtZXRob2Quc3lzdGVtLCBhY3R1YWwudHlwZSwgZXhwZWN0LnR5cGUsIHBzY29wZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChleHBlY3Qub3B0aW9uYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnRQYXJhbWV0ZXJPcHRpb25hbChhY3R1YWwub3B0aW9uYWwsIGV4cGVjdC5vcHRpb25hbCwgcHNjb3BlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGVzIHdoZXRoZXIgdGhlIHJ1bGUgc2hvdWxkIGJlIGV2YWx1YXRlZCBiYXNlZCBvbiB0aGUgZmlsdGVycyBhcHBsaWVkLlxuICAgKi9cbiAgcHJpdmF0ZSBzaG91bGRFdmFsdWF0ZShjb2RlOiBzdHJpbmcsIHNjb3BlOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5pbmNsdWRlUnVsZXMgfHwgdGhpcy5vcHRpb25zLmluY2x1ZGVSdWxlcy5pc0VtcHR5KCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuaW5jbHVkZVJ1bGVzLm1hdGNoZXMoY29kZSwgc2NvcGUpKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmV4Y2x1ZGVSdWxlcz8ubWF0Y2hlcyhjb2RlLCBzY29wZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIFJ1bGUge1xuICBjb2RlOiBzdHJpbmcsXG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgd2FybmluZz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uY3JldGVSdWxlPFQ+IGV4dGVuZHMgUnVsZSB7XG4gIGV2YWwobGludGVyOiBFdmFsdWF0aW9uPFQ+KTogdm9pZDtcbn1cblxuLyoqXG4gKiBBIHR5cGUgY29uc3RyYWludFxuICpcbiAqIEJlIHN1cGVyIGZsZXhpYmxlIGFib3V0IGhvdyB0eXBlcyBjYW4gYmUgcmVwcmVzZW50ZWQuIFVsdGltYXRlbHksIHdlIHdpbGxcbiAqIGNvbXBhcmUgd2hhdCB5b3UgZ2l2ZSB0byBhIFR5cGVSZWZlcmVuY2UsIGJlY2F1c2UgdGhhdCdzIHdoYXQncyBpbiB0aGUgSlNJSVxuICogUmVmbGVjdCBtb2RlbC4gSG93ZXZlciwgaWYgeW91IGFscmVhZHkgaGF2ZSBhIHJlYWwgVHlwZSwgb3IganVzdCBhIHN0cmluZyB0b1xuICogYSB1c2VyLWRlZmluZWQgdHlwZSwgdGhhdCdzIGZpbmUgdG9vLiBXZSdsbCBEbyBUaGUgUmlnaHQgVGhpbmcuXG4gKi9cbmV4cG9ydCB0eXBlIFR5cGVTcGVjaWZpZXIgPSByZWZsZWN0LlR5cGVSZWZlcmVuY2UgfCByZWZsZWN0LlR5cGUgfCBzdHJpbmc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWV0aG9kU2lnbmF0dXJlUGFyYW1ldGVyRXhwZWN0YXRpb24ge1xuICBuYW1lPzogc3RyaW5nO1xuICB0eXBlPzogVHlwZVNwZWNpZmllcjtcbiAgc3VidHlwZUFsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKiBzaG91bGQgdGhpcyBwYXJhbSBiZSBvcHRpb25hbD8gKi9cbiAgb3B0aW9uYWw/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1ldGhvZFNpZ25hdHVyZUV4cGVjdGF0aW9ucyB7XG4gIHBhcmFtZXRlcnM/OiBNZXRob2RTaWduYXR1cmVQYXJhbWV0ZXJFeHBlY3RhdGlvbltdO1xuICByZXR1cm5zPzogVHlwZVNwZWNpZmllcjtcbn1cblxuZXhwb3J0IGVudW0gRGlhZ25vc3RpY0xldmVsIHtcbiAgU2tpcHBlZCxcbiAgU3VjY2VzcyxcbiAgV2FybmluZyxcbiAgRXJyb3IsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlhZ25vc3RpYyB7XG4gIGxldmVsOiBEaWFnbm9zdGljTGV2ZWw7XG4gIHJ1bGU6IFJ1bGU7XG4gIHNjb3BlOiBzdHJpbmc7XG4gIG1lc3NhZ2U6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgdHlwZSBzcGVjaWZpZXIgdG8gYSBUeXBlUmVmZXJlbmNlXG4gKi9cbmZ1bmN0aW9uIHR5cGVSZWZlcmVuY2VGcm9tKHRzOiByZWZsZWN0LlR5cGVTeXN0ZW0sIHg6IFR5cGVTcGVjaWZpZXIpOiByZWZsZWN0LlR5cGVSZWZlcmVuY2Uge1xuICBpZiAoaXNUeXBlUmVmZXJlbmNlKHgpKSB7IHJldHVybiB4OyB9XG5cbiAgaWYgKHR5cGVvZiB4ID09PSAnc3RyaW5nJykge1xuICAgIGlmICh4LmluZGV4T2YoJy4nKSA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBuZXcgcmVmbGVjdC5UeXBlUmVmZXJlbmNlKHRzLCB7IHByaW1pdGl2ZTogeCBhcyBQcmltaXRpdmVUeXBlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IHJlZmxlY3QuVHlwZVJlZmVyZW5jZSh0cywgeyBmcW46IHggfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyByZWZsZWN0LlR5cGVSZWZlcmVuY2UodHMsIHgpO1xufVxuXG5mdW5jdGlvbiBpc1R5cGVSZWZlcmVuY2UoeDogYW55KTogeCBpcyByZWZsZWN0LlR5cGVSZWZlcmVuY2Uge1xuICByZXR1cm4geCBpbnN0YW5jZW9mIHJlZmxlY3QuVHlwZVJlZmVyZW5jZTtcbn1cbiJdfQ==
|
package/lib/linter.ts
CHANGED
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
import * as util from 'util';
|
|
2
2
|
import { PrimitiveType } from '@jsii/spec';
|
|
3
3
|
import * as reflect from 'jsii-reflect';
|
|
4
|
+
import { RuleFilterSet } from './rule-specs';
|
|
4
5
|
|
|
5
6
|
export interface LinterOptions {
|
|
6
7
|
/**
|
|
7
8
|
* List of rules to include.
|
|
8
9
|
* @default all rules
|
|
9
10
|
*/
|
|
10
|
-
|
|
11
|
+
includeRules?: RuleFilterSet;
|
|
11
12
|
|
|
12
13
|
/**
|
|
13
14
|
* List of rules to exclude (takes precedence on "include")
|
|
14
15
|
* @default none
|
|
15
16
|
*/
|
|
16
|
-
|
|
17
|
+
excludeRules?: RuleFilterSet;
|
|
17
18
|
}
|
|
18
19
|
|
|
19
20
|
export abstract class LinterBase {
|
|
@@ -222,47 +223,20 @@ export class Evaluation<T> {
|
|
|
222
223
|
* Evaluates whether the rule should be evaluated based on the filters applied.
|
|
223
224
|
*/
|
|
224
225
|
private shouldEvaluate(code: string, scope: string) {
|
|
225
|
-
if (!this.options.
|
|
226
|
+
if (!this.options.includeRules || this.options.includeRules.isEmpty()) {
|
|
226
227
|
return true;
|
|
227
228
|
}
|
|
228
229
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
for (const exclude of this.options.exclude || []) {
|
|
233
|
-
// match exclude
|
|
234
|
-
if (matchRule(exclude)) {
|
|
235
|
-
return false;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
return true;
|
|
230
|
+
if (this.options.includeRules.matches(code, scope)) {
|
|
231
|
+
if (this.options.excludeRules?.matches(code, scope)) {
|
|
232
|
+
return false;
|
|
239
233
|
}
|
|
234
|
+
return true;
|
|
240
235
|
}
|
|
241
236
|
|
|
242
237
|
return false;
|
|
243
|
-
|
|
244
|
-
function matchRule(filter: string) {
|
|
245
|
-
if (filter.indexOf(':') === -1) {
|
|
246
|
-
filter += ':*'; // add "*" scope filter if there isn't one
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
// filter format is "code:scope" and both support "*" suffix to indicate startsWith
|
|
250
|
-
const [codeFilter, scopeFilter] = filter.split(':');
|
|
251
|
-
return matchPattern(code, codeFilter) && matchPattern(scope, scopeFilter);
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
function matchPattern(s: string, pattern: string) {
|
|
255
|
-
if (pattern.endsWith('*')) {
|
|
256
|
-
const prefix = pattern.slice(0, -1);
|
|
257
|
-
return s.startsWith(prefix);
|
|
258
|
-
} else {
|
|
259
|
-
return s === pattern;
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
238
|
}
|
|
263
|
-
|
|
264
239
|
}
|
|
265
|
-
|
|
266
240
|
export interface Rule {
|
|
267
241
|
code: string,
|
|
268
242
|
message: string;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Caches the list of rule filters that are specified in the include and exclude options in awslint.json.
|
|
3
|
+
*/
|
|
4
|
+
export declare class RuleFilterSet {
|
|
5
|
+
/**
|
|
6
|
+
* Rule filter format is code:scope e.g. 'docs-public-apis:aws-cdk-lib.TagType'.
|
|
7
|
+
* Wildcards can be used in the following ways:
|
|
8
|
+
*
|
|
9
|
+
* 1. Match any code e.g.: '*:aws-cdk-lib.TagType'
|
|
10
|
+
* 2. Match any scope e.g.: 'docs-public-apis:*'
|
|
11
|
+
* 3. Match any scope prefix e.g.: 'docs-public-apis:aws-cdk-lib.Tag*'
|
|
12
|
+
*/
|
|
13
|
+
private codesToScopes;
|
|
14
|
+
private codesToScopePrefixes;
|
|
15
|
+
private scopes;
|
|
16
|
+
private scopePrefixes;
|
|
17
|
+
private _isEmpty;
|
|
18
|
+
constructor(ruleFilterList: string[]);
|
|
19
|
+
matches(code: string, scope: string): boolean;
|
|
20
|
+
private containsPrefix;
|
|
21
|
+
isEmpty(): boolean;
|
|
22
|
+
private addToMap;
|
|
23
|
+
private hasWildcard;
|
|
24
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RuleFilterSet = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Caches the list of rule filters that are specified in the include and exclude options in awslint.json.
|
|
6
|
+
*/
|
|
7
|
+
class RuleFilterSet {
|
|
8
|
+
constructor(ruleFilterList) {
|
|
9
|
+
/**
|
|
10
|
+
* Rule filter format is code:scope e.g. 'docs-public-apis:aws-cdk-lib.TagType'.
|
|
11
|
+
* Wildcards can be used in the following ways:
|
|
12
|
+
*
|
|
13
|
+
* 1. Match any code e.g.: '*:aws-cdk-lib.TagType'
|
|
14
|
+
* 2. Match any scope e.g.: 'docs-public-apis:*'
|
|
15
|
+
* 3. Match any scope prefix e.g.: 'docs-public-apis:aws-cdk-lib.Tag*'
|
|
16
|
+
*/
|
|
17
|
+
this.codesToScopes = new Map(); // code -> list of scopes
|
|
18
|
+
this.codesToScopePrefixes = new Map(); // code -> list of scope prefixes (wildcards)
|
|
19
|
+
this.scopes = new Set(); // list of scopes with a wilcard code
|
|
20
|
+
this.scopePrefixes = new Set(); // list of scope prefixes with a wildcard code
|
|
21
|
+
this._isEmpty = false;
|
|
22
|
+
if (!ruleFilterList || ruleFilterList.length == 0) {
|
|
23
|
+
this._isEmpty = true;
|
|
24
|
+
}
|
|
25
|
+
for (var filter of ruleFilterList) {
|
|
26
|
+
if (filter.indexOf(':') === -1) {
|
|
27
|
+
filter += ':*'; // add "*" scope filter if there isn't one
|
|
28
|
+
}
|
|
29
|
+
const [code, scope] = filter.split(':');
|
|
30
|
+
if (this.hasWildcard(code)) {
|
|
31
|
+
if (code.length > 1) {
|
|
32
|
+
throw new Error(`Error parsing rule filter ${filter}: rule code can only be a single wildcard, or a complete string.`);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
if (this.hasWildcard(scope)) {
|
|
36
|
+
this.scopePrefixes.add(scope);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
this.scopes.add(scope);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
if (this.hasWildcard(scope)) {
|
|
45
|
+
this.addToMap(this.codesToScopePrefixes, code, scope);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
this.addToMap(this.codesToScopes, code, scope);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
matches(code, scope) {
|
|
54
|
+
// Check complete filter
|
|
55
|
+
const completeScopes = this.codesToScopes.get(code);
|
|
56
|
+
if (completeScopes && completeScopes.has(scope)) {
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
// Check if scope matches a prefix e.g. 'docs-public-apis:aws-cdk-lib.Tag*'
|
|
60
|
+
const scopePrefixesForCode = this.codesToScopePrefixes.get(code);
|
|
61
|
+
if (scopePrefixesForCode) {
|
|
62
|
+
if (this.containsPrefix(scopePrefixesForCode, scope)) {
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Check if scope has a wildcard code e.g. '*:aws-cdk-lib.TagType'
|
|
67
|
+
if (this.scopes.has(scope)) {
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
// Check if scope matches a prefix with a wildcard code e.g. '*:aws-cdk-lib.TagType*'
|
|
71
|
+
if (this.containsPrefix(this.scopePrefixes, scope)) {
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
containsPrefix(prefixes, value) {
|
|
77
|
+
for (const prefix of prefixes) {
|
|
78
|
+
const prefixStr = prefix.slice(0, -1); // Strip the asterisk
|
|
79
|
+
if (value.startsWith(prefixStr)) {
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
isEmpty() {
|
|
86
|
+
return this._isEmpty;
|
|
87
|
+
}
|
|
88
|
+
addToMap(map, code, scope) {
|
|
89
|
+
if (!map.has(code)) {
|
|
90
|
+
map.set(code, new Set());
|
|
91
|
+
}
|
|
92
|
+
map.get(code)?.add(scope);
|
|
93
|
+
}
|
|
94
|
+
hasWildcard(value) {
|
|
95
|
+
return value.indexOf('*') !== -1;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
exports.RuleFilterSet = RuleFilterSet;
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZS1zcGVjcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInJ1bGUtc3BlY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7O0dBRUc7QUFDSCxNQUFhLGFBQWE7SUFvQnhCLFlBQVksY0FBd0I7UUFuQnBDOzs7Ozs7O1dBT0c7UUFFSyxrQkFBYSxHQUFHLElBQUksR0FBRyxFQUF1QixDQUFDLENBQUMseUJBQXlCO1FBRXpFLHlCQUFvQixHQUFHLElBQUksR0FBRyxFQUF1QixDQUFDLENBQUMsNkNBQTZDO1FBRXBHLFdBQU0sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDLENBQUMscUNBQXFDO1FBRWpFLGtCQUFhLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQyxDQUFDLDhDQUE4QztRQUVqRixhQUFRLEdBQVksS0FBSyxDQUFDO1FBR2hDLElBQUksQ0FBQyxjQUFjLElBQUksY0FBYyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7WUFDakQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7U0FDdEI7UUFFRCxLQUFLLElBQUksTUFBTSxJQUFJLGNBQWMsRUFBRTtZQUNqQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7Z0JBQzlCLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQywwQ0FBMEM7YUFDM0Q7WUFFRCxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFeEMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUMxQixJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixNQUFNLGtFQUFrRSxDQUFDLENBQUM7aUJBQ3hIO3FCQUFNO29CQUNMLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRTt3QkFDM0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQy9CO3lCQUFNO3dCQUNMLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO3FCQUN4QjtpQkFDRjthQUNGO2lCQUFNO2dCQUNMLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDM0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO2lCQUN2RDtxQkFBTTtvQkFDTCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO2lCQUNoRDthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBRU0sT0FBTyxDQUFDLElBQVksRUFBRSxLQUFhO1FBQ3hDLHdCQUF3QjtRQUN4QixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwRCxJQUFJLGNBQWMsSUFBSSxjQUFjLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQy9DLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCwyRUFBMkU7UUFDM0UsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pFLElBQUksb0JBQW9CLEVBQUU7WUFDeEIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxFQUFFO2dCQUNwRCxPQUFPLElBQUksQ0FBQzthQUNiO1NBQ0Y7UUFFRCxrRUFBa0U7UUFDbEUsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUMxQixPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQscUZBQXFGO1FBQ3JGLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ2xELE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTyxjQUFjLENBQUMsUUFBcUIsRUFBRSxLQUFhO1FBQ3pELEtBQUssTUFBTSxNQUFNLElBQUksUUFBUSxFQUFFO1lBQzdCLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxxQkFBcUI7WUFDNUQsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFO2dCQUMvQixPQUFPLElBQUksQ0FBQzthQUNiO1NBQ0Y7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTSxPQUFPO1FBQ1osT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFTyxRQUFRLENBQUMsR0FBNkIsRUFBRSxJQUFZLEVBQUUsS0FBYTtRQUN6RSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNsQixHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLEdBQUcsRUFBVSxDQUFDLENBQUM7U0FDbEM7UUFFRCxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRU8sV0FBVyxDQUFDLEtBQWE7UUFDL0IsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ25DLENBQUM7Q0FDRjtBQTFHRCxzQ0EwR0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENhY2hlcyB0aGUgbGlzdCBvZiBydWxlIGZpbHRlcnMgdGhhdCBhcmUgc3BlY2lmaWVkIGluIHRoZSBpbmNsdWRlIGFuZCBleGNsdWRlIG9wdGlvbnMgaW4gYXdzbGludC5qc29uLlxuICovXG5leHBvcnQgY2xhc3MgUnVsZUZpbHRlclNldCB7XG4gIC8qKlxuICAgKiBSdWxlIGZpbHRlciBmb3JtYXQgaXMgY29kZTpzY29wZSBlLmcuICdkb2NzLXB1YmxpYy1hcGlzOmF3cy1jZGstbGliLlRhZ1R5cGUnLlxuICAgKiBXaWxkY2FyZHMgY2FuIGJlIHVzZWQgaW4gdGhlIGZvbGxvd2luZyB3YXlzOlxuICAgKlxuICAgKiAxLiBNYXRjaCBhbnkgY29kZSBlLmcuOiAnKjphd3MtY2RrLWxpYi5UYWdUeXBlJ1xuICAgKiAyLiBNYXRjaCBhbnkgc2NvcGUgZS5nLjogJ2RvY3MtcHVibGljLWFwaXM6KidcbiAgICogMy4gTWF0Y2ggYW55IHNjb3BlIHByZWZpeCBlLmcuOiAnZG9jcy1wdWJsaWMtYXBpczphd3MtY2RrLWxpYi5UYWcqJ1xuICAgKi9cblxuICBwcml2YXRlIGNvZGVzVG9TY29wZXMgPSBuZXcgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KCk7IC8vIGNvZGUgLT4gbGlzdCBvZiBzY29wZXNcblxuICBwcml2YXRlIGNvZGVzVG9TY29wZVByZWZpeGVzID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpOyAvLyBjb2RlIC0+IGxpc3Qgb2Ygc2NvcGUgcHJlZml4ZXMgKHdpbGRjYXJkcylcblxuICBwcml2YXRlIHNjb3BlcyA9IG5ldyBTZXQ8c3RyaW5nPigpOyAvLyBsaXN0IG9mIHNjb3BlcyB3aXRoIGEgd2lsY2FyZCBjb2RlXG5cbiAgcHJpdmF0ZSBzY29wZVByZWZpeGVzID0gbmV3IFNldDxzdHJpbmc+KCk7IC8vIGxpc3Qgb2Ygc2NvcGUgcHJlZml4ZXMgd2l0aCBhIHdpbGRjYXJkIGNvZGVcblxuICBwcml2YXRlIF9pc0VtcHR5OiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocnVsZUZpbHRlckxpc3Q6IHN0cmluZ1tdKSB7XG4gICAgaWYgKCFydWxlRmlsdGVyTGlzdCB8fCBydWxlRmlsdGVyTGlzdC5sZW5ndGggPT0gMCkge1xuICAgICAgdGhpcy5faXNFbXB0eSA9IHRydWU7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgZmlsdGVyIG9mIHJ1bGVGaWx0ZXJMaXN0KSB7XG4gICAgICBpZiAoZmlsdGVyLmluZGV4T2YoJzonKSA9PT0gLTEpIHtcbiAgICAgICAgZmlsdGVyICs9ICc6Kic7IC8vIGFkZCBcIipcIiBzY29wZSBmaWx0ZXIgaWYgdGhlcmUgaXNuJ3Qgb25lXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IFtjb2RlLCBzY29wZV0gPSBmaWx0ZXIuc3BsaXQoJzonKTtcblxuICAgICAgaWYgKHRoaXMuaGFzV2lsZGNhcmQoY29kZSkpIHtcbiAgICAgICAgaWYgKGNvZGUubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgcGFyc2luZyBydWxlIGZpbHRlciAke2ZpbHRlcn06IHJ1bGUgY29kZSBjYW4gb25seSBiZSBhIHNpbmdsZSB3aWxkY2FyZCwgb3IgYSBjb21wbGV0ZSBzdHJpbmcuYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzV2lsZGNhcmQoc2NvcGUpKSB7XG4gICAgICAgICAgICB0aGlzLnNjb3BlUHJlZml4ZXMuYWRkKHNjb3BlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zY29wZXMuYWRkKHNjb3BlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmhhc1dpbGRjYXJkKHNjb3BlKSkge1xuICAgICAgICAgIHRoaXMuYWRkVG9NYXAodGhpcy5jb2Rlc1RvU2NvcGVQcmVmaXhlcywgY29kZSwgc2NvcGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuYWRkVG9NYXAodGhpcy5jb2Rlc1RvU2NvcGVzLCBjb2RlLCBzY29wZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbWF0Y2hlcyhjb2RlOiBzdHJpbmcsIHNjb3BlOiBzdHJpbmcpIHtcbiAgICAvLyBDaGVjayBjb21wbGV0ZSBmaWx0ZXJcbiAgICBjb25zdCBjb21wbGV0ZVNjb3BlcyA9IHRoaXMuY29kZXNUb1Njb3Blcy5nZXQoY29kZSk7XG4gICAgaWYgKGNvbXBsZXRlU2NvcGVzICYmIGNvbXBsZXRlU2NvcGVzLmhhcyhzY29wZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHNjb3BlIG1hdGNoZXMgYSBwcmVmaXggZS5nLiAnZG9jcy1wdWJsaWMtYXBpczphd3MtY2RrLWxpYi5UYWcqJ1xuICAgIGNvbnN0IHNjb3BlUHJlZml4ZXNGb3JDb2RlID0gdGhpcy5jb2Rlc1RvU2NvcGVQcmVmaXhlcy5nZXQoY29kZSk7XG4gICAgaWYgKHNjb3BlUHJlZml4ZXNGb3JDb2RlKSB7XG4gICAgICBpZiAodGhpcy5jb250YWluc1ByZWZpeChzY29wZVByZWZpeGVzRm9yQ29kZSwgc2NvcGUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHNjb3BlIGhhcyBhIHdpbGRjYXJkIGNvZGUgZS5nLiAnKjphd3MtY2RrLWxpYi5UYWdUeXBlJ1xuICAgIGlmICh0aGlzLnNjb3Blcy5oYXMoc2NvcGUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBzY29wZSBtYXRjaGVzIGEgcHJlZml4IHdpdGggYSB3aWxkY2FyZCBjb2RlIGUuZy4gJyo6YXdzLWNkay1saWIuVGFnVHlwZSonXG4gICAgaWYgKHRoaXMuY29udGFpbnNQcmVmaXgodGhpcy5zY29wZVByZWZpeGVzLCBzY29wZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgY29udGFpbnNQcmVmaXgocHJlZml4ZXM6IFNldDxzdHJpbmc+LCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgZm9yIChjb25zdCBwcmVmaXggb2YgcHJlZml4ZXMpIHtcbiAgICAgIGNvbnN0IHByZWZpeFN0ciA9IHByZWZpeC5zbGljZSgwLCAtMSk7IC8vIFN0cmlwIHRoZSBhc3Rlcmlza1xuICAgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgocHJlZml4U3RyKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNFbXB0eTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkVG9NYXAobWFwOiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4sIGNvZGU6IHN0cmluZywgc2NvcGU6IHN0cmluZykge1xuICAgIGlmICghbWFwLmhhcyhjb2RlKSkge1xuICAgICAgbWFwLnNldChjb2RlLCBuZXcgU2V0PHN0cmluZz4oKSk7XG4gICAgfVxuXG4gICAgbWFwLmdldChjb2RlKT8uYWRkKHNjb3BlKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzV2lsZGNhcmQodmFsdWU6IHN0cmluZykge1xuICAgIHJldHVybiB2YWx1ZS5pbmRleE9mKCcqJykgIT09IC0xO1xuICB9XG59Il19
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Caches the list of rule filters that are specified in the include and exclude options in awslint.json.
|
|
3
|
+
*/
|
|
4
|
+
export class RuleFilterSet {
|
|
5
|
+
/**
|
|
6
|
+
* Rule filter format is code:scope e.g. 'docs-public-apis:aws-cdk-lib.TagType'.
|
|
7
|
+
* Wildcards can be used in the following ways:
|
|
8
|
+
*
|
|
9
|
+
* 1. Match any code e.g.: '*:aws-cdk-lib.TagType'
|
|
10
|
+
* 2. Match any scope e.g.: 'docs-public-apis:*'
|
|
11
|
+
* 3. Match any scope prefix e.g.: 'docs-public-apis:aws-cdk-lib.Tag*'
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
private codesToScopes = new Map<string, Set<string>>(); // code -> list of scopes
|
|
15
|
+
|
|
16
|
+
private codesToScopePrefixes = new Map<string, Set<string>>(); // code -> list of scope prefixes (wildcards)
|
|
17
|
+
|
|
18
|
+
private scopes = new Set<string>(); // list of scopes with a wilcard code
|
|
19
|
+
|
|
20
|
+
private scopePrefixes = new Set<string>(); // list of scope prefixes with a wildcard code
|
|
21
|
+
|
|
22
|
+
private _isEmpty: boolean = false;
|
|
23
|
+
|
|
24
|
+
constructor(ruleFilterList: string[]) {
|
|
25
|
+
if (!ruleFilterList || ruleFilterList.length == 0) {
|
|
26
|
+
this._isEmpty = true;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
for (var filter of ruleFilterList) {
|
|
30
|
+
if (filter.indexOf(':') === -1) {
|
|
31
|
+
filter += ':*'; // add "*" scope filter if there isn't one
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const [code, scope] = filter.split(':');
|
|
35
|
+
|
|
36
|
+
if (this.hasWildcard(code)) {
|
|
37
|
+
if (code.length > 1) {
|
|
38
|
+
throw new Error(`Error parsing rule filter ${filter}: rule code can only be a single wildcard, or a complete string.`);
|
|
39
|
+
} else {
|
|
40
|
+
if (this.hasWildcard(scope)) {
|
|
41
|
+
this.scopePrefixes.add(scope);
|
|
42
|
+
} else {
|
|
43
|
+
this.scopes.add(scope);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
} else {
|
|
47
|
+
if (this.hasWildcard(scope)) {
|
|
48
|
+
this.addToMap(this.codesToScopePrefixes, code, scope);
|
|
49
|
+
} else {
|
|
50
|
+
this.addToMap(this.codesToScopes, code, scope);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
public matches(code: string, scope: string) {
|
|
57
|
+
// Check complete filter
|
|
58
|
+
const completeScopes = this.codesToScopes.get(code);
|
|
59
|
+
if (completeScopes && completeScopes.has(scope)) {
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Check if scope matches a prefix e.g. 'docs-public-apis:aws-cdk-lib.Tag*'
|
|
64
|
+
const scopePrefixesForCode = this.codesToScopePrefixes.get(code);
|
|
65
|
+
if (scopePrefixesForCode) {
|
|
66
|
+
if (this.containsPrefix(scopePrefixesForCode, scope)) {
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Check if scope has a wildcard code e.g. '*:aws-cdk-lib.TagType'
|
|
72
|
+
if (this.scopes.has(scope)) {
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Check if scope matches a prefix with a wildcard code e.g. '*:aws-cdk-lib.TagType*'
|
|
77
|
+
if (this.containsPrefix(this.scopePrefixes, scope)) {
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
private containsPrefix(prefixes: Set<string>, value: string) {
|
|
85
|
+
for (const prefix of prefixes) {
|
|
86
|
+
const prefixStr = prefix.slice(0, -1); // Strip the asterisk
|
|
87
|
+
if (value.startsWith(prefixStr)) {
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
public isEmpty() {
|
|
96
|
+
return this._isEmpty;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
private addToMap(map: Map<string, Set<string>>, code: string, scope: string) {
|
|
100
|
+
if (!map.has(code)) {
|
|
101
|
+
map.set(code, new Set<string>());
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
map.get(code)?.add(scope);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
private hasWildcard(value: string) {
|
|
108
|
+
return value.indexOf('*') !== -1;
|
|
109
|
+
}
|
|
110
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "awslint",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.101.0-alpha.0",
|
|
4
4
|
"description": "Enforces the AWS Construct Library guidelines",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"build": "tsc -b && eslint . --ext=.ts && pkglint && chmod +x bin/awslint",
|
|
@@ -18,25 +18,25 @@
|
|
|
18
18
|
"awslint": "bin/awslint"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@jsii/spec": "1.
|
|
21
|
+
"@jsii/spec": "1.89.0",
|
|
22
22
|
"camelcase": "^6.3.0",
|
|
23
23
|
"chalk": "^4",
|
|
24
24
|
"fs-extra": "^9.1.0",
|
|
25
|
-
"jsii-reflect": "1.
|
|
25
|
+
"jsii-reflect": "1.89.0",
|
|
26
26
|
"yargs": "^16.2.0"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
29
|
"@types/fs-extra": "^9.0.13",
|
|
30
30
|
"@types/jest": "^29.5.5",
|
|
31
|
-
"@types/yargs": "^15.0.
|
|
32
|
-
"@aws-cdk/pkglint": "2.
|
|
31
|
+
"@types/yargs": "^15.0.16",
|
|
32
|
+
"@aws-cdk/pkglint": "2.101.0-alpha.0",
|
|
33
33
|
"typescript": "~5.1.6",
|
|
34
|
-
"@typescript-eslint/eslint-plugin": "^6.7.
|
|
35
|
-
"@typescript-eslint/parser": "^6.7.
|
|
34
|
+
"@typescript-eslint/eslint-plugin": "^6.7.3",
|
|
35
|
+
"@typescript-eslint/parser": "^6.7.3",
|
|
36
36
|
"eslint": "^7.32.0",
|
|
37
37
|
"eslint-import-resolver-node": "^0.3.9",
|
|
38
38
|
"eslint-import-resolver-typescript": "^2.7.1",
|
|
39
|
-
"@aws-cdk/eslint-plugin": "2.
|
|
39
|
+
"@aws-cdk/eslint-plugin": "2.101.0-alpha.0",
|
|
40
40
|
"eslint-plugin-import": "^2.28.1",
|
|
41
41
|
"eslint-plugin-jest": "^24.7.0",
|
|
42
42
|
"jest": "^29.7.0"
|