Redocly/redocly-cli

asyncapi lint support custom rules

marianobntz opened this issue · 8 comments

Currently the custom rules do not apply to asyncapi lint validation.

Any restriction (other than priorities) to add this feature?

Thanks

Import this and it should work:
import type { Async2Rule } from "@redocly/openapi-core/lib/visitors.d.js";

@marianobntz how exactly are you trying to apply the rules? Could you provide an example of what doesn't work for you?

I have this js file "custom_rules.js"

`const path = require('path');

function FileNameArtifactRule() {
return {
Info: {
enter(operation, ctx) {
const split = ctx.location.source.absoluteRef.split(path.sep);
const apiFile = split[split.length - 1];
const operationName = operation["x-name"];
const splitVersion = operation.version.split(".");
const operationVersion = ${splitVersion[0]}.${splitVersion[1]};
const expected = operationName + "-" + operationVersion + ".json"
if (apiFile !== expected) {
ctx.report({
message: El nombre del archivo "${apiFile}" debe coincidir con el info.x-name "${operationName}" y la info.versión "${operationVersion}"!,
location: ctx.location.child('x-name'),
suggest: [El archivo debería ser ${expected}]
})
}
}
}
}
}

function AddSourceLinkDecorator() {
return {
Root: {
leave(root) {
// console.log(operation);
console.log(root);
// console.log(ctx.type.properties.externalDocs);
root.externalDocs = {
url: "http://localhost:8080"
}
}
}
}
}

module.exports = {
id: 'custom-rules',
rules: {
oas3: {
'file-name-artifact': FileNameArtifactRule,
'add-source-link': AddSourceLinkDecorator,
},
async: {
'file-name-artifact': FileNameArtifactRule,
'add-source-link': AddSourceLinkDecorator,
}
}
};

`
and I use it like this:

`plugins:

  • 'plugins/custom-rules.js'

rules:
custom-rules/file-name-artifact: error
`

This works fine when I validate openapi json files, but when I do it with asyncapi files I get this warning:

.\configuration\oas\sys\api-utils\cache-messages-1.0.json: validated in 8ms

Woohoo! Your API description is valid. 🎉

[WARNING] Unused rules found in C:\Users\m_benitez\work\git\dd-apis\resources\redocly\asyncapi-development.yaml: custom-rules/file-name-artifact.
Check the spelling and verify the added plugin prefix.

Of course the validation does not run :-)

same thing happens when I add a custom decorator... the same warning

[WARNING] Unused rules found in C:\Users\m_benitez\work\farmacity\git\dd-apis\resources\redocly\asyncapi-development.yaml: custom-rules/file-name-artifact.
[WARNING] Unused decorators found in C:\Users\m_benitez\work\farmacity\git\dd-apis\resources\redocly\asyncapi-development.yaml: custom-rules/add-source-link.

Import this and it should work: import type { Async2Rule } from "@redocly/openapi-core/lib/visitors.d.js";

Where do I put this line? inside the custom js ? If I put it on top of the file it breaks compilation.

Thanks!!

There are some asyncapi rules in the lib @redocly/openapi-core/src/rules/async2. Look there and make yours :)

So the problem was that I was not exporting properly the rules in my js file...

The proper way to add asyncapi rules and decorators is using async2 as the key...

module.exports = { id: 'custom-rules', rules: { oas3: { 'file-name-artifact': FileNameArtifactRule, 'add-source-link': AddSourceLinkDecorator, }, async2: { 'file-name-artifact': FileNameArtifactRule, 'add-source-link': AddSourceLinkDecorator, } } };
I could not find that proper keyword anywhere in the documentation. I guess that is the root problem.

Best

@marianobntz sorry for the late response. Glad you found the root cause 🎉
I'd love to see your contribution to our Cookbook 🧑‍🍳📖.