@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.
@@ -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
- // Git remote url or Tarball url - check the valid package url
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 node.js#removeModule verifies the module being removed is already in the registry
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
- if (/[.\s;]/.test(module)) {
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
- var loadPromise = null;
360
- var r = require(node.file);
361
- r = r.__esModule ? r.default : r
362
- if (typeof r === "function") {
363
-
364
- var red = registryUtil.createNodeApi(node);
365
- var promise = r(red);
366
- if (promise != null && typeof promise.then === "function") {
367
- loadPromise = promise.then(function() {
368
- node.enabled = true;
369
- node.loaded = true;
370
- return node;
371
- }).catch(function(err) {
372
- node.err = err;
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
- let invocation = 0
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.0-beta.6",
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.0-beta.6",
19
+ "@node-red/util": "5.0.1",
20
20
  "clone": "2.1.2",
21
21
  "fs-extra": "11.3.0",
22
- "npm": "11.13.0",
22
+ "npm": "11.18.0",
23
23
  "semver": "7.7.4",
24
- "tar": "7.5.12",
24
+ "tar": "7.5.19",
25
25
  "uglify-js": "3.19.3",
26
26
  "validate-npm-package-name": "7.0.2"
27
27
  }