UNPKG

@samiyev/guardian

Version:

Research-backed code quality guardian for AI-assisted development. Detects hardcodes, secrets, circular deps, framework leaks, entity exposure, and 9 architecture violations. Enforces Clean Architecture/DDD principles. Works with GitHub Copilot, Cursor, W

160 lines 5.47 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ValuePatternMatcher = void 0; const ast_node_types_1 = require("../../shared/constants/ast-node-types"); /** * Pattern matcher for detecting specific value types * * Provides pattern matching for emails, IPs, paths, dates, UUIDs, versions, and other common hardcoded values */ class ValuePatternMatcher { static EMAIL_PATTERN = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/; static IP_V4_PATTERN = /^(\d{1,3}\.){3}\d{1,3}$/; static IP_V6_PATTERN = /^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$|^::([0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}$/; static DATE_ISO_PATTERN = /^\d{4}-\d{2}-\d{2}$/; static URL_PATTERN = /^https?:\/\/|^mongodb:\/\/|^postgresql:\/\//; static UNIX_PATH_PATTERN = /^\/[a-zA-Z0-9/_-]+/; static WINDOWS_PATH_PATTERN = /^[a-zA-Z]:\\[a-zA-Z0-9\\/_-]+/; static API_KEY_PATTERN = /^(sk_|pk_|api_|key_)[a-zA-Z0-9_-]{20,}$/; static UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i; static SEMVER_PATTERN = /^\d+\.\d+\.\d+(-[\w.-]+)?(\+[\w.-]+)?$/; static HEX_COLOR_PATTERN = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/; static MAC_ADDRESS_PATTERN = /^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/; static BASE64_PATTERN = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/; static JWT_PATTERN = /^eyJ[A-Za-z0-9-_]+\.eyJ[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+$/; /** * Checks if value is an email address */ isEmail(value) { return ValuePatternMatcher.EMAIL_PATTERN.test(value); } /** * Checks if value is an IP address (v4 or v6) */ isIpAddress(value) { return (ValuePatternMatcher.IP_V4_PATTERN.test(value) || ValuePatternMatcher.IP_V6_PATTERN.test(value)); } /** * Checks if value is a date in ISO format */ isDate(value) { return ValuePatternMatcher.DATE_ISO_PATTERN.test(value); } /** * Checks if value is a URL */ isUrl(value) { return ValuePatternMatcher.URL_PATTERN.test(value); } /** * Checks if value is a file path (Unix or Windows) */ isFilePath(value) { return (ValuePatternMatcher.UNIX_PATH_PATTERN.test(value) || ValuePatternMatcher.WINDOWS_PATH_PATTERN.test(value)); } /** * Checks if value looks like an API key */ isApiKey(value) { return ValuePatternMatcher.API_KEY_PATTERN.test(value); } /** * Checks if value is a UUID */ isUuid(value) { return ValuePatternMatcher.UUID_PATTERN.test(value); } /** * Checks if value is a semantic version */ isSemver(value) { return ValuePatternMatcher.SEMVER_PATTERN.test(value); } /** * Checks if value is a hex color */ isHexColor(value) { return ValuePatternMatcher.HEX_COLOR_PATTERN.test(value); } /** * Checks if value is a MAC address */ isMacAddress(value) { return ValuePatternMatcher.MAC_ADDRESS_PATTERN.test(value); } /** * Checks if value is Base64 encoded (min length 20 to avoid false positives) */ isBase64(value) { return value.length >= 20 && ValuePatternMatcher.BASE64_PATTERN.test(value); } /** * Checks if value is a JWT token */ isJwt(value) { return ValuePatternMatcher.JWT_PATTERN.test(value); } /** * Detects the type of value */ detectType(value) { if (this.isEmail(value)) { return ast_node_types_1.VALUE_PATTERN_TYPES.EMAIL; } if (this.isJwt(value)) { return ast_node_types_1.VALUE_PATTERN_TYPES.API_KEY; } if (this.isApiKey(value)) { return ast_node_types_1.VALUE_PATTERN_TYPES.API_KEY; } if (this.isUrl(value)) { return ast_node_types_1.VALUE_PATTERN_TYPES.URL; } if (this.isIpAddress(value)) { return ast_node_types_1.VALUE_PATTERN_TYPES.IP_ADDRESS; } if (this.isFilePath(value)) { return ast_node_types_1.VALUE_PATTERN_TYPES.FILE_PATH; } if (this.isDate(value)) { return ast_node_types_1.VALUE_PATTERN_TYPES.DATE; } if (this.isUuid(value)) { return ast_node_types_1.VALUE_PATTERN_TYPES.UUID; } if (this.isSemver(value)) { return ast_node_types_1.VALUE_PATTERN_TYPES.VERSION; } if (this.isHexColor(value)) { return "color"; } if (this.isMacAddress(value)) { return ast_node_types_1.VALUE_PATTERN_TYPES.MAC_ADDRESS; } if (this.isBase64(value)) { return ast_node_types_1.VALUE_PATTERN_TYPES.BASE64; } return null; } /** * Checks if value should be detected as hardcoded */ shouldDetect(value) { return (this.isEmail(value) || this.isUrl(value) || this.isIpAddress(value) || this.isFilePath(value) || this.isDate(value) || this.isApiKey(value) || this.isUuid(value) || this.isSemver(value) || this.isHexColor(value) || this.isMacAddress(value) || this.isBase64(value) || this.isJwt(value)); } } exports.ValuePatternMatcher = ValuePatternMatcher; //# sourceMappingURL=ValuePatternMatcher.js.map