jquery-migrate
Version:
Migrate older jQuery code to jQuery 3.0+
131 lines (105 loc) • 3.33 kB
JavaScript
/**
* A build task that compiles jQuery Migrate JS modules into one bundle.
*/
import path from "node:path";
import { mkdir, readFile, writeFile } from "node:fs/promises";
import * as rollup from "rollup";
import { minify } from "./minify.js";
import { getTimestamp } from "./lib/getTimestamp.js";
import { compareSize } from "./compare_size.js";
import util from "node:util";
import { exec as nodeExec } from "node:child_process";
import { isCleanWorkingDir } from "./lib/isCleanWorkingDir.js";
const exec = util.promisify( nodeExec );
function read( filename ) {
return readFile( filename, "utf8" );
}
async function readJSON( filename ) {
return JSON.parse( await read( filename ) );
}
async function writeCompiled( { code, dir, filename, version } ) {
const compiledContents = code
// Embed Version
.replace( /@VERSION/g, version )
// Embed Date
// yyyy-mm-ddThh:mmZ
.replace( /@DATE/g, new Date().toISOString().replace( /:\d+\.\d+Z$/, "Z" ) );
await writeFile( path.join( dir, filename ), compiledContents );
console.log( `[${ getTimestamp() }] ${ filename } v${ version } created.` );
await minify( { dir, filename, version } );
}
export async function build( {
dir = "dist",
filename = "jquery-migrate.js",
watch = false,
version
} = {} ) {
const pkg = await readJSON( "package.json" );
// Add the short commit hash to the version string
// when the version is not for a release.
if ( !version ) {
const { stdout } = await exec( "git rev-parse --short HEAD" );
const isClean = await isCleanWorkingDir();
// "+SHA" is semantically correct
// Add ".dirty" as well if the working dir is not clean
version = `${ pkg.version }+${ stdout.trim() }${
isClean ? "" : ".dirty"
}`;
}
// Catch `// @CODE` and subsequent comment lines event if they don't start
// in the first column.
const wrapperSrc = await read( "src/wrapper.js" );
const wrapper = wrapperSrc.split(
/[\x20\t]*\/\/ @CODE\n(?:[\x20\t]*\/\/[^\n]+\n)*/
);
const inputRollupOptions = {};
const outputRollupOptions = {
// The ESM format is not actually used as we strip it during
// the build; it's just that it doesn't generate any extra
// wrappers so there's nothing for us to remove.
format: "esm",
intro: wrapper[ 0 ].replace( /\n*$/, "" ),
outro: wrapper[ 1 ].replace( /^\n*/, "" )
};
const src = "src/migrate.js";
inputRollupOptions.input = path.resolve( src );
await mkdir( dir, { recursive: true } );
if ( watch ) {
const watcher = rollup.watch( {
...inputRollupOptions,
output: [ outputRollupOptions ],
watch: {
include: "src/**",
skipWrite: true
}
} );
watcher.on( "event", async( event ) => {
switch ( event.code ) {
case "ERROR":
console.error( event.error );
break;
case "BUNDLE_END":
const {
output: [ { code } ]
} = await event.result.generate( outputRollupOptions );
await writeCompiled( {
code,
dir,
filename,
version
} );
break;
}
} );
return watcher;
} else {
const bundle = await rollup.rollup( inputRollupOptions );
const {
output: [ { code } ]
} = await bundle.generate( outputRollupOptions );
await writeCompiled( { code, dir, filename, version } );
return compareSize( {
files: [ "dist/jquery-migrate.min.js" ]
} );
}
}