noflo 1.4.2 → 1.5.0

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.
Files changed (89) hide show
  1. package/.ecrc +3 -0
  2. package/.eslintignore +2 -0
  3. package/{CHANGES.md → CHANGELOG.md} +520 -523
  4. package/README.md +1 -1
  5. package/bin/noflo-cache-preheat +17 -15
  6. package/components/Graph.d.ts +50 -15
  7. package/components/Graph.js +94 -68
  8. package/examples/http/HelloController.js +9 -6
  9. package/examples/spreadsheet/parse.fbp +3 -3
  10. package/lib/AsCallback.d.ts +22 -9
  11. package/lib/AsCallback.js +69 -18
  12. package/lib/AsComponent.d.ts +1 -1
  13. package/lib/AsComponent.js +5 -3
  14. package/lib/BaseNetwork.d.ts +16 -6
  15. package/lib/BaseNetwork.js +65 -31
  16. package/lib/BasePort.d.ts +39 -12
  17. package/lib/BasePort.js +34 -6
  18. package/lib/Component.d.ts +8 -8
  19. package/lib/Component.js +23 -20
  20. package/lib/ComponentLoader.d.ts +3 -4
  21. package/lib/ComponentLoader.js +9 -10
  22. package/lib/IP.d.ts +12 -8
  23. package/lib/IP.js +6 -4
  24. package/lib/InPort.d.ts +81 -10
  25. package/lib/InPort.js +83 -19
  26. package/lib/InternalSocket.d.ts +53 -7
  27. package/lib/InternalSocket.js +51 -14
  28. package/lib/LegacyNetwork.d.ts +12 -2
  29. package/lib/LegacyNetwork.js +5 -5
  30. package/lib/Network.d.ts +13 -2
  31. package/lib/Network.js +10 -10
  32. package/lib/NoFlo.d.ts +13 -13
  33. package/lib/NoFlo.js +29 -27
  34. package/lib/OutPort.d.ts +74 -32
  35. package/lib/OutPort.js +79 -23
  36. package/lib/Platform.d.ts +1 -1
  37. package/lib/Platform.js +9 -4
  38. package/lib/Ports.d.ts +14 -21
  39. package/lib/Ports.js +11 -13
  40. package/lib/ProcessInput.d.ts +5 -9
  41. package/lib/ProcessInput.js +8 -9
  42. package/lib/ProcessOutput.d.ts +2 -2
  43. package/lib/ProcessOutput.js +5 -5
  44. package/lib/loader/NodeJs.d.ts +0 -1
  45. package/lib/loader/NodeJs.js +104 -105
  46. package/lib/loader/register.d.ts +1 -1
  47. package/lib/loader/register.js +8 -4
  48. package/package.json +16 -11
  49. package/spec/.eslintrc +5 -2
  50. package/spec/AsCallback.js +9 -13
  51. package/spec/AsComponent.js +10 -4
  52. package/spec/AsPromise.js +38 -0
  53. package/spec/CommonJS.cjs +10 -0
  54. package/spec/ComponentLoader.js +2 -38
  55. package/spec/ESModule.mjs +11 -0
  56. package/spec/Network.js +32 -11
  57. package/spec/NetworkSync.js +892 -0
  58. package/spec/Scoping.js +27 -42
  59. package/spec/Subgraph.js +6 -11
  60. package/spec/fixtures/componentloader/components/Output.js +1 -1
  61. package/spec/fixtures/componentloader/components/Repeat.ts +1 -1
  62. package/spec/fixtures/componentloader/components/RepeatAsync.coffee +1 -1
  63. package/spec/fixtures/componentloader/node_modules/example/components/Forward.js +1 -1
  64. package/spec/fixtures/componentloader/node_modules/example/package.json +1 -1
  65. package/spec/fixtures/componentloader/package.json +1 -1
  66. package/spec/fixtures/componentloader/spec/Repeat.yaml +1 -1
  67. package/src/.eslintrc +9 -2
  68. package/src/components/Graph.js +105 -71
  69. package/src/lib/AsCallback.js +71 -16
  70. package/src/lib/AsComponent.js +4 -3
  71. package/src/lib/BaseNetwork.js +48 -15
  72. package/src/lib/BasePort.js +43 -9
  73. package/src/lib/Component.js +8 -8
  74. package/src/lib/ComponentLoader.js +3 -4
  75. package/src/lib/IP.js +7 -4
  76. package/src/lib/InPort.js +86 -21
  77. package/src/lib/InternalSocket.js +49 -9
  78. package/src/lib/LegacyNetwork.js +2 -2
  79. package/src/lib/Network.js +2 -2
  80. package/src/lib/NoFlo.js +15 -13
  81. package/src/lib/OutPort.js +83 -22
  82. package/src/lib/Platform.js +9 -4
  83. package/src/lib/Ports.js +9 -11
  84. package/src/lib/ProcessInput.js +7 -9
  85. package/src/lib/ProcessOutput.js +1 -1
  86. package/src/lib/loader/NodeJs.js +122 -116
  87. package/src/lib/loader/register.js +2 -2
  88. /package/{karma.config.js → karma.config.cjs} +0 -0
  89. /package/{webpack.config.js → webpack.config.cjs} +0 -0
@@ -6,7 +6,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  // NoFlo may be freely distributed under the MIT license
7
7
  /* eslint-disable no-underscore-dangle */
8
8
  const debug_1 = require("debug");
9
- const debugComponent = debug_1.default('noflo:component');
9
+ const IP_js_1 = require("./IP.js"); // eslint-disable-line no-unused-vars
10
+ const debugComponent = (0, debug_1.default)('noflo:component');
10
11
  class ProcessInput {
11
12
  /**
12
13
  * @param {import("./Ports").InPorts} ports - Component inports
@@ -71,13 +72,9 @@ class ProcessInput {
71
72
  // Returns true if a port (or ports joined by logical AND) has a new IP
72
73
  // Passing a validation callback as a last argument allows more selective
73
74
  // checking of packets.
74
- /**
75
- * @callback HasValidationCallback
76
- * @param {IP} ip
77
- * @returns {boolean}
78
- */
79
75
  /**
80
76
  * @typedef {string|Array<string|number>} GetArgument
77
+ * @typedef {import("./InPort").HasValidationCallback} HasValidationCallback
81
78
  */
82
79
  /**
83
80
  * @typedef {GetArgument|HasValidationCallback} HasArgument
@@ -86,13 +83,14 @@ class ProcessInput {
86
83
  * @param {...HasArgument} params
87
84
  */
88
85
  has(...params) {
86
+ /** @type {HasValidationCallback} */
89
87
  let validate;
90
88
  let args = params.filter((p) => typeof p !== 'function');
91
89
  if (!args.length) {
92
90
  args = ['in'];
93
91
  }
94
92
  if (typeof params[params.length - 1] === 'function') {
95
- validate = params[params.length - 1];
93
+ validate = /** @type {HasValidationCallback} */ (params[params.length - 1]);
96
94
  }
97
95
  else {
98
96
  validate = () => true;
@@ -107,7 +105,8 @@ class ProcessInput {
107
105
  if (!portImpl.isAddressable()) {
108
106
  throw new Error(`Non-addressable ports, access must be with string ${port[0]}`);
109
107
  }
110
- if (!portImpl.has(this.scope, port[1], validate)) {
108
+ const portIdx = (typeof port[1] === 'string') ? parseInt(port[1], 10) : port[1];
109
+ if (!portImpl.has(this.scope, portIdx, validate)) {
111
110
  return false;
112
111
  }
113
112
  }
@@ -248,7 +247,7 @@ class ProcessInput {
248
247
  }
249
248
  else {
250
249
  const portImpl = /** @type {import("./InPort").default} */ (this.ports.ports[name]);
251
- ip = portImpl.get(this.scope, idx);
250
+ ip = portImpl.get(this.scope, idxName);
252
251
  res.push(ip);
253
252
  }
254
253
  }
@@ -6,7 +6,7 @@ export default class ProcessOutput {
6
6
  constructor(ports: import("./Ports").OutPorts, context: import("./ProcessContext").default);
7
7
  ports: import("./Ports").OutPorts;
8
8
  context: import("./ProcessContext").default;
9
- nodeInstance: import("./Component").Component;
9
+ nodeInstance: import("./Component.js").Component;
10
10
  ip: IP;
11
11
  result: {
12
12
  [x: string]: any;
@@ -47,4 +47,4 @@ export default class ProcessOutput {
47
47
  */
48
48
  done(error?: Error | Array<Error>): void;
49
49
  }
50
- import IP from "./IP";
50
+ import IP from "./IP.js";
@@ -6,8 +6,8 @@
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  /* eslint-disable no-underscore-dangle */
8
8
  const debug_1 = require("debug");
9
- const IP_1 = require("./IP");
10
- const debugComponent = debug_1.default('noflo:component');
9
+ const IP_js_1 = require("./IP.js");
10
+ const debugComponent = (0, debug_1.default)('noflo:component');
11
11
  // Checks if a value is an Error
12
12
  /**
13
13
  * @param {any} err
@@ -40,11 +40,11 @@ class ProcessOutput {
40
40
  if (this.ports.ports.error
41
41
  && (this.ports.ports.error.isAttached() || !this.ports.ports.error.isRequired())) {
42
42
  if (errs.length > 1) {
43
- this.sendIP('error', new IP_1.default('openBracket'));
43
+ this.sendIP('error', new IP_js_1.default('openBracket'));
44
44
  }
45
45
  errs.forEach((e) => { this.sendIP('error', e); });
46
46
  if (errs.length > 1) {
47
- this.sendIP('error', new IP_1.default('closeBracket'));
47
+ this.sendIP('error', new IP_js_1.default('closeBracket'));
48
48
  }
49
49
  }
50
50
  else {
@@ -58,7 +58,7 @@ class ProcessOutput {
58
58
  * @returns {void}
59
59
  */
60
60
  sendIP(port, packet) {
61
- const ip = IP_1.default.isIP(packet) ? packet : new IP_1.default('data', packet);
61
+ const ip = IP_js_1.default.isIP(packet) ? packet : new IP_js_1.default('data', packet);
62
62
  if ((this.scope !== null) && (ip.scope === null)) {
63
63
  ip.scope = this.scope;
64
64
  }
@@ -55,7 +55,6 @@ export function register(loader: import("../ComponentLoader").ComponentLoader, c
55
55
  export function dynamicLoad(name: string, cPath: string, metadata: any, callback: ModuleLoadingCallback): void;
56
56
  export type ErrorableCallback = (error: Error | null) => any;
57
57
  export type TranspileCallback = (error: Error | null, source?: string) => void;
58
- export type EvaluationCallback = (error: Error | null, module?: any | Function) => void;
59
58
  export type SourceCallback = (error: Error | null, source?: any, name?: string, library?: string, code?: string, language?: string, tests?: string) => void;
60
59
  export type RegistrationCallback = (error: Error | null, modules?: {
61
60
  [x: string]: string;
@@ -11,7 +11,10 @@ const path = require("path");
11
11
  const fs = require("fs");
12
12
  const manifest = require("fbp-manifest");
13
13
  const fbpGraph = require("fbp-graph");
14
- const utils = require("../Utils");
14
+ const util_1 = require("util");
15
+ const utils = require("../Utils.js");
16
+ const writeFile = (0, util_1.promisify)(fs.writeFile);
17
+ const readFile = (0, util_1.promisify)(fs.readFile);
15
18
  // Type loading CoffeeScript compiler
16
19
  let CoffeeScript;
17
20
  try {
@@ -45,15 +48,14 @@ catch (e) {
45
48
  * @param {string} name
46
49
  * @param {string} source
47
50
  * @param {string} language
48
- * @param {TranspileCallback} callback
49
- * @returns {void}
51
+ * @returns {Promise<string>}
50
52
  */
51
- function transpileSource(packageId, name, source, language, callback) {
53
+ function transpileSource(packageId, name, source, language) {
52
54
  let src;
53
55
  switch (language) {
54
56
  case 'coffeescript': {
55
57
  if (!CoffeeScript) {
56
- callback(new Error(`Unsupported component source language ${language} for ${packageId}/${name}: no CoffeeScript compiler installed`));
58
+ return Promise.reject(new Error(`Unsupported component source language ${language} for ${packageId}/${name}: no CoffeeScript compiler installed`));
57
59
  }
58
60
  try {
59
61
  src = CoffeeScript.compile(source, {
@@ -61,14 +63,13 @@ function transpileSource(packageId, name, source, language, callback) {
61
63
  });
62
64
  }
63
65
  catch (err) {
64
- callback(err);
65
- return;
66
+ return Promise.reject(err);
66
67
  }
67
68
  break;
68
69
  }
69
70
  case 'typescript': {
70
71
  if (!typescript) {
71
- callback(new Error(`Unsupported component source language ${language} for ${packageId}/${name}: no TypeScript compiler installed`));
72
+ return Promise.reject(new Error(`Unsupported component source language ${language} for ${packageId}/${name}: no TypeScript compiler installed`));
72
73
  }
73
74
  try {
74
75
  src = typescript.transpile(source, {
@@ -77,8 +78,7 @@ function transpileSource(packageId, name, source, language, callback) {
77
78
  });
78
79
  }
79
80
  catch (err) {
80
- callback(err);
81
- return;
81
+ return Promise.reject(err);
82
82
  }
83
83
  break;
84
84
  }
@@ -90,27 +90,19 @@ function transpileSource(packageId, name, source, language, callback) {
90
90
  break;
91
91
  }
92
92
  default: {
93
- callback(new Error(`Unsupported component source language ${language} for ${packageId}/${name}`));
94
- return;
93
+ return Promise.reject(new Error(`Unsupported component source language ${language} for ${packageId}/${name}`));
95
94
  }
96
95
  }
97
- callback(null, src);
96
+ return Promise.resolve(src);
98
97
  }
99
- /**
100
- * @callback EvaluationCallback
101
- * @param {Error|null} error
102
- * @param {Object|Function} [module]
103
- * @returns {void}
104
- */
105
98
  /**
106
99
  * @param {string} baseDir
107
100
  * @param {string} packageId
108
101
  * @param {string} name
109
102
  * @param {string} source
110
- * @param {EvaluationCallback} callback
111
- * @returns {void}
103
+ * @returns {Promise<Object|Function>}
112
104
  */
113
- function evaluateModule(baseDir, packageId, name, source, callback) {
105
+ function evaluateModule(baseDir, packageId, name, source) {
114
106
  const Module = require('module');
115
107
  let implementation;
116
108
  try {
@@ -125,14 +117,12 @@ function evaluateModule(baseDir, packageId, name, source, callback) {
125
117
  implementation = moduleImpl.exports;
126
118
  }
127
119
  catch (e) {
128
- callback(e);
129
- return;
120
+ return Promise.reject(e);
130
121
  }
131
122
  if ((typeof implementation !== 'function') && (typeof implementation.getComponent !== 'function')) {
132
- callback(new Error(`Provided source for ${packageId}/${name} failed to create a runnable component`));
133
- return;
123
+ return Promise.reject(new Error(`Provided source for ${packageId}/${name} failed to create a runnable component`));
134
124
  }
135
- callback(null, implementation);
125
+ return Promise.resolve(implementation);
136
126
  }
137
127
  /**
138
128
  * @param {import("../ComponentLoader").ComponentLoader} loader
@@ -168,28 +158,29 @@ function registerSpecs(loader, packageId, name, specs) {
168
158
  }
169
159
  /**
170
160
  * @param {import("../ComponentLoader").ComponentLoader} loader
171
- * @param {Object} module
172
- * @param {Object} component
161
+ * @param {import("fbp-manifest/dist/lib/list").FbpManifestModule} module
162
+ * @param {import("fbp-manifest/dist/lib/list").FbpManifestComponent} component
173
163
  * @param {string} source
174
164
  * @param {string} language
175
- * @param {TranspileCallback} callback
176
- * @returns {void}
165
+ * @returns {Promise<void>}
177
166
  */
178
- function transpileAndRegisterForModule(loader, module, component, source, language, callback) {
179
- transpileSource(module.name, component.name, source, language, (transpileError, src) => {
180
- if (transpileError) {
181
- callback(transpileError);
182
- return;
183
- }
167
+ function transpileAndRegisterForModule(loader, module, component, source, language) {
168
+ return transpileSource(module.name, component.name, source, language)
169
+ .then((src) => {
184
170
  const moduleBase = path.resolve(loader.baseDir, module.base);
185
- evaluateModule(moduleBase, module.name, component.name, src, (evalError, implementation) => {
186
- if (evalError) {
187
- callback(evalError);
188
- return;
189
- }
190
- registerSources(loader, module.name, component.name, source, language);
191
- registerSpecs(loader, module.name, component.name, component.tests);
192
- loader.registerComponent(module.name, component.name, implementation, callback);
171
+ return evaluateModule(moduleBase, module.name, component.name, src);
172
+ })
173
+ .then((implementation) => {
174
+ registerSources(loader, module.name, component.name, source, language);
175
+ registerSpecs(loader, module.name, component.name, component.tests || '');
176
+ return new Promise((resolve, reject) => {
177
+ loader.registerComponent(module.name, component.name, implementation, (err) => {
178
+ if (err) {
179
+ reject(err);
180
+ return;
181
+ }
182
+ resolve();
183
+ });
193
184
  });
194
185
  });
195
186
  }
@@ -206,9 +197,14 @@ function setSource(loader, packageId, name, source, language, callback) {
206
197
  transpileAndRegisterForModule(loader, {
207
198
  name: packageId,
208
199
  base: '',
200
+ components: [],
201
+ runtime: 'noflo',
209
202
  }, {
210
203
  name,
211
- }, source, language, callback);
204
+ }, source, language)
205
+ .then(() => {
206
+ callback(null);
207
+ }, callback);
212
208
  }
213
209
  exports.setSource = setSource;
214
210
  /**
@@ -382,17 +378,18 @@ function registerCustomLoaders(loader, componentLoaders, callback) {
382
378
  }
383
379
  /**
384
380
  * @param {import("../ComponentLoader").ComponentLoader} loader
385
- * @param {Array<Object>} modules
381
+ * @param {Array<import("fbp-manifest/dist/lib/list").FbpManifestModule>} modules
386
382
  * @param {ErrorableCallback} callback
387
383
  */
388
384
  function registerModules(loader, modules, callback) {
389
385
  const compatible = modules.filter((m) => ['noflo', 'noflo-nodejs'].includes(m.runtime));
386
+ /** @type {string[]} */
390
387
  const componentLoaders = [];
391
388
  Promise.all(compatible.map((m) => {
392
389
  if (m.icon) {
393
390
  loader.setLibraryIcon(m.name, m.icon);
394
391
  }
395
- if (m.noflo != null ? m.noflo.loader : undefined) {
392
+ if (m.noflo && m.noflo.loader) {
396
393
  const loaderPath = path.resolve(loader.baseDir, m.base, m.noflo.loader);
397
394
  componentLoaders.push(loaderPath);
398
395
  }
@@ -400,19 +397,9 @@ function registerModules(loader, modules, callback) {
400
397
  const language = utils.guessLanguageFromFilename(c.path);
401
398
  if (language === 'typescript' || language === 'coffeescript') {
402
399
  // We can't require a module that requires transpilation, go the setSource route
403
- fs.readFile(path.resolve(loader.baseDir, c.path), 'utf-8', (fsErr, source) => {
404
- if (fsErr) {
405
- reject(fsErr);
406
- return;
407
- }
408
- transpileAndRegisterForModule(loader, m, c, source, language, (err) => {
409
- if (err) {
410
- reject(err);
411
- return;
412
- }
413
- resolve();
414
- });
415
- });
400
+ readFile(path.resolve(loader.baseDir, c.path), 'utf-8')
401
+ .then((source) => transpileAndRegisterForModule(loader, m, c, source, language))
402
+ .then(resolve, reject);
416
403
  return;
417
404
  }
418
405
  registerSpecs(loader, m.name, c.name, c.tests);
@@ -432,51 +419,59 @@ function registerModules(loader, modules, callback) {
432
419
  const dynamicLoader = {
433
420
  /**
434
421
  * @param {import("../ComponentLoader").ComponentLoader} loader
435
- * @param {Object} manifestOptions
422
+ * @param {import("fbp-manifest/dist/lib/list").FbpManifestOptions} manifestOptions
436
423
  * @param {Function} callback
437
424
  */
438
425
  listComponents(loader, manifestOptions, callback) {
439
426
  const opts = manifestOptions;
440
427
  opts.discover = true;
441
- manifest.list.list(loader.baseDir, opts, (err, modules) => {
442
- if (err) {
443
- callback(err);
444
- return;
445
- }
446
- registerModules(loader, modules, (err2) => {
447
- if (err2) {
448
- callback(err2);
428
+ manifest.list.list(loader.baseDir, opts)
429
+ .then((modules) => new Promise((resolve, reject) => {
430
+ registerModules(loader, modules, (err) => {
431
+ if (err) {
432
+ reject(err);
449
433
  return;
450
434
  }
451
- callback(null, modules);
435
+ resolve(modules);
452
436
  });
437
+ }))
438
+ .then((modules) => {
439
+ callback(null, modules);
440
+ }, (err) => {
441
+ callback(err);
453
442
  });
454
443
  },
455
444
  };
456
445
  const manifestLoader = {
457
446
  /**
458
447
  * @param {import("../ComponentLoader").ComponentLoader} loader
459
- * @param {Object} options
448
+ * @param {import("fbp-manifest/dist/lib/list").FbpManifestOptions} options
460
449
  * @param {Object} manifestContents
461
- * @param {ErrorableCallback} callback
450
+ * @param {import("fbp-manifest/src/lib/list").FbpManifestDocument} manifestContents
451
+ * @returns {Promise<import("fbp-manifest/dist/lib/list").FbpManifestDocument>}
462
452
  */
463
- writeCache(loader, options, manifestContents, callback) {
464
- const filePath = path.resolve(loader.baseDir, options.manifest);
465
- fs.writeFile(filePath, JSON.stringify(manifestContents, null, 2), { encoding: 'utf-8' }, callback);
453
+ writeCache(loader, options, manifestContents) {
454
+ const manifestName = options.manifest || 'fbp.json';
455
+ const filePath = path.resolve(loader.baseDir, manifestName);
456
+ return writeFile(filePath, JSON.stringify(manifestContents, null, 2), {
457
+ encoding: 'utf-8',
458
+ })
459
+ .then(() => manifestContents);
466
460
  },
467
461
  /**
468
462
  * @param {import("../ComponentLoader").ComponentLoader} loader
469
- * @param {Object} options
470
- * @param {Function} callback
463
+ * @param {import("fbp-manifest/dist/lib/list").FbpManifestOptions} options
464
+ * @returns {Promise<import("fbp-manifest/dist/lib/list").FbpManifestDocument>}
471
465
  */
472
- readCache(loader, options, callback) {
473
- const opts = options;
474
- opts.discover = false;
475
- manifest.load.load(loader.baseDir, opts, callback);
466
+ readCache(loader, options) {
467
+ return manifest.load.load(loader.baseDir, {
468
+ ...options,
469
+ discover: false,
470
+ });
476
471
  },
477
472
  /**
478
473
  * @param {import("../ComponentLoader").ComponentLoader} loader
479
- * @returns {Object}
474
+ * @returns {import("fbp-manifest/dist/lib/list").FbpManifestOptions}
480
475
  */
481
476
  prepareManifestOptions(loader) {
482
477
  const l = loader;
@@ -498,37 +493,41 @@ const manifestLoader = {
498
493
  * @param {Function} callback
499
494
  */
500
495
  listComponents(loader, manifestOptions, callback) {
501
- this.readCache(loader, manifestOptions, (err, manifestContents) => {
502
- if (err) {
503
- if (!loader.options.discover) {
504
- callback(err);
505
- return;
506
- }
496
+ this.readCache(loader, manifestOptions)
497
+ .catch((err) => {
498
+ if (!loader.options.discover) {
499
+ return Promise.reject(err);
500
+ }
501
+ return new Promise((resolve, reject) => {
507
502
  dynamicLoader.listComponents(loader, manifestOptions, (err2, modules) => {
508
503
  if (err2) {
509
- callback(err2);
504
+ reject(err2);
510
505
  return;
511
506
  }
512
- this.writeCache(loader, manifestOptions, {
513
- version: 1,
514
- modules,
515
- }, (err3) => {
516
- if (err3) {
517
- callback(err3);
518
- return;
519
- }
520
- callback(null, modules);
521
- });
507
+ resolve(modules);
522
508
  });
523
- return;
524
- }
525
- registerModules(loader, manifestContents.modules, (err2) => {
526
- if (err2) {
527
- callback(err2);
509
+ })
510
+ .then((modules) => {
511
+ const manifestContents = {
512
+ version: 1,
513
+ modules,
514
+ };
515
+ return this
516
+ .writeCache(loader, manifestOptions, manifestContents)
517
+ .then(() => manifestContents);
518
+ });
519
+ })
520
+ .then((manifestContents) => {
521
+ registerModules(loader, manifestContents.modules, (err) => {
522
+ if (err) {
523
+ callback(err);
528
524
  return;
529
525
  }
530
526
  callback(null, manifestContents.modules);
531
527
  });
528
+ })
529
+ .catch((err) => {
530
+ callback(err);
532
531
  });
533
532
  },
534
533
  };
@@ -1 +1 @@
1
- export * from "./NodeJs";
1
+ export * from "./NodeJs.js";
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
5
9
  }) : (function(o, m, k, k2) {
6
10
  if (k2 === undefined) k2 = k;
7
11
  o[k2] = m[k];
@@ -13,8 +17,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
13
17
  /* eslint-disable
14
18
  global-require,
15
19
  */
16
- const Platform_1 = require("../Platform");
17
- if (Platform_1.isBrowser()) {
20
+ const Platform_js_1 = require("../Platform.js");
21
+ if ((0, Platform_js_1.isBrowser)()) {
18
22
  throw new Error('Generate NoFlo component loader for browsers with noflo-component-loader');
19
23
  }
20
- __exportStar(require("./NodeJs"), exports);
24
+ __exportStar(require("./NodeJs.js"), exports);
package/package.json CHANGED
@@ -8,7 +8,7 @@
8
8
  "noflo"
9
9
  ],
10
10
  "author": "Henri Bergius <henri.bergius@iki.fi>",
11
- "version": "1.4.2",
11
+ "version": "1.5.0",
12
12
  "license": "MIT",
13
13
  "engines": {
14
14
  "node": ">= 6"
@@ -17,7 +17,7 @@
17
17
  "debug": "^4.0.1",
18
18
  "fbp": "^1.5.0",
19
19
  "fbp-graph": "^0.7.0",
20
- "fbp-manifest": "^0.2.7",
20
+ "fbp-manifest": "^0.3.1",
21
21
  "get-function-params": "^2.0.6"
22
22
  },
23
23
  "devDependencies": {
@@ -25,13 +25,13 @@
25
25
  "@types/node": "^14.14.2",
26
26
  "chai": "^4.0.0",
27
27
  "coffeescript": "^2.2.1",
28
- "coveralls": "^3.0.0",
29
- "eslint": "^7.7.0",
30
- "eslint-config-airbnb-base": "^14.2.0",
28
+ "coveralls": "^2.7.1",
29
+ "eslint": "^8.2.0",
30
+ "eslint-config-airbnb-base": "^15.0.0",
31
31
  "eslint-plugin-import": "^2.22.0",
32
32
  "events": "^3.2.0",
33
33
  "flowtrace": "^0.1.8",
34
- "karma": "^5.1.1",
34
+ "karma": "^6.0.0",
35
35
  "karma-chai": "^0.1.0",
36
36
  "karma-chrome-launcher": "^3.1.0",
37
37
  "karma-mocha": "^2.0.1",
@@ -48,6 +48,7 @@
48
48
  "webpack-cli": "^4.0.0"
49
49
  },
50
50
  "main": "./lib/NoFlo",
51
+ "module": "./src/lib/NoFlo.js",
51
52
  "types": "./lib/NoFlo.d.ts",
52
53
  "bin": {
53
54
  "noflo": "./bin/noflo",
@@ -60,14 +61,18 @@
60
61
  },
61
62
  "scripts": {
62
63
  "lint": "eslint .",
63
- "build:node": "tsc",
64
- "build:browser": "webpack",
64
+ "dirname:to": "sed -i -e 's/import\\.meta\\.dirname/__dirname/g' src/lib/loader/NodeJs.js",
65
+ "build:node": "npm run dirname:to && tsc && npm run dirname:from",
66
+ "dirname:from": "sed -i -e 's/__dirname/import\\.meta\\.dirname/g' src/lib/loader/NodeJs.js",
67
+ "build:browser": "webpack --config webpack.config.cjs",
65
68
  "build": "npm run build:node && npm run build:browser",
66
69
  "postbuild": "replace 'node/events' 'events' lib -r",
67
70
  "pretest": "npm run lint && npm run build",
68
- "test:node": "nyc mocha --require spec/utils/inject.js spec",
69
- "test:browser": "karma start karma.config.js",
70
- "test": "npm run test:node && npm run test:browser"
71
+ "test:esmodules": "node --test spec/*.mjs",
72
+ "test:commonjs": "node --test spec/*.cjs",
73
+ "test:node": "nyc mocha --require spec/utils/inject.js spec/*.js",
74
+ "test:browser": "karma start karma.config.cjs",
75
+ "test": "npm run test:esmodules && npm run test:commonjs && npm run test:node && npm run test:browser"
71
76
  },
72
77
  "docco_husky": {
73
78
  "output_dir": "docs",
package/spec/.eslintrc CHANGED
@@ -7,6 +7,7 @@
7
7
  "global-require": 0,
8
8
  "import/no-extraneous-dependencies": 0,
9
9
  "import/no-unresolved": 0,
10
+ "import/extensions": 0,
10
11
  "no-console": 0,
11
12
  "no-param-reassign": 0,
12
13
  "no-plusplus": 0,
@@ -15,6 +16,8 @@
15
16
  "no-shadow": 0,
16
17
  "no-undef": 0,
17
18
  "no-unused-expressions": 0,
18
- "prefer-destructuring": 0
19
+ "prefer-destructuring": 0,
20
+ "function-paren-newline": 0,
21
+ "function-call-argument-newline": 0
19
22
  }
20
- }
23
+ }
@@ -70,20 +70,16 @@ describe('asCallback interface', () => {
70
70
  return c;
71
71
  };
72
72
 
73
- before((done) => {
73
+ before(() => {
74
74
  loader = new noflo.ComponentLoader(baseDir);
75
- loader.listComponents((err) => {
76
- if (err) {
77
- done(err);
78
- return;
79
- }
80
- loader.registerComponent('process', 'Async', processAsync);
81
- loader.registerComponent('process', 'Error', processError);
82
- loader.registerComponent('process', 'Values', processValues);
83
- loader.registerComponent('process', 'NeverSend', neverSend);
84
- loader.registerComponent('process', 'Streamify', streamify);
85
- done();
86
- });
75
+ return loader.listComponents()
76
+ .then(() => {
77
+ loader.registerComponent('process', 'Async', processAsync);
78
+ loader.registerComponent('process', 'Error', processError);
79
+ loader.registerComponent('process', 'Values', processValues);
80
+ loader.registerComponent('process', 'NeverSend', neverSend);
81
+ loader.registerComponent('process', 'Streamify', streamify);
82
+ });
87
83
  });
88
84
  describe('with a non-existing component', () => {
89
85
  let wrapped = null;
@@ -202,8 +202,11 @@ describe('asComponent interface', () => {
202
202
  before(function () {
203
203
  if (isBrowser && (typeof window.Promise === 'undefined')) { return this.skip(); }
204
204
  });
205
- const func = (hello) => new Promise((resolve) => setTimeout(() => resolve(`Hello ${hello}`),
206
- 5));
205
+ const func = (hello) => new Promise((resolve) => {
206
+ setTimeout(() => {
207
+ resolve(`Hello ${hello}`);
208
+ }, 5);
209
+ });
207
210
  it('should be possible to componentize', (done) => {
208
211
  const component = () => noflo.asComponent(func);
209
212
  loader.registerComponent('ascomponent', 'promise-one', component, done);
@@ -227,8 +230,11 @@ describe('asComponent interface', () => {
227
230
  this.skip();
228
231
  }
229
232
  });
230
- const func = (hello) => new Promise((resolve, reject) => setTimeout(() => reject(new Error(`Hello ${hello}`)),
231
- 5));
233
+ const func = (hello) => new Promise((resolve, reject) => {
234
+ setTimeout(() => {
235
+ reject(new Error(`Hello ${hello}`));
236
+ }, 5);
237
+ });
232
238
  it('should be possible to componentize', (done) => {
233
239
  const component = () => noflo.asComponent(func);
234
240
  loader.registerComponent('ascomponent', 'sync-throw', component, done);