mirror of
https://github.com/google/blockly.git
synced 2025-12-16 14:20:10 +01:00
* refactor(build): Rename "package" gulp task (but not npm script) to "pack" This is to avoid an issue due to "package" being a reserved word in JavaScript, and therefore not a valid export identifier. * refactor(build): Convert gulpfile.js from CJS to ESM. * refactor(build): Convert scripts/gulpfiles/*.js from CJS to ESM * fix(build): Fix eslint warning for @license tag in gulpfile.mjs * chore(build): Remove unused imports * fix(build): Fix incorrect import of gulp-gzip * fix(build): Fix incorrect sourcemaps import reference
175 lines
5.7 KiB
JavaScript
175 lines
5.7 KiB
JavaScript
/**
|
|
* @license
|
|
* Copyright 2020 Google LLC
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
/**
|
|
* @fileoverview Gulp scripts for releasing Blockly.
|
|
*/
|
|
|
|
import {execSync} from 'child_process';
|
|
import * as fs from 'fs';
|
|
import * as gulp from 'gulp';
|
|
import * as readlineSync from 'readline-sync';
|
|
|
|
import * as gitTasks from './git_tasks.mjs';
|
|
import * as packageTasks from './package_tasks.mjs';
|
|
import {getPackageJson} from './helper_tasks.mjs';
|
|
import {RELEASE_DIR} from './config.mjs';
|
|
|
|
|
|
// Gets the current major version.
|
|
function getMajorVersion() {
|
|
const { version } = getPackageJson();
|
|
const re = new RegExp(/^(\d)./);
|
|
const match = re.exec(version);
|
|
if (!match[0]) {
|
|
return null;
|
|
}
|
|
console.log(match[0]);
|
|
return parseInt(match[0]);
|
|
}
|
|
|
|
// Updates the version depending on user input.
|
|
function updateVersion(done, updateType) {
|
|
const majorVersion = getMajorVersion();
|
|
if (!majorVersion) {
|
|
done(new Error('Something went wrong when getting the major version number.'));
|
|
} else if (!updateType) {
|
|
// User selected to cancel.
|
|
done(new Error('Cancelling process.'));
|
|
}
|
|
|
|
switch (updateType.toLowerCase()) {
|
|
case 'major':
|
|
majorVersion++;
|
|
execSync(`npm --no-git-tag-version version ${majorVersion}.$(date +'%Y%m%d').0`, {stdio: 'inherit'});
|
|
done();
|
|
break;
|
|
case 'minor':
|
|
execSync(`npm --no-git-tag-version version ${majorVersion}.$(date +'%Y%m%d').0`, {stdio: 'inherit'});
|
|
done();
|
|
break;
|
|
case 'patch':
|
|
execSync(`npm --no-git-tag-version version patch`, {stdio: 'inherit'});
|
|
done();
|
|
break;
|
|
default:
|
|
done(new Error('Unexpected update type was chosen.'))
|
|
}
|
|
}
|
|
|
|
// Prompt the user to figure out what kind of version update we should do.
|
|
function updateVersionPrompt(done) {
|
|
const releaseTypes = ['Major', 'Minor', 'Patch'];
|
|
const index = readlineSync.keyInSelect(releaseTypes, 'Which version type?');
|
|
updateVersion(done, releaseTypes[index]);
|
|
}
|
|
|
|
// Checks with the user that they are on the correct git branch.
|
|
function checkBranch(done) {
|
|
const gitBranchName = execSync('git rev-parse --abbrev-ref HEAD').toString();
|
|
if (readlineSync.keyInYN(`You are on '${gitBranchName.trim()}'. Is this the correct branch?`)) {
|
|
done();
|
|
} else {
|
|
done(new Error('Not on correct branch'));
|
|
}
|
|
}
|
|
|
|
|
|
// Sanity check that the RELASE_DIR directory exists, and that certain
|
|
// files are in it.
|
|
function checkReleaseDir(done) {
|
|
const sanityFiles = ['blockly_compressed.js', 'blocks_compressed.js'];
|
|
// Check that directory exists.
|
|
if (fs.existsSync(RELEASE_DIR)) {
|
|
// Sanity check that certain files exist in RELASE_DIR.
|
|
sanityFiles.forEach((fileName) => {
|
|
if (!fs.existsSync(`${RELEASE_DIR}/${fileName}`)) {
|
|
done(new Error(
|
|
`Your ${RELEASE_DIR} directory does not contain ${fileName}`));
|
|
return;
|
|
}
|
|
});
|
|
done();
|
|
} else {
|
|
done(new Error(`The ${RELEASE_DIR} directory does not exist. ` +
|
|
'Has packageTasks.package been run?'));
|
|
}
|
|
}
|
|
|
|
// Check with the user that the version number is correct, then login and publish to npm.
|
|
function loginAndPublish_(done, isBeta) {
|
|
const { version } = getPackageJson();
|
|
if (readlineSync.keyInYN(`You are about to publish blockly with the version number:${version}. Do you want to continue?`)) {
|
|
execSync(`npm login --registry https://wombat-dressing-room.appspot.com`, {stdio: 'inherit'});
|
|
execSync(`npm publish --registry https://wombat-dressing-room.appspot.com ${isBeta ? '--tag beta' : ''}`, {cwd: RELEASE_DIR, stdio: 'inherit'});
|
|
done();
|
|
} else {
|
|
done(new Error('User quit due to the version number not being correct.'));
|
|
}
|
|
}
|
|
|
|
// Login and publish.
|
|
function loginAndPublish(done) {
|
|
return loginAndPublish_(done, false);
|
|
}
|
|
|
|
// Login and publish the beta version.
|
|
function loginAndPublishBeta(done) {
|
|
return loginAndPublish_(done, true);
|
|
}
|
|
|
|
// Repeatedly prompts the user for a beta version number until a valid one is given.
|
|
// A valid version number must have '-beta.x' and can not have already been used to publish to npm.
|
|
function updateBetaVersion(done) {
|
|
let isValid = false;
|
|
let newVersion = null;
|
|
const blocklyVersions = JSON.parse(execSync('npm view blockly versions --json').toString());
|
|
const re = new RegExp(/-beta\.(\d)/);
|
|
const latestBetaVersion = execSync('npm show blockly version --tag beta').toString().trim();
|
|
while (!isValid) {
|
|
newVersion = readlineSync.question(`What is the new beta version? (latest beta version: ${latestBetaVersion})`);
|
|
const existsOnNpm = blocklyVersions.includes(newVersion);
|
|
const isFormatted = newVersion.search(re) > -1;
|
|
if (!existsOnNpm && isFormatted) {
|
|
isValid = true;
|
|
} else if (existsOnNpm) {
|
|
console.log("This version already exists. Please enter a new version.");
|
|
} else if (!isFormatted) {
|
|
console.log("To publish a beta version you must have -beta.x in the version.");
|
|
}
|
|
}
|
|
// Allow the same version here, since we already check the version does not exist on npm.
|
|
execSync(`npm --no-git-tag-version --allow-same-version version ${newVersion}`, {stdio: 'inherit'});
|
|
done();
|
|
}
|
|
|
|
// Rebuild, package and publish to npm.
|
|
export const publish = gulp.series(
|
|
packageTasks.pack, // Does clean + build.
|
|
checkBranch,
|
|
checkReleaseDir,
|
|
loginAndPublish
|
|
);
|
|
|
|
// Rebuild, package and publish a beta version of Blockly.
|
|
export const publishBeta = gulp.series(
|
|
updateBetaVersion,
|
|
packageTasks.pack, // Does clean + build.
|
|
checkBranch,
|
|
checkReleaseDir,
|
|
loginAndPublishBeta
|
|
);
|
|
|
|
// Switch to a new branch, update the version number, build Blockly
|
|
// and check in the resulting built files.
|
|
export const recompile = gulp.series(
|
|
gitTasks.syncDevelop(),
|
|
gitTasks.createRebuildBranch,
|
|
updateVersionPrompt,
|
|
packageTasks.pack, // Does clean + build.
|
|
gitTasks.pushRebuildBranch
|
|
);
|