packages/awslint/lib/rules/module.ts (47 lines of code) (raw):
import * as reflect from 'jsii-reflect';
import { CfnResourceReflection } from './cfn-resource';
import { Linter } from '../linter';
interface ModuleLinterContext {
readonly assembly: reflect.Assembly;
readonly namespaces: Set<string>;
}
export const moduleLinter = new Linter<ModuleLinterContext>(assembly => {
const cfnResources = CfnResourceReflection.findAll(assembly);
if (cfnResources.length === 0) {
return undefined; // no resources
}
const namespaces = new Set<string>();
for (const cfnResource of cfnResources) {
namespaces.add(cfnResource.namespace);
}
return {
assembly,
namespaces,
};
});
moduleLinter.add( {
code: 'module-name',
message: 'module name must be @aws-cdk/aws-<namespace>',
eval: e => {
if (!e.ctx.namespaces) { return; }
if (!e.ctx.assembly) { return; }
const cdkNamespaces = Array
.from(e.ctx.namespaces)
.map(ns => `@aws-cdk/${overrideNamespace(ns.toLocaleLowerCase().replace('::', '-'))}`);
for (const cdkNamespace of cdkNamespaces) {
if (e.ctx.assembly.name === cdkNamespace) {
return;
}
}
e.assert(false, e.ctx.assembly.name, ` expected '${e.ctx.assembly.name}' to be ` +
(cdkNamespaces.length === 1
? `'${cdkNamespaces[0]}'`
: `one of: ${cdkNamespaces.join(', ')}`));
},
});
/**
* Overrides special-case namespaces like aws-serverless=>aws-sam
*/
function overrideNamespace(namespace: string) {
if (namespace === 'aws-serverless') {
return 'aws-sam';
}
return namespace;
}