diff --git a/lib/linter.js b/lib/linter.js index 1428db2..7ef22a2 100644 --- a/lib/linter.js +++ b/lib/linter.js @@ -25,7 +25,7 @@ const testRule = require('./test-rule'); * } } ResolvedRuleDefinition * * @typedef { import('./types.js').Report } Report - * @typedef { Report & { + * @typedef { Report & Pick & { * category: ReportingCategory | RuleErrorCategory * } } AnnotatedReport * @@ -111,6 +111,7 @@ Linter.prototype.applyRule = function applyRule(moddleRoot, ruleDefinition) { return reports.map(function(report) { return { ...report, + meta: rule.meta, category }; }); diff --git a/lib/types.d.ts b/lib/types.d.ts index 8bb86c3..d68396c 100644 --- a/lib/types.d.ts +++ b/lib/types.d.ts @@ -33,6 +33,11 @@ export type CheckDefinition = EnterFn | { }; export type RuleDefinition = { + meta?: { + documentation?: { + url?: string + } + }, check: CheckDefinition }; diff --git a/test/spec/linter-spec.mjs b/test/spec/linter-spec.mjs index e95ac7a..530e295 100644 --- a/test/spec/linter-spec.mjs +++ b/test/spec/linter-spec.mjs @@ -949,9 +949,64 @@ describe('linter', function() { it('caching behavior'); + + describe('reporting', function() { + + let moddleRoot; + + const linter = new Linter({ + resolver: fakeResolver() + }); + + const annotateRule = (rule, meta) => { + + return { + ...rule, + meta + }; + }; + + beforeEach(async function() { + const result = await readModdle(__dirname + '/diagram.bpmn'); + + moddleRoot = result.root; + }); + + + it('should attach rule to report', function() { + + // given + const meta = { foo: 'BAR' }; + + const rule = annotateRule( + createRule(fakeRule), + meta + ); + + // when + const results = linter.applyRule( + moddleRoot, + { + name: 'test-rule', + config: { }, + rule, + category: 'error' + } + ); + + const expectedResult = buildFakeResults('error', null, meta); + + // then + expect(results).to.eql(expectedResult); + }); + + }); + }); +// helpers ////////////// + function fakeResolver(cache = {}) { return { resolveRule(pkg, ruleName) { @@ -964,7 +1019,6 @@ function fakeResolver(cache = {}) { }; } - async function fakeAsyncRule() { function check(node, reporter) { @@ -995,7 +1049,7 @@ function fakeRule(config = {}) { } -function buildFakeResults(category, message) { +function buildFakeResults(category, message, meta) { const results = [ { id: 'sid-38422fae-e03e-43a3-bef4-bd33b32041b2', @@ -1010,12 +1064,12 @@ function buildFakeResults(category, message) { return results.map((result) => { return { ...result, - category + category, + meta }; }); } - function fakeEnterLeaveRule() { const seen = {}; @@ -1047,8 +1101,7 @@ function fakeEnterLeaveRule() { }; } - -function buildFakeEnterLeaveResults(category, message) { +function buildFakeEnterLeaveResults(category, message, meta) { const results = [ { id: 'sid-38422fae-e03e-43a3-bef4-bd33b32041b2', @@ -1063,7 +1116,8 @@ function buildFakeEnterLeaveResults(category, message) { return results.map((result) => { return { ...result, - category + category, + meta }; }); } \ No newline at end of file