lwc-linter
Version:
A comprehensive CLI tool for linting Lightning Web Components v8.0.0+ with modern LWC patterns, decorators, lifecycle hooks, and Salesforce platform integration
201 lines • 6.87 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.loadConfig = loadConfig;
exports.createDefaultConfig = createDefaultConfig;
const fs = __importStar(require("fs-extra"));
const path = __importStar(require("path"));
const DEFAULT_CONFIG = {
rules: {
// Code Quality Rules
'no-unused-vars': 'warn',
'no-console': 'warn',
'prefer-const': 'warn',
'no-var': 'error',
'camelcase-naming': 'warn',
'max-nesting-depth': 'warn',
'no-magic-numbers': 'info',
// Accessibility Rules
'aria-required': 'error',
'alt-text-required': 'error',
'color-contrast': 'warn',
'keyboard-navigation': 'warn',
'focus-management': 'warn',
'semantic-html': 'warn',
// Performance Rules
'dom-query-optimization': 'warn',
'reactive-property-usage': 'warn',
'large-dom-check': 'warn',
'bundle-size-check': 'info',
'async-operation-check': 'warn',
// Security Rules
'no-innerhtml': 'error',
'input-validation': 'warn',
'xss-prevention': 'error',
'no-eval': 'error',
'secure-communication': 'warn',
// ESLint Integration Rules
'eslint-integration': 'warn',
'prettier-formatting': 'warn',
'import-organization': 'info'
},
severity: 'info',
fix: false,
exclude: [
'node_modules/**',
'**/*.test.js',
'**/*.spec.js',
'**/test/**',
'**/__tests__/**',
'**/coverage/**'
],
include: [
'**/*.js',
'**/*.html',
'**/*.css'
],
accessibility: {
enabled: true,
level: 'AA'
},
performance: {
enabled: true,
maxBundleSize: 500000, // 500KB
maxDomNodes: 1000
},
security: {
enabled: true,
allowInnerHTML: false
},
eslintIntegration: {
enabled: true,
configPath: '.eslintrc.js',
ignorePatterns: ['node_modules/**', 'lib/**']
},
prettierIntegration: {
enabled: true,
configPath: '.prettierrc.js',
printWidth: 100,
tabWidth: 2,
useTabs: false
}
};
async function loadConfig(configPath) {
let config = { ...DEFAULT_CONFIG };
// Try to find config file
const configFiles = [
configPath,
'.lwclintrc.json',
'.lwclintrc.js',
'lwclint.config.js',
'package.json'
].filter(Boolean);
for (const file of configFiles) {
if (file && await fs.pathExists(file)) {
try {
let userConfig;
if (file.endsWith('.json') || file === 'package.json') {
const content = await fs.readFile(file, 'utf-8');
const parsed = JSON.parse(content);
userConfig = file === 'package.json' ? parsed.lwclint || {} : parsed;
}
else if (file.endsWith('.js')) {
// For .js config files, require them
const fullPath = path.resolve(file);
delete require.cache[fullPath];
const requiredModule = require(fullPath);
userConfig = typeof requiredModule === 'function' ? requiredModule() : requiredModule;
}
else {
continue;
}
// Merge configurations
config = mergeConfigs(config, userConfig);
break;
}
catch (error) {
console.warn(`Warning: Failed to load config from ${file}: ${error}`);
}
}
}
return config;
}
function mergeConfigs(base, override) {
return {
...base,
...override,
rules: {
...base.rules,
...(override.rules || {})
},
exclude: override.exclude || base.exclude,
include: override.include || base.include,
accessibility: {
enabled: base.accessibility.enabled,
level: base.accessibility.level,
...(override.accessibility || {})
},
performance: {
enabled: base.performance.enabled,
maxBundleSize: base.performance.maxBundleSize,
maxDomNodes: base.performance.maxDomNodes,
...(override.performance || {})
},
security: {
enabled: base.security.enabled,
allowInnerHTML: base.security.allowInnerHTML,
...(override.security || {})
},
eslintIntegration: {
enabled: base.eslintIntegration.enabled,
configPath: base.eslintIntegration.configPath,
ignorePatterns: base.eslintIntegration.ignorePatterns,
...(override.eslintIntegration || {})
},
prettierIntegration: {
enabled: base.prettierIntegration.enabled,
configPath: base.prettierIntegration.configPath,
printWidth: base.prettierIntegration.printWidth,
tabWidth: base.prettierIntegration.tabWidth,
useTabs: base.prettierIntegration.useTabs,
...(override.prettierIntegration || {})
}
};
}
function createDefaultConfig(outputPath = '.lwclintrc.json') {
const configContent = JSON.stringify(DEFAULT_CONFIG, null, 2);
return fs.writeFile(outputPath, configContent);
}
//# sourceMappingURL=config-loader.js.map