mirror of
				https://github.com/node-red/node-red.git
				synced 2025-03-01 10:36:34 +00:00 
			
		
		
		
	Support loading ESM via dynamic import rather than require
This commit is contained in:
		| @@ -344,9 +344,19 @@ function loadNodeSet(node) { | ||||
|     } else { | ||||
|     } | ||||
|     try { | ||||
|         var r = require(node.file); | ||||
|         r = r.__esModule ? r.default : r; | ||||
|         return createLoadPromise(node, r); | ||||
|         let importPromise = import(node.file); | ||||
|         return importPromise | ||||
|             .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) { | ||||
|         node.err = err; | ||||
|         var stack = err.stack; | ||||
| @@ -371,6 +381,20 @@ function loadNodeSet(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") { | ||||
|   | ||||
| @@ -626,7 +626,7 @@ describe("red/nodes/registry/loader",function() { | ||||
|                 node.enabled.should.be.true(); | ||||
|                 nodes.registerType.called.should.be.false(); | ||||
|                 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(); | ||||
|             }).catch(function(err) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user