@node-red/registry 5.0.0-beta.6 → 5.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/externalModules.js +0 -1
- package/lib/installer.js +5 -5
- package/lib/loader.js +58 -30
- package/package.json +4 -4
package/lib/externalModules.js
CHANGED
|
@@ -274,7 +274,6 @@ async function installModule(moduleDetails) {
|
|
|
274
274
|
let extraArgs = triggerPayload.args || [];
|
|
275
275
|
let args = [npmCli, 'install', ...extraArgs, '--', installSpec]
|
|
276
276
|
log.trace(`${process.execPath} ${npmCli} ${JSON.stringify(args)}`);
|
|
277
|
-
console.log('HIT EM ONE')
|
|
278
277
|
return exec.run(process.execPath, args, { cwd: installDir },true)
|
|
279
278
|
} else {
|
|
280
279
|
log.trace("skipping npm install");
|
package/lib/installer.js
CHANGED
|
@@ -147,8 +147,7 @@ async function installModule(module,version,url) {
|
|
|
147
147
|
var isExisting = false;
|
|
148
148
|
if (url) {
|
|
149
149
|
if (pkgurlRe.test(url) || localtgzRe.test(url)) {
|
|
150
|
-
|
|
151
|
-
installName = localtgzRe.test(url) && slashRe.test(url) ? `"${url}"` : url;
|
|
150
|
+
installName = url;
|
|
152
151
|
isRegistryPackage = false;
|
|
153
152
|
} else {
|
|
154
153
|
log.warn(log._("server.install.install-failed-url",{name:module,url:url}));
|
|
@@ -504,12 +503,13 @@ async function getTarballModuleInfo(tarball) {
|
|
|
504
503
|
|
|
505
504
|
function uninstallModule(module) {
|
|
506
505
|
// This function is called when the admin api is called to remove a module.
|
|
507
|
-
// A check in
|
|
506
|
+
// A check in nodes.js#removeModule verifies the module being removed is already in the registry
|
|
508
507
|
// as a user module. As such, we can have confidence that the `module` passed here is
|
|
509
|
-
// a valid and recognised module name.
|
|
508
|
+
// a valid and recognised module name. But lets not rely 100% on that.
|
|
510
509
|
activePromise = activePromise.then(() => {
|
|
511
510
|
return new Promise((resolve,reject) => {
|
|
512
|
-
|
|
511
|
+
// Ensure its a valid package name and nothing has slipped through other checks
|
|
512
|
+
if (!validateNpmPackageName(module).validForOldPackages) {
|
|
513
513
|
reject(new Error(log._("server.install.invalid")));
|
|
514
514
|
return;
|
|
515
515
|
}
|
package/lib/loader.js
CHANGED
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
var fs = require("fs-extra");
|
|
18
18
|
var path = require("path");
|
|
19
19
|
var semver = require("semver");
|
|
20
|
+
const { pathToFileURL } = require('node:url');
|
|
20
21
|
|
|
21
22
|
var localfilesystem = require("./localfilesystem");
|
|
22
23
|
var registry = require("./registry");
|
|
@@ -66,7 +67,7 @@ function loadModuleTypeFiles(module, type) {
|
|
|
66
67
|
moduleFn = parts.slice(0,nmi+2).join(path.sep);
|
|
67
68
|
}
|
|
68
69
|
if (!moduleFn) {
|
|
69
|
-
// shortcut - skip calling statSync on empty string
|
|
70
|
+
// shortcut - skip calling statSync on empty string
|
|
70
71
|
break; // Module not found, don't attempt to load its nodes
|
|
71
72
|
}
|
|
72
73
|
try {
|
|
@@ -230,8 +231,9 @@ async function loadNodeTemplate(node) {
|
|
|
230
231
|
}
|
|
231
232
|
|
|
232
233
|
async function loadNodeLocales(node) {
|
|
233
|
-
if (node.module === 'node-red') {
|
|
234
|
+
if (node.module === 'node-red' || (!node.file && !node.template)) {
|
|
234
235
|
// do not look up locales directory for core nodes
|
|
236
|
+
// or themes which have no file or template
|
|
235
237
|
node.namespace = node.module;
|
|
236
238
|
return node
|
|
237
239
|
}
|
|
@@ -356,34 +358,23 @@ function loadNodeSet(node) {
|
|
|
356
358
|
} else {
|
|
357
359
|
}
|
|
358
360
|
try {
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
return node;
|
|
374
|
-
});
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
if (loadPromise == null) {
|
|
378
|
-
node.enabled = true;
|
|
379
|
-
node.loaded = true;
|
|
380
|
-
loadPromise = Promise.resolve(node);
|
|
381
|
-
}
|
|
382
|
-
return loadPromise;
|
|
361
|
+
const modulePath = pathToFileURL(node.file).href;
|
|
362
|
+
const importPromise = import(modulePath);
|
|
363
|
+
return importPromise
|
|
364
|
+
.then(function(moduleNamespaceObject) {
|
|
365
|
+
// CJS will always have default, ESM might have default. (details in note below)
|
|
366
|
+
let r = moduleNamespaceObject.default ? moduleNamespaceObject.default : moduleNamespaceObject;
|
|
367
|
+
// Babel related workaround, references in comment below.
|
|
368
|
+
r = r.__esModule ? r.default : r;
|
|
369
|
+
return createLoadPromise(node, r);
|
|
370
|
+
})
|
|
371
|
+
.catch(function(err) {
|
|
372
|
+
node.err = err;
|
|
373
|
+
return Promise.resolve(node);
|
|
374
|
+
});
|
|
383
375
|
} catch(err) {
|
|
384
376
|
node.err = err;
|
|
385
377
|
var stack = err.stack;
|
|
386
|
-
var message;
|
|
387
378
|
if (stack) {
|
|
388
379
|
var filePath = node.file;
|
|
389
380
|
try {
|
|
@@ -403,6 +394,45 @@ function loadNodeSet(node) {
|
|
|
403
394
|
}
|
|
404
395
|
return Promise.resolve(node);
|
|
405
396
|
}
|
|
397
|
+
|
|
398
|
+
// Notes on default:
|
|
399
|
+
// https://nodejs.org/api/esm.html#import-expressions
|
|
400
|
+
// "When importing CommonJS modules, the module.exports object is provided as the default export."
|
|
401
|
+
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/import
|
|
402
|
+
// "The module namespace object is a sealed object ... with the default export available as a key called `default`."
|
|
403
|
+
|
|
404
|
+
// Notes on __esModule:
|
|
405
|
+
// Workaround originally added in commit 326f3469, merged in pull request #3669.
|
|
406
|
+
// Related links:
|
|
407
|
+
// https://github.com/nodejs/node/issues/40891
|
|
408
|
+
// https://github.com/evanw/esbuild/issues/1591
|
|
409
|
+
// https://babeljs.io/docs/babel-plugin-transform-modules-commonjs
|
|
410
|
+
// https://stackoverflow.com/questions/50943704/whats-the-purpose-of-object-definepropertyexports-esmodule-value-0
|
|
411
|
+
|
|
412
|
+
function createLoadPromise(node, r) {
|
|
413
|
+
var loadPromise = null;
|
|
414
|
+
if (typeof r === "function") {
|
|
415
|
+
|
|
416
|
+
var red = registryUtil.createNodeApi(node);
|
|
417
|
+
var promise = r(red);
|
|
418
|
+
if (promise != null && typeof promise.then === "function") {
|
|
419
|
+
loadPromise = promise.then(function () {
|
|
420
|
+
node.enabled = true;
|
|
421
|
+
node.loaded = true;
|
|
422
|
+
return node;
|
|
423
|
+
}).catch(function (err) {
|
|
424
|
+
node.err = err;
|
|
425
|
+
return node;
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
if (loadPromise == null) {
|
|
430
|
+
node.enabled = true;
|
|
431
|
+
node.loaded = true;
|
|
432
|
+
loadPromise = Promise.resolve(node);
|
|
433
|
+
}
|
|
434
|
+
return loadPromise;
|
|
435
|
+
}
|
|
406
436
|
}
|
|
407
437
|
|
|
408
438
|
async function loadPlugin(plugin) {
|
|
@@ -435,7 +465,6 @@ async function loadPlugin(plugin) {
|
|
|
435
465
|
console.log(err);
|
|
436
466
|
plugin.err = err;
|
|
437
467
|
var stack = err.stack;
|
|
438
|
-
var message;
|
|
439
468
|
if (stack) {
|
|
440
469
|
var i = stack.indexOf(plugin.file);
|
|
441
470
|
if (i > -1) {
|
|
@@ -449,7 +478,7 @@ async function loadPlugin(plugin) {
|
|
|
449
478
|
return plugin;
|
|
450
479
|
}
|
|
451
480
|
}
|
|
452
|
-
|
|
481
|
+
|
|
453
482
|
function loadNodeSetList(nodes) {
|
|
454
483
|
var promises = [];
|
|
455
484
|
nodes.forEach(function(node) {
|
|
@@ -471,7 +500,6 @@ function addModule(module) {
|
|
|
471
500
|
if (!settings.available()) {
|
|
472
501
|
throw new Error("Settings unavailable");
|
|
473
502
|
}
|
|
474
|
-
var nodes = [];
|
|
475
503
|
var existingInfo = registry.getModuleInfo(module);
|
|
476
504
|
if (existingInfo) {
|
|
477
505
|
// TODO: nls
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@node-red/registry",
|
|
3
|
-
"version": "5.0.
|
|
3
|
+
"version": "5.0.1",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"main": "./lib/index.js",
|
|
6
6
|
"repository": {
|
|
@@ -16,12 +16,12 @@
|
|
|
16
16
|
}
|
|
17
17
|
],
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@node-red/util": "5.0.
|
|
19
|
+
"@node-red/util": "5.0.1",
|
|
20
20
|
"clone": "2.1.2",
|
|
21
21
|
"fs-extra": "11.3.0",
|
|
22
|
-
"npm": "11.
|
|
22
|
+
"npm": "11.18.0",
|
|
23
23
|
"semver": "7.7.4",
|
|
24
|
-
"tar": "7.5.
|
|
24
|
+
"tar": "7.5.19",
|
|
25
25
|
"uglify-js": "3.19.3",
|
|
26
26
|
"validate-npm-package-name": "7.0.2"
|
|
27
27
|
}
|