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 🧑🍳📖.