Skip to content

Commit d1f075e

Browse files
committed
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.
1 parent f412d7b commit d1f075e

File tree

1 file changed

+12
-6
lines changed

1 file changed

+12
-6
lines changed

packages/angular_devkit/build_angular/src/utils/service-worker.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -63,15 +63,15 @@ class CliFilesystem implements Filesystem {
6363
}
6464

6565
class ResultFilesystem implements Filesystem {
66-
private readonly fileReaders = new Map<string, () => Promise<string>>();
66+
private readonly fileReaders = new Map<string, () => Promise<Uint8Array>>();
6767

6868
constructor(outputFiles: OutputFile[], assetFiles: { source: string; destination: string }[]) {
6969
for (const file of outputFiles) {
70-
this.fileReaders.set('/' + file.path.replace(/\\/g, '/'), async () => file.text);
70+
this.fileReaders.set('/' + file.path.replace(/\\/g, '/'), async () => file.contents);
7171
}
7272
for (const file of assetFiles) {
7373
this.fileReaders.set('/' + file.destination.replace(/\\/g, '/'), () =>
74-
fsPromises.readFile(file.source, 'utf-8'),
74+
fsPromises.readFile(file.source),
7575
);
7676
}
7777
}
@@ -84,19 +84,25 @@ class ResultFilesystem implements Filesystem {
8484
return [...this.fileReaders.keys()];
8585
}
8686

87-
read(file: string): Promise<string> {
87+
async read(file: string): Promise<string> {
8888
const reader = this.fileReaders.get(file);
8989
if (reader === undefined) {
9090
throw new Error('File does not exist.');
9191
}
92+
const contents = await reader();
9293

93-
return reader();
94+
return Buffer.from(contents.buffer, contents.byteOffset, contents.byteLength).toString('utf-8');
9495
}
9596

9697
async hash(file: string): Promise<string> {
98+
const reader = this.fileReaders.get(file);
99+
if (reader === undefined) {
100+
throw new Error('File does not exist.');
101+
}
102+
97103
return crypto
98104
.createHash('sha1')
99-
.update(await this.read(file))
105+
.update(await reader())
100106
.digest('hex');
101107
}
102108

0 commit comments

Comments
 (0)