Skip to content

Commit c01c6b5

Browse files
committed
feat(core): include error codes in RulesetValidationError
1 parent 1724aba commit c01c6b5

File tree

11 files changed

+377
-122
lines changed

11 files changed

+377
-122
lines changed

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

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,11 @@ describe('Ruleset', () => {
262262
describe('error handling', () => {
263263
it('given empty ruleset, should throw a user friendly error', () => {
264264
expect(() => new Ruleset({})).toThrowError(
265-
new RulesetValidationError('Ruleset must have rules or extends or overrides defined', []),
265+
new RulesetValidationError(
266+
'invalid-ruleset-definition',
267+
'Ruleset must have rules or extends or overrides defined',
268+
[],
269+
),
266270
);
267271
});
268272
});
@@ -1271,7 +1275,11 @@ describe('Ruleset', () => {
12711275
}),
12721276
).toThrowAggregateError(
12731277
new AggregateError([
1274-
new RulesetValidationError('Alias "PathItem-" does not exist', ['rules', 'valid-path', 'given']),
1278+
new RulesetValidationError('undefined-alias', 'Alias "PathItem-" does not exist', [
1279+
'rules',
1280+
'valid-path',
1281+
'given',
1282+
]),
12751283
]),
12761284
);
12771285
});
@@ -1298,6 +1306,7 @@ describe('Ruleset', () => {
12981306
).toThrowAggregateError(
12991307
new AggregateError([
13001308
new RulesetValidationError(
1309+
'generic-validation-error',
13011310
'Alias "Test" is circular. Resolution stack: Test -> Contact -> Info -> Root -> Info',
13021311
['rules', 'valid-path', 'given'],
13031312
),
@@ -1335,9 +1344,17 @@ describe('Ruleset', () => {
13351344
}),
13361345
).toThrowAggregateError(
13371346
new AggregateError([
1338-
new RulesetValidationError('Alias "PathItem" does not exist', ['rules', 'valid-path', 'given']),
1339-
new RulesetValidationError('Alias "Name" does not exist', ['rules', 'valid-name-and-description', 'given']),
1340-
new RulesetValidationError(`Alias "Description" does not exist`, [
1347+
new RulesetValidationError('undefined-alias', 'Alias "PathItem" does not exist', [
1348+
'rules',
1349+
'valid-path',
1350+
'given',
1351+
]),
1352+
new RulesetValidationError('undefined-alias', 'Alias "Name" does not exist', [
1353+
'rules',
1354+
'valid-name-and-description',
1355+
'given',
1356+
]),
1357+
new RulesetValidationError('undefined-alias', `Alias "Description" does not exist`, [
13411358
'rules',
13421359
'valid-name-and-description',
13431360
'given',

packages/core/src/ruleset/alias.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,12 @@ function _resolveAlias(
4444
const alias = ALIAS.exec(expression)?.[1];
4545

4646
if (alias === void 0 || alias === null) {
47-
throw new ReferenceError(`Alias must match /^#([A-Za-z0-9_-]+)/`);
47+
throw new TypeError(`Alias must match /^#([A-Za-z0-9_-]+)/`);
4848
}
4949

5050
if (stack.has(alias)) {
5151
const _stack = [...stack, alias];
52-
throw new ReferenceError(`Alias "${_stack[0]}" is circular. Resolution stack: ${_stack.join(' -> ')}`);
52+
throw new Error(`Alias "${_stack[0]}" is circular. Resolution stack: ${_stack.join(' -> ')}`);
5353
}
5454

5555
stack.add(alias);

packages/core/src/ruleset/function.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,11 @@ addFormats(ajv);
1919

2020
export class RulesetFunctionValidationError extends RulesetValidationError {
2121
constructor(fn: string, error: ErrorObject) {
22-
super(RulesetFunctionValidationError.printMessage(fn, error), error.instancePath.slice(1).split('/'));
22+
super(
23+
'invalid-function-options',
24+
RulesetFunctionValidationError.printMessage(fn, error),
25+
error.instancePath.slice(1).split('/'),
26+
);
2327
}
2428

2529
private static printMessage(fn: string, error: ErrorObject): string {
@@ -150,7 +154,11 @@ export function createRulesetFunction<I, O>(
150154
}
151155

152156
if (options === null) {
153-
throw new RulesetValidationError(`"${fn.name || '<unknown>'}" function does not accept any options`, []);
157+
throw new RulesetValidationError(
158+
'invalid-function-options',
159+
`"${fn.name || '<unknown>'}" function does not accept any options`,
160+
[],
161+
);
154162
} else if (
155163
'errors' in validateOptions &&
156164
Array.isArray(validateOptions.errors) &&
@@ -160,7 +168,11 @@ export function createRulesetFunction<I, O>(
160168
validateOptions.errors.map(error => new RulesetFunctionValidationError(fn.name || '<unknown>', error)),
161169
);
162170
} else {
163-
throw new RulesetValidationError(`"functionOptions" of "${fn.name || '<unknown>'}" function must be valid`, []);
171+
throw new RulesetValidationError(
172+
'invalid-function-options',
173+
`"functionOptions" of "${fn.name || '<unknown>'}" function must be valid`,
174+
[],
175+
);
164176
}
165177
};
166178

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@
101101
},
102102
"required": ["files"],
103103
"errorMessage": {
104-
"type": "must be a override, i.e. { \"files\": [\"v2/**/*.json\"], \"rules\": {} }"
104+
"type": "must be an override, i.e. { \"files\": [\"v2/**/*.json\"], \"rules\": {} }"
105105
}
106106
},
107107
{

0 commit comments

Comments
 (0)