From a30525b68bc54a75fc0b0cc432b739c1db5da7a1 Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Wed, 9 Jun 2021 09:01:45 +0200 Subject: [PATCH] fix(@angular-devkit/schematics): handle updating renamed files With this change we fix an issue which caused a file not found error when trying to modify the file after it was renamed. Closes #14255 and closes #21083 --- .../schematics/src/sink/host.ts | 23 +++++++++++++------ .../schematics/src/sink/host_spec.ts | 17 ++++++++++++++ 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/packages/angular_devkit/schematics/src/sink/host.ts b/packages/angular_devkit/schematics/src/sink/host.ts index 7f135bf66487..e03e4bfc3caa 100644 --- a/packages/angular_devkit/schematics/src/sink/host.ts +++ b/packages/angular_devkit/schematics/src/sink/host.ts @@ -36,13 +36,22 @@ export class HostSink extends SimpleSinkBase { protected _validateFileExists(p: Path): Observable { if (this._filesToCreate.has(p) || this._filesToUpdate.has(p)) { return observableOf(true); - } else if (this._filesToDelete.has(p)) { - return observableOf(false); - } else if ([...this._filesToRename.values()].some(([from]) => from == p)) { + } + + if (this._filesToDelete.has(p)) { return observableOf(false); - } else { - return this._host.exists(p); } + + for (const [from, to] of this._filesToRename.values()) { + switch (p) { + case from: + return observableOf(false); + case to: + return observableOf(true); + } + } + + return this._host.exists(p); } protected _overwriteFile(path: Path, content: Buffer): Observable { @@ -82,12 +91,12 @@ export class HostSink extends SimpleSinkBase { ), observableFrom([...this._filesToCreate.entries()]).pipe( concatMap(([path, buffer]) => { - return this._host.write(path, (buffer.generate() as {}) as virtualFs.FileBuffer); + return this._host.write(path, buffer.generate() as {} as virtualFs.FileBuffer); }), ), observableFrom([...this._filesToUpdate.entries()]).pipe( concatMap(([path, buffer]) => { - return this._host.write(path, (buffer.generate() as {}) as virtualFs.FileBuffer); + return this._host.write(path, buffer.generate() as {} as virtualFs.FileBuffer); }), ), ).pipe(reduce(() => {})); diff --git a/packages/angular_devkit/schematics/src/sink/host_spec.ts b/packages/angular_devkit/schematics/src/sink/host_spec.ts index 6bc5d6e5a75c..a5dc5e057431 100644 --- a/packages/angular_devkit/schematics/src/sink/host_spec.ts +++ b/packages/angular_devkit/schematics/src/sink/host_spec.ts @@ -135,5 +135,22 @@ describe('FileSystemSink', () => { }) .then(done, done.fail); }); + + it('can rename then modify the same file', async () => { + const host = new virtualFs.test.TestHost({ + '/file0': 'world', + }); + const tree = new HostTree(host); + + tree.rename('/file0', '/file1'); + expect(tree.exists('/file0')).toBeFalsy(); + expect(tree.exists('/file1')).toBeTruthy(); + + tree.overwrite('/file1', 'hello'); + + const sink = new HostSink(host); + await sink.commit(tree).toPromise(); + expect(virtualFs.fileBufferToString(host.sync.read(normalize('/file1')))).toBe('hello'); + }); }); });