Merge 393658c54dede66d3df43d85871e4a1db577d99b into bb01f26f068b8e083e35fdf19dc9b36f8cf67068

This commit is contained in:
hlovdal 2024-12-02 18:06:22 +01:00 committed by GitHub
commit 9a3a5172d9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 53 additions and 25 deletions

View File

@ -350,30 +350,19 @@ function loadNodeSet(node) {
} else { } else {
} }
try { try {
var loadPromise = null; let importPromise = import(node.file);
var r = require(node.file); return importPromise
r = r.__esModule ? r.default : r .then(function(moduleNamespaceObject) {
if (typeof r === "function") { // CJS will always have default, ESM might have default. (details in note below)
let r = moduleNamespaceObject.default ? moduleNamespaceObject.default : moduleNamespaceObject;
var red = registryUtil.createNodeApi(node); // Babel related workaround. (references in note below)
var promise = r(red); r = r.__esModule ? r.default : r;
if (promise != null && typeof promise.then === "function") { return createLoadPromise(node, r);
loadPromise = promise.then(function() { })
node.enabled = true; .catch(function(err) {
node.loaded = true; node.err = err;
return node; return Promise.resolve(node);
}).catch(function(err) { });
node.err = err;
return node;
});
}
}
if (loadPromise == null) {
node.enabled = true;
node.loaded = true;
loadPromise = Promise.resolve(node);
}
return loadPromise;
} catch(err) { } catch(err) {
node.err = err; node.err = err;
var stack = err.stack; var stack = err.stack;
@ -397,6 +386,45 @@ function loadNodeSet(node) {
} }
return Promise.resolve(node); return Promise.resolve(node);
} }
// Notes on default:
// https://nodejs.org/api/esm.html#import-expressions
// "When importing CommonJS modules, the module.exports object is provided as the default export."
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/import
// "The module namespace object is a sealed object ... with the default export available as a key called `default`."
// Notes on __esModule:
// Workaround originally added in commit 326f3469, merged in pull request #3669.
// Related links:
// https://github.com/nodejs/node/issues/40891
// https://github.com/evanw/esbuild/issues/1591
// https://babeljs.io/docs/babel-plugin-transform-modules-commonjs
// https://stackoverflow.com/questions/50943704/whats-the-purpose-of-object-definepropertyexports-esmodule-value-0
function createLoadPromise(node, r) {
var loadPromise = null;
if (typeof r === "function") {
var red = registryUtil.createNodeApi(node);
var promise = r(red);
if (promise != null && typeof promise.then === "function") {
loadPromise = promise.then(function () {
node.enabled = true;
node.loaded = true;
return node;
}).catch(function (err) {
node.err = err;
return node;
});
}
}
if (loadPromise == null) {
node.enabled = true;
node.loaded = true;
loadPromise = Promise.resolve(node);
}
return loadPromise;
}
} }
async function loadPlugin(plugin) { async function loadPlugin(plugin) {

View File

@ -626,7 +626,7 @@ describe("red/nodes/registry/loader",function() {
node.enabled.should.be.true(); node.enabled.should.be.true();
nodes.registerType.called.should.be.false(); nodes.registerType.called.should.be.false();
node.should.have.property('err'); node.should.have.property('err');
node.err.toString().should.eql("Error: fail to require (line:1)"); node.err.toString().should.eql("Error: fail to require");
done(); done();
}).catch(function(err) { }).catch(function(err) {