From 07ba9141e475ec63f6ef56b67ec5f98077cd3446 Mon Sep 17 00:00:00 2001 From: punteek Date: Tue, 6 Mar 2018 19:46:39 -0800 Subject: vm: add support for import.meta to Module Fixes: https://github.com/nodejs/node/issues/18570 PR-URL: https://github.com/nodejs/node/pull/19277 Reviewed-By: Gus Caplan Reviewed-By: Tiancheng "Timothy" Gu --- doc/api/vm.md | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) (limited to 'doc/api/vm.md') diff --git a/doc/api/vm.md b/doc/api/vm.md index c729ef5999..ed7be81776 100644 --- a/doc/api/vm.md +++ b/doc/api/vm.md @@ -167,9 +167,49 @@ const contextifiedSandbox = vm.createContext({ secret: 42 }); in stack traces produced by this Module. * `columnOffset` {integer} Spcifies the column number offset that is displayed in stack traces produced by this Module. + * `initalizeImportMeta` {Function} Called during evaluation of this Module to + initialize the `import.meta`. This function has the signature `(meta, + module)`, where `meta` is the `import.meta` object in the Module, and + `module` is this `vm.Module` object. Creates a new ES `Module` object. +*Note*: Properties assigned to the `import.meta` object that are objects may +allow the Module to access information outside the specified `context`, if the +object is created in the top level context. Use `vm.runInContext()` to create +objects in a specific context. + +```js +const vm = require('vm'); + +const contextifiedSandbox = vm.createContext({ secret: 42 }); + +(async () => { + const module = new vm.Module( + 'Object.getPrototypeOf(import.meta.prop).secret = secret;', + { + initializeImportMeta(meta) { + // Note: this object is created in the top context. As such, + // Object.getPrototypeOf(import.meta.prop) points to the + // Object.prototype in the top context rather than that in + // the sandbox. + meta.prop = {}; + } + }); + // Since module has no dependencies, the linker function will never be called. + await module.link(() => {}); + module.initialize(); + await module.evaluate(); + + // Now, Object.prototype.secret will be equal to 42. + // + // To fix this problem, replace + // meta.prop = {}; + // above with + // meta.prop = vm.runInContext('{}', contextifiedSandbox); +})(); +``` + ### module.dependencySpecifiers * {string[]} -- cgit v1.2.3