@miniflare/runner-vm
Advanced tools
Comparing version 2.11.0 to 2.12.0
/// <reference types="node" /> | ||
import { AdditionalModules } from '@miniflare/shared'; | ||
import { Compatibility } from '@miniflare/shared'; | ||
import { Context } from '@miniflare/shared'; | ||
@@ -19,3 +20,3 @@ import { MiniflareError } from '@miniflare/shared'; | ||
private runAsModule; | ||
run(globalScope: Context, blueprint: ScriptBlueprint, modulesRules?: ProcessedModuleRule[], additionalModules?: AdditionalModules): Promise<ScriptRunnerResult>; | ||
run(globalScope: Context, blueprint: ScriptBlueprint, modulesRules?: ProcessedModuleRule[], additionalModules?: AdditionalModules, compat?: Compatibility): Promise<ScriptRunnerResult>; | ||
} | ||
@@ -22,0 +23,0 @@ |
@@ -98,3 +98,2 @@ var __create = Object.create; | ||
var import_fs = __toModule(require("fs")); | ||
var import_promises = __toModule(require("fs/promises")); | ||
var import_module = __toModule(require("module")); | ||
@@ -106,7 +105,9 @@ var import_path = __toModule(require("path")); | ||
var SUGGEST_NODE = "If you're trying to import a Node.js built-in module, or an npm package that uses Node.js built-ins, you'll either need to:\n- Bundle your Worker, configuring your bundler to polyfill Node.js built-ins\n- Configure your bundler to load Workers-compatible builds by changing the main fields/conditions\n- Find an alternative package that doesn't require Node.js built-ins"; | ||
var linkingPromises = new WeakMap(); | ||
var evaluatingPromises = new WeakMap(); | ||
var ModuleLinker = class { | ||
constructor(moduleRules, additionalModules) { | ||
constructor(moduleRules, additionalModules, compat) { | ||
this.moduleRules = moduleRules; | ||
this.additionalModules = additionalModules; | ||
this.linker = this.linker.bind(this); | ||
this.compat = compat; | ||
} | ||
@@ -116,2 +117,3 @@ #referencedPathSizes = new Map(); | ||
#cjsModuleCache = new Map(); | ||
#namespaceCache = new WeakMap(); | ||
get referencedPaths() { | ||
@@ -124,3 +126,3 @@ return this.#referencedPathSizes.keys(); | ||
} | ||
async linker(spec, referencing) { | ||
linker = (spec, referencing) => { | ||
const relative = import_path.default.relative("", referencing.identifier); | ||
@@ -154,12 +156,15 @@ const errorBase = `Unable to resolve "${relative}" dependency "${spec}"`; | ||
} | ||
const data = await import_promises.default.readFile(identifier); | ||
const data = (0, import_fs.readFileSync)(identifier); | ||
this.#referencedPathSizes.set(identifier, data.byteLength); | ||
switch (rule.type) { | ||
case "ESModule": | ||
module2 = new import_vm2.default.SourceTextModule(data.toString("utf8"), moduleOptions); | ||
module2 = new import_vm2.default.SourceTextModule(data.toString("utf8"), { | ||
...moduleOptions, | ||
importModuleDynamically: this.importModuleDynamically | ||
}); | ||
break; | ||
case "CommonJS": | ||
const exports = this.loadCommonJSModule(errorBase, identifier, spec, referencing.context); | ||
const mod = this.loadCommonJSModule(errorBase, identifier, spec, referencing.context); | ||
module2 = new import_vm2.default.SyntheticModule(["default"], function() { | ||
this.setExport("default", exports); | ||
this.setExport("default", mod.exports); | ||
}, moduleOptions); | ||
@@ -187,13 +192,25 @@ break; | ||
return module2; | ||
} | ||
}; | ||
importModuleDynamically = async (spec, referencing) => { | ||
const module2 = this.linker(spec, referencing); | ||
if (module2.status === "unlinked") { | ||
linkingPromises.set(module2, module2.link(this.linker)); | ||
} | ||
await linkingPromises.get(module2); | ||
if (module2.status === "linked") { | ||
evaluatingPromises.set(module2, module2.evaluate()); | ||
} | ||
await evaluatingPromises.get(module2); | ||
return module2; | ||
}; | ||
loadCommonJSModule(errorBase, identifier, spec, context) { | ||
const cached = this.#cjsModuleCache.get(identifier); | ||
if (cached) | ||
return cached.exports; | ||
return cached; | ||
const additionalModule = this.additionalModules[spec]; | ||
const module2 = { exports: {} }; | ||
if (additionalModule) { | ||
module2.exports.default = additionalModule.default; | ||
module2.exports = additionalModule.default; | ||
this.#cjsModuleCache.set(identifier, module2); | ||
return module2.exports; | ||
return module2; | ||
} | ||
@@ -227,9 +244,9 @@ const rule = this.moduleRules.find((rule2) => rule2.include.test(identifier)); | ||
case "Text": | ||
module2.exports.default = data.toString("utf8"); | ||
module2.exports = data.toString("utf8"); | ||
break; | ||
case "Data": | ||
module2.exports.default = (0, import_shared2.viewToBuffer)(data); | ||
module2.exports = (0, import_shared2.viewToBuffer)(data); | ||
break; | ||
case "CompiledWasm": | ||
module2.exports.default = new WebAssembly.Module(data); | ||
module2.exports = new WebAssembly.Module(data); | ||
break; | ||
@@ -239,3 +256,3 @@ default: | ||
} | ||
return module2.exports; | ||
return module2; | ||
} | ||
@@ -248,3 +265,16 @@ createRequire(referencingIdentifier, context) { | ||
const identifier = import_path.default.resolve(referencingDirname, spec); | ||
return this.loadCommonJSModule(errorBase, identifier, spec, context); | ||
const mod = this.loadCommonJSModule(errorBase, identifier, spec, context); | ||
if (this.compat === void 0 || this.compat.isEnabled("export_commonjs_default")) { | ||
return mod.exports; | ||
} else { | ||
let ns = this.#namespaceCache.get(mod); | ||
if (ns !== void 0) | ||
return ns; | ||
ns = Object.defineProperty({}, "default", { | ||
get: () => mod.exports, | ||
enumerable: true | ||
}); | ||
this.#namespaceCache.set(mod, ns); | ||
return ns; | ||
} | ||
}; | ||
@@ -268,13 +298,14 @@ } | ||
identifier: blueprint.filePath, | ||
context | ||
context, | ||
importModuleDynamically: linker.importModuleDynamically | ||
}); | ||
await module2.link(linker); | ||
await module2.link(linker.linker); | ||
await module2.evaluate(); | ||
return module2.namespace; | ||
} | ||
async run(globalScope, blueprint, modulesRules, additionalModules) { | ||
async run(globalScope, blueprint, modulesRules, additionalModules, compat) { | ||
if (modulesRules && !("SourceTextModule" in import_vm3.default)) { | ||
throw new VMScriptRunnerError("ERR_MODULE_DISABLED", "Modules support requires the --experimental-vm-modules flag"); | ||
} | ||
const linker = modulesRules && new ModuleLinker(modulesRules, additionalModules ?? {}); | ||
const linker = modulesRules && new ModuleLinker(modulesRules, additionalModules ?? {}, compat); | ||
let context = this.context; | ||
@@ -293,3 +324,3 @@ if (context) { | ||
if (linker) { | ||
exports = await this.runAsModule(context, blueprint, linker.linker); | ||
exports = await this.runAsModule(context, blueprint, linker); | ||
} else { | ||
@@ -296,0 +327,0 @@ this.runAsScript(context, blueprint); |
{ | ||
"name": "@miniflare/runner-vm", | ||
"version": "2.11.0", | ||
"version": "2.12.0", | ||
"description": "VM script runner module for Miniflare: a fun, full-featured, fully-local simulator for Cloudflare Workers", | ||
@@ -38,7 +38,7 @@ "keywords": [ | ||
"dependencies": { | ||
"@miniflare/shared": "2.11.0" | ||
"@miniflare/shared": "2.12.0" | ||
}, | ||
"devDependencies": { | ||
"@miniflare/shared-test": "2.11.0" | ||
"@miniflare/shared-test": "2.12.0" | ||
} | ||
} |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
21953
348
5
+ Added@miniflare/shared@2.12.0(transitive)
- Removed@miniflare/shared@2.11.0(transitive)
Updated@miniflare/shared@2.12.0