change-version.js 2.4 KB
Newer Older
C
codecalm 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
#!/usr/bin/env node

const fs = require('fs');
const path = require('path');
const sh = require('shelljs');

sh.config.fatal = true;

// Blame TC39... https://github.com/benjamingr/RegExp.escape/issues/37
function regExpQuote(string) {
	return string.replace(/[$()*+-.?[\\\]^{|}]/g, '\\$&')
}

function regExpQuoteReplacement(string) {
	return string.replace(/\$/g, '$$')
}

const DRY_RUN = false;

function walkAsync(directory, excludedDirectories, fileCallback, errback) {
	if (excludedDirectories.has(path.parse(directory).base)) {
		return
	}

	fs.readdir(directory, (err, names) => {
		if (err) {
			errback(err);
			return
		}

		names.forEach(name => {
			const filepath = path.join(directory, name);
			fs.lstat(filepath, (err, stats) => {
				if (err) {
					process.nextTick(errback, err);
					return
				}

				if (stats.isDirectory()) {
					process.nextTick(walkAsync, filepath, excludedDirectories, fileCallback, errback)
				} else if (stats.isFile()) {
					process.nextTick(fileCallback, filepath)
				}
			})
		})
	})
}

function replaceRecursively(directory, excludedDirectories, allowedExtensions, original, replacement) {
	original = new RegExp(regExpQuote(original), 'g');
	replacement = regExpQuoteReplacement(replacement);
	const updateFile = DRY_RUN ?
		filepath => {
			if (allowedExtensions.has(path.parse(filepath).ext)) {
				console.log(`FILE: ${filepath}`)
			} else {
				console.log(`EXCLUDED:${filepath}`)
			}
		} :
		filepath => {
			if (allowedExtensions.has(path.parse(filepath).ext)) {
				sh.sed('-i', original, replacement, filepath)
			}
		};

	walkAsync(directory, excludedDirectories, updateFile, err => {
		console.error('ERROR while traversing directory!:');
		console.error(err);
		process.exit(1)
	})
}

function main(args) {
	if (args.length !== 2) {
		console.error('USAGE: change-version old_version new_version');
		console.error('Got arguments:', args);
		process.exit(1);
	}

	const oldVersion = args[0];
	const newVersion = args[1];
	const EXCLUDED_DIRS = new Set([
		'.git',
		'_gh_pages',
		'node_modules',
		'vendor',
		'demo',
C
codecalm 已提交
88 89 90 91
		'dist',
		'pages/.jekyll-cache',
		'.cache',
		'.idea'
C
codecalm 已提交
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
	]);

	const INCLUDED_EXTENSIONS = new Set([
		// This extension whitelist is how we avoid modifying binary files
		'',
		'.css',
		'.html',
		'.js',
		'.json',
		'.md',
		'.scss',
		'.txt',
		'.yml'
	]);

	replaceRecursively('.', EXCLUDED_DIRS, INCLUDED_EXTENSIONS, oldVersion, newVersion)
}

main(process.argv.slice(2));