From ebb495dc8e8728aa43cb4cc5d2190197dff1c98d Mon Sep 17 00:00:00 2001 From: Hans Larsen Date: Sun, 19 Mar 2017 12:19:12 -0700 Subject: [PATCH] fix(@ngtools/webpack): add parent nodes and keep program Technically that program should always be the valid one, and is needed in some cases (e.g. diagnostics). Adding parent nodes get rid of the getChildAt error that happens, because the prop.parent is not set. The issue happened because people are using "files": ["main.ts"] or something similar, and when we load another file than main we dont set the parent nodes. Fixes #5143 Fixes #4817 --- packages/@ngtools/webpack/src/loader.spec.ts | 21 ++++++++++++++++++++ packages/@ngtools/webpack/src/refactor.ts | 3 +-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/packages/@ngtools/webpack/src/loader.spec.ts b/packages/@ngtools/webpack/src/loader.spec.ts index ea356f5ae755..5514dd342f7f 100644 --- a/packages/@ngtools/webpack/src/loader.spec.ts +++ b/packages/@ngtools/webpack/src/loader.spec.ts @@ -34,6 +34,27 @@ describe('@ngtools/webpack', () => { expect(refactor2.sourceText).toMatch(/\(\{\s*otherValue2: 2\s*,\s*otherValue3: 3\s*}\)/); expect(refactor2.sourceText).toMatch(/\(\{\s*otherValue4: 4\s*}\)/); }); + + it('should work without a root name', () => { + const host = new WebpackCompilerHost({}, ''); + host.writeFile('/file.ts', ` + import './file2.ts'; + `, false); + host.writeFile('/file2.ts', ` + @SomeDecorator({ moduleId: 123 }) class CLS {} + @SomeDecorator({ moduleId: 123, otherValue1: 1 }) class CLS2 {} + @SomeDecorator({ otherValue2: 2, moduleId: 123, otherValue3: 3 }) class CLS3 {} + @SomeDecorator({ otherValue4: 4, moduleId: 123 }) class CLS4 {} + `, false); + + const program = ts.createProgram(['/file.ts'], {}, host); + const refactor = new TypeScriptFileRefactor('/file2.ts', host, program); + removeModuleIdOnlyForTesting(refactor); + expect(refactor.sourceText).toMatch(/\(\{\s+}\)/); + expect(refactor.sourceText).toMatch(/\(\{\s*otherValue1: 1\s*}\)/); + expect(refactor.sourceText).toMatch(/\(\{\s*otherValue2: 2\s*,\s*otherValue3: 3\s*}\)/); + expect(refactor.sourceText).toMatch(/\(\{\s*otherValue4: 4\s*}\)/); + }); }); }); }); diff --git a/packages/@ngtools/webpack/src/refactor.ts b/packages/@ngtools/webpack/src/refactor.ts index 7b11da71d3a1..25c85f946415 100644 --- a/packages/@ngtools/webpack/src/refactor.ts +++ b/packages/@ngtools/webpack/src/refactor.ts @@ -45,9 +45,8 @@ export class TypeScriptFileRefactor { this._sourceFile = _program.getSourceFile(fileName); } if (!this._sourceFile) { - this._program = null; this._sourceFile = ts.createSourceFile(fileName, _host.readFile(fileName), - ts.ScriptTarget.Latest); + ts.ScriptTarget.Latest, true); } this._sourceText = this._sourceFile.getFullText(this._sourceFile); this._sourceString = new MagicString(this._sourceText);