From 1d3b7f63ac39167ce5054532888228ab8eb97b7a 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 | 4 ++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/packages/@ngtools/webpack/src/loader.spec.ts b/packages/@ngtools/webpack/src/loader.spec.ts index dbd7b731e2df..c9b5338d3348 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..2f5c02a2db63 100644 --- a/packages/@ngtools/webpack/src/refactor.ts +++ b/packages/@ngtools/webpack/src/refactor.ts @@ -45,9 +45,9 @@ export class TypeScriptFileRefactor { this._sourceFile = _program.getSourceFile(fileName); } if (!this._sourceFile) { - this._program = null; + // 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);