react 0.0.1 → 0.2.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/.npmignore +6 -0
- package/Jakefile.js +8 -0
- package/README.md +233 -83
- package/examples/ast1.js +26 -0
- package/examples/chain-events1.js +34 -0
- package/examples/chain1.js +19 -0
- package/examples/default1.js +40 -0
- package/examples/fstr-events1.js +51 -0
- package/examples/fstr1.js +36 -0
- package/examples/pcode1.js +22 -0
- package/jake-tasks/jake-test.js +64 -0
- package/lib/base-task.js +115 -0
- package/lib/cb-task.js +67 -0
- package/lib/chain.js +148 -0
- package/lib/core.js +96 -0
- package/lib/dsl.js +122 -0
- package/lib/error.js +37 -0
- package/lib/event-manager.js +57 -0
- package/lib/finalcb-first-task.js +59 -0
- package/lib/finalcb-task.js +54 -0
- package/lib/fstr.js +110 -0
- package/lib/id.js +10 -0
- package/lib/input-parser.js +44 -0
- package/lib/parse.js +29 -0
- package/lib/pcode.js +164 -0
- package/lib/ret-task.js +67 -0
- package/lib/status.js +5 -0
- package/lib/task.js +234 -0
- package/lib/validate.js +102 -0
- package/lib/vcon.js +76 -0
- package/oldExamples/analyze.js +29 -0
- package/oldExamples/analyze2.js +29 -0
- package/oldExamples/example10-dsl.js +63 -0
- package/oldExamples/example11.js +62 -0
- package/oldExamples/example12.js +63 -0
- package/oldExamples/example13.js +63 -0
- package/oldExamples/example14.js +63 -0
- package/oldExamples/example15.js +75 -0
- package/{test → oldExamples}/example6-ast.js +4 -4
- package/{test → oldExamples}/example6-dsl.js +3 -2
- package/{test → oldExamples}/example8-ast.js +3 -2
- package/{test → oldExamples}/example8-dsl.js +3 -2
- package/oldExamples/example9-ast.js +58 -0
- package/oldExamples/example9-dsl.js +57 -0
- package/oldExamples/function-str-ex1.js +33 -0
- package/oldExamples/function-str-ex2.js +67 -0
- package/oldExamples/trait1.js +41 -0
- package/oldExamples/trait2.js +44 -0
- package/package.json +16 -6
- package/react.js +11 -1
- package/test/ast.test.js +69 -0
- package/test/cb-task.test.js +197 -0
- package/test/chain.test.js +239 -0
- package/test/core.test.js +519 -0
- package/test/dsl.test.js +237 -0
- package/test/event-manager.test.js +102 -0
- package/test/exec-options.test.js +32 -0
- package/test/finalcb-task.test.js +37 -0
- package/test/fstr.test.js +288 -0
- package/test/input-parser.test.js +62 -0
- package/test/module-use.test.js +317 -0
- package/test/pcode.test.js +321 -0
- package/test/ret-task.test.js +199 -0
- package/test/task.test.js +21 -0
- package/test/validate-cb-task.test.js +74 -0
- package/test/validate-ret-task.test.js +83 -0
- package/test/validate.test.js +218 -0
- package/test/vcon.test.js +160 -0
- package/lib/react.js +0 -228
package/lib/validate.js
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var util = require('util');
|
|
4
|
+
var sprintf = require('sprintf').sprintf;
|
|
5
|
+
var array = require('ensure-array');
|
|
6
|
+
var tutil = require('./task.js');
|
|
7
|
+
|
|
8
|
+
var AST_IS_OBJECT = 'ast must be an object with inParams, tasks, and outTask';
|
|
9
|
+
var INPARAMS_ARR_STR = 'ast.inParams must be an array of strings';
|
|
10
|
+
var TASKS_ARR = 'ast.tasks must be an array of tasks';
|
|
11
|
+
var NAMES_UNIQUE = 'ast.tasks that specify name need to be unique, duplicate:';
|
|
12
|
+
var LOCALS_NOTNULL = 'ast.locals should not be null';
|
|
13
|
+
var DUP_OUTPUTS = 'multiple tasks output the same param, must be unique. param';
|
|
14
|
+
|
|
15
|
+
var validateInParams, validateTasks, validateOutTask, validateTaskNamesUnique;
|
|
16
|
+
var validateLocals, validateOuputsUnique;
|
|
17
|
+
|
|
18
|
+
function format_error(errmsg, obj) {
|
|
19
|
+
return sprintf('%s - %s', errmsg, util.inspect(obj));
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
validate the AST return Errors
|
|
24
|
+
@example
|
|
25
|
+
var validate = require('./validate');
|
|
26
|
+
var errors = validate(ast);
|
|
27
|
+
@returns array of errors, could be empty
|
|
28
|
+
*/
|
|
29
|
+
function validate(ast) {
|
|
30
|
+
if (!ast || !ast.inParams || !ast.tasks || !ast.outTask) return [AST_IS_OBJECT];
|
|
31
|
+
var errors = [];
|
|
32
|
+
errors = errors.concat(validateInParams(ast.inParams));
|
|
33
|
+
errors = errors.concat(validateTasks(ast.tasks));
|
|
34
|
+
errors = errors.concat(validateTaskNamesUnique(ast.tasks));
|
|
35
|
+
errors = errors.concat(tutil.validateOutTask(ast.outTask));
|
|
36
|
+
errors = errors.concat(validateLocals(ast.locals));
|
|
37
|
+
if (errors.length === 0) { // if no errors do additional validation
|
|
38
|
+
if (ast.outTask.type !== 'finalcbFirst') errors = errors.concat(validateOuputsUnique(ast.tasks));
|
|
39
|
+
errors = errors.concat(tutil.validateLocalFunctions(ast.inParams, ast.tasks, ast.locals));
|
|
40
|
+
}
|
|
41
|
+
return errors;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
@returns array of errors, could be empty
|
|
46
|
+
*/
|
|
47
|
+
function validateInParams(inParams) {
|
|
48
|
+
if (!Array.isArray(inParams) ||
|
|
49
|
+
!inParams.every(function (x) { return (typeof(x) === 'string'); })) {
|
|
50
|
+
return [INPARAMS_ARR_STR];
|
|
51
|
+
}
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
@returns array of errors, could be empty
|
|
57
|
+
*/
|
|
58
|
+
function validateTasks(tasks) {
|
|
59
|
+
if (!Array.isArray(tasks)) return [TASKS_ARR];
|
|
60
|
+
var errors = [];
|
|
61
|
+
tasks.forEach(function (t) {
|
|
62
|
+
errors = errors.concat(tutil.validate(t));
|
|
63
|
+
});
|
|
64
|
+
return errors;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function validateTaskNamesUnique(tasks) {
|
|
68
|
+
if (!Array.isArray(tasks)) return [];
|
|
69
|
+
var errors = [];
|
|
70
|
+
var namedTasks = tasks.filter(function (t) { return (t.name); });
|
|
71
|
+
var names = namedTasks.map(function (t) { return t.name; });
|
|
72
|
+
names.reduce(function (accum, name) {
|
|
73
|
+
if (accum[name]) errors.push(sprintf('%s %s', NAMES_UNIQUE, name));
|
|
74
|
+
else accum[name] = true;
|
|
75
|
+
return accum;
|
|
76
|
+
}, {});
|
|
77
|
+
return errors;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function validateLocals(locals) {
|
|
81
|
+
var errors = [];
|
|
82
|
+
if (locals === null) errors.push(LOCALS_NOTNULL);
|
|
83
|
+
return errors;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function getOutputParams(taskDef) {
|
|
87
|
+
return array(taskDef.out); //ensure array
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function validateOuputsUnique(taskDefs) {
|
|
91
|
+
var errors = [];
|
|
92
|
+
taskDefs.reduce(function (accum, t) {
|
|
93
|
+
getOutputParams(t).forEach(function (param) {
|
|
94
|
+
if (accum[param] !== undefined) errors.push(sprintf('%s: %s', DUP_OUTPUTS, param));
|
|
95
|
+
else accum[param] = true;
|
|
96
|
+
});
|
|
97
|
+
return accum;
|
|
98
|
+
}, {});
|
|
99
|
+
return errors;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
module.exports = validate;
|
package/lib/vcon.js
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var LAST_RESULTS_KEY = ':LAST_RESULTS';
|
|
4
|
+
|
|
5
|
+
function VContext() {
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
VContext.prototype.getLastResults = function () { return this.getVar(LAST_RESULTS_KEY); };
|
|
9
|
+
VContext.prototype.setLastResults = function (args) { this.setVar(LAST_RESULTS_KEY, args); };
|
|
10
|
+
|
|
11
|
+
VContext.prototype.getVar = function (name) { //name might be simple or obj.prop, also literals
|
|
12
|
+
var vConValues = this.values;
|
|
13
|
+
if (typeof(name) !== 'string') return name; // literal boolean or number
|
|
14
|
+
name = name.trim();
|
|
15
|
+
if (name === 'true') return true;
|
|
16
|
+
if (name === 'false') return false;
|
|
17
|
+
if (/^-?[0-9]+$/.test(name)) return parseInt(name, 10); //int
|
|
18
|
+
if (/^-?[0-9.]+$/.test(name)) return parseFloat(name); //float
|
|
19
|
+
var m = /^("|')([^\1]*)\1$/.exec(name); //check for quoted string " or '
|
|
20
|
+
if (m) return m[2]; // if is quoted str, return inside of the quotes
|
|
21
|
+
var nameAndProps = name.split('.');
|
|
22
|
+
return nameAndProps.reduce(function (accObj, prop) {
|
|
23
|
+
if (accObj === undefined || accObj === null) return undefined; // prevent exception
|
|
24
|
+
return accObj[prop];
|
|
25
|
+
}, vConValues); // vCon['foo']['bar']
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
Saves all the results from a task as a unit, also sets special
|
|
30
|
+
variable :LAST_RESULTS which keeps an array of the last values
|
|
31
|
+
which can be used for chaining and testing last results, etc.
|
|
32
|
+
*/
|
|
33
|
+
VContext.prototype.saveResults = function(paramArr, valuesArr) { // set values for params
|
|
34
|
+
var self = this;
|
|
35
|
+
paramArr.forEach(function (k, idx) { //save values to v context
|
|
36
|
+
self.setVar(k, (valuesArr[idx] !== undefined) ? valuesArr[idx] : null); //upgrade any undefined to null
|
|
37
|
+
});
|
|
38
|
+
this.setLastResults(valuesArr);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
VContext.prototype.setVar = function (name, value) { //name might be simple or obj.prop
|
|
42
|
+
if (!name) return; // if name is undefined or null, then discard
|
|
43
|
+
var vConValues = this.values;
|
|
44
|
+
var nameAndProps = name.split('.');
|
|
45
|
+
var lastProp = nameAndProps.pop();
|
|
46
|
+
var obj = nameAndProps.reduce(function (accObj, prop) {
|
|
47
|
+
var o = accObj[prop];
|
|
48
|
+
if (o === undefined || o === null) { // if doesn't exist create it
|
|
49
|
+
o = accObj[prop] = { };
|
|
50
|
+
}
|
|
51
|
+
return o;
|
|
52
|
+
}, vConValues); // vCon['foo']['bar']
|
|
53
|
+
obj[lastProp] = value;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
Create Variable Context using arguments passed in.
|
|
59
|
+
Ignore extra arguments passed in. Locals can be
|
|
60
|
+
passed into seed the VContext otherwise empty {}
|
|
61
|
+
will be used
|
|
62
|
+
*/
|
|
63
|
+
VContext.create = function (args, inParams, locals) {
|
|
64
|
+
var initValues = {};
|
|
65
|
+
if (locals) Object.keys(locals).forEach(function (k) { initValues[k] = locals[k]; }); // copy over keys
|
|
66
|
+
var vContext = new VContext();
|
|
67
|
+
vContext.values = args.reduce(function (vcon, x, idx) { // create vCon start with input args
|
|
68
|
+
var param = inParams[idx];
|
|
69
|
+
if (param) vcon[param] = x;
|
|
70
|
+
return vcon;
|
|
71
|
+
}, initValues);
|
|
72
|
+
return vContext;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
module.exports = VContext;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function loadUser(uid, cb) { setTimeout(cb, 100, null, "User" + uid); }
|
|
4
|
+
function loadFile(filename, cb) { setTimeout(cb, 100, null, 'Filedata' + filename); }
|
|
5
|
+
function markdown(filedata) { return 'html' + filedata; }
|
|
6
|
+
function prepareDirectory(outDirname, cb) { setTimeout(cb, 200, null, 'dircreated-' + outDirname); }
|
|
7
|
+
function writeOutput(html, user, cb) { setTimeout(cb, 300, null, html + '_bytesWritten'); }
|
|
8
|
+
function loadEmailTemplate(cb) { setTimeout(cb, 50, null, 'emailmd'); }
|
|
9
|
+
function customizeEmail(user, emailHtml, cb) { return 'cust-' + user + emailHtml; }
|
|
10
|
+
function deliverEmail(custEmailHtml, cb) { setTimeout(cb, 100, null, 'delivered-' + custEmailHtml); }
|
|
11
|
+
|
|
12
|
+
function analyze(fn) {
|
|
13
|
+
console.log(fn.toString());
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
var fn = analyze(function loadAndSend(filename, uid, outDirname, cb,
|
|
17
|
+
R, filedata, outDirName, dircreated, emailmd, emailHtml,
|
|
18
|
+
custEmailHtml, deliveredEmail, err, user, html, bytesWritten) {
|
|
19
|
+
R.async(loadUser, uid).cb(err, user)
|
|
20
|
+
.async(loadFile, filename).cb(err, filedata)
|
|
21
|
+
.sync(markdown, filedata).returns(filedata)
|
|
22
|
+
.async(prepareDirectory, outDirName).cb(dircreated)
|
|
23
|
+
.async(writeOutput, html, user).cb(err, bytesWritten).after(prepareDirectory)
|
|
24
|
+
.async(loadEmailTemplate).cb(err, emailmd)
|
|
25
|
+
.sync(markdown, emailmd).returns(emailHtml)
|
|
26
|
+
.sync(customizeEmail, user, emailHtml).returns(custEmailHtml)
|
|
27
|
+
.sync(deliverEmail, custEmailHtml).returns(deliveredEmail).after(writeOutput)
|
|
28
|
+
.finalCb(err, html, user, bytesWritten);
|
|
29
|
+
});
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function loadUser(uid, cb) { setTimeout(cb, 100, null, "User" + uid); }
|
|
4
|
+
function loadFile(filename, cb) { setTimeout(cb, 100, null, 'Filedata' + filename); }
|
|
5
|
+
function markdown(filedata) { return 'html' + filedata; }
|
|
6
|
+
function prepareDirectory(outDirname, cb) { setTimeout(cb, 200, null, 'dircreated-' + outDirname); }
|
|
7
|
+
function writeOutput(html, user, cb) { setTimeout(cb, 300, null, html + '_bytesWritten'); }
|
|
8
|
+
function loadEmailTemplate(cb) { setTimeout(cb, 50, null, 'emailmd'); }
|
|
9
|
+
function customizeEmail(user, emailHtml, cb) { return 'cust-' + user + emailHtml; }
|
|
10
|
+
function deliverEmail(custEmailHtml, cb) { setTimeout(cb, 100, null, 'delivered-' + custEmailHtml); }
|
|
11
|
+
|
|
12
|
+
function react(fn) {
|
|
13
|
+
console.log(fn.toString());
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
var fn = react(function (R, filename, uid, outDirname, cb) {
|
|
17
|
+
var filedata, outDirName, dircreated, emailmd, emailHtml,
|
|
18
|
+
custEmailHtml, deliveredEmail, err, user, html, bytesWritten;
|
|
19
|
+
R.async(loadUser).in(uid).out(err, user)
|
|
20
|
+
.async(loadFile).in(filename).out(err, filedata)
|
|
21
|
+
.sync(markdown, filedata).out(filedata)
|
|
22
|
+
.async(prepareDirectory, outDirName).out(dircreated)
|
|
23
|
+
.async(writeOutput, html, user).out(err, bytesWritten).after(prepareDirectory)
|
|
24
|
+
.async(loadEmailTemplate).out(err, emailmd)
|
|
25
|
+
.sync(markdown, emailmd).out(emailHtml)
|
|
26
|
+
.sync(customizeEmail, user, emailHtml).out(custEmailHtml)
|
|
27
|
+
.sync(deliverEmail, custEmailHtml).out(deliveredEmail).after(writeOutput)
|
|
28
|
+
.cb(err, html, user, bytesWritten);
|
|
29
|
+
});
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
var reactMod = require(__dirname+'/../lib/react.js');
|
|
4
|
+
var react = reactMod.react;
|
|
5
|
+
|
|
6
|
+
var r = react('allStart, titlesFile, numQueries, numFactors, cb').define(
|
|
7
|
+
openTitlesStream, 'titlesFile -> err, fileStream', { tasks: [
|
|
8
|
+
split, 'fileStream -> err, lineStream',
|
|
9
|
+
filterLines, 'lineStream, numQueries -> err, filteredLineStream',
|
|
10
|
+
trimLines, 'filteredLineStream -> err, trimmedLineStream',
|
|
11
|
+
recordTime, ' -> returns qStart', { after: trimLines },
|
|
12
|
+
runQuery, 'trimmedLineStream, numFactors -> err, qResults', { after: recordTime },
|
|
13
|
+
calcTime, 'qStart -> returns qTime', { after: runQuery },
|
|
14
|
+
sumTotal, 'qTime -> returns qTotal', { reduce: true }
|
|
15
|
+
], cb:'-> err, qTotal' },
|
|
16
|
+
calcTime, 'allStart -> returns allElapsed', { after: openTitlesStream }
|
|
17
|
+
).callbackDef('allElapsed, qTotal, numQueries, numFactors');
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
//new simpler syntax
|
|
22
|
+
|
|
23
|
+
var react = require('react');
|
|
24
|
+
|
|
25
|
+
var loadAndSave = react('allStart, titlesFile, numQueries, numFactors, cb',
|
|
26
|
+
foo, 'bar -> err, baz',
|
|
27
|
+
cat, 'baz -> err, zoo',
|
|
28
|
+
'-> err, allElapse, qTotal');
|
|
29
|
+
|
|
30
|
+
var loadAndSave = react('allStart, titlesFile, numQueries, numFactors, cb', [
|
|
31
|
+
foo, 'bar -> err, baz',
|
|
32
|
+
cat, 'baz -> returns zoo'
|
|
33
|
+
], 'err, allElapse, qTotal');
|
|
34
|
+
|
|
35
|
+
var loadAndSave = react('allStart, titlesFile, numQueries, numFactors, cb', [
|
|
36
|
+
foo, 'bar => err, baz',
|
|
37
|
+
cat, 'baz -> returns zoo'
|
|
38
|
+
], 'err, allElapse, qTotal');
|
|
39
|
+
|
|
40
|
+
var loadAndSave = react('allStart, titlesFile, numQueries, numFactors, cb', [
|
|
41
|
+
foo, 'bar -> err, baz',
|
|
42
|
+
'zoo <- ', cat, 'baz',
|
|
43
|
+
], 'err, allElapse, qTotal');
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
var loadAndSave = react('allStart, titlesFile, numQueries, numFactors, cb -> err, allElapse, qTotal',
|
|
48
|
+
foo, 'bar -> err, baz',
|
|
49
|
+
cat, 'baz -> err, zoo');
|
|
50
|
+
loadAndSave(1, 2, 3, cb);
|
|
51
|
+
|
|
52
|
+
OR using AST
|
|
53
|
+
|
|
54
|
+
var loadAndSave = react();
|
|
55
|
+
loadAndSave.ast.inputs(['one', 'two'])
|
|
56
|
+
.tasks({ })
|
|
57
|
+
.outTask({ });
|
|
58
|
+
|
|
59
|
+
loadAndSave(1,2,cb);
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
|
|
5
|
+
function loadUser(uid, cb) { setTimeout(cb, 100, null, "User" + uid); }
|
|
6
|
+
function loadFile(filename, cb) { setTimeout(cb, 100, null, 'Filedata' + filename); }
|
|
7
|
+
function markdown(filedata) { return 'html' + filedata; }
|
|
8
|
+
function prepareDirectory(outDirname, cb) { setTimeout(cb, 200, null, 'dircreated-' + outDirname); }
|
|
9
|
+
function writeOutput(html, user, cb) { setTimeout(cb, 300, null, html + '_bytesWritten'); }
|
|
10
|
+
function loadEmailTemplate(cb) { setTimeout(cb, 50, null, 'emailmd'); }
|
|
11
|
+
function customizeEmail(user, emailHtml, cb) { return 'cust-' + user + emailHtml; }
|
|
12
|
+
function deliverEmail(custEmailHtml, cb) { setTimeout(cb, 100, null, 'delivered-' + custEmailHtml); }
|
|
13
|
+
|
|
14
|
+
function useHtml(err, html, user, bytesWritten) {
|
|
15
|
+
if (err) {
|
|
16
|
+
console.log('***Error: %s', err);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
console.log('final result: %s, user: %s, written:%s', html, user, bytesWritten);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
var fn = react(function (r, filename, uid, outDirname, cb) {
|
|
25
|
+
var err, user, html, bytesWritten;
|
|
26
|
+
r.sync(loadUser).in(uid).out(err, user)
|
|
27
|
+
.cb(err, html, user, bytesWritten);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
/*
|
|
32
|
+
var r = react();
|
|
33
|
+
r.ast.inputNames = ['filename', 'uid', 'outDirname', 'cb'];
|
|
34
|
+
r.ast.taskDefs = [
|
|
35
|
+
{ f:loadUser, a:['uid'], cb:['user'] },
|
|
36
|
+
{ f:loadFile, a:['filename'], cb:['filedata'] },
|
|
37
|
+
{ f:markdown, a:['filedata'], ret:['html'] },
|
|
38
|
+
{ f:prepareDirectory, a:['outDirname'], cb:['dircreated'] },
|
|
39
|
+
{ f:writeOutput, a:['html', 'user'], cb:['bytesWritten'], after:['prepareDirectory'] },
|
|
40
|
+
{ f:loadEmailTemplate, a:[], cb:['emailmd'] },
|
|
41
|
+
{ f:markdown, a:['emailmd'], ret:['emailHtml'] },
|
|
42
|
+
{ f:customizeEmail, a:['user', 'emailHtml'], ret:['custEmailHtml'] },
|
|
43
|
+
{ f:deliverEmail, a:['custEmailHtml'], cb:['deliveredEmail'], after:['writeOutput'] }
|
|
44
|
+
];
|
|
45
|
+
r.ast.finalOutputNames = ['html', 'user', 'bytesWritten'];
|
|
46
|
+
*/
|
|
47
|
+
|
|
48
|
+
var fn = react(function (r, filename, uid, outDirname, cb) {
|
|
49
|
+
var filedata, outDirName, dircreated, emailmd, emailHtml, custEmailHtml, deliveredEmail;
|
|
50
|
+
var err, user, html, bytesWritten;
|
|
51
|
+
|
|
52
|
+
r.async(loadUser).in(uid).out(err, user)
|
|
53
|
+
.async(loadFile).in(filename).out(filedata)
|
|
54
|
+
.sync(markdown).in(filedata).out(html)
|
|
55
|
+
.async(prepareDirectory).in(outDirName).out(dircreated)
|
|
56
|
+
.async(writeOutput).in(html, user).out(bytesWritten).after(prepareDirectory)
|
|
57
|
+
.async(loadEmailTemplate).out(emailmd)
|
|
58
|
+
.sync(markdown).in(emailmd).out(emailHtml)
|
|
59
|
+
.sync(customizeEmail).in(user, emailHtml).out(custEmailHtml)
|
|
60
|
+
.async(deliveredEmail).in(custEmailHtml).out(deliveredEmail).after(writeOutput)
|
|
61
|
+
.cb(err, html, user, bytesWritten);
|
|
62
|
+
});
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
|
|
5
|
+
function loadUser(uid, cb) { setTimeout(cb, 100, null, "User" + uid); }
|
|
6
|
+
function loadFile(filename, cb) { setTimeout(cb, 100, null, 'Filedata' + filename); }
|
|
7
|
+
function markdown(filedata) { return 'html' + filedata; }
|
|
8
|
+
function prepareDirectory(outDirname, cb) { setTimeout(cb, 200, null, 'dircreated-' + outDirname); }
|
|
9
|
+
function writeOutput(html, user, cb) { setTimeout(cb, 300, null, html + '_bytesWritten'); }
|
|
10
|
+
function loadEmailTemplate(cb) { setTimeout(cb, 50, null, 'emailmd'); }
|
|
11
|
+
function customizeEmail(user, emailHtml, cb) { return 'cust-' + user + emailHtml; }
|
|
12
|
+
function deliverEmail(custEmailHtml, cb) { setTimeout(cb, 100, null, 'delivered-' + custEmailHtml); }
|
|
13
|
+
|
|
14
|
+
function useHtml(err, html, user, bytesWritten) {
|
|
15
|
+
if (err) {
|
|
16
|
+
console.log('***Error: %s', err);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
console.log('final result: %s, user: %s, written:%s', html, user, bytesWritten);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
var fn = react(function (r, filename, uid, outDirname, cb) {
|
|
25
|
+
var err, user, html, bytesWritten;
|
|
26
|
+
r.sync(loadUser).in(uid).out(err, user)
|
|
27
|
+
.cb(err, html, user, bytesWritten);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
/*
|
|
32
|
+
var r = react();
|
|
33
|
+
r.ast.inputNames = ['filename', 'uid', 'outDirname', 'cb'];
|
|
34
|
+
r.ast.taskDefs = [
|
|
35
|
+
{ f:loadUser, a:['uid'], cb:['user'] },
|
|
36
|
+
{ f:loadFile, a:['filename'], cb:['filedata'] },
|
|
37
|
+
{ f:markdown, a:['filedata'], ret:['html'] },
|
|
38
|
+
{ f:prepareDirectory, a:['outDirname'], cb:['dircreated'] },
|
|
39
|
+
{ f:writeOutput, a:['html', 'user'], cb:['bytesWritten'], after:['prepareDirectory'] },
|
|
40
|
+
{ f:loadEmailTemplate, a:[], cb:['emailmd'] },
|
|
41
|
+
{ f:markdown, a:['emailmd'], ret:['emailHtml'] },
|
|
42
|
+
{ f:customizeEmail, a:['user', 'emailHtml'], ret:['custEmailHtml'] },
|
|
43
|
+
{ f:deliverEmail, a:['custEmailHtml'], cb:['deliveredEmail'], after:['writeOutput'] }
|
|
44
|
+
];
|
|
45
|
+
r.ast.finalOutputNames = ['html', 'user', 'bytesWritten'];
|
|
46
|
+
*/
|
|
47
|
+
|
|
48
|
+
var fn = react(function (r, filename, uid, outDirname, cb,
|
|
49
|
+
filedata, outDirName, dircreated, emailmd, emailHtml,
|
|
50
|
+
custEmailHtml, deliveredEmail,
|
|
51
|
+
err, user, html, bytesWritten) {
|
|
52
|
+
|
|
53
|
+
r.async(loadUser, [uid], [err, user])
|
|
54
|
+
.async(loadFile, [filename], [filedata])
|
|
55
|
+
.sync(markdown, [filedata], filedata)
|
|
56
|
+
.async(prepareDirectory, [outDirName], [dircreated])
|
|
57
|
+
.async(writeOutput, [html, user], [err, bytesWritten], { after: prepareDirectory })
|
|
58
|
+
.async(loadEmailTemplate, [], [emailmd])
|
|
59
|
+
.sync(markdown, [emailmd], emailHtml)
|
|
60
|
+
.sync(customizeEmail, [user, emailHtml], custEmailHtml)
|
|
61
|
+
.sync(deliverEmail, [custEmailHtml], [deliveredEmail], { after: writeOutput })
|
|
62
|
+
.cb(err, html, user, bytesWritten);
|
|
63
|
+
});
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
|
|
5
|
+
function loadUser(uid, cb) { setTimeout(cb, 100, null, "User" + uid); }
|
|
6
|
+
function loadFile(filename, cb) { setTimeout(cb, 100, null, 'Filedata' + filename); }
|
|
7
|
+
function markdown(filedata) { return 'html' + filedata; }
|
|
8
|
+
function prepareDirectory(outDirname, cb) { setTimeout(cb, 200, null, 'dircreated-' + outDirname); }
|
|
9
|
+
function writeOutput(html, user, cb) { setTimeout(cb, 300, null, html + '_bytesWritten'); }
|
|
10
|
+
function loadEmailTemplate(cb) { setTimeout(cb, 50, null, 'emailmd'); }
|
|
11
|
+
function customizeEmail(user, emailHtml, cb) { return 'cust-' + user + emailHtml; }
|
|
12
|
+
function deliverEmail(custEmailHtml, cb) { setTimeout(cb, 100, null, 'delivered-' + custEmailHtml); }
|
|
13
|
+
|
|
14
|
+
function useHtml(err, html, user, bytesWritten) {
|
|
15
|
+
if (err) {
|
|
16
|
+
console.log('***Error: %s', err);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
console.log('final result: %s, user: %s, written:%s', html, user, bytesWritten);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
var fn = react(function (r, filename, uid, outDirname, cb) {
|
|
25
|
+
var err, user, html, bytesWritten;
|
|
26
|
+
r.sync(loadUser).in(uid).out(err, user)
|
|
27
|
+
.cb(err, html, user, bytesWritten);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
/*
|
|
32
|
+
var r = react();
|
|
33
|
+
r.ast.inputNames = ['filename', 'uid', 'outDirname', 'cb'];
|
|
34
|
+
r.ast.taskDefs = [
|
|
35
|
+
{ f:loadUser, a:['uid'], cb:['user'] },
|
|
36
|
+
{ f:loadFile, a:['filename'], cb:['filedata'] },
|
|
37
|
+
{ f:markdown, a:['filedata'], ret:['html'] },
|
|
38
|
+
{ f:prepareDirectory, a:['outDirname'], cb:['dircreated'] },
|
|
39
|
+
{ f:writeOutput, a:['html', 'user'], cb:['bytesWritten'], after:['prepareDirectory'] },
|
|
40
|
+
{ f:loadEmailTemplate, a:[], cb:['emailmd'] },
|
|
41
|
+
{ f:markdown, a:['emailmd'], ret:['emailHtml'] },
|
|
42
|
+
{ f:customizeEmail, a:['user', 'emailHtml'], ret:['custEmailHtml'] },
|
|
43
|
+
{ f:deliverEmail, a:['custEmailHtml'], cb:['deliveredEmail'], after:['writeOutput'] }
|
|
44
|
+
];
|
|
45
|
+
r.ast.finalOutputNames = ['html', 'user', 'bytesWritten'];
|
|
46
|
+
*/
|
|
47
|
+
|
|
48
|
+
var fn = react(function (r, filename, uid, outDirname, cb,
|
|
49
|
+
filedata, outDirName, dircreated, emailmd, emailHtml,
|
|
50
|
+
custEmailHtml, deliveredEmail,
|
|
51
|
+
err, user, html, bytesWritten) {
|
|
52
|
+
|
|
53
|
+
r.async(loadUser, uid).cb(err, user)
|
|
54
|
+
.async(loadFile, filename).cb(err, filedata)
|
|
55
|
+
.sync(markdown, filedata).returns(filedata)
|
|
56
|
+
.async(prepareDirectory, outDirName).cb(dircreated)
|
|
57
|
+
.async(writeOutput, html, user).cb(err, bytesWritten).after(prepareDirectory)
|
|
58
|
+
.async(loadEmailTemplate).cb(err, emailmd)
|
|
59
|
+
.sync(markdown, emailmd).returns(emailHtml)
|
|
60
|
+
.sync(customizeEmail, user, emailHtml).returns(custEmailHtml)
|
|
61
|
+
.sync(deliverEmail, custEmailHtml).returns(deliveredEmail).after(writeOutput)
|
|
62
|
+
.finalCb(err, html, user, bytesWritten);
|
|
63
|
+
});
|