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.
- package/.ecrc +3 -0
- package/.eslintignore +2 -0
- package/{CHANGES.md → CHANGELOG.md} +520 -523
- package/README.md +1 -1
- package/bin/noflo-cache-preheat +17 -15
- package/components/Graph.d.ts +50 -15
- package/components/Graph.js +94 -68
- package/examples/http/HelloController.js +9 -6
- package/examples/spreadsheet/parse.fbp +3 -3
- package/lib/AsCallback.d.ts +22 -9
- package/lib/AsCallback.js +69 -18
- package/lib/AsComponent.d.ts +1 -1
- package/lib/AsComponent.js +5 -3
- package/lib/BaseNetwork.d.ts +16 -6
- package/lib/BaseNetwork.js +65 -31
- package/lib/BasePort.d.ts +39 -12
- package/lib/BasePort.js +34 -6
- package/lib/Component.d.ts +8 -8
- package/lib/Component.js +23 -20
- package/lib/ComponentLoader.d.ts +3 -4
- package/lib/ComponentLoader.js +9 -10
- package/lib/IP.d.ts +12 -8
- package/lib/IP.js +6 -4
- package/lib/InPort.d.ts +81 -10
- package/lib/InPort.js +83 -19
- package/lib/InternalSocket.d.ts +53 -7
- package/lib/InternalSocket.js +51 -14
- package/lib/LegacyNetwork.d.ts +12 -2
- package/lib/LegacyNetwork.js +5 -5
- package/lib/Network.d.ts +13 -2
- package/lib/Network.js +10 -10
- package/lib/NoFlo.d.ts +13 -13
- package/lib/NoFlo.js +29 -27
- package/lib/OutPort.d.ts +74 -32
- package/lib/OutPort.js +79 -23
- package/lib/Platform.d.ts +1 -1
- package/lib/Platform.js +9 -4
- package/lib/Ports.d.ts +14 -21
- package/lib/Ports.js +11 -13
- package/lib/ProcessInput.d.ts +5 -9
- package/lib/ProcessInput.js +8 -9
- package/lib/ProcessOutput.d.ts +2 -2
- package/lib/ProcessOutput.js +5 -5
- package/lib/loader/NodeJs.d.ts +0 -1
- package/lib/loader/NodeJs.js +104 -105
- package/lib/loader/register.d.ts +1 -1
- package/lib/loader/register.js +8 -4
- package/package.json +16 -11
- package/spec/.eslintrc +5 -2
- package/spec/AsCallback.js +9 -13
- package/spec/AsComponent.js +10 -4
- package/spec/AsPromise.js +38 -0
- package/spec/CommonJS.cjs +10 -0
- package/spec/ComponentLoader.js +2 -38
- package/spec/ESModule.mjs +11 -0
- package/spec/Network.js +32 -11
- package/spec/NetworkSync.js +892 -0
- package/spec/Scoping.js +27 -42
- package/spec/Subgraph.js +6 -11
- package/spec/fixtures/componentloader/components/Output.js +1 -1
- package/spec/fixtures/componentloader/components/Repeat.ts +1 -1
- package/spec/fixtures/componentloader/components/RepeatAsync.coffee +1 -1
- package/spec/fixtures/componentloader/node_modules/example/components/Forward.js +1 -1
- package/spec/fixtures/componentloader/node_modules/example/package.json +1 -1
- package/spec/fixtures/componentloader/package.json +1 -1
- package/spec/fixtures/componentloader/spec/Repeat.yaml +1 -1
- package/src/.eslintrc +9 -2
- package/src/components/Graph.js +105 -71
- package/src/lib/AsCallback.js +71 -16
- package/src/lib/AsComponent.js +4 -3
- package/src/lib/BaseNetwork.js +48 -15
- package/src/lib/BasePort.js +43 -9
- package/src/lib/Component.js +8 -8
- package/src/lib/ComponentLoader.js +3 -4
- package/src/lib/IP.js +7 -4
- package/src/lib/InPort.js +86 -21
- package/src/lib/InternalSocket.js +49 -9
- package/src/lib/LegacyNetwork.js +2 -2
- package/src/lib/Network.js +2 -2
- package/src/lib/NoFlo.js +15 -13
- package/src/lib/OutPort.js +83 -22
- package/src/lib/Platform.js +9 -4
- package/src/lib/Ports.js +9 -11
- package/src/lib/ProcessInput.js +7 -9
- package/src/lib/ProcessOutput.js +1 -1
- package/src/lib/loader/NodeJs.js +122 -116
- package/src/lib/loader/register.js +2 -2
- /package/{karma.config.js → karma.config.cjs} +0 -0
- /package/{webpack.config.js → webpack.config.cjs} +0 -0
package/lib/ProcessInput.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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,
|
|
250
|
+
ip = portImpl.get(this.scope, idxName);
|
|
252
251
|
res.push(ip);
|
|
253
252
|
}
|
|
254
253
|
}
|
package/lib/ProcessOutput.d.ts
CHANGED
|
@@ -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";
|
package/lib/ProcessOutput.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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 =
|
|
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
|
}
|
package/lib/loader/NodeJs.d.ts
CHANGED
|
@@ -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;
|
package/lib/loader/NodeJs.js
CHANGED
|
@@ -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
|
|
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
|
-
* @
|
|
49
|
-
* @returns {void}
|
|
51
|
+
* @returns {Promise<string>}
|
|
50
52
|
*/
|
|
51
|
-
function transpileSource(packageId, name, source, language
|
|
53
|
+
function transpileSource(packageId, name, source, language) {
|
|
52
54
|
let src;
|
|
53
55
|
switch (language) {
|
|
54
56
|
case 'coffeescript': {
|
|
55
57
|
if (!CoffeeScript) {
|
|
56
|
-
|
|
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
|
-
|
|
65
|
-
return;
|
|
66
|
+
return Promise.reject(err);
|
|
66
67
|
}
|
|
67
68
|
break;
|
|
68
69
|
}
|
|
69
70
|
case 'typescript': {
|
|
70
71
|
if (!typescript) {
|
|
71
|
-
|
|
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
|
-
|
|
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
|
-
|
|
94
|
-
return;
|
|
93
|
+
return Promise.reject(new Error(`Unsupported component source language ${language} for ${packageId}/${name}`));
|
|
95
94
|
}
|
|
96
95
|
}
|
|
97
|
-
|
|
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
|
-
* @
|
|
111
|
-
* @returns {void}
|
|
103
|
+
* @returns {Promise<Object|Function>}
|
|
112
104
|
*/
|
|
113
|
-
function evaluateModule(baseDir, packageId, name, source
|
|
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
|
-
|
|
129
|
-
return;
|
|
120
|
+
return Promise.reject(e);
|
|
130
121
|
}
|
|
131
122
|
if ((typeof implementation !== 'function') && (typeof implementation.getComponent !== 'function')) {
|
|
132
|
-
|
|
133
|
-
return;
|
|
123
|
+
return Promise.reject(new Error(`Provided source for ${packageId}/${name} failed to create a runnable component`));
|
|
134
124
|
}
|
|
135
|
-
|
|
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 {
|
|
172
|
-
* @param {
|
|
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
|
-
* @
|
|
176
|
-
* @returns {void}
|
|
165
|
+
* @returns {Promise<void>}
|
|
177
166
|
*/
|
|
178
|
-
function transpileAndRegisterForModule(loader, module, component, source, language
|
|
179
|
-
transpileSource(module.name, component.name, source, language
|
|
180
|
-
|
|
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
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
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
|
|
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<
|
|
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
|
|
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
|
-
|
|
404
|
-
|
|
405
|
-
|
|
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 {
|
|
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
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
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
|
-
|
|
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 {
|
|
448
|
+
* @param {import("fbp-manifest/dist/lib/list").FbpManifestOptions} options
|
|
460
449
|
* @param {Object} manifestContents
|
|
461
|
-
* @param {
|
|
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
|
|
464
|
-
const
|
|
465
|
-
|
|
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 {
|
|
470
|
-
* @
|
|
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
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
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 {
|
|
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
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
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
|
-
|
|
504
|
+
reject(err2);
|
|
510
505
|
return;
|
|
511
506
|
}
|
|
512
|
-
|
|
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
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
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
|
};
|
package/lib/loader/register.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from "./NodeJs";
|
|
1
|
+
export * from "./NodeJs.js";
|
package/lib/loader/register.js
CHANGED
|
@@ -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.
|
|
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
|
|
17
|
-
if (
|
|
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.
|
|
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.
|
|
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": "^
|
|
29
|
-
"eslint": "^
|
|
30
|
-
"eslint-config-airbnb-base": "^
|
|
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": "^
|
|
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
|
-
"
|
|
64
|
-
"build:
|
|
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:
|
|
69
|
-
"test:
|
|
70
|
-
"test": "
|
|
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
|
+
}
|
package/spec/AsCallback.js
CHANGED
|
@@ -70,20 +70,16 @@ describe('asCallback interface', () => {
|
|
|
70
70
|
return c;
|
|
71
71
|
};
|
|
72
72
|
|
|
73
|
-
before((
|
|
73
|
+
before(() => {
|
|
74
74
|
loader = new noflo.ComponentLoader(baseDir);
|
|
75
|
-
loader.listComponents(
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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;
|
package/spec/AsComponent.js
CHANGED
|
@@ -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) =>
|
|
206
|
-
|
|
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) =>
|
|
231
|
-
|
|
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);
|