mirror of
https://github.com/node-red/node-red.git
synced 2023-10-10 13:36:53 +02:00
Support loading ESM via dynamic import rather than require
This commit is contained in:
parent
3bf1667181
commit
e1d974be03
@ -344,9 +344,19 @@ function loadNodeSet(node) {
|
|||||||
} else {
|
} else {
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
var r = require(node.file);
|
let importPromise = import(node.file);
|
||||||
r = r.__esModule ? r.default : r;
|
return importPromise
|
||||||
return createLoadPromise(node, r);
|
.then(function(module_namespace_object) {
|
||||||
|
// CJS will always have default, ESM might have default. (details in note below)
|
||||||
|
let r = module_namespace_object.default ? module_namespace_object.default : module_namespace_object;
|
||||||
|
// Babel related workaround. (references in note below)
|
||||||
|
r = r.__esModule ? r.default : r;
|
||||||
|
return createLoadPromise(node, r);
|
||||||
|
})
|
||||||
|
.catch(function(err) {
|
||||||
|
node.err = err;
|
||||||
|
return Promise.resolve(node);
|
||||||
|
});
|
||||||
} catch(err) {
|
} catch(err) {
|
||||||
node.err = err;
|
node.err = err;
|
||||||
var stack = err.stack;
|
var stack = err.stack;
|
||||||
@ -371,6 +381,20 @@ 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) {
|
function createLoadPromise(node, r) {
|
||||||
var loadPromise = null;
|
var loadPromise = null;
|
||||||
if (typeof r === "function") {
|
if (typeof r === "function") {
|
||||||
|
@ -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) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user