Skip to content

Commit

Permalink
fix(@ngtools/webpack): only load test helpers on tests
Browse files Browse the repository at this point in the history
Fix #16858
  • Loading branch information
filipesilva authored and mgechev committed Feb 7, 2020
1 parent 89b1fc0 commit f866eab
Show file tree
Hide file tree
Showing 14 changed files with 151 additions and 142 deletions.
130 changes: 0 additions & 130 deletions packages/ngtools/webpack/src/transformers/ast_helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,7 @@
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
import { virtualFs } from '@angular-devkit/core';
import { readFileSync, readdirSync } from 'fs';
import { dirname, join } from 'path';
import * as ts from 'typescript';
import { WebpackCompilerHost } from '../compiler_host';


// Find all nodes from the AST in the subtree of node of SyntaxKind kind.
Expand Down Expand Up @@ -45,129 +41,3 @@ export function getLastNode(sourceFile: ts.SourceFile): ts.Node | null {

return null;
}


// Test transform helpers.
const basePath = '/project/src/';
const fileName = basePath + 'test-file.ts';
const typeScriptLibFiles = loadTypeScriptLibFiles();
const tsLibFiles = loadTsLibFiles();

export function createTypescriptContext(
content: string,
additionalFiles?: Record<string, string>,
useLibs = false,
extraCompilerOptions: ts.CompilerOptions = {},
) {
// Set compiler options.
const compilerOptions: ts.CompilerOptions = {
noEmitOnError: useLibs,
allowJs: true,
newLine: ts.NewLineKind.LineFeed,
moduleResolution: ts.ModuleResolutionKind.NodeJs,
module: ts.ModuleKind.ESNext,
target: ts.ScriptTarget.ESNext,
skipLibCheck: true,
sourceMap: false,
importHelpers: true,
experimentalDecorators: true,
...extraCompilerOptions,
};

// Create compiler host.
const compilerHost = new WebpackCompilerHost(
compilerOptions,
basePath,
new virtualFs.SimpleMemoryHost(),
false,
);

// Add a dummy file to host content.
compilerHost.writeFile(fileName, content, false);

if (useLibs) {
// Write the default libs.
// These are needed for tests that use import(), because it relies on a Promise being there.
const compilerLibFolder = dirname(compilerHost.getDefaultLibFileName(compilerOptions));
for (const [k, v] of Object.entries(typeScriptLibFiles)) {
compilerHost.writeFile(join(compilerLibFolder, k), v, false);
}
}

if (compilerOptions.importHelpers) {
for (const [k, v] of Object.entries(tsLibFiles)) {
compilerHost.writeFile(k, v, false);
}
}

if (additionalFiles) {
for (const key in additionalFiles) {
compilerHost.writeFile(basePath + key, additionalFiles[key], false);
}
}

// Create the TypeScript program.
const program = ts.createProgram([fileName], compilerOptions, compilerHost);

return { compilerHost, program };
}

export function transformTypescript(
content: string | undefined,
transformers: ts.TransformerFactory<ts.SourceFile>[],
program?: ts.Program,
compilerHost?: WebpackCompilerHost,
): string | undefined {
// Use given context or create a new one.
if (content !== undefined) {
const typescriptContext = createTypescriptContext(content);
if (!program) {
program = typescriptContext.program;
}
if (!compilerHost) {
compilerHost = typescriptContext.compilerHost;
}
} else if (!program || !compilerHost) {
throw new Error('transformTypescript needs either `content` or a `program` and `compilerHost');
}

// Emit.
const { emitSkipped, diagnostics } = program.emit(
undefined, undefined, undefined, undefined, { before: transformers },
);

// Throw error with diagnostics if emit wasn't successfull.
if (emitSkipped) {
throw new Error(ts.formatDiagnostics(diagnostics, compilerHost));
}

// Return the transpiled js.
return compilerHost.readFile(fileName.replace(/\.tsx?$/, '.js'));
}

function loadTypeScriptLibFiles(): Record<string, string> {
const libFolderPath = dirname(require.resolve('typescript/lib/lib.d.ts'));
const libFolderFiles = readdirSync(libFolderPath);
const libFileNames = libFolderFiles.filter(f => f.startsWith('lib.') && f.endsWith('.d.ts'));

// Return a map of the lib names to their content.
const libs: Record<string, string> = {};
for (const f of libFileNames) {
libs[f] = readFileSync(join(libFolderPath, f), 'utf-8');
}

return libs;
}

function loadTsLibFiles(): Record<string, string> {
const libFolderPath = dirname(require.resolve('tslib/package.json'));
const libFolderFiles = readdirSync(libFolderPath);

// Return a map of the lib names to their content.
const libs: Record<string, string> = {};
for (const f of libFolderFiles) {
libs[join('node_modules/tslib', f)] = readFileSync(join(libFolderPath, f), 'utf-8');
}

return libs;
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
* found in the LICENSE file at https://angular.io/license
*/
import { tags } from '@angular-devkit/core'; // tslint:disable-line:no-implicit-dependencies
import { createTypescriptContext, transformTypescript } from './ast_helpers';
import { downlevelConstructorParameters } from './ctor-parameters';
import { createTypescriptContext, transformTypescript } from './spec_helpers';

function transform(input: string, additionalFiles?: Record<string, string>) {
const { program, compilerHost } = createTypescriptContext(input, additionalFiles);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,10 @@
// tslint:disable:no-big-function
import { tags } from '@angular-devkit/core'; // tslint:disable-line:no-implicit-dependencies
import * as ts from 'typescript';
import { createTypescriptContext, getLastNode, transformTypescript } from './ast_helpers';
import { getLastNode } from './ast_helpers';
import { RemoveNodeOperation } from './interfaces';
import { makeTransform } from './make_transform';
import { createTypescriptContext, transformTypescript } from './spec_helpers';

describe('@ngtools/webpack transformers', () => {
describe('elide_imports', () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
* found in the LICENSE file at https://angular.io/license
*/
import { tags } from '@angular-devkit/core'; // tslint:disable-line:no-implicit-dependencies
import { transformTypescript } from './ast_helpers';
import { exportLazyModuleMap } from './export_lazy_module_map';
import { transformTypescript } from './spec_helpers';

describe('@ngtools/webpack transformers', () => {
describe('export_lazy_module_map', () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
* found in the LICENSE file at https://angular.io/license
*/
import { tags } from '@angular-devkit/core'; // tslint:disable-line:no-implicit-dependencies
import { transformTypescript } from './ast_helpers';
import { exportNgFactory } from './export_ngfactory';
import { transformTypescript } from './spec_helpers';

describe('@ngtools/webpack transformers', () => {
describe('export_ngfactory', () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
* found in the LICENSE file at https://angular.io/license
*/
import { tags } from '@angular-devkit/core';
import { createTypescriptContext, transformTypescript } from './ast_helpers';
import { importFactory } from './import_factory';
import { createTypescriptContext, transformTypescript } from './spec_helpers';

describe('@ngtools/webpack transformers', () => {
describe('import_factory', () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@
* found in the LICENSE file at https://angular.io/license
*/
import { tags } from '@angular-devkit/core'; // tslint:disable-line:no-implicit-dependencies
import { createTypescriptContext, transformTypescript } from './ast_helpers';
import { exportLazyModuleMap } from './export_lazy_module_map';
import { exportNgFactory } from './export_ngfactory';
import { removeDecorators } from './remove_decorators';
import { replaceBootstrap } from './replace_bootstrap';
import { createTypescriptContext, transformTypescript } from './spec_helpers';


describe('@ngtools/webpack transformers', () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
* found in the LICENSE file at https://angular.io/license
*/
import { tags } from '@angular-devkit/core'; // tslint:disable-line:no-implicit-dependencies
import { transformTypescript } from './ast_helpers';
import { registerLocaleData } from './register_locale_data';
import { transformTypescript } from './spec_helpers';

describe('@ngtools/webpack transformers', () => {
describe('register_locale_data', () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
*/
import { tags } from '@angular-devkit/core'; // tslint:disable-line:no-implicit-dependencies
import * as ts from 'typescript';
import { createTypescriptContext, transformTypescript } from './ast_helpers';
import { removeIvyJitSupportCalls } from './remove-ivy-jit-support-calls';
import { createTypescriptContext, transformTypescript } from './spec_helpers';

function transform(
input: string,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
*/
// tslint:disable:no-big-function
import { tags } from '@angular-devkit/core'; // tslint:disable-line:no-implicit-dependencies
import { createTypescriptContext, transformTypescript } from './ast_helpers';
import { removeDecorators } from './remove_decorators';
import { createTypescriptContext, transformTypescript } from './spec_helpers';

describe('@ngtools/webpack transformers', () => {
describe('remove_decorators', () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
* found in the LICENSE file at https://angular.io/license
*/
import { tags } from '@angular-devkit/core'; // tslint:disable-line:no-implicit-dependencies
import { createTypescriptContext, transformTypescript } from './ast_helpers';
import { replaceBootstrap } from './replace_bootstrap';
import { createTypescriptContext, transformTypescript } from './spec_helpers';

describe('@ngtools/webpack transformers', () => {
describe('replace_bootstrap', () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
* found in the LICENSE file at https://angular.io/license
*/
import { tags } from '@angular-devkit/core'; // tslint:disable-line:no-implicit-dependencies
import { createTypescriptContext, transformTypescript } from './ast_helpers';
import { replaceResources } from './replace_resources';
import { createTypescriptContext, transformTypescript } from './spec_helpers';

function transform(
input: string,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
*/
// tslint:disable:no-big-function
import { tags } from '@angular-devkit/core'; // tslint:disable-line:no-implicit-dependencies
import { createTypescriptContext, transformTypescript } from './ast_helpers';
import { replaceServerBootstrap } from './replace_server_bootstrap';
import { createTypescriptContext, transformTypescript } from './spec_helpers';

describe('@ngtools/webpack transformers', () => {
describe('replace_server_bootstrap', () => {
Expand Down
Loading

0 comments on commit f866eab

Please sign in to comment.