structure-validation
Version:
A Node.js CLI tool for validating codebase folder and file structure using a clean declarative configuration. Part of the guardz ecosystem for comprehensive TypeScript development.
69 lines • 2.65 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ValidationRule = void 0;
/**
* ValidationRule entity representing a folder structure rule
*/
class ValidationRule {
constructor(folder, patterns) {
this.folder = folder;
this.patterns = patterns;
}
/**
* Check if a file belongs to this rule's folder
*/
isFileInFolder(fileFolder) {
if (this.folder === '**')
return true;
// Check if this is a variable placeholder rule (e.g., {a}, {b}, {folderName}, etc.)
if (this.folder.match(/^\{[^}]+\}$/))
return true;
if (this.folder === fileFolder)
return true;
// Handle glob patterns like **/components/**
if (this.folder.includes('**')) {
const folderPattern = this.globToRegex(this.folder);
return folderPattern.test(fileFolder);
}
// Check if the folder path ends with the rule folder name
// This handles nested folder structures like .../utils/
if (fileFolder.endsWith(`/${this.folder}`) || fileFolder.includes(`/${this.folder}/`)) {
return true;
}
return false;
}
/**
* Check if a file matches this rule's patterns
*/
isFileMatchingPatterns(filename, folderName) {
return this.patterns.some(pattern => this.matchesPattern(filename, pattern, folderName));
}
/**
* Check if a filename matches a specific pattern
*/
matchesPattern(filename, pattern, folderName) {
const regexPattern = this.globToRegex(pattern, folderName);
return regexPattern.test(filename);
}
/**
* Convert glob pattern to regex, supporting {variable} placeholder for folder name
*/
globToRegex(pattern, folderName) {
let processedPattern = pattern;
// Replace {variable} placeholder with folder name if provided
// This supports any variable name like {a}, {b}, {folderName}, etc.
if (folderName && pattern.includes('{')) {
processedPattern = pattern.replace(/\{[^}]+\}/g, folderName);
}
// Handle ** for folder paths (matches any number of directories)
processedPattern = processedPattern.replace(/\*\*/g, '.*');
// Escape special characters, but handle glob patterns first
const escaped = processedPattern
.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
.replace(/\\\*/g, '.*')
.replace(/\\\?/g, '.');
return new RegExp(`^${escaped}$`);
}
}
exports.ValidationRule = ValidationRule;
//# sourceMappingURL=ValidationRule.js.map