UNPKG

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
"use strict"; 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