Skip to content

Commit

Permalink
fix(@angular-devkit/build-angular): don't bundle linked modules when …
Browse files Browse the repository at this point in the history
…`bundleDependencies` in `none` in server builder

Fixes #13817
  • Loading branch information
Alan authored and hansl committed Mar 6, 2019
1 parent e664eb4 commit ebab2f0
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 22 deletions.
Expand Up @@ -9,30 +9,21 @@ import { Configuration } from 'webpack';
import { WebpackConfigOptions } from '../build-options';
import { getSourceMapDevTool } from './utils';


/**
* Returns a partial specific to creating a bundle for node
* @param wco Options which are include the build options and app config
*/
export function getServerConfig(wco: WebpackConfigOptions) {

const extraPlugins = [];
if (wco.buildOptions.sourceMap) {
const { scripts, styles, hidden } = wco.buildOptions.sourceMap;

extraPlugins.push(getSourceMapDevTool(
scripts,
styles,
hidden,
));
extraPlugins.push(getSourceMapDevTool(scripts || false, styles || false, hidden || false));
}

const config: Configuration = {
resolve: {
mainFields: [
...(wco.supportES2015 ? ['es2015'] : []),
'main', 'module',
],
mainFields: [...(wco.supportES2015 ? ['es2015'] : []), 'main', 'module'],
},
target: 'node',
output: {
Expand All @@ -45,23 +36,15 @@ export function getServerConfig(wco: WebpackConfigOptions) {
if (wco.buildOptions.bundleDependencies == 'none') {
config.externals = [
/^@angular/,
// tslint:disable-next-line:no-any
(_: any, request: any, callback: (error?: any, result?: any) => void) => {
(context: string, request: string, callback: (error?: null, result?: string) => void) => {
// Absolute & Relative paths are not externals
if (request.match(/^\.{0,2}\//)) {
return callback();
}

try {
// Attempt to resolve the module via Node
const e = require.resolve(request);
if (/node_modules/.test(e)) {
// It's a node_module
callback(null, request);
} else {
// It's a system thing (.ie util, fs...)
callback();
}
require.resolve(request);
callback(null, request);
} catch {
// Node couldn't find it, so it must be user-aliased
callback();
Expand Down
66 changes: 66 additions & 0 deletions tests/legacy-cli/e2e/tests/misc/universal-bundle-dependencies.ts
@@ -0,0 +1,66 @@
import * as path from 'path';
import {
createDir,
expectFileToMatch,
rimraf,
symlinkFile,
writeMultipleFiles,
} from '../../utils/fs';
import { ng } from '../../utils/process';
import { updateJsonFile } from '../../utils/project';

export default async function() {
await updateJsonFile('angular.json', workspaceJson => {
const appArchitect = workspaceJson.projects['test-project'].architect;
appArchitect['server'] = {
builder: '@angular-devkit/build-angular:server',
options: {
bundleDependencies: 'none',
outputPath: 'dist/test-project-server',
main: 'src/main.server.ts',
tsConfig: 'tsconfig.server.json',
},
};
});

await createDir('./dummy-lib');

await writeMultipleFiles({
'./tsconfig.server.json': `
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "../dist-server",
"baseUrl": "./",
"module": "commonjs",
"types": []
},
"include": [
"src/main.server.ts"
]
}
`,
'./src/main.server.ts': `
import { dummyVersion } from 'dummy-lib';
console.log(dummyVersion);
`,
// create a dummy library
'./dummy-lib/package.json': `{
"name": "dummy-lib",
"version": "0.0.0",
"typings": "./main.d.ts",
"main": "./main.js"
}`,
'./dummy-lib/main.js': 'export const dummyVersion = 1',
'./dummy-lib/main.d.ts': 'export declare const dummyVersion = 1',
});

await symlinkFile(path.resolve('./dummy-lib'), path.resolve('./node_modules/dummy-lib'), 'dir');

await ng('run', 'test-project:server');
// when preserve symlinks is true, it should not included node_modules in the bundle
await expectFileToMatch('dist/test-project-server/main.js', 'require("dummy-lib")');

// cleanup the package
await rimraf('node_modules/dummy-lib');
}

0 comments on commit ebab2f0

Please sign in to comment.