react 0.6.1 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/.travis.yml +5 -2
  2. package/README.md +15 -3
  3. package/browser-test/dist.html +1 -0
  4. package/browser-test/index.html +1 -0
  5. package/browser-test/min.html +1 -0
  6. package/dist/react.js +370 -322
  7. package/dist/react.min.js +22 -1
  8. package/doc/advanced.md +11 -2
  9. package/lib/base-task.js +16 -19
  10. package/lib/cb-task.js +5 -5
  11. package/lib/core.js +5 -5
  12. package/lib/dsl.js +29 -29
  13. package/lib/error.js +4 -4
  14. package/lib/event-collector.js +6 -6
  15. package/lib/event-manager.js +7 -3
  16. package/lib/eventemitter.js +3 -3
  17. package/lib/finalcb-first-task.js +4 -4
  18. package/lib/finalcb-task.js +4 -4
  19. package/lib/id.js +3 -3
  20. package/lib/input-parser.js +10 -10
  21. package/lib/log-events.js +23 -14
  22. package/lib/parse.js +3 -3
  23. package/lib/promise-resolve.js +4 -4
  24. package/lib/promise-task.js +4 -4
  25. package/lib/react.js +7 -7
  26. package/lib/ret-task.js +4 -4
  27. package/lib/sprintf.js +4 -4
  28. package/lib/status.js +3 -3
  29. package/lib/task.js +12 -12
  30. package/lib/track-tasks.js +4 -4
  31. package/lib/validate.js +8 -8
  32. package/lib/vcon.js +28 -5
  33. package/lib/when-task.js +7 -8
  34. package/package.json +17 -7
  35. package/test/ast.mocha.js +4 -4
  36. package/test/cb-task.mocha.js +17 -17
  37. package/test/core-deferred.mocha.js +8 -8
  38. package/test/core-when.mocha.js +7 -7
  39. package/test/core.mocha.js +52 -52
  40. package/test/dsl.mocha.js +45 -43
  41. package/test/event-manager.mocha.js +2 -2
  42. package/test/exec-options.mocha.js +4 -4
  43. package/test/finalcb-task.mocha.js +6 -6
  44. package/test/input-parser.mocha.js +1 -1
  45. package/test/log-events.mocha.js +88 -0
  46. package/test/module-use.mocha.js +24 -7
  47. package/test/promise-auto-resolve.mocha.js +4 -4
  48. package/test/ret-task.mocha.js +18 -18
  49. package/test/task.mocha.js +3 -3
  50. package/test/validate-cb-task.mocha.js +11 -11
  51. package/test/validate-ret-task.mocha.js +14 -14
  52. package/test/validate.mocha.js +57 -57
  53. package/test/vcon.mocha.js +13 -13
  54. package/vendor/chai/chai.js +3371 -1158
  55. package/vendor/requirejs/require.js +1447 -1455
  56. package/vendor/requirejs/require.min.js +31 -28
  57. package/vendor/mocha/mocha.css +0 -135
  58. package/vendor/mocha/mocha.js +0 -3589
package/.travis.yml CHANGED
@@ -1,4 +1,7 @@
1
1
  language: node_js
2
2
  node_js:
3
- - 0.6
4
- - 0.7
3
+ - "0.6"
4
+ - "0.7"
5
+ - "0.8"
6
+ - "0.10"
7
+ - "0.11"
package/README.md CHANGED
@@ -16,9 +16,15 @@ Also "Reactive Programming" or "Dataflow" describe defining flow which reacts to
16
16
 
17
17
  It takes inspiration from several projects including:
18
18
 
19
- - Tim Caswell and Elijah Insua's [conductor](https://github.com/creationix/conductor) - [Article](http://howtonode.org/step-of-conductor)
19
+ - Tim Caswell and Elijah Insua's [conductor](https://github.com/tmpvar/conductor) - [Article](http://howtonode.org/step-of-conductor)
20
20
  - Caolan McMahon's [async](https://github.com/caolan/async)
21
21
 
22
+ ## Example Video and Comparison
23
+
24
+ Ryan Atkinson did a nice job of demonstrating some of the power of react as compared to async and native callback code. http://www.youtube.com/embed/5EDucc56UnA?rel=0
25
+
26
+ You can read more and see his example site here https://github.com/ryanatkn/react-writeup
27
+
22
28
 
23
29
  ## Goals
24
30
 
@@ -38,9 +44,11 @@ It takes inspiration from several projects including:
38
44
  - class method calls
39
45
  - selectFirst flow where the first task that returns defined, non-null value is used
40
46
  - promise style functions - also automatic resolution of promise inputs (optionally loaded with `react.resolvePromises();`)
41
- - use of resulting flow function as callback style or promise style (if no callback provided) (provided via plugin corresponding to the promise library used) See https://github.com/jeffbski/react-deferred
47
+ - use of resulting flow function as callback style or promise style (if no callback provided) (provided via plugin corresponding to the promise library used) See https://github.com/jeffbski/react-deferred and https://github.com/jeffbski/react-q
48
+ - supports ES5 browsers (can work with others by using polyfills)
42
49
  - (planned) iteration on arrays, streams, sockets
43
50
  - (planned) event emitter integration
51
+ - tested on node 0.8, 0.10, 0.11
44
52
 
45
53
  The tasks can be mixed, meaning you can use async, sync, object method calls, class method calls, etc in the same flow.
46
54
 
@@ -156,7 +164,7 @@ var fn = react('loadRender', 'fooPath, barPath, barP2, cb -> err, renderedOut',
156
164
 
157
165
  1. **flow/function name** - string - represents the name of the flow or function that will be created. React will use the name when generating events so you can monitor progress and performance and also when errors occur.
158
166
  2. **in/out flow parameter definition** - string - the inputs and outputs for the flow function. The parameters are specified in one single string for easy typing, separated by commas. The output follows the input after being separated by a `->`. Use the parameter name `cb` or `callback` to specify the Node style callback and `err` to represent the error parameter as the first output parameter of the callback. Literal values can also be specified directly (true, false, numbers, this, null). Literal strings can simply be quoted using single or double quotes.
159
- 3. **optional flow options** - object - If an object is provided immediately after the in/out flow def, then these options will be provided to react to customize the flow. This is reserved for future use.
167
+ 3. **optional flow options** - object - If an object is provided immediately after the in/out flow def, then these options will be provided to react to customize the flow. The `locals` property can contain an object map of any local variables you want to reference in the flow (other than what is passed in as parameters). For example: `{ locals: { foo: foo, bar: bar }}` would make local vars available in the flow. Note that global variables are already available in the flow.
160
168
  4. **function reference or method string** - Specify the function to be called for this task, or if calling a method off of an object being passed in or returned by a task, use a string to specify like `'obj.method'`. These can be asynchronous Node-style callback `cb(err, ...)` functions or synchronous functions which simply return values directly.
161
169
  5. **in/out task parameter definition** - string - similar to the in/out flow parameter definition above, these are the inputs and outputs that are passed to a task function and returned from a task function. The inputs will need to match either those from the flow inputs or outputs from other tasks that will run before this task. React will use the inputs as dependencies, so it will invoke and wait for response from the tasks that provide the dependent inputs. So simply by specifying inputs and outputs for the tasks, React will prioritize and parallelize tasks to run as fast as possible. Use `cb` or `callback` along with `err` to specify asynchronous Node style `cb(err, ...)` task, or omit both to specify a synchronous task.A synchronous task can only have a single return parameter.
162
170
  6. **optional task options** - object - if an object is provided this can be used to specify additional options for this task. Currently the valid options for a task are:
@@ -186,6 +194,10 @@ See the [Advanced React](https://github.com/jeffbski/react/blob/master/doc/advan
186
194
 
187
195
  ## Status
188
196
 
197
+ - 2013-05-23 - Allow use of globals without needing to specify in locals, move 'use strict' into define, upgrade amdefine@0.0.5, eventemitter@0.4.11, requirejs@2.1.6, mocha@1.10.0, chai@1.6.0, jake@0.5.15 (v0.7.0)
198
+ - 2013-04-12 - Update to test on node 0.8, 0.10, 0.11
199
+ - 2012-10-17 - Fix issue with logEvents and provide way to disable logEvents(false) (v0.6.3)
200
+ - 2012-09-12 - Upgrade RequireJS@2.0.6, mocha@1.4.2, chai@1.2.0, jake@0.3.16. Update travis config to include Node 0.8 (v0.6.2)
189
201
  - 2012-04-25 - Browser compatibility issue with process check, (v0.6.1)
190
202
  - 2012-04-05 - Remove dependency on sprint, use util.format
191
203
  - 2012-03-28 - Make react AMD-enabled and compatible with ES5 browsers and node.js, provide single file dist and min, add browser tests (v0.6.0)
@@ -62,6 +62,7 @@
62
62
  "test/exec-options.mocha",
63
63
  "test/finalcb-task.mocha",
64
64
  "test/input-parser.mocha",
65
+ "test/log-events.mocha",
65
66
  "test/module-use.mocha",
66
67
  "test/promise-auto-resolve.mocha",
67
68
  "test/ret-task.mocha",
@@ -59,6 +59,7 @@
59
59
  "test/exec-options.mocha",
60
60
  "test/finalcb-task.mocha",
61
61
  "test/input-parser.mocha",
62
+ "test/log-events.mocha",
62
63
  "test/module-use.mocha",
63
64
  "test/promise-auto-resolve.mocha",
64
65
  "test/ret-task.mocha",
@@ -62,6 +62,7 @@
62
62
  "test/exec-options.mocha",
63
63
  "test/finalcb-task.mocha",
64
64
  "test/input-parser.mocha",
65
+ "test/log-events.mocha",
65
66
  "test/module-use.mocha",
66
67
  "test/promise-auto-resolve.mocha",
67
68
  "test/ret-task.mocha",
package/dist/react.js CHANGED
@@ -7,21 +7,31 @@
7
7
  var defaultMaxListeners = 10;
8
8
 
9
9
  function init() {
10
- this._events = new Object;
10
+ this._events = {};
11
+ if (this._conf) {
12
+ configure.call(this, this._conf);
13
+ }
11
14
  }
12
15
 
13
16
  function configure(conf) {
14
17
  if (conf) {
18
+
19
+ this._conf = conf;
20
+
15
21
  conf.delimiter && (this.delimiter = conf.delimiter);
22
+ conf.maxListeners && (this._events.maxListeners = conf.maxListeners);
16
23
  conf.wildcard && (this.wildcard = conf.wildcard);
24
+ conf.newListener && (this.newListener = conf.newListener);
25
+
17
26
  if (this.wildcard) {
18
- this.listenerTree = new Object;
27
+ this.listenerTree = {};
19
28
  }
20
29
  }
21
30
  }
22
31
 
23
32
  function EventEmitter(conf) {
24
- this._events = new Object;
33
+ this._events = {};
34
+ this.newListener = false;
25
35
  configure.call(this, conf);
26
36
  }
27
37
 
@@ -155,7 +165,7 @@
155
165
  while (name) {
156
166
 
157
167
  if (!tree[name]) {
158
- tree[name] = new Object;
168
+ tree[name] = {};
159
169
  }
160
170
 
161
171
  tree = tree[name];
@@ -210,6 +220,8 @@
210
220
  EventEmitter.prototype.setMaxListeners = function(n) {
211
221
  this._events || init.call(this);
212
222
  this._events.maxListeners = n;
223
+ if (!this._conf) this._conf = {};
224
+ this._conf.maxListeners = n;
213
225
  };
214
226
 
215
227
  EventEmitter.prototype.event = '';
@@ -241,11 +253,12 @@
241
253
  };
242
254
 
243
255
  EventEmitter.prototype.emit = function() {
256
+
244
257
  this._events || init.call(this);
245
258
 
246
259
  var type = arguments[0];
247
260
 
248
- if (type === 'newListener') {
261
+ if (type === 'newListener' && !this.newListener) {
249
262
  if (!this._events.newListener) { return false; }
250
263
  }
251
264
 
@@ -547,12 +560,12 @@
547
560
 
548
561
  }(typeof process !== 'undefined' && typeof process.title !== 'undefined' && typeof exports !== 'undefined' ? exports : window);
549
562
 
550
-
551
563
  /*global define:true EventEmitter2:true */
552
564
 
553
565
 
554
566
 
555
567
  define('react/eventemitter',['eventemitter2'], function (EventEmitterMod) {
568
+
556
569
 
557
570
  /**
558
571
  Abstract the details of getting an EventEmitter
@@ -563,8 +576,8 @@ define('react/eventemitter',['eventemitter2'], function (EventEmitterMod) {
563
576
  var EventEmitter = (EventEmitterMod) ?
564
577
  ((EventEmitterMod.EventEmitter2) ? EventEmitterMod.EventEmitter2 : EventEmitterMod) : EventEmitter2;
565
578
  return EventEmitter;
566
-
567
- });
579
+
580
+ });
568
581
  /*global define:true */
569
582
 
570
583
 
@@ -1094,12 +1107,12 @@ exports._extend = function(origin, add) {
1094
1107
  };
1095
1108
 
1096
1109
  });
1097
-
1098
1110
  /*global define:true */
1099
1111
 
1100
1112
 
1101
1113
 
1102
1114
  define('react/error',['util'], function (util) {
1115
+
1103
1116
 
1104
1117
  function ensureStackTraceLimitSet(stackTraceLimit) {
1105
1118
  if (!Error.stackTraceLimit || Error.stackTraceLimit < stackTraceLimit) {
@@ -1130,7 +1143,7 @@ define('react/error',['util'], function (util) {
1130
1143
  errString += task.f.toString(); //TODO need to pretty print function, gets collapsed
1131
1144
  errString += '\n\n';
1132
1145
  }
1133
- return errString;
1146
+ return errString;
1134
1147
  }
1135
1148
 
1136
1149
  function augmentError(err, meta) {
@@ -1143,10 +1156,26 @@ define('react/error',['util'], function (util) {
1143
1156
 
1144
1157
  return {
1145
1158
  ensureStackTraceLimitSet: ensureStackTraceLimitSet,
1146
- augmentError: augmentError
1159
+ augmentError: augmentError
1147
1160
  };
1148
1161
 
1149
- });
1162
+ });
1163
+ /*global define:true sprint:true */
1164
+
1165
+
1166
+
1167
+ define('react/sprintf',['util'], function (util) {
1168
+
1169
+
1170
+ /**
1171
+ Abstract the details of getting a sprintf function.
1172
+ Currently using the simple format capabilities of node's util.format
1173
+ */
1174
+
1175
+ var sprintf = util.format;
1176
+ return sprintf;
1177
+
1178
+ });
1150
1179
  (function (root, factory) {
1151
1180
  /*global define:true */
1152
1181
 
@@ -1178,112 +1207,24 @@ define('react/error',['util'], function (util) {
1178
1207
  }));
1179
1208
 
1180
1209
 
1181
-
1182
1210
  /*global define:true */
1183
1211
 
1184
1212
 
1185
1213
 
1186
1214
  define('react/status',[], function () {
1187
1215
 
1216
+
1188
1217
  var STATUS = { READY: 'ready', RUNNING: 'running', ERRORED: 'errored', COMPLETE: 'complete' };
1189
1218
 
1190
1219
  return STATUS;
1191
1220
 
1192
- });
1193
-
1194
- /*global define:true */
1195
-
1196
-
1197
-
1198
- define('react/vcon',[], function () {
1199
-
1200
- var LAST_RESULTS_KEY = ':LAST_RESULTS';
1201
-
1202
- function VContext() {
1203
- }
1204
-
1205
- VContext.prototype.getLastResults = function () { return this.getVar(LAST_RESULTS_KEY); };
1206
- VContext.prototype.setLastResults = function (args) { this.setVar(LAST_RESULTS_KEY, args); };
1207
-
1208
- VContext.prototype.getVar = function (name) { //name might be simple or obj.prop, also literals
1209
- /*jshint regexp: false */
1210
- var vConValues = this.values;
1211
- if (typeof(name) !== 'string') return name; // literal boolean or number
1212
- name = name.trim();
1213
- // literal checks need to match what is in validate.js
1214
- if (name === 'true') return true;
1215
- if (name === 'false') return false;
1216
- if (name === 'null') return null;
1217
- if (/^-?[0-9]+$/.test(name)) return parseInt(name, 10); //int
1218
- if (/^-?[0-9.]+$/.test(name)) return parseFloat(name); //float
1219
- var m = /^("|')([^\1]*)\1$/.exec(name); //check for quoted string " or '
1220
- if (m) return m[2]; // if is quoted str, return inside of the quotes
1221
- var nameAndProps = name.split('.');
1222
- return nameAndProps.reduce(function (accObj, prop) {
1223
- if (accObj === undefined || accObj === null) return undefined; // prevent exception
1224
- return accObj[prop];
1225
- }, vConValues); // vCon['foo']['bar']
1226
- };
1227
-
1228
- /**
1229
- Saves all the results from a task as a unit, also sets special
1230
- variable :LAST_RESULTS which keeps an array of the last values
1231
- which can be used for chaining and testing last results, etc.
1232
- */
1233
- VContext.prototype.saveResults = function (paramArr, valuesArr) { // set values for params
1234
- var self = this;
1235
- paramArr.forEach(function (k, idx) { //save values to v context
1236
- self.setVar(k, (valuesArr[idx] !== undefined) ? valuesArr[idx] : null); //upgrade any undefined to null
1237
- });
1238
- this.setLastResults(valuesArr);
1239
- };
1240
-
1241
- VContext.prototype.setVar = function (name, value) { //name might be simple or obj.prop
1242
- if (!name) return; // if name is undefined or null, then discard
1243
- var vConValues = this.values;
1244
- var nameAndProps = name.split('.');
1245
- var lastProp = nameAndProps.pop();
1246
- var obj = nameAndProps.reduce(function (accObj, prop) {
1247
- var o = accObj[prop];
1248
- if (o === undefined || o === null) { // if doesn't exist create it
1249
- o = accObj[prop] = { };
1250
- }
1251
- return o;
1252
- }, vConValues); // vCon['foo']['bar']
1253
- obj[lastProp] = value;
1254
- };
1255
-
1256
-
1257
- /**
1258
- Create Variable Context using arguments passed in.
1259
- Ignore extra arguments passed in. Locals can be
1260
- passed into seed the VContext otherwise empty {}
1261
- will be used
1262
- @param self used to pass 'this' context in
1263
- */
1264
- VContext.create = function (args, inParams, locals, self) {
1265
- var initValues = {};
1266
- if (self) initValues['this'] = self;
1267
- if (locals) Object.keys(locals).forEach(function (k) { initValues[k] = locals[k]; }); // copy over keys
1268
- var vContext = new VContext();
1269
- vContext.values = args.reduce(function (vcon, x, idx) { // create vCon start with input args
1270
- var param = inParams[idx];
1271
- if (param) vcon[param] = (x !== undefined) ? x : null; // upgrade undefined to null
1272
- return vcon;
1273
- }, initValues);
1274
- return vContext;
1275
- };
1276
-
1277
-
1278
- return VContext;
1279
-
1280
- });
1281
-
1221
+ });
1282
1222
  /*global define:true process:false*/
1283
1223
 
1284
1224
 
1285
1225
 
1286
1226
  define('react/event-manager',['./eventemitter'], function (EventEmitter) {
1227
+
1287
1228
  /*jshint regexp:false */
1288
1229
 
1289
1230
  var EVENT_EMITTER2_CONFIG = {
@@ -1356,12 +1297,15 @@ define('react/event-manager',['./eventemitter'], function (EventEmitter) {
1356
1297
  if (this.emitter) this.emitter.removeListener.apply(this.emitter, arguments);
1357
1298
  };
1358
1299
 
1300
+ EventManager.prototype.removeAllListeners = function (event) {
1301
+ if (this.emitter) this.emitter.removeAllListeners.apply(this.emitter, arguments);
1302
+ };
1303
+
1359
1304
 
1360
1305
  EventManager.global = EventManager.create(); // create one top level emitter
1361
1306
  return EventManager;
1362
-
1363
- });
1364
1307
 
1308
+ });
1365
1309
  /*global define:true */
1366
1310
 
1367
1311
 
@@ -1369,6 +1313,7 @@ define('react/event-manager',['./eventemitter'], function (EventEmitter) {
1369
1313
  define('react/base-task',['ensure-array', './status', './event-manager'],
1370
1314
  function (array, STATUS, EventManager) {
1371
1315
 
1316
+
1372
1317
  function BaseTask() {
1373
1318
  }
1374
1319
 
@@ -1428,7 +1373,7 @@ define('react/base-task',['ensure-array', './status', './event-manager'],
1428
1373
  to this if they want to do this check.
1429
1374
  */
1430
1375
  BaseTask.prototype.parentExists = function (objPropStr, vCon) {
1431
- if (!isObjProperty(objPropStr)) return true; // NOT obj prop, just simple arg, ret true
1376
+ if (!isObjProperty(objPropStr)) return true; // NOT obj prop, just simple arg, ret true
1432
1377
  var nameAndProps = objPropStr.split('.');
1433
1378
  nameAndProps.pop(); // pop off final prop
1434
1379
  var parent = nameAndProps.reduce(function (accObj, prop) {
@@ -1464,120 +1409,28 @@ define('react/base-task',['ensure-array', './status', './event-manager'],
1464
1409
  BaseTask.prototype.isMethodCall = function () {
1465
1410
  /*jshint regexp: false */
1466
1411
  return (typeof(this.f) === 'string' && /^.*\..*$/.test(this.f)); //str contains .
1467
- };
1468
-
1469
- BaseTask.prototype.getMethodObj = function (vCon) { //obj.prop.prop2, returns obj.prop or undefined
1470
- var name = this.f;
1471
- if (!name) return undefined;
1472
- var nameAndProps = name.split('.');
1473
- nameAndProps.pop(); // pop off last one
1474
- if (!nameAndProps.length) return undefined;
1475
- var result = nameAndProps.reduce(function (accObj, prop) {
1476
- if (accObj === undefined || accObj === null) return undefined; // prevent exception
1477
- return accObj[prop];
1478
- }, vCon.values); // vCon['foo']['bar']
1479
- return result;
1480
- };
1481
-
1482
- return BaseTask;
1483
-
1484
- });
1485
-
1486
- /*global define:true */
1487
-
1488
-
1489
-
1490
- define('react/input-parser',['./event-manager'], function (EventManager) {
1491
-
1492
- var defaultExecOptions = {
1493
- reactExecOptions: true,
1494
- outputStyle: 'cb',
1495
1412
  };
1496
1413
 
1497
- var OUTPUT_STYLES = {
1498
- CALLBACK: 'cb',
1499
- NONE: 'none'
1500
- };
1501
-
1502
- function isExecOptions(x) { return (x && x.reactExecOptions); }
1503
- function execOptionsFilter(x) { return isExecOptions(x); }
1504
- function nonExecOptionsFilter(x) { return !isExecOptions(x); }
1505
- function mergeExecOptions(accum, options) {
1506
- Object.keys(options).forEach(function (k) { accum[k] = options[k]; });
1507
- return accum;
1508
- }
1509
-
1510
- function splitArgs(args, inParams, style) {
1511
- var result = { };
1512
- result.args = inParams.map(function (p) { return args.shift(); }); // take args for input params first
1513
- if (style === OUTPUT_STYLES.CALLBACK && args.length) result.cb = args.shift(); // next take the cb
1514
- result.extra = args; // these remaining were after the callback
1414
+ BaseTask.prototype.getMethodObj = function (vCon) { //obj.prop.prop2, returns obj.prop or undefined
1415
+ var name = this.f;
1416
+ if (!name) return undefined;
1417
+ var nameAndProps = name.split('.');
1418
+ nameAndProps.pop(); // pop off last one
1419
+ if (!nameAndProps.length) return undefined;
1420
+ var result = vCon.resolveNameArr(nameAndProps);
1515
1421
  return result;
1516
- }
1517
-
1518
- function inputParser(inputArgs, ast) {
1519
- var parsedInput = { };
1520
- var execOptionsArr = inputArgs.filter(execOptionsFilter);
1521
- execOptionsArr.unshift(defaultExecOptions);
1522
- parsedInput.options = execOptionsArr.reduce(mergeExecOptions, {});
1523
-
1524
- var args = inputArgs.filter(nonExecOptionsFilter);
1525
- var splitResult = splitArgs(args, ast.inParams, parsedInput.options.outputStyle);
1526
- parsedInput.args = splitResult.args;
1527
- parsedInput.cb = splitResult.cb;
1528
- if (splitResult.outputStyle) parsedInput.options.outputStyle = splitResult.outputStyle;
1529
- if (splitResult.extra) parsedInput.extraArgs = splitResult.extra;
1530
- EventManager.global.emit(EventManager.TYPES.EXEC_INPUT_PREPROCESS, parsedInput); // hook
1531
- return parsedInput;
1532
- }
1533
-
1534
-
1535
- inputParser.defaultExecOptions = defaultExecOptions;
1536
- return inputParser;
1537
-
1538
- });
1539
-
1540
- /*global define:true */
1541
-
1542
-
1543
-
1544
- define('react/id',[], function () {
1545
-
1546
- var startingId = 0;
1547
-
1548
- function createUniqueId() {
1549
- startingId += 1;
1550
- if (startingId === Number.MAX_VALUE) startingId = 0; // if hits this start over //TODO need something better?
1551
- return startingId;
1552
- }
1553
-
1554
- return {
1555
- createUniqueId: createUniqueId
1556
1422
  };
1557
1423
 
1558
- });
1559
-
1560
- /*global define:true sprint:true */
1561
-
1562
-
1563
-
1564
- define('react/sprintf',['util'], function (util) {
1424
+ return BaseTask;
1565
1425
 
1566
- /**
1567
- Abstract the details of getting a sprintf function.
1568
- Currently using the simple format capabilities of node's util.format
1569
- */
1570
-
1571
- var sprintf = util.format;
1572
- return sprintf;
1573
-
1574
- });
1426
+ });
1575
1427
 
1576
1428
  /*global define:true */
1577
1429
 
1578
1430
 
1579
1431
 
1580
1432
  define('react/cb-task',['util', './sprintf', './base-task'], function (util, sprintf, BaseTask) {
1433
+
1581
1434
 
1582
1435
  function format_error(errmsg, obj) {
1583
1436
  return sprintf('%s - %s', errmsg, util.inspect(obj));
@@ -1627,7 +1480,7 @@ define('react/cb-task',['util', './sprintf', './base-task'], function (util, spr
1627
1480
  vCon.saveResults(self.out, args);
1628
1481
  self.complete(args);
1629
1482
  contExec();
1630
- };
1483
+ };
1631
1484
  };
1632
1485
 
1633
1486
  CbTask.prototype.exec = function exec(vCon, handleError, contExec) {
@@ -1645,22 +1498,22 @@ define('react/cb-task',['util', './sprintf', './base-task'], function (util, spr
1645
1498
  } else if (typeof(func) === 'string') {
1646
1499
  func = vCon.getVar(func); // we want the actual fn from this string
1647
1500
  }
1648
- func.apply(bindObj, args);
1501
+ func.apply(bindObj, args);
1649
1502
  } catch (err) { //catch and handle the task error, calling final cb
1650
1503
  handleError(this, err);
1651
- }
1504
+ }
1652
1505
  };
1653
1506
 
1654
1507
  return CbTask;
1655
1508
 
1656
- });
1657
-
1509
+ });
1658
1510
 
1659
1511
  /*global define:true */
1660
1512
 
1661
1513
 
1662
1514
 
1663
1515
  define('react/promise-task',['util', './sprintf', './base-task'], function (util, sprintf, BaseTask) {
1516
+
1664
1517
 
1665
1518
  /**
1666
1519
  PromiseTask is a task which executes a fn that returns a promise
@@ -1697,7 +1550,7 @@ define('react/promise-task',['util', './sprintf', './base-task'], function (util
1697
1550
  taskDef.a.every(function (x) { return (typeof(x) === 'string'); }))) {
1698
1551
  errors.push(format_error(A_REQ, taskDef));
1699
1552
  }
1700
- if (! (Array.isArray(taskDef.out) && taskDef.out.length <= 1 &&
1553
+ if (! (Array.isArray(taskDef.out) && taskDef.out.length <= 1 &&
1701
1554
  taskDef.out.every(function (x) { return (typeof(x) === 'string'); }))) {
1702
1555
  errors.push(format_error(OUT_REQ, taskDef));
1703
1556
  }
@@ -1740,19 +1593,19 @@ define('react/promise-task',['util', './sprintf', './base-task'], function (util
1740
1593
  }
1741
1594
  } catch (err) { //catch and handle the task error, calling final cb
1742
1595
  handleError(this, err);
1743
- }
1596
+ }
1744
1597
  };
1745
1598
 
1746
1599
  return PromiseTask;
1747
1600
 
1748
- });
1749
-
1601
+ });
1750
1602
  /*global define:true */
1751
1603
 
1752
1604
 
1753
1605
 
1754
1606
  define('react/ret-task',['util', './sprintf', './base-task'], function (util, sprintf, BaseTask) {
1755
1607
 
1608
+
1756
1609
  function format_error(errmsg, obj) {
1757
1610
  return sprintf('%s - %s', errmsg, util.inspect(obj));
1758
1611
  }
@@ -1796,7 +1649,7 @@ define('react/ret-task',['util', './sprintf', './base-task'], function (util, sp
1796
1649
  RetTask.prototype.exec = function exec(vCon, handleError, contExec) {
1797
1650
  try {
1798
1651
  var args = this.a.map(function (k) { return vCon.getVar(k); }); //get args from vCon
1799
- this.start(args); //note the start time, args
1652
+ this.start(args); //note the start time, args
1800
1653
  var func = this.f;
1801
1654
  var bindObj = vCon.getVar('this'); //global space or the original this
1802
1655
  if (this.isMethodCall()) { //if method call then reset func and bindObj
@@ -1814,14 +1667,14 @@ define('react/ret-task',['util', './sprintf', './base-task'], function (util, sp
1814
1667
 
1815
1668
  return RetTask;
1816
1669
 
1817
- });
1818
-
1670
+ });
1819
1671
  /*global define:true */
1820
1672
 
1821
1673
 
1822
1674
 
1823
1675
  define('react/when-task',['util', './sprintf', './base-task'], function (util, sprintf, BaseTask) {
1824
1676
 
1677
+
1825
1678
  /**
1826
1679
  When task which checks if is a promise (has a then method)
1827
1680
  and waits for it to resolve.
@@ -1845,19 +1698,18 @@ define('react/when-task',['util', './sprintf', './base-task'], function (util, s
1845
1698
  WhenTask.prototype = new BaseTask();
1846
1699
  WhenTask.prototype.constructor = WhenTask;
1847
1700
 
1848
- WhenTask.prototype.f = function when() { // just here to keep validations happy
1849
- }
1701
+ WhenTask.prototype.f = function when() { }; // just here to keep validations happy
1850
1702
 
1851
1703
  WhenTask.validate = function (taskDef) {
1852
1704
  var errors = [];
1853
1705
  if (!taskDef.a || !taskDef.out) {
1854
1706
  errors.push(format_error(REQ, taskDef));
1855
1707
  } else {
1856
- if (! (Array.isArray(taskDef.a) && taskDef.a.length === 1 &&
1708
+ if (! (Array.isArray(taskDef.a) && taskDef.a.length === 1 &&
1857
1709
  taskDef.a.every(function (x) { return (typeof(x) === 'string'); }))) {
1858
1710
  errors.push(format_error(A_REQ, taskDef));
1859
1711
  }
1860
- if (! (Array.isArray(taskDef.out) && taskDef.out.length <= 1 &&
1712
+ if (! (Array.isArray(taskDef.out) && taskDef.out.length <= 1 &&
1861
1713
  taskDef.out.every(function (x) { return (typeof(x) === 'string'); }))) {
1862
1714
  errors.push(format_error(OUT_REQ, taskDef));
1863
1715
  }
@@ -1892,25 +1744,25 @@ define('react/when-task',['util', './sprintf', './base-task'], function (util, s
1892
1744
  }
1893
1745
  } catch (err) { //catch and handle the task error, calling final cb
1894
1746
  handleError(this, err);
1895
- }
1747
+ }
1896
1748
  };
1897
1749
 
1898
1750
  return WhenTask;
1899
1751
 
1900
- });
1901
-
1752
+ });
1902
1753
  /*global define:true */
1903
1754
 
1904
1755
 
1905
1756
 
1906
1757
  define('react/finalcb-task',['./sprintf', 'util', './status', './event-manager'],
1907
1758
  function (sprintf, util, STATUS, EventManager) {
1759
+
1908
1760
 
1909
1761
  var OUTTASK_A_REQ = 'ast.outTask.a should be an array of string param names';
1910
1762
 
1911
1763
  function FinalCbTask(outTaskOptions) {
1912
- var taskDef = outTaskOptions.taskDef;
1913
- if (typeof(outTaskOptions.cbFunc) !== 'function') throw new Error('callback is not a function');
1764
+ var taskDef = outTaskOptions.taskDef;
1765
+ if (typeof(outTaskOptions.cbFunc) !== 'function') throw new Error('callback is not a function');
1914
1766
  var self = this;
1915
1767
  for (var k in taskDef) {
1916
1768
  if (true) self[k] = taskDef[k]; // if to make jshint happy
@@ -1960,7 +1812,118 @@ define('react/finalcb-task',['./sprintf', 'util', './status', './event-manager']
1960
1812
 
1961
1813
  return FinalCbTask;
1962
1814
 
1963
- });
1815
+ });
1816
+ /*global define:true */
1817
+
1818
+
1819
+
1820
+ define('react/vcon',[], function () {
1821
+
1822
+
1823
+ var LAST_RESULTS_KEY = ':LAST_RESULTS';
1824
+
1825
+ function VContext() {
1826
+ }
1827
+
1828
+ VContext.prototype.getLastResults = function () { return this.getVar(LAST_RESULTS_KEY); };
1829
+ VContext.prototype.setLastResults = function (args) { this.setVar(LAST_RESULTS_KEY, args); };
1830
+
1831
+ VContext.prototype.getVar = function (name) { //name might be simple or obj.prop, also literals
1832
+ /*jshint regexp: false */
1833
+ var vConValues = this.values;
1834
+ if (typeof(name) !== 'string') return name; // literal boolean or number
1835
+ name = name.trim();
1836
+ // literal checks need to match what is in validate.js
1837
+ if (name === 'true') return true;
1838
+ if (name === 'false') return false;
1839
+ if (name === 'null') return null;
1840
+ if (/^-?[0-9]+$/.test(name)) return parseInt(name, 10); //int
1841
+ if (/^-?[0-9.]+$/.test(name)) return parseFloat(name); //float
1842
+ var m = /^("|')([^\1]*)\1$/.exec(name); //check for quoted string " or '
1843
+ if (m) return m[2]; // if is quoted str, return inside of the quotes
1844
+ var nameAndProps = name.split('.');
1845
+ var result = this.resolveNameArr(nameAndProps);
1846
+ return result;
1847
+ };
1848
+
1849
+ VContext.prototype.resolveNameArr = function (nameAndProps) {
1850
+ var vConValues = this.values;
1851
+ var result = nameAndProps.reduce(function (accObj, prop) {
1852
+ if (accObj === undefined || accObj === null) return undefined; // prevent exception
1853
+ return accObj[prop];
1854
+ }, vConValues); // vCon['foo']['bar']
1855
+ if (result === undefined && this.global !== undefined) { // see if matches any global
1856
+ result = nameAndProps.reduce(function (accObj, prop) {
1857
+ if (accObj === undefined || accObj === null) return undefined; // prevent exception
1858
+ return accObj[prop];
1859
+ }, this.global); // global['foo']['bar']
1860
+ }
1861
+ return result;
1862
+ };
1863
+
1864
+ /**
1865
+ Saves all the results from a task as a unit, also sets special
1866
+ variable :LAST_RESULTS which keeps an array of the last values
1867
+ which can be used for chaining and testing last results, etc.
1868
+ */
1869
+ VContext.prototype.saveResults = function (paramArr, valuesArr) { // set values for params
1870
+ var self = this;
1871
+ paramArr.forEach(function (k, idx) { //save values to v context
1872
+ self.setVar(k, (valuesArr[idx] !== undefined) ? valuesArr[idx] : null); //upgrade any undefined to null
1873
+ });
1874
+ this.setLastResults(valuesArr);
1875
+ };
1876
+
1877
+ VContext.prototype.setVar = function (name, value) { //name might be simple or obj.prop
1878
+ if (!name) return; // if name is undefined or null, then discard
1879
+ var vConValues = this.values;
1880
+ var nameAndProps = name.split('.');
1881
+ var lastProp = nameAndProps.pop();
1882
+ var obj = nameAndProps.reduce(function (accObj, prop) {
1883
+ var o = accObj[prop];
1884
+ if (o === undefined || o === null) { // if doesn't exist create it
1885
+ o = accObj[prop] = { };
1886
+ }
1887
+ return o;
1888
+ }, vConValues); // vCon['foo']['bar']
1889
+ obj[lastProp] = value;
1890
+ };
1891
+
1892
+
1893
+ /**
1894
+ Create Variable Context using arguments passed in.
1895
+ Ignore extra arguments passed in. Locals can be
1896
+ passed into seed the VContext otherwise empty {}
1897
+ will be used
1898
+ @param self used to pass 'this' context in
1899
+ */
1900
+ VContext.create = function (args, inParams, locals, self) {
1901
+ /*jshint validthis:true, evil:true */
1902
+ var initValues = {};
1903
+ if (self) initValues['this'] = self;
1904
+ if (locals) Object.keys(locals).forEach(function (k) { initValues[k] = locals[k]; }); // copy over keys
1905
+ var vContext = new VContext();
1906
+ vContext.values = args.reduce(function (vcon, x, idx) { // create vCon start with input args
1907
+ var param = inParams[idx];
1908
+ if (param) vcon[param] = (x !== undefined) ? x : null; // upgrade undefined to null
1909
+ return vcon;
1910
+ }, initValues);
1911
+
1912
+ // add in global
1913
+ if (typeof global === 'object') { // node.js and modern browsers expose global
1914
+ vContext.global = global;
1915
+ } else { // try to access this using Function eval of this
1916
+ // http://stackoverflow.com/questions/3277182/how-to-get-the-global-object-in-javascript
1917
+ vContext.global = new Function('return this')();
1918
+ }
1919
+
1920
+ return vContext;
1921
+ };
1922
+
1923
+
1924
+ return VContext;
1925
+
1926
+ });
1964
1927
 
1965
1928
  /*global define:true */
1966
1929
 
@@ -1968,12 +1931,13 @@ define('react/finalcb-task',['./sprintf', 'util', './status', './event-manager']
1968
1931
 
1969
1932
  define('react/finalcb-first-task',['./sprintf', 'util', './status', './vcon', './event-manager'],
1970
1933
  function (sprintf, util, STATUS, VContext, EventManager) {
1934
+
1971
1935
 
1972
1936
  var OUTTASK_A_REQ = 'ast.outTask.a should be an array of string param names';
1973
1937
 
1974
1938
  function FinalCbFirstSuccTask(outTaskOptions) {
1975
- var taskDef = outTaskOptions.taskDef;
1976
- if (typeof(outTaskOptions.cbFunc) !== 'function') throw new Error('callback is not a function');
1939
+ var taskDef = outTaskOptions.taskDef;
1940
+ if (typeof(outTaskOptions.cbFunc) !== 'function') throw new Error('callback is not a function');
1977
1941
  var self = this;
1978
1942
  for (var k in taskDef) {
1979
1943
  if (true) self[k] = taskDef[k]; // if to make jshint happy
@@ -2026,8 +1990,7 @@ define('react/finalcb-first-task',['./sprintf', 'util', './status', './vcon', '.
2026
1990
 
2027
1991
  return FinalCbFirstSuccTask;
2028
1992
 
2029
- });
2030
-
1993
+ });
2031
1994
  /*global define:true */
2032
1995
 
2033
1996
 
@@ -2039,6 +2002,7 @@ function (util, sprintf, array, CbTask, PromiseTask,
2039
2002
  RetTask, WhenTask, FinalCbTask, FinalCbFirstSuccTask,
2040
2003
  STATUS, error, VContext, EventManager) {
2041
2004
 
2005
+
2042
2006
  var TASK_TYPES = {
2043
2007
  cb: CbTask,
2044
2008
  ret: RetTask,
@@ -2073,13 +2037,13 @@ function (util, sprintf, array, CbTask, PromiseTask,
2073
2037
  */
2074
2038
  function setMissingType(taskDef) {
2075
2039
  if (taskDef.type) return taskDef; //already set, return
2076
- taskDef.type = 'cb';
2040
+ taskDef.type = 'cb';
2077
2041
  return taskDef;
2078
2042
  }
2079
2043
 
2080
2044
  function setMissingOutTaskType(taskDef) {
2081
2045
  if (!taskDef.type) taskDef.type = Object.keys(OUT_TASK_TYPES)[0]; //use first outTask type as default
2082
- }
2046
+ }
2083
2047
 
2084
2048
  function ensureAfterArrStrings(taskDef) { // convert any fn to str, and make sure is array
2085
2049
  if (!taskDef.after) return;
@@ -2092,14 +2056,14 @@ function (util, sprintf, array, CbTask, PromiseTask,
2092
2056
  @returns array of errors for taskDef, could be empty
2093
2057
  */
2094
2058
  function validate(taskDef) {
2095
- if (!taskDef || typeof(taskDef) !== 'object') {
2059
+ if (!taskDef || typeof(taskDef) !== 'object') {
2096
2060
  return [format_error(TASKDEF_IS_OBJECT, taskDef)];
2097
2061
  }
2098
2062
  setMissingType(taskDef);
2099
2063
  ensureAfterArrStrings(taskDef);
2100
2064
  var errors = [];
2101
2065
  errors = errors.concat(validateTaskType(taskDef));
2102
- errors = errors.concat(validateTask(taskDef));
2066
+ errors = errors.concat(validateTask(taskDef));
2103
2067
  return errors;
2104
2068
  }
2105
2069
 
@@ -2126,13 +2090,13 @@ function (util, sprintf, array, CbTask, PromiseTask,
2126
2090
  setMissingOutTaskType(taskDef);
2127
2091
  var taskCons = OUT_TASK_TYPES[taskDef.type];
2128
2092
  errors = errors.concat(taskCons.validate(taskDef));
2129
- return errors;
2093
+ return errors;
2130
2094
  }
2131
2095
 
2132
2096
 
2133
2097
  function validateLocalFunctions(inParams, taskDefs, locals) {
2134
2098
  var errors = [];
2135
- function foo() { } //used to mock args as fns for validation check
2099
+ function foo() { } //used to mock args as fns for validation check
2136
2100
  var mock_args = inParams.map(function (p) { return foo; }); //mock args with fns
2137
2101
  var vCon = VContext.create(mock_args, inParams, locals);
2138
2102
  var tasks = taskDefs.map(create);
@@ -2205,7 +2169,7 @@ function (util, sprintf, array, CbTask, PromiseTask,
2205
2169
  var TaskConstructor = outTaskOptions.TaskConstructor; // hook could have changed
2206
2170
  return new TaskConstructor(outTaskOptions);
2207
2171
  }
2208
-
2172
+
2209
2173
  function createErrorHandler(vCon, outTask) {
2210
2174
  return function handleError(task, err) {
2211
2175
  task.status = STATUS.ERRORED;
@@ -2223,7 +2187,7 @@ function (util, sprintf, array, CbTask, PromiseTask,
2223
2187
 
2224
2188
  function execTasks(tasksReady, vCon, handleError, contExec) {
2225
2189
  tasksReady.forEach(function (t) { t.status = STATUS.READY; }); //set ready first, no double exec
2226
- tasksReady.forEach(function (t) { t.exec(vCon, handleError, contExec); });
2190
+ tasksReady.forEach(function (t) { t.exec(vCon, handleError, contExec); });
2227
2191
  }
2228
2192
 
2229
2193
  /**
@@ -2254,7 +2218,7 @@ function (util, sprintf, array, CbTask, PromiseTask,
2254
2218
 
2255
2219
  function serializeTasks(tasks) { // conveniently set after for each task idx > 0
2256
2220
  nameTasks(tasks);
2257
- tasks.forEach(function (t, idx, arr) { if (idx !== 0) t.after = [arr[idx - 1].name]; });
2221
+ tasks.forEach(function (t, idx, arr) { if (idx !== 0) t.after = [arr[idx - 1].name]; });
2258
2222
  return tasks;
2259
2223
  }
2260
2224
 
@@ -2275,15 +2239,15 @@ function (util, sprintf, array, CbTask, PromiseTask,
2275
2239
  findReadyAndExec: findReadyAndExec
2276
2240
  };
2277
2241
 
2278
- });
2279
-
2242
+ });
2280
2243
  /*global define:true */
2281
2244
 
2282
2245
 
2283
2246
 
2284
2247
  define('react/validate',['util', './sprintf', 'ensure-array', './task'], function (util, sprintf, array, taskUtil) {
2285
- /*jshint latedef:false */
2286
2248
 
2249
+ /*jshint latedef:false */
2250
+
2287
2251
  var AST_IS_OBJECT = 'ast must be an object with inParams, tasks, and outTask';
2288
2252
  var INPARAMS_ARR_STR = 'ast.inParams must be an array of strings';
2289
2253
  var TASKS_ARR = 'ast.tasks must be an array of tasks';
@@ -2293,7 +2257,7 @@ define('react/validate',['util', './sprintf', 'ensure-array', './task'], functio
2293
2257
  var MISSING_INPUTS = 'missing or mispelled variable referenced in flow definition: %s';
2294
2258
 
2295
2259
  // match any of our literals true, false, int, float, quoted strings, or is property (has dot), match vcon.js
2296
- var LITERAL_OR_PROP_RE = /^(true|false|this|null|\-?[0-9\.]+)$|'|"|\./i;
2260
+ var LITERAL_OR_PROP_RE = /^(true|false|this|null|\-?[0-9\.]+)$|'|"|\./i;
2297
2261
 
2298
2262
  function format_error(errmsg, obj) {
2299
2263
  return sprintf('%s - %s', errmsg, util.inspect(obj));
@@ -2349,11 +2313,11 @@ define('react/validate',['util', './sprintf', 'ensure-array', './task'], functio
2349
2313
  tasks.forEach(function (t) {
2350
2314
  errors = errors.concat(taskUtil.validate(t));
2351
2315
  });
2352
- return errors;
2316
+ return errors;
2353
2317
  }
2354
2318
 
2355
2319
  function validateTaskNamesUnique(tasks) {
2356
- if (!Array.isArray(tasks)) return [];
2320
+ if (!Array.isArray(tasks)) return [];
2357
2321
  var errors = [];
2358
2322
  var namedTasks = tasks.filter(function (t) { return (t.name); });
2359
2323
  var names = namedTasks.map(function (t) { return t.name; });
@@ -2361,7 +2325,7 @@ define('react/validate',['util', './sprintf', 'ensure-array', './task'], functio
2361
2325
  if (accum[name]) errors.push(sprintf('%s %s', NAMES_UNIQUE, name));
2362
2326
  else accum[name] = true;
2363
2327
  return accum;
2364
- }, {});
2328
+ }, {});
2365
2329
  return errors;
2366
2330
  }
2367
2331
 
@@ -2427,13 +2391,86 @@ define('react/validate',['util', './sprintf', 'ensure-array', './task'], functio
2427
2391
  if (!isLiteralOrProp(p) && !names[p]) accum.push(sprintf(MISSING_INPUTS, p)); // add error if missing
2428
2392
  return accum;
2429
2393
  }, errors);
2430
- return errors;
2394
+ return errors;
2431
2395
  }
2432
2396
 
2433
2397
  return validate;
2434
2398
 
2435
- });
2399
+ });
2400
+ /*global define:true */
2401
+
2402
+
2436
2403
 
2404
+ define('react/input-parser',['./event-manager'], function (EventManager) {
2405
+
2406
+
2407
+ var defaultExecOptions = {
2408
+ reactExecOptions: true,
2409
+ outputStyle: 'cb',
2410
+ };
2411
+
2412
+ var OUTPUT_STYLES = {
2413
+ CALLBACK: 'cb',
2414
+ NONE: 'none'
2415
+ };
2416
+
2417
+ function isExecOptions(x) { return (x && x.reactExecOptions); }
2418
+ function execOptionsFilter(x) { return isExecOptions(x); }
2419
+ function nonExecOptionsFilter(x) { return !isExecOptions(x); }
2420
+ function mergeExecOptions(accum, options) {
2421
+ Object.keys(options).forEach(function (k) { accum[k] = options[k]; });
2422
+ return accum;
2423
+ }
2424
+
2425
+ function splitArgs(args, inParams, style) {
2426
+ var result = { };
2427
+ result.args = inParams.map(function (p) { return args.shift(); }); // take args for input params first
2428
+ if (style === OUTPUT_STYLES.CALLBACK && args.length) result.cb = args.shift(); // next take the cb
2429
+ result.extra = args; // these remaining were after the callback
2430
+ return result;
2431
+ }
2432
+
2433
+ function inputParser(inputArgs, ast) {
2434
+ var parsedInput = { };
2435
+ var execOptionsArr = inputArgs.filter(execOptionsFilter);
2436
+ execOptionsArr.unshift(defaultExecOptions);
2437
+ parsedInput.options = execOptionsArr.reduce(mergeExecOptions, {});
2438
+
2439
+ var args = inputArgs.filter(nonExecOptionsFilter);
2440
+ var splitResult = splitArgs(args, ast.inParams, parsedInput.options.outputStyle);
2441
+ parsedInput.args = splitResult.args;
2442
+ parsedInput.cb = splitResult.cb;
2443
+ if (splitResult.outputStyle) parsedInput.options.outputStyle = splitResult.outputStyle;
2444
+ if (splitResult.extra) parsedInput.extraArgs = splitResult.extra;
2445
+ EventManager.global.emit(EventManager.TYPES.EXEC_INPUT_PREPROCESS, parsedInput); // hook
2446
+ return parsedInput;
2447
+ }
2448
+
2449
+
2450
+ inputParser.defaultExecOptions = defaultExecOptions;
2451
+ return inputParser;
2452
+
2453
+ });
2454
+ /*global define:true */
2455
+
2456
+
2457
+
2458
+ define('react/id',[], function () {
2459
+
2460
+
2461
+ var startingId = 0;
2462
+
2463
+ function createUniqueId() {
2464
+ startingId += 1;
2465
+ if (startingId === Number.MAX_VALUE) startingId = 0; // if hits this start over //TODO need something better?
2466
+ return startingId;
2467
+ }
2468
+
2469
+ return {
2470
+ createUniqueId: createUniqueId
2471
+ };
2472
+
2473
+ });
2437
2474
  /*global define:true */
2438
2475
 
2439
2476
 
@@ -2442,6 +2479,7 @@ define('react/core',['./eventemitter', './error', './validate', './task', './sta
2442
2479
  './vcon', './event-manager', './input-parser', './id', './sprintf'],
2443
2480
  function (EventEmitter, error, validate, taskUtil, STATUS,
2444
2481
  VContext, EventManager, inputParser, idGenerator, sprintf) {
2482
+
2445
2483
 
2446
2484
  var reactOptions = {
2447
2485
  stackTraceLimitMin: 30
@@ -2456,7 +2494,7 @@ define('react/core',['./eventemitter', './error', './validate', './task', './sta
2456
2494
  return Object.keys(reactOptions).reduce(function (accum, k) {
2457
2495
  if (!accum[k]) accum[k] = reactOptions[k];
2458
2496
  return accum;
2459
- }, parsedOptions);
2497
+ }, parsedOptions);
2460
2498
  }
2461
2499
 
2462
2500
  /**
@@ -2513,7 +2551,7 @@ define('react/core',['./eventemitter', './error', './validate', './task', './sta
2513
2551
  });
2514
2552
  Object.freeze(newAST);
2515
2553
  }
2516
- flowEmitter.emit(EventManager.TYPES.AST_DEFINED, ast);
2554
+ flowEmitter.emit(EventManager.TYPES.AST_DEFINED, ast);
2517
2555
  return errors;
2518
2556
  }
2519
2557
 
@@ -2537,7 +2575,7 @@ define('react/core',['./eventemitter', './error', './validate', './task', './sta
2537
2575
  env.taskDefs = ast.tasks.slice(); // create copy
2538
2576
  env.outTaskDef = Object.create(ast.outTask); // create copy
2539
2577
  reactEmitter.emit(EventManager.TYPES.EXEC_TASKS_PRECREATE, env); // hook
2540
-
2578
+
2541
2579
  var tasks = env.taskDefs.map(taskUtil.create);
2542
2580
  var tasksByName = taskUtil.nameTasks(tasks); // map names to working tasks
2543
2581
  var outTask = taskUtil.createOutTask(env.outTaskDef, parsedInput.cb, tasks, vCon, env.options, env);
@@ -2568,13 +2606,13 @@ define('react/core',['./eventemitter', './error', './validate', './task', './sta
2568
2606
  reactFactory.options = reactOptions; // global react options
2569
2607
  reactFactory.events = reactEmitter; // global react emitter
2570
2608
  return reactFactory; // module returns reactFactory to create a react fn
2571
- });
2572
-
2609
+ });
2573
2610
  /*global define:true */
2574
2611
 
2575
2612
 
2576
2613
 
2577
2614
  define('react/parse',['./sprintf'], function (sprintf) {
2615
+
2578
2616
 
2579
2617
  function splitTrimFilterArgs(commaSepArgs) { //parse 'one, two' into ['one', 'two']
2580
2618
  if (!commaSepArgs) return [];
@@ -2599,7 +2637,7 @@ define('react/parse',['./sprintf'], function (sprintf) {
2599
2637
  return result;
2600
2638
  } else { // no match
2601
2639
  throw new Error(sprintf(errStr, str));
2602
- }
2640
+ }
2603
2641
  }
2604
2642
 
2605
2643
  return {
@@ -2607,8 +2645,7 @@ define('react/parse',['./sprintf'], function (sprintf) {
2607
2645
  parseStr: parseStr
2608
2646
  };
2609
2647
 
2610
- });
2611
-
2648
+ });
2612
2649
 
2613
2650
  /*global define:true */
2614
2651
 
@@ -2616,7 +2653,8 @@ define('react/parse',['./sprintf'], function (sprintf) {
2616
2653
 
2617
2654
  define('react/dsl',['./sprintf', './core', './parse', './task'],
2618
2655
  function (sprintf, core, parse, taskUtil) {
2619
- /*jshint regexp: false */
2656
+
2657
+ /*jshint regexp: false */
2620
2658
 
2621
2659
  var MISSING_NAME = 'first flow parameter should be the flow name, but found in/out def: %s';
2622
2660
  var INOUT_PARAMS_NO_MATCH = 'params in wrong format, wanted "foo, bar, cb -> err, baz" - found: %s';
@@ -2640,23 +2678,23 @@ define('react/dsl',['./sprintf', './core', './parse', './task'],
2640
2678
 
2641
2679
  var inOutDefParse = {
2642
2680
  splitStr: '->',
2643
- fn: function (m, origStr) {
2644
- var inParams = parse.splitTrimFilterArgs(m[0]);
2645
- var lastParam = inParams[inParams.length - 1];
2646
- var type = (lastParam && CB_NAMES_RE.test(lastParam)) ? 'cb' : 'ret';
2647
- var outParams = parse.splitTrimFilterArgs(m[1]);
2648
- var firstOutParam = outParams[0];
2649
- if (type === 'cb' && (!firstOutParam || !ERR_NAMES_RE.test(firstOutParam))) {
2650
- throw new Error(sprintf(MISSING_ERR, origStr)); // found cb, but no err param
2651
- } else if (type === 'ret' && firstOutParam && ERR_NAMES_RE.test(firstOutParam)) {
2652
- throw new Error(sprintf(MISSING_CB, origStr)); // found err but not cb param
2653
- }
2654
- return {
2655
- type: type,
2656
- inDef: filterOutTrailingCbParam(inParams),
2657
- outDef: filterOutLeadingErrParam(outParams)
2658
- };
2681
+ fn: function (m, origStr) {
2682
+ var inParams = parse.splitTrimFilterArgs(m[0]);
2683
+ var lastParam = inParams[inParams.length - 1];
2684
+ var type = (lastParam && CB_NAMES_RE.test(lastParam)) ? 'cb' : 'ret';
2685
+ var outParams = parse.splitTrimFilterArgs(m[1]);
2686
+ var firstOutParam = outParams[0];
2687
+ if (type === 'cb' && (!firstOutParam || !ERR_NAMES_RE.test(firstOutParam))) {
2688
+ throw new Error(sprintf(MISSING_ERR, origStr)); // found cb, but no err param
2689
+ } else if (type === 'ret' && firstOutParam && ERR_NAMES_RE.test(firstOutParam)) {
2690
+ throw new Error(sprintf(MISSING_CB, origStr)); // found err but not cb param
2659
2691
  }
2692
+ return {
2693
+ type: type,
2694
+ inDef: filterOutTrailingCbParam(inParams),
2695
+ outDef: filterOutLeadingErrParam(outParams)
2696
+ };
2697
+ }
2660
2698
  };
2661
2699
 
2662
2700
  function parseInOutParams(str) {
@@ -2692,11 +2730,11 @@ define('react/dsl',['./sprintf', './core', './parse', './task'],
2692
2730
  // if next arg is object, shift it off as options
2693
2731
  var options = (vargs.length && typeof(vargs[0]) === 'object') ? vargs.shift() : { };
2694
2732
  var taskDefArr = vargs; // rest are for the tasks
2695
- var defObj = {
2733
+ var defObj = {
2696
2734
  inOutParamStr: inOutParamStr,
2697
2735
  taskDefArr: taskDefArr,
2698
2736
  options: options
2699
- };
2737
+ };
2700
2738
  return defObj;
2701
2739
  }
2702
2740
 
@@ -2704,7 +2742,7 @@ define('react/dsl',['./sprintf', './core', './parse', './task'],
2704
2742
  function dslDefine(name, arg1, arg2, argN) {
2705
2743
  var reactFn = core();
2706
2744
  if (name && INOUT_RE.test(name)) throw new Error(sprintf(MISSING_NAME, name));
2707
- var defObj = parseVargs(Array.prototype.slice.call(arguments, 1)); // name, already used
2745
+ var defObj = parseVargs(Array.prototype.slice.call(arguments, 1)); // name, already used
2708
2746
  var inOutDef = parseInOutParams(defObj.inOutParamStr);
2709
2747
  var ast = {
2710
2748
  name: name,
@@ -2713,18 +2751,18 @@ define('react/dsl',['./sprintf', './core', './parse', './task'],
2713
2751
  outTask: { a: inOutDef.outDef }
2714
2752
  };
2715
2753
  if (defObj.options) Object.keys(defObj.options).forEach(function (k) { ast[k] = defObj.options[k]; });
2716
- var errors = reactFn.setAndValidateAST(ast);
2754
+ var errors = reactFn.setAndValidateAST(ast);
2717
2755
  if (errors.length) {
2718
2756
  var errorStr = errors.join('\n');
2719
- throw new Error(errorStr);
2757
+ throw new Error(errorStr);
2720
2758
  }
2721
2759
  return reactFn;
2722
- }
2760
+ }
2723
2761
 
2724
2762
  function selectFirst(name, arg1, arg2, argN) {
2725
2763
  var reactFn = core();
2726
- var defObj = parseVargs(Array.prototype.slice.call(arguments, 1)); // name, already used
2727
- var inOutDef = parseInOutParams(defObj.inOutParamStr);
2764
+ var defObj = parseVargs(Array.prototype.slice.call(arguments, 1)); // name, already used
2765
+ var inOutDef = parseInOutParams(defObj.inOutParamStr);
2728
2766
  var tasks = taskUtil.serializeTasks(parseTasks(defObj.taskDefArr));
2729
2767
  var ast = {
2730
2768
  name: name,
@@ -2732,7 +2770,7 @@ define('react/dsl',['./sprintf', './core', './parse', './task'],
2732
2770
  tasks: tasks,
2733
2771
  outTask: { type: 'finalcbFirst', a: inOutDef.outDef },
2734
2772
  };
2735
- if (defObj.options) Object.keys(defObj.options).forEach(function (k) { ast[k] = defObj.options[k]; });
2773
+ if (defObj.options) Object.keys(defObj.options).forEach(function (k) { ast[k] = defObj.options[k]; });
2736
2774
  var errors = reactFn.setAndValidateAST(ast);
2737
2775
  if (errors.length) {
2738
2776
  var errorStr = errors.join('\n');
@@ -2743,15 +2781,15 @@ define('react/dsl',['./sprintf', './core', './parse', './task'],
2743
2781
 
2744
2782
  dslDefine.selectFirst = selectFirst;
2745
2783
  return dslDefine;
2746
-
2747
- });
2748
2784
 
2785
+ });
2749
2786
  /*global define:true */
2750
2787
 
2751
2788
 
2752
2789
 
2753
2790
  define('react/track-tasks',[], function () {
2754
2791
 
2792
+
2755
2793
  /**
2756
2794
  Track the tasks, start, complete, args, results, elapsed time
2757
2795
  Emits events that can be monitored
@@ -2814,18 +2852,18 @@ define('react/track-tasks',[], function () {
2814
2852
 
2815
2853
  }
2816
2854
 
2817
- return trackTasks;
2818
-
2819
- });
2855
+ return trackTasks;
2820
2856
 
2857
+ });
2821
2858
  /*global define:true */
2822
2859
 
2823
2860
 
2824
2861
 
2825
2862
  define('react/log-events',['util'], function (util) { // TODO replace util.inspect with something portable to browser
2863
+
2826
2864
 
2827
2865
  var logEventsMod = { };
2828
-
2866
+
2829
2867
  /**
2830
2868
  Log events to console.error
2831
2869
 
@@ -2837,31 +2875,31 @@ define('react/log-events',['util'], function (util) { // TODO replace util.inspe
2837
2875
  react.logEvents(flowFn, 'flow.*'); // log all flow events on flowFn only
2838
2876
  */
2839
2877
 
2840
- var ALL_FLOW_EVENTS = 'flow.*';
2878
+ var ALL_FLOW_EVENTS = 'flow.*';
2841
2879
  var ALL_TASK_EVENTS = 'task.*';
2842
2880
  var FLOW_RE = /^flow\./;
2843
2881
 
2844
2882
  function flowLog(obj) {
2845
2883
  /*jshint validthis: true */
2846
2884
  var time = new Date();
2847
- time.setTime(obj.time);
2885
+ time.setTime(obj.startTime);
2848
2886
  var argsNoCb = obj.args.filter(function (a) { return (typeof(a) !== 'function'); });
2849
2887
  var eventTimeStr = time.toISOString();
2850
2888
  if (this.event === 'flow.complete') {
2851
- var env = obj;
2889
+ var env = obj;
2852
2890
  console.error('%s: %s \tmsecs: %s \n\targs: %s \n\tresults: %s\n',
2853
- this.event, env.name, env.elapsedTime, util.inspect(argsNoCb), util.inspect(env.results));
2891
+ this.event, env.name, env.elapsedTime, util.inspect(argsNoCb), util.inspect(env.results));
2854
2892
  } else {
2855
2893
  var name = obj.name;
2856
2894
  var args = obj.args;
2857
2895
  console.error('%s: %s \n\targs: %s\n', this.event, name, util.inspect(argsNoCb));
2858
- }
2896
+ }
2859
2897
  }
2860
2898
 
2861
2899
  function taskLog(obj) {
2862
2900
  /*jshint validthis: true */
2863
2901
  var time = new Date();
2864
- time.setTime(obj.time);
2902
+ time.setTime(obj.startTime);
2865
2903
  var argsNoCb = obj.args.filter(function (a) { return (typeof(a) !== 'function'); });
2866
2904
  var eventTimeStr = time.toISOString();
2867
2905
  if (this.event === 'task.complete') {
@@ -2873,46 +2911,55 @@ define('react/log-events',['util'], function (util) { // TODO replace util.inspe
2873
2911
  var args = obj.args;
2874
2912
  console.error('%s: %s:%s \n\targs: %s\n', this.event, obj.env.name, obj.name, util.inspect(argsNoCb));
2875
2913
  }
2876
-
2914
+
2877
2915
  }
2878
2916
 
2879
2917
  /**
2880
2918
  Log flow and task events for a flowFn or all of react.
2881
2919
  If called multiple times, remove previous listener (if any) before
2882
2920
  adding.
2883
-
2921
+
2884
2922
  @example
2885
2923
  var react = require('react');
2886
2924
  react.logEvents(flowFn, eventWildcard); //log events on flowfn matching wildcard
2887
-
2925
+
2888
2926
  @param flowFn Flow function or global react object
2889
2927
  @param eventWildcard wildcarded event type, if not provided use flow.* and task.*
2890
2928
  */
2891
2929
  function logEvents(flowFn, eventWildcard) {
2892
2930
  if (!flowFn) throw new Error('flowFn is required');
2893
- if (eventWildcard && eventWildcard !== '*') {
2931
+ if (!flowFn.events._loggingEvents) flowFn.events._loggingEvents = [];
2932
+ if (eventWildcard === false) { // turn off logging
2933
+ flowFn.events._loggingEvents.forEach(function (evt) {
2934
+ flowFn.events.removeAllListeners(evt);
2935
+ });
2936
+ flowFn.events._loggingEvents.length = 0; // clear
2937
+ } else if (eventWildcard && eventWildcard !== '*') {
2894
2938
  var logFn = (FLOW_RE.test(eventWildcard)) ? flowLog : taskLog;
2895
2939
  flowFn.events.removeListener(eventWildcard, logFn);
2896
2940
  flowFn.events.on(eventWildcard, logFn);
2941
+ flowFn.events._loggingEvents.push(eventWildcard);
2897
2942
  } else { // none provided, use flow.* and task.*
2898
2943
  //output events as tasks start and complete
2899
2944
  flowFn.events.removeListener(ALL_FLOW_EVENTS, flowLog);
2900
2945
  flowFn.events.on(ALL_FLOW_EVENTS, flowLog);
2946
+ flowFn.events._loggingEvents.push(ALL_FLOW_EVENTS);
2901
2947
  flowFn.events.removeListener(ALL_TASK_EVENTS, taskLog);
2902
- flowFn.events.on(ALL_TASK_EVENTS, taskLog);
2948
+ flowFn.events.on(ALL_TASK_EVENTS, taskLog);
2949
+ flowFn.events._loggingEvents.push(ALL_TASK_EVENTS);
2903
2950
  }
2904
2951
  }
2905
2952
 
2906
2953
  logEventsMod.logEvents = logEvents;
2907
2954
  return logEventsMod;
2908
2955
 
2909
- });
2910
-
2956
+ });
2911
2957
  /*global define:true */
2912
2958
 
2913
2959
 
2914
2960
 
2915
2961
  define('react/promise-resolve',[], function () {
2962
+
2916
2963
 
2917
2964
  /**
2918
2965
  Auto resolve promises passed in as arguments to the flow
@@ -2924,9 +2971,9 @@ define('react/promise-resolve',[], function () {
2924
2971
  */
2925
2972
 
2926
2973
 
2927
- var PROMISE_SUFFIX = '__promise'; // added to param names that are promises
2974
+ var PROMISE_SUFFIX = '__promise'; // added to param names that are promises
2928
2975
 
2929
- var resolvingPromises = false;
2976
+ var resolvingPromises = false;
2930
2977
 
2931
2978
  function resolvePromises(react) {
2932
2979
  if (resolvingPromises) return; // already resolving
@@ -2954,13 +3001,13 @@ define('react/promise-resolve',[], function () {
2954
3001
 
2955
3002
  return resolvePromises;
2956
3003
 
2957
- });
2958
-
3004
+ });
2959
3005
  /*global define:true */
2960
3006
 
2961
3007
 
2962
3008
 
2963
3009
  define('react/event-collector',[], function () {
3010
+
2964
3011
 
2965
3012
  /**
2966
3013
  create an instance of the event collector
@@ -3013,9 +3060,9 @@ define('react/event-collector',[], function () {
3013
3060
  } else if (TASK_EVENTS_RE.test(this.event)) {
3014
3061
  eventObject.task = obj;
3015
3062
  } else if (AST_EVENTS_RE.test(this.event)) {
3016
- eventObject.ast = obj;
3063
+ eventObject.ast = obj;
3017
3064
  }
3018
- self.events.push(eventObject);
3065
+ self.events.push(eventObject);
3019
3066
  }
3020
3067
  emitter.on(eventId, accumEvents);
3021
3068
  };
@@ -3028,22 +3075,22 @@ define('react/event-collector',[], function () {
3028
3075
  this.events = []; // clear
3029
3076
  };
3030
3077
 
3031
- return new EventCollector();
3078
+ return new EventCollector();
3032
3079
  }
3033
3080
 
3034
3081
  return instantiate; // return the factory for creating EventCollector
3035
-
3036
- });
3037
3082
 
3083
+ });
3038
3084
  /*global define:true */
3039
3085
 
3040
3086
 
3041
3087
 
3042
- define('react',['./core', './dsl', './track-tasks', './log-events', './promise-resolve', './event-collector'],
3088
+ define('react/react',['./core', './dsl', './track-tasks', './log-events', './promise-resolve', './event-collector'],
3043
3089
  function (core, dsl, trackTasksFn, logEventsMod, resolvePromisesFn, eventCollectorFactory) {
3090
+
3044
3091
 
3045
3092
  var react = dsl; // core + default dsl
3046
-
3093
+
3047
3094
  /**
3048
3095
  Enable detection of promises and resolution
3049
3096
  */
@@ -3057,8 +3104,8 @@ define('react',['./core', './dsl', './track-tasks', './log-events', './promise-r
3057
3104
  */
3058
3105
  function trackTasks() {
3059
3106
  trackTasksFn(react);
3060
- }
3061
-
3107
+ }
3108
+
3062
3109
  /**
3063
3110
  If called, load the built-in plugin for log events and invoke
3064
3111
 
@@ -3066,7 +3113,7 @@ define('react',['./core', './dsl', './track-tasks', './log-events', './promise-r
3066
3113
  @param eventWildcard [string] pattern to log events for
3067
3114
  */
3068
3115
  function logEvents(flowFn, eventWildcard) {
3069
- if (!eventWildcard && typeof(flowFn) === 'string') { // only wildcard provided
3116
+ if (typeof(flowFn) !== 'function') { // only wildcard provided
3070
3117
  eventWildcard = flowFn;
3071
3118
  flowFn = undefined;
3072
3119
  }
@@ -3087,7 +3134,8 @@ define('react',['./core', './dsl', './track-tasks', './log-events', './promise-r
3087
3134
  react.logEvents = logEvents; // enable event logging
3088
3135
  react.resolvePromises = resolvePromises; // enable promise resolution
3089
3136
  react.trackTasks = trackTasks; // enable tracking of tasks
3090
- react.createEventCollector = createEventCollector; // create instance of EventCollector
3137
+ react.createEventCollector = createEventCollector; // create instance of EventCollector
3091
3138
  return react;
3092
-
3093
- });
3139
+
3140
+ });
3141
+ define('react', ['react/react'], function (main) { return main; });