Skip to content

Commit 592d769

Browse files
committed
fix: localStorage exception in Node 25+
1 parent 6ef547a commit 592d769

File tree

1 file changed

+8
-51
lines changed

1 file changed

+8
-51
lines changed

index.js

Lines changed: 8 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -632,62 +632,19 @@ class HtmlWebpackPlugin {
632632
const templateWithoutLoaders = templateFilename
633633
.replace(/^.+!/, "")
634634
.replace(/\?.+$/, "");
635-
const vmContext = vm.createContext({
636-
...global,
635+
const globalClone = Object.create(Object.getPrototypeOf(global),
636+
Object.getOwnPropertyDescriptors(global));
637+
// Presence of `eval` breaks template's explicit `eval` call, might be a bug in Node
638+
delete globalClone.eval;
639+
// Not using `...global` as it throws when localStorage is not explicitly enabled in Node 25+
640+
const vmContext = vm.createContext(Object.assign(globalClone, {
637641
HTML_WEBPACK_PLUGIN: true,
642+
// Copying nonstandard globals like `require` explicitly as they may be absent from `global`
638643
require: require,
639644
htmlWebpackPluginPublicPath: publicPath,
640645
__filename: templateWithoutLoaders,
641646
__dirname: path.dirname(templateWithoutLoaders),
642-
AbortController: global.AbortController,
643-
AbortSignal: global.AbortSignal,
644-
Blob: global.Blob,
645-
Buffer: global.Buffer,
646-
ByteLengthQueuingStrategy: global.ByteLengthQueuingStrategy,
647-
BroadcastChannel: global.BroadcastChannel,
648-
CompressionStream: global.CompressionStream,
649-
CountQueuingStrategy: global.CountQueuingStrategy,
650-
Crypto: global.Crypto,
651-
CryptoKey: global.CryptoKey,
652-
CustomEvent: global.CustomEvent,
653-
DecompressionStream: global.DecompressionStream,
654-
Event: global.Event,
655-
EventTarget: global.EventTarget,
656-
File: global.File,
657-
FormData: global.FormData,
658-
Headers: global.Headers,
659-
MessageChannel: global.MessageChannel,
660-
MessageEvent: global.MessageEvent,
661-
MessagePort: global.MessagePort,
662-
PerformanceEntry: global.PerformanceEntry,
663-
PerformanceMark: global.PerformanceMark,
664-
PerformanceMeasure: global.PerformanceMeasure,
665-
PerformanceObserver: global.PerformanceObserver,
666-
PerformanceObserverEntryList: global.PerformanceObserverEntryList,
667-
PerformanceResourceTiming: global.PerformanceResourceTiming,
668-
ReadableByteStreamController: global.ReadableByteStreamController,
669-
ReadableStream: global.ReadableStream,
670-
ReadableStreamBYOBReader: global.ReadableStreamBYOBReader,
671-
ReadableStreamBYOBRequest: global.ReadableStreamBYOBRequest,
672-
ReadableStreamDefaultController: global.ReadableStreamDefaultController,
673-
ReadableStreamDefaultReader: global.ReadableStreamDefaultReader,
674-
Response: global.Response,
675-
Request: global.Request,
676-
SubtleCrypto: global.SubtleCrypto,
677-
DOMException: global.DOMException,
678-
TextDecoder: global.TextDecoder,
679-
TextDecoderStream: global.TextDecoderStream,
680-
TextEncoder: global.TextEncoder,
681-
TextEncoderStream: global.TextEncoderStream,
682-
TransformStream: global.TransformStream,
683-
TransformStreamDefaultController: global.TransformStreamDefaultController,
684-
URL: global.URL,
685-
URLSearchParams: global.URLSearchParams,
686-
WebAssembly: global.WebAssembly,
687-
WritableStream: global.WritableStream,
688-
WritableStreamDefaultController: global.WritableStreamDefaultController,
689-
WritableStreamDefaultWriter: global.WritableStreamDefaultWriter,
690-
});
647+
}));
691648

692649
const vmScript = new vm.Script(source, {
693650
filename: templateWithoutLoaders,

0 commit comments

Comments
 (0)