#!/usr/bin/env node
const fs = require('fs');
const path = require('path');
const ROOT_DIR = path.resolve(__dirname, '..');
const DEFAULT_DIST_DIR = path.join(ROOT_DIR, 'dist');
const FORBIDDEN_PATTERNS = [
{
label: 'remark-gfm variable-length email lookbehind',
source: '(?<=^|\\s|\\p{P}|\\p{S})',
},
];
function collectJavaScriptFiles(directory) {
if (!fs.existsSync(directory)) {
return [];
}
const files = [];
const entries = fs.readdirSync(directory, { withFileTypes: true });
for (const entry of entries) {
const entryPath = path.join(directory, entry.name);
if (entry.isDirectory()) {
files.push(...collectJavaScriptFiles(entryPath));
} else if (entry.isFile() && entry.name.endsWith('.js')) {
files.push(entryPath);
}
}
return files;
}
function findWebKitCompatibilityViolations(directory = DEFAULT_DIST_DIR) {
const violations = [];
for (const filePath of collectJavaScriptFiles(directory)) {
const content = fs.readFileSync(filePath, 'utf8');
for (const pattern of FORBIDDEN_PATTERNS) {
if (content.includes(pattern.source)) {
violations.push({ filePath, label: pattern.label });
}
}
}
return violations;
}
function main() {
if (!fs.existsSync(DEFAULT_DIST_DIR)) {
console.error('[verify-webkit-compatibility] Production output directory is missing.');
process.exitCode = 1;
return;
}
const violations = findWebKitCompatibilityViolations();
if (violations.length === 0) {
console.log(
'[verify-webkit-compatibility] Known Markdown WebKit incompatibilities were not found.'
);
return;
}
console.error('[verify-webkit-compatibility] Unsupported JavaScript found:');
for (const violation of violations) {
console.error(
` - ${path.relative(ROOT_DIR, violation.filePath)}: ${violation.label}`
);
}
process.exitCode = 1;
}
if (require.main === module) {
main();
}
module.exports = { findWebKitCompatibilityViolations };