mirror of
https://github.com/angular/angular-cli.git
synced 2025-05-17 11:03:53 +08:00
126 lines
3.6 KiB
JavaScript
126 lines
3.6 KiB
JavaScript
#!/usr/bin/env node
|
|
'use strict';
|
|
|
|
/* eslint-disable no-console */
|
|
const { packages } = require('../../lib/packages');
|
|
const { yellow } = require('chalk');
|
|
const fs = require('fs');
|
|
const http = require('http');
|
|
const path = require('path');
|
|
const semver = require('semver');
|
|
const spawn = require('child_process').spawn;
|
|
|
|
function _exec(options, cmd, args) {
|
|
let stdout = '';
|
|
let stderr = '';
|
|
const cwd = options.cwd || process.cwd();
|
|
|
|
args = args.filter(x => x !== undefined);
|
|
const spawnOptions = { cwd };
|
|
|
|
if (process.platform.startsWith('win')) {
|
|
args.unshift('/c', cmd);
|
|
cmd = 'cmd.exe';
|
|
spawnOptions['stdio'] = 'pipe';
|
|
}
|
|
|
|
const childProcess = spawn(cmd, args, spawnOptions);
|
|
childProcess.stdout.on('data', (data) => {
|
|
stdout += data.toString('utf-8');
|
|
data.toString('utf-8')
|
|
.split(/[\n\r]+/)
|
|
.filter(line => line !== '')
|
|
.forEach(line => console.log(' ' + line));
|
|
});
|
|
childProcess.stderr.on('data', (data) => {
|
|
stderr += data.toString('utf-8');
|
|
data.toString('utf-8')
|
|
.split(/[\n\r]+/)
|
|
.filter(line => line !== '')
|
|
.forEach(line => console.error(yellow(' ' + line)));
|
|
});
|
|
|
|
// Create the error here so the stack shows who called this function.
|
|
const err = new Error(`Running "${cmd} ${args.join(' ')}" returned error code `);
|
|
return new Promise((resolve, reject) => {
|
|
childProcess.on('exit', (error) => {
|
|
if (!error) {
|
|
resolve({ stdout, stderr });
|
|
} else {
|
|
err.message += `${error}...\n\nSTDOUT:\n${stdout}\n`;
|
|
reject(err);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
|
|
|
|
Promise.resolve()
|
|
.then(() => {
|
|
// Login into NPM.
|
|
const NpmToken = process.env['NPM_TOKEN'];
|
|
if (!NpmToken) {
|
|
throw new Error('Need an NPM_TOKEN to be able to log into NPM.');
|
|
}
|
|
|
|
fs.writeFileSync(path.join(process.env['HOME'], '.npmrc'),
|
|
`//registry.npmjs.org/:_authToken=${NpmToken}\n`);
|
|
})
|
|
// .then(() => runTool('publish', 'build'))
|
|
.then(() => Promise.all(Object.keys(packages).map(name => {
|
|
const pkg = packages[name];
|
|
const version = require(pkg.packageJson).version;
|
|
const cwd = pkg.dist;
|
|
|
|
return new Promise((resolve, reject) => {
|
|
const url = `http://registry.npmjs.org/${name.replace(/\//g, '%2F')}`;
|
|
const request = http.request(url, response => {
|
|
let data = '';
|
|
|
|
response.on('data', chunk => data += chunk);
|
|
response.on('end', () => {
|
|
const json = JSON.parse(data);
|
|
resolve(json);
|
|
});
|
|
response.on('error', err => reject(err));
|
|
});
|
|
|
|
request.end();
|
|
})
|
|
.then(json => {
|
|
// Verify that the package is newer that latest, minor or next, or skip. This promise
|
|
// will release with an array of dist-tags.
|
|
if (json['name'] !== name) {
|
|
return null;
|
|
}
|
|
const { latest, next } = json['dist-tags'];
|
|
const isNext = semver.eq(version, next);
|
|
const gtNext = semver.gt(version, next);
|
|
const isLatest = semver.eq(version, latest);
|
|
|
|
if (isNext || isLatest) {
|
|
return null;
|
|
} else if (gtNext) {
|
|
return 'next';
|
|
} else {
|
|
return 'latest';
|
|
}
|
|
})
|
|
.then(distTag => {
|
|
if (!distTag) {
|
|
return;
|
|
}
|
|
|
|
console.log(`Publishing ${name} @ ${version}...`);
|
|
return _exec({ cwd }, 'npm', ['publish', '--tag', distTag]);
|
|
});
|
|
})))
|
|
.then(() => {
|
|
fs.writeFileSync(path.join(process.env['HOME'], '.npmrc'), '');
|
|
}, err => {
|
|
fs.writeFileSync(path.join(process.env['HOME'], '.npmrc'), '');
|
|
console.error(err);
|
|
process.exit(1);
|
|
});
|