From c2ad741dbd9b2dc3308244744251b99056d77909 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Fri, 12 May 2023 11:18:19 -0400 Subject: [PATCH] fix(@angular-devkit/build-angular): correctly generate serviceworker hashes for binary assets When using the esbuild-based build system with the service worker enabled, binary assets were unintentionally being hashed with the assumption of UTF-8 encoding. The assets are now hashed directly to ensure correct output hashes. --- .../build_angular/src/utils/service-worker.ts | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/packages/angular_devkit/build_angular/src/utils/service-worker.ts b/packages/angular_devkit/build_angular/src/utils/service-worker.ts index 17d564bc4212..e19e6ef3a84e 100644 --- a/packages/angular_devkit/build_angular/src/utils/service-worker.ts +++ b/packages/angular_devkit/build_angular/src/utils/service-worker.ts @@ -63,15 +63,15 @@ class CliFilesystem implements Filesystem { } class ResultFilesystem implements Filesystem { - private readonly fileReaders = new Map Promise>(); + private readonly fileReaders = new Map Promise>(); constructor(outputFiles: OutputFile[], assetFiles: { source: string; destination: string }[]) { for (const file of outputFiles) { - this.fileReaders.set('/' + file.path.replace(/\\/g, '/'), async () => file.text); + this.fileReaders.set('/' + file.path.replace(/\\/g, '/'), async () => file.contents); } for (const file of assetFiles) { this.fileReaders.set('/' + file.destination.replace(/\\/g, '/'), () => - fsPromises.readFile(file.source, 'utf-8'), + fsPromises.readFile(file.source), ); } } @@ -84,19 +84,25 @@ class ResultFilesystem implements Filesystem { return [...this.fileReaders.keys()]; } - read(file: string): Promise { + async read(file: string): Promise { const reader = this.fileReaders.get(file); if (reader === undefined) { throw new Error('File does not exist.'); } + const contents = await reader(); - return reader(); + return Buffer.from(contents.buffer, contents.byteOffset, contents.byteLength).toString('utf-8'); } async hash(file: string): Promise { + const reader = this.fileReaders.get(file); + if (reader === undefined) { + throw new Error('File does not exist.'); + } + return crypto .createHash('sha1') - .update(await this.read(file)) + .update(await reader()) .digest('hex'); }