react 0.0.3 → 0.1.2

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 (66) hide show
  1. package/.npmignore +5 -0
  2. package/Jakefile.js +8 -0
  3. package/README.md +183 -83
  4. package/examples/ast1.js +26 -0
  5. package/examples/chain-events1.js +34 -0
  6. package/examples/chain1.js +19 -0
  7. package/examples/fstr-events1.js +51 -0
  8. package/examples/fstr1.js +36 -0
  9. package/examples/pcode1.js +22 -0
  10. package/jake-tasks/jake-test.js +64 -0
  11. package/lib/base-task.js +115 -0
  12. package/lib/cb-task.js +67 -0
  13. package/lib/chain.js +148 -0
  14. package/lib/core.js +95 -0
  15. package/lib/error.js +37 -0
  16. package/lib/event-manager.js +57 -0
  17. package/lib/finalcb-first-task.js +59 -0
  18. package/lib/finalcb-task.js +54 -0
  19. package/lib/fstr.js +110 -0
  20. package/lib/id.js +10 -0
  21. package/lib/input-parser.js +44 -0
  22. package/lib/parse.js +28 -0
  23. package/lib/pcode.js +164 -0
  24. package/lib/ret-task.js +67 -0
  25. package/lib/status.js +5 -0
  26. package/lib/task.js +234 -0
  27. package/lib/validate.js +102 -0
  28. package/lib/vcon.js +76 -0
  29. package/oldExamples/analyze.js +29 -0
  30. package/oldExamples/analyze2.js +29 -0
  31. package/oldExamples/example10-dsl.js +63 -0
  32. package/oldExamples/example11.js +62 -0
  33. package/oldExamples/example12.js +63 -0
  34. package/oldExamples/example13.js +63 -0
  35. package/oldExamples/example14.js +63 -0
  36. package/oldExamples/example15.js +75 -0
  37. package/{test → oldExamples}/example6-ast.js +0 -0
  38. package/{test → oldExamples}/example6-dsl.js +0 -0
  39. package/{test → oldExamples}/example8-ast.js +0 -0
  40. package/{test → oldExamples}/example8-dsl.js +0 -0
  41. package/{test → oldExamples}/example9-ast.js +0 -0
  42. package/{test → oldExamples}/example9-dsl.js +0 -0
  43. package/oldExamples/function-str-ex1.js +33 -0
  44. package/oldExamples/function-str-ex2.js +67 -0
  45. package/oldExamples/trait1.js +41 -0
  46. package/oldExamples/trait2.js +44 -0
  47. package/package.json +16 -6
  48. package/react.js +11 -1
  49. package/test/ast.test.js +69 -0
  50. package/test/cb-task.test.js +197 -0
  51. package/test/chain.test.js +239 -0
  52. package/test/core.test.js +519 -0
  53. package/test/event-manager.test.js +102 -0
  54. package/test/exec-options.test.js +32 -0
  55. package/test/finalcb-task.test.js +37 -0
  56. package/test/fstr.test.js +288 -0
  57. package/test/input-parser.test.js +62 -0
  58. package/test/module-use.test.js +271 -0
  59. package/test/pcode.test.js +321 -0
  60. package/test/ret-task.test.js +199 -0
  61. package/test/task.test.js +21 -0
  62. package/test/validate-cb-task.test.js +74 -0
  63. package/test/validate-ret-task.test.js +83 -0
  64. package/test/validate.test.js +218 -0
  65. package/test/vcon.test.js +160 -0
  66. package/lib/react.js +0 -254
@@ -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
+ });