mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2025-08-15 01:03:03 +08:00
136 lines
3.1 KiB
JavaScript
136 lines
3.1 KiB
JavaScript
/**
|
|
* Deploy script adopted from https://github.com/sindresorhus/np
|
|
* MIT License (c) Sindre Sorhus (sindresorhus.com)
|
|
*/
|
|
const tc = require('turbocolor');
|
|
const execa = require('execa');
|
|
const Listr = require('listr');
|
|
const octokit = require('@octokit/rest')()
|
|
const common = require('./common');
|
|
const fs = require('fs-extra');
|
|
|
|
|
|
async function main() {
|
|
try {
|
|
if (!process.env.GH_TOKEN) {
|
|
throw new Error('env.GH_TOKEN is undefined');
|
|
}
|
|
|
|
const tasks = [];
|
|
const { version } = common.readPkg('core');
|
|
const changelog = findChangelog();
|
|
|
|
// repo must be clean
|
|
common.checkGit(tasks);
|
|
|
|
// publish each package in NPM
|
|
publishPackages(tasks, common.packages, version);
|
|
|
|
// push tag to git remote
|
|
publishGit(tasks, version, changelog);
|
|
|
|
const listr = new Listr(tasks);
|
|
await listr.run();
|
|
console.log(`\nionic ${version} published!! 🎉\n`);
|
|
|
|
} catch (err) {
|
|
console.log('\n', tc.red(err), '\n');
|
|
process.exit(1);
|
|
}
|
|
}
|
|
|
|
|
|
async function publishPackages(tasks, packages, version) {
|
|
// first verify version
|
|
packages.forEach(package => {
|
|
if (package === 'core') {
|
|
return;
|
|
}
|
|
|
|
const pkg = common.readPkg(package);
|
|
tasks.push({
|
|
title: `${pkg.name}: check version (must match: ${version})`,
|
|
task: () => {
|
|
if (version !== pkg.version) {
|
|
throw new Error(`${pkg.name} version ${pkg.version} must match ${version}`);
|
|
}
|
|
}
|
|
});
|
|
});
|
|
|
|
// next publish
|
|
packages.forEach(package => {
|
|
const pkg = common.readPkg(package);
|
|
const projectRoot = common.projectPath(package);
|
|
|
|
tasks.push({
|
|
title: `${pkg.name}: publish ${pkg.version}`,
|
|
task: () => execa('npm', ['publish', '--tag', 'latest'], { cwd: projectRoot })
|
|
});
|
|
});
|
|
}
|
|
|
|
function publishGit(tasks, version, changelog) {
|
|
const tag = `v${version}`;
|
|
|
|
tasks.push(
|
|
{
|
|
title: `Tag latest commit ${tc.dim(`(${tag})`)}`,
|
|
task: () => execa('git', ['tag', `${tag}`], { cwd: common.rootDir })
|
|
},
|
|
{
|
|
title: 'Push branches to remote',
|
|
task: () => execa('git', ['push'], { cwd: common.rootDir })
|
|
},
|
|
{
|
|
title: 'Push tags to remove',
|
|
task: () => execa('git', ['push', '--tags'], { cwd: common.rootDir })
|
|
},
|
|
{
|
|
title: 'Publish Github release',
|
|
task: () => publishGithub(version, tag, changelog)
|
|
}
|
|
);
|
|
}
|
|
|
|
function findChangelog() {
|
|
const lines = fs.readFileSync('CHANGELOG.md', 'utf-8').toString().split('\n');
|
|
let start = -1;
|
|
let end = -1;
|
|
|
|
for (let i = 0; i < lines.length; i++) {
|
|
const line = lines[i];
|
|
if (line.startsWith('# [')) {
|
|
if (start === -1) {
|
|
start = i + 1;
|
|
} else {
|
|
end = i - 1;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(start === -1 || end === -1) {
|
|
throw new Error('changelog diff was not found');
|
|
}
|
|
return lines.slice(start, end).join('\n').trim();
|
|
}
|
|
|
|
async function publishGithub(version, tag, changelog) {
|
|
octokit.authenticate({
|
|
type: 'oauth',
|
|
token: process.env.GH_TOKEN
|
|
});
|
|
|
|
await octokit.repos.createRelease({
|
|
owner: 'ionic-team',
|
|
repo: 'ionic',
|
|
target_commitish: 'master',
|
|
tag_name: tag,
|
|
name: version,
|
|
body: changelog,
|
|
});
|
|
}
|
|
|
|
main();
|