mirror of
https://github.com/angular/angular-cli.git
synced 2025-05-17 02:54:21 +08:00
178 lines
5.3 KiB
JavaScript
Executable File
178 lines
5.3 KiB
JavaScript
Executable File
#!/usr/bin/env node
|
|
'use strict';
|
|
|
|
/* eslint-disable no-console */
|
|
const chalk = require('chalk');
|
|
const denodeify = require('denodeify');
|
|
const fs = require('fs');
|
|
const glob = denodeify(require('glob'));
|
|
const path = require('path');
|
|
const npmRun = require('npm-run');
|
|
const rimraf = denodeify(require('rimraf'));
|
|
|
|
|
|
const root = path.join(__dirname, '../..');
|
|
const dist = path.join(root, 'dist');
|
|
const packagesRoot = path.join(root, 'packages');
|
|
|
|
|
|
function copy(from, to) {
|
|
from = path.relative(process.cwd(), from);
|
|
to = path.relative(process.cwd(), to);
|
|
return new Promise((resolve, reject) => {
|
|
const rs = fs.createReadStream(from);
|
|
const ws = fs.createWriteStream(to);
|
|
|
|
rs.on('error', reject);
|
|
ws.on('error', reject);
|
|
ws.on('close', resolve);
|
|
|
|
rs.pipe(ws);
|
|
});
|
|
}
|
|
|
|
|
|
function rm(p) {
|
|
path.relative(process.cwd(), p);
|
|
return new Promise((resolve, reject) => {
|
|
fs.unlink(p, err => {
|
|
if (err) {
|
|
reject(err);
|
|
} else {
|
|
resolve();
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
|
|
function getDeps(pkg) {
|
|
const packageJson = require(pkg.packageJson);
|
|
return Object.assign({}, packageJson['dependencies'], packageJson['devDependencies']);
|
|
}
|
|
|
|
|
|
// First delete the dist folder.
|
|
Promise.resolve()
|
|
.then(() => console.log('Deleting dist folder...'))
|
|
.then(() => rimraf(dist))
|
|
.then(() => console.log('Compiling packages...'))
|
|
.then(() => {
|
|
const packages = require('../../lib/packages');
|
|
return Object.keys(packages)
|
|
// Order packages in order of dependency.
|
|
.sort((a, b) => {
|
|
const aDependsOnB = Object.keys(getDeps(packages[a])).indexOf(b) != -1;
|
|
const bDependsOnA = Object.keys(getDeps(packages[b])).indexOf(a) != -1;
|
|
|
|
if (!aDependsOnB && !bDependsOnA) {
|
|
return 0;
|
|
} else if (aDependsOnB) {
|
|
return 1;
|
|
} else {
|
|
return -1;
|
|
}
|
|
})
|
|
.reduce((promise, packageName) => {
|
|
const pkg = packages[packageName];
|
|
const name = path.relative(packagesRoot, pkg.root);
|
|
|
|
return promise.then(() => {
|
|
console.log(` ${name}`);
|
|
try {
|
|
return npmRun.execSync(`tsc -p ${path.relative(process.cwd(), pkg.root)}`);
|
|
} catch (err) {
|
|
throw new Error(`Compilation error.\n${err.stdout}`);
|
|
}
|
|
});
|
|
}, Promise.resolve());
|
|
})
|
|
.then(() => console.log('Copying uncompiled resources...'))
|
|
.then(() => glob(path.join(packagesRoot, '**/*'), { dot: true }))
|
|
.then(files => {
|
|
console.log(`Found ${files.length} files...`);
|
|
return files
|
|
.map((fileName) => path.relative(packagesRoot, fileName))
|
|
.filter((fileName) => {
|
|
if (/^angular-cli[\\\/]blueprints/.test(fileName)) {
|
|
return true;
|
|
}
|
|
if (/\.d\.ts$/.test(fileName)) {
|
|
// The last thing we want is d.ts files...
|
|
return false;
|
|
}
|
|
if (/\.spec\.ts$/.test(fileName)) {
|
|
// Also spec.ts files...
|
|
return false;
|
|
}
|
|
if (/spec-utils.ts/.test(fileName)) {
|
|
// TODO: get rid of this by splitting spec utils in its own package.
|
|
return false;
|
|
}
|
|
if (/\.ts$/.test(fileName)) {
|
|
// Verify that it was actually built.
|
|
if (!fs.existsSync(path.join(dist, fileName).replace(/ts$/, 'js'))) {
|
|
throw new Error(`Source found but compiled file not found: "${fileName}".`);
|
|
}
|
|
|
|
// Skip all source files, since we have their JS files now.
|
|
return false;
|
|
}
|
|
|
|
// The only remaining file we want to ignore is tsconfig and spec files.
|
|
return !(/tsconfig\.json$/.test(fileName))
|
|
&& !(/\.spec\./.test(fileName))
|
|
&& !(/[\/\\]tests[\/\\]/.test(fileName));
|
|
})
|
|
.map((fileName) => {
|
|
const source = path.join(packagesRoot, fileName);
|
|
const dest = path.join(dist, fileName);
|
|
|
|
if (fs.statSync(source).isDirectory()) {
|
|
try {
|
|
fs.mkdirSync(dest);
|
|
} catch (err) {
|
|
if (err.code != 'EEXIST') {
|
|
throw err;
|
|
}
|
|
}
|
|
} else {
|
|
return copy(source, dest);
|
|
}
|
|
})
|
|
.reduce((promise, current) => {
|
|
return promise.then(() => current);
|
|
}, Promise.resolve());
|
|
})
|
|
.then(() => glob(path.join(dist, '**/*.spec.*')))
|
|
.then(specFiles => specFiles.filter(fileName => {
|
|
return !/[\\\/]angular-cli[\\\/]blueprints/.test(fileName);
|
|
}))
|
|
.then(specFiles => {
|
|
console.log(`Found ${specFiles.length} spec files...`);
|
|
return Promise.all(specFiles.map(rm));
|
|
})
|
|
.then(() => {
|
|
// Copy all resources that might have been missed.
|
|
const extraFiles = ['CHANGELOG.md', 'CONTRIBUTING.md', 'README.md'];
|
|
return Promise.all(extraFiles.map(fileName => {
|
|
console.log(`Copying ${fileName}...`);
|
|
return copy(fileName, path.join('dist/angular-cli', fileName));
|
|
}));
|
|
})
|
|
.then(() => {
|
|
// Copy LICENSE into all the packages
|
|
console.log('Copying LICENSE...');
|
|
|
|
const packages = require('../../lib/packages');
|
|
return Promise.all(Object.keys(packages).map(pkgName => {
|
|
const pkg = packages[pkgName];
|
|
console.log(` ${pkgName}`);
|
|
return copy('LICENSE', path.join(pkg.dist, 'LICENSE'));
|
|
}));
|
|
})
|
|
.then(() => process.exit(0), (err) => {
|
|
console.error(chalk.red(err.message));
|
|
process.exit(1);
|
|
});
|