const fs = require('fs-extra'); 
 | 
const chalk = require('chalk'); 
 | 
const ignore = require('ignore'); 
 | 
const { execSync } = require('node:child_process'); 
 | 
  
 | 
console.log(); 
 | 
console.log(chalk.yellowBright(`⚠️ You should have run ${chalk.bold('`npm run release`')} before running this script!`)); 
 | 
console.log(); 
 | 
  
 | 
// check versions in key dist files 
 | 
  
 | 
console.log(chalk.yellow('🔎 Checking versions in dist files...')); 
 | 
  
 | 
const fileVersions = [ 
 | 
    'package.json', 
 | 
    'package-lock.json', 
 | 
    'dist/zrender.js', 
 | 
    'dist/zrender.min.js' 
 | 
].map(filePath => ({ 
 | 
    file: filePath, 
 | 
    version: require('../' + filePath).version 
 | 
})); 
 | 
  
 | 
['lib/zrender.js', 'src/zrender.ts'].forEach(filePath => { 
 | 
    const version = fs.readFileSync(filePath, 'utf-8').match(/export (?:var|const) version = '(\S+)'/)[1]; 
 | 
    fileVersions.push({ 
 | 
        file: filePath, 
 | 
        version: version 
 | 
    }); 
 | 
}); 
 | 
  
 | 
const versions = fileVersions.map(({ file, version }) => { 
 | 
    console.log(`  ∟ The version in [${chalk.blueBright(file)}] is ${chalk.cyanBright.bold(version)}`); 
 | 
    return version; 
 | 
}); 
 | 
  
 | 
if (new Set(versions).size !== 1) { 
 | 
    console.log(); 
 | 
    console.error(chalk.red('❌ Version does not match! Please check and rerun the release script via:')); 
 | 
    console.log(); 
 | 
    console.error(chalk.yellow('     npm run release')); 
 | 
    console.log(); 
 | 
    process.exit(-1); 
 | 
} 
 | 
  
 | 
console.log(); 
 | 
console.log(chalk.green('✔️ Versions are all the same.')); 
 | 
console.log(); 
 | 
  
 | 
console.log(chalk.yellow('🔎 Checking unexpected files that probably shouldn\'t be published...\n')); 
 | 
  
 | 
// check if there are unexpected files that not in .npmignore 
 | 
const npmignore = fs.readFileSync('.npmignore', 'utf-8'); 
 | 
const npmignorePatterns = npmignore 
 | 
    .split(/\r?\n/) 
 | 
    .filter(item => item && !item.startsWith('#')); 
 | 
  
 | 
const untrackedFiles = execSync('git ls-files --others --exclude-standard', { encoding: 'utf-8' }) 
 | 
    .trim() 
 | 
    .split('\n') 
 | 
    .map(escapeOctal); 
 | 
  
 | 
if (untrackedFiles.length) { 
 | 
    const maybeUnexpectedFiles = ignore().add(npmignorePatterns).filter(untrackedFiles); 
 | 
    if (maybeUnexpectedFiles.length) { 
 | 
        console.error(chalk.red(`❌ Found ${maybeUnexpectedFiles.length} file(s) that are neither tracked by git nor ignored by .npmignore! Please double-check before publishing them to npm.`)); 
 | 
        maybeUnexpectedFiles.forEach(filePath => { 
 | 
            console.log('  ∟ ' + filePath); 
 | 
        }); 
 | 
        console.log(); 
 | 
        process.exit(-1); 
 | 
    } 
 | 
} 
 | 
  
 | 
console.log(chalk.green('✔️ No unexpected files found.')); 
 | 
console.log(); 
 | 
  
 | 
console.log(chalk.yellow('🔎 Checking registry url of the packages in package-lock.json...\n')); 
 | 
  
 | 
const NPM_REGISTRY = 'https://registry.npmjs.org/'; 
 | 
const packageLock = require('../package-lock.json'); 
 | 
  
 | 
const unexpectedPkgsFromUnofficialRegistry = Object.entries(packageLock.dependencies) 
 | 
    .concat(Object.entries(packageLock.packages)) 
 | 
    .filter(([pkgName, pkgRegistry]) => pkgRegistry.resolved && !pkgRegistry.resolved.startsWith(NPM_REGISTRY)); 
 | 
if (unexpectedPkgsFromUnofficialRegistry.length) { 
 | 
    console.error(chalk.red('❌ Found packages that are not from npm registry in package-lock.json! Please double-check before publishing them to npm.')); 
 | 
    unexpectedPkgsFromUnofficialRegistry.forEach(([pkgName, pkgRegistry]) => { 
 | 
        console.log(`  ∟ ${pkgName} (${pkgRegistry.resolved})`); 
 | 
    }); 
 | 
    console.log(); 
 | 
    process.exit(-1); 
 | 
} 
 | 
  
 | 
console.log(chalk.green('✔️ No unexpected packages with unofficial registry url found.')); 
 | 
console.log(); 
 | 
  
 | 
function escapeOctal(str) { 
 | 
    const matches = str.match(/(\\\d{3}){3}/g); 
 | 
    if (matches) { 
 | 
        matches.forEach(match => { 
 | 
            let encoded = ''; 
 | 
            match.split('\\').forEach(code => !code || (encoded += '%' + parseInt(code, 8).toString(16))); 
 | 
            str = str.replace(match, decodeURI(encoded)); 
 | 
        }); 
 | 
    } 
 | 
    return str; 
 | 
} 
 |