angular/packages/zone.js/lib/node/fs.ts
arturovt 19fae76bad fix(zone.js): patch fs.realpath.native as macrotask (#54208)
This commit updates the implementation of the zone.js `fs` patch to
restore the implementation of `realpath.native` and patches it as a macrotask,
along with other functions of the `fs` package. This is the only nested function
that must be patched.

Closes: #45546

PR Close #54208
2024-02-06 16:04:40 +00:00

54 lines
1.9 KiB
TypeScript

/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
import {patchMacroTask, zoneSymbol} from '../common/utils';
Zone.__load_patch('fs', (global: any, Zone: ZoneType, api: _ZonePrivate) => {
let fs: any;
try {
fs = require('fs');
} catch (err) {
}
if (!fs) return;
// watch, watchFile, unwatchFile has been patched
// because EventEmitter has been patched
const TO_PATCH_MACROTASK_METHODS = [
'access', 'appendFile', 'chmod', 'chown', 'close', 'exists', 'fchmod',
'fchown', 'fdatasync', 'fstat', 'fsync', 'ftruncate', 'futimes', 'lchmod',
'lchown', 'link', 'lstat', 'mkdir', 'mkdtemp', 'open', 'read',
'readdir', 'readFile', 'readlink', 'realpath', 'rename', 'rmdir', 'stat',
'symlink', 'truncate', 'unlink', 'utimes', 'write', 'writeFile',
];
TO_PATCH_MACROTASK_METHODS.filter(name => !!fs[name] && typeof fs[name] === 'function')
.forEach(name => {
patchMacroTask(fs, name, (self: any, args: any[]) => {
return {
name: 'fs.' + name,
args: args,
cbIdx: args.length > 0 ? args.length - 1 : -1,
target: self
};
});
});
const realpathOriginalDelegate = fs.realpath?.[api.symbol('OriginalDelegate')];
// This is the only specific method that should be additionally patched because the previous
// `patchMacroTask` has overridden the `realpath` function and its `native` property.
if (realpathOriginalDelegate?.native) {
fs.realpath.native = realpathOriginalDelegate.native;
patchMacroTask(fs.realpath, 'native', (self, args) => ({
args,
target: self,
cbIdx: args.length > 0 ? args.length - 1 : -1,
name: 'fs.realpath.native',
}));
}
});