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 ;
}