Skip to content

Commit a88940e

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

File tree

1 file changed

+17
-56
lines changed

1 file changed

+17
-56
lines changed

index.js

Lines changed: 17 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -632,62 +632,23 @@ class HtmlWebpackPlugin {
632632
const templateWithoutLoaders = templateFilename
633633
.replace(/^.+!/, "")
634634
.replace(/\?.+$/, "");
635-
const vmContext = vm.createContext({
636-
...global,
637-
HTML_WEBPACK_PLUGIN: true,
638-
require: require,
639-
htmlWebpackPluginPublicPath: publicPath,
640-
__filename: templateWithoutLoaders,
641-
__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-
});
635+
const globalClone = Object.create(
636+
Object.getPrototypeOf(global),
637+
Object.getOwnPropertyDescriptors(global),
638+
);
639+
// Presence of `eval` breaks template's explicit `eval` call, might be a bug in Node
640+
delete globalClone.eval;
641+
// Not using `...global` as it throws when localStorage is not explicitly enabled in Node 25+
642+
const vmContext = vm.createContext(
643+
Object.assign(globalClone, {
644+
HTML_WEBPACK_PLUGIN: true,
645+
// Copying nonstandard globals like `require` explicitly as they may be absent from `global`
646+
require: require,
647+
htmlWebpackPluginPublicPath: publicPath,
648+
__filename: templateWithoutLoaders,
649+
__dirname: path.dirname(templateWithoutLoaders),
650+
}),
651+
);
691652

692653
const vmScript = new vm.Script(source, {
693654
filename: templateWithoutLoaders,

0 commit comments

Comments
 (0)