Skip to content

Commit

Permalink
Merge branch 'develop' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
mnaumanali94 authored May 3, 2024
2 parents 957d061 + b055d1d commit 67389b4
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 28 deletions.
6 changes: 2 additions & 4 deletions docs/reference/openapi-rules.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ It can be hard to pick a license, so if you don't have a lawyer around you can u

How useful this is in court is not entirely known, but having a license is better than not having a license.

**Recommended:** Yes
**Recommended:** No

**Good Example**

Expand All @@ -130,7 +130,7 @@ info:

Mentioning a license is only useful if people know what the license means, so add a link to the full text for those who need it.

**Recommended:** Yes
**Recommended:** No

**Good Example**

Expand Down Expand Up @@ -244,8 +244,6 @@ tags:
- name: "Badger"
```

**Recommended:** No

### operation-description

**Recommended:** Yes
Expand Down
34 changes: 21 additions & 13 deletions packages/functions/src/__tests__/xor.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,24 @@ describe('Core Functions / Xor', () => {
]);
});

it('given multiple properties that do not match, should return an error message', async () => {
expect(
await runXor(
{
version: '1.0.0',
title: 'Swagger Petstore',
termsOfService: 'http://swagger.io/terms/',
},
{ properties: ['yada-yada', 'whatever', 'foo'] },
),
).toEqual([
{
message: '"yada-yada", "whatever" and "foo" must not be both defined or both undefined',
path: [],
},
]);
});

it('given both properties, should return an error message', async () => {
expect(
await runXor(
Expand Down Expand Up @@ -99,22 +117,12 @@ describe('Core Functions / Xor', () => {
]),
],
],
[
{ properties: ['foo', 'bar', 'baz'] },
[
new RulesetValidationError(
'invalid-function-options',
'"xor" and its "properties" option support 2-item tuples, i.e. ["id", "name"]',
['rules', 'my-rule', 'then', 'functionOptions', 'properties'],
),
],
],
[
{ properties: ['foo', {}] },
[
new RulesetValidationError(
'invalid-function-options',
'"xor" and its "properties" option support 2-item tuples, i.e. ["id", "name"]',
'"xor" and its "properties" option require at least 2-item tuples, i.e. ["id", "name"]',
['rules', 'my-rule', 'then', 'functionOptions', 'properties'],
),
],
Expand All @@ -124,7 +132,7 @@ describe('Core Functions / Xor', () => {
[
new RulesetValidationError(
'invalid-function-options',
'"xor" and its "properties" option support 2-item tuples, i.e. ["id", "name"]',
'"xor" and its "properties" option require at least 2-item tuples, i.e. ["id", "name"]',
['rules', 'my-rule', 'then', 'functionOptions', 'properties'],
),
],
Expand All @@ -134,7 +142,7 @@ describe('Core Functions / Xor', () => {
[
new RulesetValidationError(
'invalid-function-options',
'"xor" and its "properties" option support 2-item tuples, i.e. ["id", "name"]',
'"xor" and its "properties" option require at least 2-item tuples, i.e. ["id", "name"]',
['rules', 'my-rule', 'then', 'functionOptions', 'properties'],
),
],
Expand Down
3 changes: 1 addition & 2 deletions packages/functions/src/optionSchemas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -207,8 +207,7 @@ export const optionSchemas: Record<string, CustomFunctionOptionsSchema> = {
type: 'string',
},
minItems: 2,
maxItems: 2,
errorMessage: `"xor" and its "properties" option support 2-item tuples, i.e. ["id", "name"]`,
errorMessage: `"xor" and its "properties" option require at least 2-item tuples, i.e. ["id", "name"]`,
description: 'The properties to check.',
},
},
Expand Down
16 changes: 10 additions & 6 deletions packages/functions/src/xor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,20 @@ export default createRulesetFunction<Record<string, unknown>, Options>(
options: optionSchemas.xor,
},
function xor(targetVal, { properties }) {
if (properties.length !== 2) return;

const results: IFunctionResult[] = [];

const intersection = Object.keys(targetVal).filter(value => -1 !== properties.indexOf(value));
const intersection = Object.keys(targetVal).filter(key => properties.includes(key));

if (intersection.length !== 1) {
const formattedProperties = properties.map(prop => printValue(prop));

const lastProperty = formattedProperties.pop();
let message = formattedProperties.join(', ') + (lastProperty != undefined ? ` and ${lastProperty}` : '');

message += ' must not be both defined or both undefined';

results.push({
message: `${printValue(properties[0])} and ${printValue(
properties[1],
)} must not be both defined or both undefined`,
message,
});
}

Expand Down
6 changes: 3 additions & 3 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -12448,16 +12448,16 @@ __metadata:
linkType: hard

"tar@npm:^6.0.2, tar@npm:^6.1.0, tar@npm:^6.1.11, tar@npm:^6.1.2":
version: 6.1.15
resolution: "tar@npm:6.1.15"
version: 6.2.1
resolution: "tar@npm:6.2.1"
dependencies:
chownr: ^2.0.0
fs-minipass: ^2.0.0
minipass: ^5.0.0
minizlib: ^2.1.1
mkdirp: ^1.0.3
yallist: ^4.0.0
checksum: f23832fceeba7578bf31907aac744ae21e74a66f4a17a9e94507acf460e48f6db598c7023882db33bab75b80e027c21f276d405e4a0322d58f51c7088d428268
checksum: f1322768c9741a25356c11373bce918483f40fa9a25c69c59410c8a1247632487edef5fe76c5f12ac51a6356d2f1829e96d2bc34098668a2fc34d76050ac2b6c
languageName: node
linkType: hard

Expand Down

0 comments on commit 67389b4

Please sign in to comment.