Skip to content

Commit a5c6173

Browse files
pavelkornevPagoNxt-Trade
authored andcommitted
feat(core): support end-user extensions in the rule definitions (stoplightio#2345)
1 parent 36cf762 commit a5c6173

File tree

6 files changed

+54
-0
lines changed

6 files changed

+54
-0
lines changed

packages/core/src/ruleset/__tests__/ruleset.test.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,7 @@ describe('Ruleset', () => {
247247
description: null,
248248
documentationUrl: null,
249249
enabled: true,
250+
extensions: null,
250251
formats: null,
251252
given: ['$'],
252253
message: null,
@@ -322,6 +323,30 @@ describe('Ruleset', () => {
322323
`);
323324
});
324325

326+
it('should respect extensions', async () => {
327+
const ruleset = {
328+
rules: {
329+
'foo-rule': {
330+
given: '$',
331+
then: {
332+
function() {
333+
return;
334+
},
335+
},
336+
extensions: {
337+
foo: 'bar',
338+
},
339+
},
340+
},
341+
};
342+
343+
const rulesetInstance = new Ruleset(ruleset);
344+
345+
expect(rulesetInstance.rules['foo-rule'].extensions).toEqual({
346+
foo: 'bar',
347+
});
348+
});
349+
325350
it('should include parserOptions', async () => {
326351
const { parserOptions } = await loadRuleset(import('./__fixtures__/parser-options-ruleset'));
327352

@@ -581,6 +606,7 @@ describe('Ruleset', () => {
581606
description: null,
582607
documentationUrl: null,
583608
enabled: false,
609+
extensions: null,
584610
formats: null,
585611
given: ['$.info.contact'],
586612
message: 'Contact name must contain Stoplight',
@@ -600,6 +626,7 @@ describe('Ruleset', () => {
600626
description: null,
601627
documentationUrl: null,
602628
enabled: true,
629+
extensions: null,
603630
formats: null,
604631
given: ['$.info'],
605632
message: 'Description must contain Stoplight',
@@ -619,6 +646,7 @@ describe('Ruleset', () => {
619646
description: null,
620647
documentationUrl: null,
621648
enabled: true,
649+
extensions: null,
622650
formats: null,
623651
given: ['$.info'],
624652
message: 'Title must contain Stoplight',
@@ -1144,6 +1172,7 @@ describe('Ruleset', () => {
11441172
description: null,
11451173
documentationUrl: null,
11461174
enabled: true,
1175+
extensions: null,
11471176
formats: null,
11481177
given: ['#PathItem'],
11491178
message: null,
@@ -1163,6 +1192,7 @@ describe('Ruleset', () => {
11631192
description: null,
11641193
documentationUrl: null,
11651194
enabled: true,
1195+
extensions: null,
11661196
formats: null,
11671197
given: ['#Name', '#Description'],
11681198
message: null,
@@ -1182,6 +1212,7 @@ describe('Ruleset', () => {
11821212
description: null,
11831213
documentationUrl: null,
11841214
enabled: true,
1215+
extensions: null,
11851216
formats: null,
11861217
given: ['#Info.contact'],
11871218
message: null,
@@ -1606,6 +1637,7 @@ describe('Ruleset', () => {
16061637
description: null,
16071638
documentationUrl: null,
16081639
enabled: true,
1640+
extensions: null,
16091641
formats: null,
16101642
given: ['#Id'],
16111643
message: null,

packages/core/src/ruleset/meta/rule.schema.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@
7777
"enum": ["style", "validation"],
7878
"type": "string",
7979
"errorMessage": "allowed types are \"style\" and \"validation\""
80+
},
81+
"extensions": {
82+
"type": "object"
8083
}
8184
},
8285
"required": ["given", "then"],

packages/core/src/ruleset/rule.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ export interface IRule {
2424
documentationUrl: string | null;
2525
then: IRuleThen[];
2626
given: string[];
27+
extensions: Record<string, unknown> | null;
2728
}
2829

2930
type RuleJson = Omit<IRule, 'then'> & {
@@ -43,6 +44,7 @@ export class Rule implements IRule {
4344
#enabled: boolean;
4445
public recommended: boolean;
4546
public documentationUrl: string | null;
47+
public extensions: Record<string, unknown> | null;
4648
#then!: IRuleThen[];
4749
#given!: string[];
4850

@@ -61,6 +63,7 @@ export class Rule implements IRule {
6163
this.formats = 'formats' in definition ? new Formats(definition.formats) : null;
6264
this.then = definition.then;
6365
this.given = definition.given;
66+
this.extensions = definition.extensions ?? null;
6467
}
6568

6669
public overrides?: { rulesetSource: string; definition: Map<string, Map<string, DiagnosticSeverity | -1>> };
@@ -188,6 +191,7 @@ export class Rule implements IRule {
188191
})),
189192
given: Array.isArray(this.definition.given) ? this.definition.given : [this.definition.given],
190193
owner: this.owner.id,
194+
extensions: this.extensions,
191195
};
192196
}
193197
}

packages/core/src/ruleset/types.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ export type RuleDefinition = {
4242
resolved?: boolean;
4343

4444
then: IRuleThen | IRuleThen[];
45+
46+
// User extensions/metadata point
47+
extensions?: Record<string, unknown>;
4548
};
4649

4750
export interface IRuleThen {

packages/ruleset-bundler/src/loader/__tests__/browser.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ export default {
116116
description: null,
117117
documentationUrl: null,
118118
enabled: true,
119+
extensions: null,
119120
formats: null,
120121
given: ['$'],
121122
message: null,
@@ -134,6 +135,7 @@ export default {
134135
description: null,
135136
documentationUrl: null,
136137
enabled: true,
138+
extensions: null,
137139
formats: null,
138140
given: ['$'],
139141
message: null,
@@ -152,6 +154,7 @@ export default {
152154
description: null,
153155
documentationUrl: null,
154156
enabled: true,
157+
extensions: null,
155158
formats: null,
156159
given: ['$'],
157160
message: null,
@@ -189,6 +192,7 @@ export default {
189192
description: null,
190193
documentationUrl: null,
191194
enabled: true,
195+
extensions: null,
192196
formats: null,
193197
given: ['$'],
194198
message: null,
@@ -207,6 +211,7 @@ export default {
207211
description: null,
208212
documentationUrl: null,
209213
enabled: true,
214+
extensions: null,
210215
formats: null,
211216
given: ['$'],
212217
message: null,
@@ -225,6 +230,7 @@ export default {
225230
description: null,
226231
documentationUrl: null,
227232
enabled: true,
233+
extensions: null,
228234
formats: null,
229235
given: ['$'],
230236
message: null,

packages/ruleset-bundler/src/loader/__tests__/node.jest.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ export {default} from '/-/[email protected]/dist=es20
4848
description: null,
4949
documentationUrl: null,
5050
enabled: true,
51+
extensions: null,
5152
formats: null,
5253
given: ['$'],
5354
message: null,
@@ -66,6 +67,7 @@ export {default} from '/-/[email protected]/dist=es20
6667
description: null,
6768
documentationUrl: null,
6869
enabled: true,
70+
extensions: null,
6971
formats: null,
7072
given: ['$'],
7173
message: null,
@@ -84,6 +86,7 @@ export {default} from '/-/[email protected]/dist=es20
8486
description: null,
8587
documentationUrl: null,
8688
enabled: true,
89+
extensions: null,
8790
formats: null,
8891
given: ['$'],
8992
message: null,
@@ -121,6 +124,7 @@ export {default} from '/-/[email protected]/dist=es20
121124
description: null,
122125
documentationUrl: null,
123126
enabled: true,
127+
extensions: null,
124128
formats: null,
125129
given: ['$'],
126130
message: null,
@@ -139,6 +143,7 @@ export {default} from '/-/[email protected]/dist=es20
139143
description: null,
140144
documentationUrl: null,
141145
enabled: true,
146+
extensions: null,
142147
formats: null,
143148
given: ['$'],
144149
message: null,
@@ -157,6 +162,7 @@ export {default} from '/-/[email protected]/dist=es20
157162
description: null,
158163
documentationUrl: null,
159164
enabled: true,
165+
extensions: null,
160166
formats: null,
161167
given: ['$'],
162168
message: null,

0 commit comments

Comments
 (0)