react 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/.travis.yml +5 -2
  2. package/README.md +16 -2
  3. package/browser-test/dist.html +1 -1
  4. package/browser-test/index.html +3 -3
  5. package/browser-test/min.html +1 -1
  6. package/dist/react.js +407 -557
  7. package/dist/react.min.js +22 -1
  8. package/doc/advanced.md +9 -1
  9. package/lib/base-task.js +16 -19
  10. package/lib/cb-task.js +5 -5
  11. package/lib/core.js +7 -7
  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 +13 -6
  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 +8 -8
  28. package/lib/status.js +3 -3
  29. package/lib/task.js +44 -47
  30. package/lib/track-tasks.js +4 -4
  31. package/lib/validate.js +8 -8
  32. package/lib/vcon.js +31 -8
  33. package/lib/when-task.js +7 -8
  34. package/package.json +7 -8
  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/lib/task.js CHANGED
@@ -1,4 +1,3 @@
1
- 'use strict';
2
1
  /*global define:true */
3
2
 
4
3
  if (typeof define !== 'function') {
@@ -11,15 +10,16 @@ define(['util', './sprintf', 'ensure-array', './cb-task', './promise-task',
11
10
  function (util, sprintf, array, CbTask, PromiseTask,
12
11
  RetTask, WhenTask, FinalCbTask, FinalCbFirstSuccTask,
13
12
  STATUS, error, VContext, EventManager) {
14
-
13
+ 'use strict';
14
+
15
15
  var TASK_TYPES = {
16
16
  cb: CbTask,
17
17
  ret: RetTask,
18
18
  promise: PromiseTask,
19
19
  when: WhenTask
20
- };
20
+ };
21
21
 
22
- var DEFAULT_TASK_NAME = 'task_%s'; // for unnamed tasks use task_idx, like task_0
22
+ var DEFAULT_TASK_NAME = 'task_%s'; // for unnamed tasks use task_idx, like task_0
23
23
 
24
24
  function taskTypeKeys() { return Object.keys(TASK_TYPES); }
25
25
 
@@ -35,9 +35,6 @@ function (util, sprintf, array, CbTask, PromiseTask,
35
35
  var TASK_TYPE_SHOULD_MATCH = 'task.type should match one of ' +
36
36
  Object.keys(TASK_TYPES).join(', ');
37
37
 
38
- var validateTaskType, validateTask, create;
39
-
40
-
41
38
  function format_error(errmsg, obj) {
42
39
  return sprintf('%s - %s', errmsg, util.inspect(obj));
43
40
  }
@@ -49,13 +46,13 @@ function (util, sprintf, array, CbTask, PromiseTask,
49
46
  */
50
47
  function setMissingType(taskDef) {
51
48
  if (taskDef.type) return taskDef; //already set, return
52
- taskDef.type = 'cb';
49
+ taskDef.type = 'cb';
53
50
  return taskDef;
54
51
  }
55
52
 
56
53
  function setMissingOutTaskType(taskDef) {
57
54
  if (!taskDef.type) taskDef.type = Object.keys(OUT_TASK_TYPES)[0]; //use first outTask type as default
58
- }
55
+ }
59
56
 
60
57
  function ensureAfterArrStrings(taskDef) { // convert any fn to str, and make sure is array
61
58
  if (!taskDef.after) return;
@@ -68,14 +65,14 @@ function (util, sprintf, array, CbTask, PromiseTask,
68
65
  @returns array of errors for taskDef, could be empty
69
66
  */
70
67
  function validate(taskDef) {
71
- if (!taskDef || typeof(taskDef) !== 'object') {
68
+ if (!taskDef || typeof(taskDef) !== 'object') {
72
69
  return [format_error(TASKDEF_IS_OBJECT, taskDef)];
73
70
  }
74
71
  setMissingType(taskDef);
75
72
  ensureAfterArrStrings(taskDef);
76
73
  var errors = [];
77
74
  errors = errors.concat(validateTaskType(taskDef));
78
- errors = errors.concat(validateTask(taskDef));
75
+ errors = errors.concat(validateTask(taskDef));
79
76
  return errors;
80
77
  }
81
78
 
@@ -102,30 +99,30 @@ function (util, sprintf, array, CbTask, PromiseTask,
102
99
  setMissingOutTaskType(taskDef);
103
100
  var taskCons = OUT_TASK_TYPES[taskDef.type];
104
101
  errors = errors.concat(taskCons.validate(taskDef));
105
- return errors;
106
- }
107
-
108
-
109
- function validateLocalFunctions(inParams, taskDefs, locals) {
110
- var errors = [];
111
- function foo() { } //used to mock args as fns for validation check
112
- var mock_args = inParams.map(function (p) { return foo; }); //mock args with fns
113
- var vCon = VContext.create(mock_args, inParams, locals);
114
- var tasks = taskDefs.map(create);
115
- var tasksWFunctions = tasks.filter(function (t) { return (t.type !== 'when'); }); // non-when tasks need f
116
- tasksWFunctions.forEach(function (t, idx) {
117
- if (!t.functionExists(vCon)) { // error if function doesnt exist AND
118
- if (!t.isMethodCall()) errors.push(sprintf(LOCAL_FN_MISSING, t.f, idx)); // not method OR
119
- else {
120
- var obj = t.getMethodObj(vCon);
121
- if (obj && obj !== foo) { // (has parent but not our mock)
122
- errors.push(sprintf(LOCAL_FN_MISSING, t.f, idx));
123
- }
102
+ return errors;
103
+ }
104
+
105
+
106
+ function validateLocalFunctions(inParams, taskDefs, locals) {
107
+ var errors = [];
108
+ function foo() { } //used to mock args as fns for validation check
109
+ var mock_args = inParams.map(function (p) { return foo; }); //mock args with fns
110
+ var vCon = VContext.create(mock_args, inParams, locals);
111
+ var tasks = taskDefs.map(create);
112
+ var tasksWFunctions = tasks.filter(function (t) { return (t.type !== 'when'); }); // non-when tasks need f
113
+ tasksWFunctions.forEach(function (t, idx) {
114
+ if (!t.functionExists(vCon)) { // error if function doesnt exist AND
115
+ if (!t.isMethodCall()) errors.push(sprintf(LOCAL_FN_MISSING, t.f, idx)); // not method OR
116
+ else {
117
+ var obj = t.getMethodObj(vCon);
118
+ if (obj && obj !== foo) { // (has parent but not our mock)
119
+ errors.push(sprintf(LOCAL_FN_MISSING, t.f, idx));
124
120
  }
125
121
  }
126
- });
127
- return errors;
128
- }
122
+ }
123
+ });
124
+ return errors;
125
+ }
129
126
 
130
127
  function fName(fn) {
131
128
  if (typeof(fn) === 'function') {
@@ -155,7 +152,7 @@ function (util, sprintf, array, CbTask, PromiseTask,
155
152
  name = sprintf('%s_%s', name, idx); //if empty or already used, postfix with _idx
156
153
  }
157
154
  t.name = name;
158
- namesMap[name] = t;
155
+ namesMap[name] = t;
159
156
  }
160
157
  });
161
158
  return namesMap;
@@ -168,20 +165,20 @@ function (util, sprintf, array, CbTask, PromiseTask,
168
165
 
169
166
  function createOutTask(taskDef, cbFunc, tasks, vCon, execOptions, env) {
170
167
  setMissingOutTaskType(taskDef);
171
- var outTaskOptions = {
172
- taskDef: taskDef,
173
- cbFunc: cbFunc,
174
- tasks: tasks,
175
- vCon: vCon,
176
- execOptions: execOptions,
177
- env: env,
178
- TaskConstructor: OUT_TASK_TYPES[taskDef.type]
179
- };
168
+ var outTaskOptions = {
169
+ taskDef: taskDef,
170
+ cbFunc: cbFunc,
171
+ tasks: tasks,
172
+ vCon: vCon,
173
+ execOptions: execOptions,
174
+ env: env,
175
+ TaskConstructor: OUT_TASK_TYPES[taskDef.type]
176
+ };
180
177
  EventManager.global.emit(EventManager.TYPES.EXEC_OUTTASK_CREATE, outTaskOptions); // hook
181
178
  var TaskConstructor = outTaskOptions.TaskConstructor; // hook could have changed
182
179
  return new TaskConstructor(outTaskOptions);
183
180
  }
184
-
181
+
185
182
  function createErrorHandler(vCon, outTask) {
186
183
  return function handleError(task, err) {
187
184
  task.status = STATUS.ERRORED;
@@ -199,7 +196,7 @@ function (util, sprintf, array, CbTask, PromiseTask,
199
196
 
200
197
  function execTasks(tasksReady, vCon, handleError, contExec) {
201
198
  tasksReady.forEach(function (t) { t.status = STATUS.READY; }); //set ready first, no double exec
202
- tasksReady.forEach(function (t) { t.exec(vCon, handleError, contExec); });
199
+ tasksReady.forEach(function (t) { t.exec(vCon, handleError, contExec); });
203
200
  }
204
201
 
205
202
  /**
@@ -230,7 +227,7 @@ function (util, sprintf, array, CbTask, PromiseTask,
230
227
 
231
228
  function serializeTasks(tasks) { // conveniently set after for each task idx > 0
232
229
  nameTasks(tasks);
233
- tasks.forEach(function (t, idx, arr) { if (idx !== 0) t.after = [arr[idx - 1].name]; });
230
+ tasks.forEach(function (t, idx, arr) { if (idx !== 0) t.after = [arr[idx - 1].name]; });
234
231
  return tasks;
235
232
  }
236
233
 
@@ -251,4 +248,4 @@ function (util, sprintf, array, CbTask, PromiseTask,
251
248
  findReadyAndExec: findReadyAndExec
252
249
  };
253
250
 
254
- });
251
+ });
@@ -1,4 +1,3 @@
1
- 'use strict';
2
1
  /*global define:true */
3
2
 
4
3
  if (typeof define !== 'function') {
@@ -6,7 +5,8 @@ if (typeof define !== 'function') {
6
5
  }
7
6
 
8
7
  define([], function () {
9
-
8
+ 'use strict';
9
+
10
10
  /**
11
11
  Track the tasks, start, complete, args, results, elapsed time
12
12
  Emits events that can be monitored
@@ -69,6 +69,6 @@ define([], function () {
69
69
 
70
70
  }
71
71
 
72
- return trackTasks;
72
+ return trackTasks;
73
73
 
74
- });
74
+ });
package/lib/validate.js CHANGED
@@ -1,4 +1,3 @@
1
- 'use strict';
2
1
  /*global define:true */
3
2
 
4
3
  if (typeof define !== 'function') {
@@ -6,8 +5,9 @@ if (typeof define !== 'function') {
6
5
  }
7
6
 
8
7
  define(['util', './sprintf', 'ensure-array', './task'], function (util, sprintf, array, taskUtil) {
8
+ 'use strict';
9
9
  /*jshint latedef:false */
10
-
10
+
11
11
  var AST_IS_OBJECT = 'ast must be an object with inParams, tasks, and outTask';
12
12
  var INPARAMS_ARR_STR = 'ast.inParams must be an array of strings';
13
13
  var TASKS_ARR = 'ast.tasks must be an array of tasks';
@@ -17,7 +17,7 @@ define(['util', './sprintf', 'ensure-array', './task'], function (util, sprintf,
17
17
  var MISSING_INPUTS = 'missing or mispelled variable referenced in flow definition: %s';
18
18
 
19
19
  // match any of our literals true, false, int, float, quoted strings, or is property (has dot), match vcon.js
20
- var LITERAL_OR_PROP_RE = /^(true|false|this|null|\-?[0-9\.]+)$|'|"|\./i;
20
+ var LITERAL_OR_PROP_RE = /^(true|false|this|null|\-?[0-9\.]+)$|'|"|\./i;
21
21
 
22
22
  function format_error(errmsg, obj) {
23
23
  return sprintf('%s - %s', errmsg, util.inspect(obj));
@@ -73,11 +73,11 @@ define(['util', './sprintf', 'ensure-array', './task'], function (util, sprintf,
73
73
  tasks.forEach(function (t) {
74
74
  errors = errors.concat(taskUtil.validate(t));
75
75
  });
76
- return errors;
76
+ return errors;
77
77
  }
78
78
 
79
79
  function validateTaskNamesUnique(tasks) {
80
- if (!Array.isArray(tasks)) return [];
80
+ if (!Array.isArray(tasks)) return [];
81
81
  var errors = [];
82
82
  var namedTasks = tasks.filter(function (t) { return (t.name); });
83
83
  var names = namedTasks.map(function (t) { return t.name; });
@@ -85,7 +85,7 @@ define(['util', './sprintf', 'ensure-array', './task'], function (util, sprintf,
85
85
  if (accum[name]) errors.push(sprintf('%s %s', NAMES_UNIQUE, name));
86
86
  else accum[name] = true;
87
87
  return accum;
88
- }, {});
88
+ }, {});
89
89
  return errors;
90
90
  }
91
91
 
@@ -151,9 +151,9 @@ define(['util', './sprintf', 'ensure-array', './task'], function (util, sprintf,
151
151
  if (!isLiteralOrProp(p) && !names[p]) accum.push(sprintf(MISSING_INPUTS, p)); // add error if missing
152
152
  return accum;
153
153
  }, errors);
154
- return errors;
154
+ return errors;
155
155
  }
156
156
 
157
157
  return validate;
158
158
 
159
- });
159
+ });
package/lib/vcon.js CHANGED
@@ -1,4 +1,3 @@
1
- 'use strict';
2
1
  /*global define:true */
3
2
 
4
3
  if (typeof define !== 'function') {
@@ -6,7 +5,8 @@ if (typeof define !== 'function') {
6
5
  }
7
6
 
8
7
  define([], function () {
9
-
8
+ 'use strict';
9
+
10
10
  var LAST_RESULTS_KEY = ':LAST_RESULTS';
11
11
 
12
12
  function VContext() {
@@ -29,10 +29,23 @@ define([], function () {
29
29
  var m = /^("|')([^\1]*)\1$/.exec(name); //check for quoted string " or '
30
30
  if (m) return m[2]; // if is quoted str, return inside of the quotes
31
31
  var nameAndProps = name.split('.');
32
- return nameAndProps.reduce(function (accObj, prop) {
32
+ var result = this.resolveNameArr(nameAndProps);
33
+ return result;
34
+ };
35
+
36
+ VContext.prototype.resolveNameArr = function (nameAndProps) {
37
+ var vConValues = this.values;
38
+ var result = nameAndProps.reduce(function (accObj, prop) {
33
39
  if (accObj === undefined || accObj === null) return undefined; // prevent exception
34
40
  return accObj[prop];
35
41
  }, vConValues); // vCon['foo']['bar']
42
+ if (result === undefined && this.global !== undefined) { // see if matches any global
43
+ result = nameAndProps.reduce(function (accObj, prop) {
44
+ if (accObj === undefined || accObj === null) return undefined; // prevent exception
45
+ return accObj[prop];
46
+ }, this.global); // global['foo']['bar']
47
+ }
48
+ return result;
36
49
  };
37
50
 
38
51
  /**
@@ -49,9 +62,9 @@ define([], function () {
49
62
  };
50
63
 
51
64
  VContext.prototype.setVar = function (name, value) { //name might be simple or obj.prop
52
- if (!name) return; // if name is undefined or null, then discard
53
- var vConValues = this.values;
54
- var nameAndProps = name.split('.');
65
+ if (!name) return; // if name is undefined or null, then discard
66
+ var vConValues = this.values;
67
+ var nameAndProps = name.split('.');
55
68
  var lastProp = nameAndProps.pop();
56
69
  var obj = nameAndProps.reduce(function (accObj, prop) {
57
70
  var o = accObj[prop];
@@ -62,7 +75,7 @@ define([], function () {
62
75
  }, vConValues); // vCon['foo']['bar']
63
76
  obj[lastProp] = value;
64
77
  };
65
-
78
+
66
79
 
67
80
  /**
68
81
  Create Variable Context using arguments passed in.
@@ -72,6 +85,7 @@ define([], function () {
72
85
  @param self used to pass 'this' context in
73
86
  */
74
87
  VContext.create = function (args, inParams, locals, self) {
88
+ /*jshint validthis:true, evil:true */
75
89
  var initValues = {};
76
90
  if (self) initValues['this'] = self;
77
91
  if (locals) Object.keys(locals).forEach(function (k) { initValues[k] = locals[k]; }); // copy over keys
@@ -81,10 +95,19 @@ define([], function () {
81
95
  if (param) vcon[param] = (x !== undefined) ? x : null; // upgrade undefined to null
82
96
  return vcon;
83
97
  }, initValues);
98
+
99
+ // add in global
100
+ if (typeof global === 'object') { // node.js and modern browsers expose global
101
+ vContext.global = global;
102
+ } else { // try to access this using Function eval of this
103
+ // http://stackoverflow.com/questions/3277182/how-to-get-the-global-object-in-javascript
104
+ vContext.global = new Function('return this')();
105
+ }
106
+
84
107
  return vContext;
85
108
  };
86
109
 
87
110
 
88
111
  return VContext;
89
112
 
90
- });
113
+ });
package/lib/when-task.js CHANGED
@@ -1,4 +1,3 @@
1
- 'use strict';
2
1
  /*global define:true */
3
2
 
4
3
  if (typeof define !== 'function') {
@@ -6,7 +5,8 @@ if (typeof define !== 'function') {
6
5
  }
7
6
 
8
7
  define(['util', './sprintf', './base-task'], function (util, sprintf, BaseTask) {
9
-
8
+ 'use strict';
9
+
10
10
  /**
11
11
  When task which checks if is a promise (has a then method)
12
12
  and waits for it to resolve.
@@ -30,19 +30,18 @@ define(['util', './sprintf', './base-task'], function (util, sprintf, BaseTask)
30
30
  WhenTask.prototype = new BaseTask();
31
31
  WhenTask.prototype.constructor = WhenTask;
32
32
 
33
- WhenTask.prototype.f = function when() { // just here to keep validations happy
34
- }
33
+ WhenTask.prototype.f = function when() { }; // just here to keep validations happy
35
34
 
36
35
  WhenTask.validate = function (taskDef) {
37
36
  var errors = [];
38
37
  if (!taskDef.a || !taskDef.out) {
39
38
  errors.push(format_error(REQ, taskDef));
40
39
  } else {
41
- if (! (Array.isArray(taskDef.a) && taskDef.a.length === 1 &&
40
+ if (! (Array.isArray(taskDef.a) && taskDef.a.length === 1 &&
42
41
  taskDef.a.every(function (x) { return (typeof(x) === 'string'); }))) {
43
42
  errors.push(format_error(A_REQ, taskDef));
44
43
  }
45
- if (! (Array.isArray(taskDef.out) && taskDef.out.length <= 1 &&
44
+ if (! (Array.isArray(taskDef.out) && taskDef.out.length <= 1 &&
46
45
  taskDef.out.every(function (x) { return (typeof(x) === 'string'); }))) {
47
46
  errors.push(format_error(OUT_REQ, taskDef));
48
47
  }
@@ -77,9 +76,9 @@ define(['util', './sprintf', './base-task'], function (util, sprintf, BaseTask)
77
76
  }
78
77
  } catch (err) { //catch and handle the task error, calling final cb
79
78
  handleError(this, err);
80
- }
79
+ }
81
80
  };
82
81
 
83
82
  return WhenTask;
84
83
 
85
- });
84
+ });
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "react",
3
3
  "description": "React is a javascript module implementing a lightweight rules engine to make it easier to work with asynchronous code, by reducing boilerplate code and improving error and exception handling while allowing variable and task dependencies when defining flow.",
4
- "version": "0.6.0",
4
+ "version": "0.7.0",
5
5
  "author": "Jeff Barczewski <jeff.barczewski@gmail.com>",
6
6
  "repository": { "type": "git", "url": "http://github.com/jeffbski/react.git" },
7
7
  "bugs" : { "url": "http://github.com/jeffbski/react/issues" },
@@ -9,16 +9,15 @@
9
9
  "main": "lib/react",
10
10
  "engines": { "node": ">=0.6" },
11
11
  "dependencies": {
12
- "amdefine": "~0.0.2",
13
- "eventemitter2": "~0.4.1",
14
- "sprint": "~0.3.0",
12
+ "amdefine": "~0.0.5",
13
+ "eventemitter2": "~0.4.11",
15
14
  "ensure-array": "~0.0.5"
16
15
  },
17
16
  "devDependencies": {
18
- "requirejs": "~1.0.7",
19
- "mocha": "~0.14.1",
20
- "chai": "~0.5.2",
21
- "jake": "~0.2.31",
17
+ "requirejs": "~2.1.6",
18
+ "mocha": "~1.10.0",
19
+ "chai": "~1.6.0",
20
+ "jake": "~0.5.15",
22
21
  "Deferred" : "~0.1.1"
23
22
  },
24
23
  "scripts": {
package/test/ast.mocha.js CHANGED
@@ -1,4 +1,3 @@
1
- 'use strict';
2
1
  /*global react:true */
3
2
 
4
3
  if (typeof(chai) === 'undefined') {
@@ -10,6 +9,7 @@ if (typeof(react) === 'undefined') {
10
9
  }
11
10
 
12
11
  (function () {
12
+ 'use strict';
13
13
 
14
14
  var t = chai.assert;
15
15
 
@@ -57,7 +57,7 @@ if (typeof(react) === 'undefined') {
57
57
  var fn = react();
58
58
  var collector = react.createEventCollector();
59
59
  collector.capture(fn, 'ast.*');
60
-
60
+
61
61
  var errors = fn.setAndValidateAST({
62
62
  inParams: ['res', 'prefstr', 'poststr'],
63
63
  tasks: [
@@ -80,7 +80,7 @@ if (typeof(react) === 'undefined') {
80
80
 
81
81
  test('ast.defined event is passed to process', function (done) {
82
82
  // browser might not have this, so only if process is an eventemitter
83
- if (process && process.once) {
83
+ if (typeof process !== 'undefined' && process && process.once) {
84
84
  var fn = react();
85
85
  process.once('ast.defined', function (ast) {
86
86
  t.isObject(ast);
@@ -99,7 +99,7 @@ if (typeof(react) === 'undefined') {
99
99
  { f: postfix, a: ['plres', 'poststr'], out: ['plresp'] }
100
100
  ],
101
101
  outTask: { a: ['plresp'] }
102
- });
102
+ });
103
103
  } else {
104
104
  done(); //skipping in browser
105
105
  }