diff --git a/aio/package.json b/aio/package.json index ae9be2772d..55ac1fb2cd 100644 --- a/aio/package.json +++ b/aio/package.json @@ -43,7 +43,7 @@ "docs-watch": "node tools/transforms/authors-package/watchr.js", "docs-lint": "eslint --ignore-path=\"tools/transforms/.eslintignore\" tools/transforms", "docs-test": "node tools/transforms/test.js", - "tools-test": "./scripts/deploy-to-firebase.test.sh && yarn docs-test && yarn boilerplate:test && jasmine tools/ng-packages-installer.spec.js", + "tools-test": "./scripts/deploy-to-firebase.test.sh && yarn docs-test && yarn boilerplate:test && jasmine tools/ng-packages-installer/index.spec.js", "serve-and-sync": "concurrently --kill-others \"yarn docs-watch\" \"yarn start\"", "boilerplate:add": "node ./tools/examples/example-boilerplate add", "boilerplate:remove": "node ./tools/examples/example-boilerplate remove", diff --git a/aio/tools/ng-packages-installer/index.js b/aio/tools/ng-packages-installer/index.js index a520cb3843..786a804cc2 100644 --- a/aio/tools/ng-packages-installer/index.js +++ b/aio/tools/ng-packages-installer/index.js @@ -7,7 +7,6 @@ const shelljs = require('shelljs'); const yargs = require('yargs'); const PACKAGE_JSON = 'package.json'; -const LOCKFILE = 'yarn.lock'; const LOCAL_MARKER_PATH = 'node_modules/_local_.json'; const PACKAGE_JSON_REGEX = /^[^/]+\/package\.json$/; @@ -122,13 +121,14 @@ class NgPackagesInstaller { const sourcePackage = packages[key]; if (sourcePackage) { // point the core Angular packages at the distributable folder - mergedDependencies[key] = `file:${ANGULAR_DIST_PACKAGES}/${key.replace('@angular/', '')}`; + mergedDependencies[key] = `file:${sourcePackage.parentDir}/${key.replace('@angular/', '')}`; this._log(`Overriding dependency with local package: ${key}: ${mergedDependencies[key]}`); // grab peer dependencies - Object.keys(sourcePackage.peerDependencies || {}) + const sourcePackagePeerDeps = sourcePackage.config.peerDependencies || {}; + Object.keys(sourcePackagePeerDeps) // ignore peerDependencies which are already core Angular packages .filter(key => !packages[key]) - .forEach(key => peerDependencies[key] = sourcePackage.peerDependencies[key]); + .forEach(key => peerDependencies[key] = sourcePackagePeerDeps[key]); } }); return [mergedDependencies, peerDependencies]; @@ -140,20 +140,25 @@ class NgPackagesInstaller { */ _getDistPackages() { const packageConfigs = Object.create(null); - this._log(`Angular distributable directory: ${ANGULAR_DIST_PACKAGES}.`); - shelljs - .find(ANGULAR_DIST_PACKAGES) - .map(filePath => filePath.slice(ANGULAR_DIST_PACKAGES.length + 1)) - .filter(filePath => PACKAGE_JSON_REGEX.test(filePath)) - .forEach(packagePath => { - const packageName = `@angular/${packagePath.slice(0, -PACKAGE_JSON.length -1)}`; - if (this.ignorePackages.indexOf(packageName) === -1) { - const packageConfig = require(path.resolve(ANGULAR_DIST_PACKAGES, packagePath)); - packageConfigs[packageName] = packageConfig; - } else { - this._log('Ignoring package', packageName); - } - }); + + [ANGULAR_DIST_PACKAGES].forEach(distDir => { + this._log(`Angular distributable directory: ${distDir}.`); + shelljs + .find(distDir) + .map(filePath => filePath.slice(distDir.length + 1)) + .filter(filePath => PACKAGE_JSON_REGEX.test(filePath)) + .forEach(packagePath => { + const packageName = `@angular/${packagePath.slice(0, -PACKAGE_JSON.length -1)}`; + if (this.ignorePackages.indexOf(packageName) === -1) { + const packageConfig = require(path.resolve(distDir, packagePath)); + packageConfigs[packageName] = {parentDir: distDir, config: packageConfig}; + } else { + this._log('Ignoring package', packageName); + } + }); + + }); + this._log('Found the following Angular distributables:', Object.keys(packageConfigs).map(key => `\n - ${key}`)); return packageConfigs; } @@ -244,4 +249,4 @@ function main() { module.exports = NgPackagesInstaller; if (require.main === module) { main(); -} \ No newline at end of file +} diff --git a/aio/tools/ng-packages-installer/index.spec.js b/aio/tools/ng-packages-installer/index.spec.js index 48efc0b193..0cc46033c9 100644 --- a/aio/tools/ng-packages-installer/index.spec.js +++ b/aio/tools/ng-packages-installer/index.spec.js @@ -12,6 +12,7 @@ describe('NgPackagesInstaller', () => { const nodeModulesDir = path.resolve(absoluteRootDir, 'node_modules'); const packageJsonPath = path.resolve(absoluteRootDir, 'package.json'); const packagesDir = path.resolve(path.resolve(__dirname, '../../../dist/packages-dist')); + const toolsDir = path.resolve(path.resolve(__dirname, '../../../dist/tools/@angular')); let installer; beforeEach(() => { @@ -53,10 +54,10 @@ describe('NgPackagesInstaller', () => { // These are the packages that are "found" in the dist directory dummyNgPackages = { - '@angular/core': { peerDependencies: { rxjs: '5.0.1' } }, - '@angular/common': { peerDependencies: { '@angular/core': '4.4.1' } }, - '@angular/compiler': { }, - '@angular/compiler-cli': { peerDependencies: { typescript: '^2.4.2', '@angular/compiler': '4.3.2' } } + '@angular/core': { parentDir: packagesDir, config: { peerDependencies: { rxjs: '5.0.1' } } }, + '@angular/common': { parentDir: packagesDir, config: { peerDependencies: { '@angular/core': '4.4.1' } } }, + '@angular/compiler': { parentDir: packagesDir, config: { } }, + '@angular/compiler-cli': { parentDir: toolsDir, config: { peerDependencies: { typescript: '^2.4.2', '@angular/compiler': '4.3.2' } } } }; spyOn(installer, '_getDistPackages').and.returnValue(dummyNgPackages); @@ -82,7 +83,7 @@ describe('NgPackagesInstaller', () => { '@angular/common': `file:${packagesDir}/common` }, devDependencies: { - '@angular/compiler-cli': `file:${packagesDir}/compiler-cli`, + '@angular/compiler-cli': `file:${toolsDir}/compiler-cli`, rxjs: '5.0.1', typescript: '^2.4.2' }, @@ -154,22 +155,34 @@ describe('NgPackagesInstaller', () => { describe('_getDistPackages', () => { it('should include top level Angular packages', () => { const ngPackages = installer._getDistPackages(); + const expectedValue = jasmine.objectContaining({ + parentDir: jasmine.any(String), + config: jasmine.any(Object), + }); // For example... - expect(ngPackages['@angular/common']).toBeDefined(); - expect(ngPackages['@angular/core']).toBeDefined(); - expect(ngPackages['@angular/router']).toBeDefined(); - expect(ngPackages['@angular/upgrade']).toBeDefined(); + expect(ngPackages['@angular/common']).toEqual(expectedValue); + expect(ngPackages['@angular/core']).toEqual(expectedValue); + expect(ngPackages['@angular/router']).toEqual(expectedValue); + expect(ngPackages['@angular/upgrade']).toEqual(expectedValue); expect(ngPackages['@angular/upgrade/static']).not.toBeDefined(); + }); - it('should not include packages that have been ignored', () => { - installer = new NgPackagesInstaller(rootDir, { ignorePackages: ['@angular/router'] }); - const ngPackages = installer._getDistPackages(); + it('should store each package\'s parent directory', () => { + const ngPackages = installer._getDistPackages(); - expect(ngPackages['@angular/common']).toBeDefined(); - expect(ngPackages['@angular/router']).toBeUndefined(); - }); + // For example... + expect(ngPackages['@angular/core'].parentDir).toBe(packagesDir); + expect(ngPackages['@angular/router'].parentDir).toBeDefined(toolsDir); + }); + + it('should not include packages that have been ignored', () => { + installer = new NgPackagesInstaller(rootDir, { ignorePackages: ['@angular/router'] }); + const ngPackages = installer._getDistPackages(); + + expect(ngPackages['@angular/common']).toBeDefined(); + expect(ngPackages['@angular/router']).toBeUndefined(); }); }); diff --git a/scripts/ci/build.sh b/scripts/ci/build.sh index 81c6e9b25a..b7583dd767 100755 --- a/scripts/ci/build.sh +++ b/scripts/ci/build.sh @@ -41,12 +41,12 @@ if [[ ${CI_MODE:-} == "aio" ]]; then fi # Build the Angular packages then exit (no further build required) -if [[ ${CI_MODE:-} == "aio_e2e" ]]; then - travisFoldStart "build.aio_e2e" +if [[ ${CI_MODE:-} == "aio_e2e" || ${CI_MODE:-} == "aio_tools_test" ]]; then + travisFoldStart "build.$CI_MODE" ( ./build.sh ) - travisFoldEnd "build.aio_e2e" + travisFoldEnd "build.$CI_MODE" exit 0; fi