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
@@ -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
  /**
@@ -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.1",
4
+ "version": "0.7.1",
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,17 +9,27 @@
9
9
  "main": "lib/react",
10
10
  "engines": { "node": ">=0.6" },
11
11
  "dependencies": {
12
- "amdefine": "~0.0.2",
13
- "eventemitter2": "~0.4.1",
12
+ "amdefine": "~0.0.5",
13
+ "eventemitter2": "~0.4.11",
14
14
  "ensure-array": "~0.0.5"
15
15
  },
16
16
  "devDependencies": {
17
- "requirejs": "~1.0.7",
18
- "mocha": "~0.14.1",
19
- "chai": "~0.5.2",
20
- "jake": "~0.2.31",
17
+ "requirejs": "~2.1.6",
18
+ "mocha": "~1.10.0",
19
+ "chai": "~1.6.0",
20
+ "jake": "~0.5.15",
21
21
  "Deferred" : "~0.1.1"
22
22
  },
23
+ "keywords": [
24
+ "flow",
25
+ "flow control",
26
+ "control flow",
27
+ "dataflow",
28
+ "reactive",
29
+ "deferred",
30
+ "promise",
31
+ "async"
32
+ ],
23
33
  "scripts": {
24
34
  "test": "./node_modules/mocha/bin/mocha ./test/*.mocha.js"
25
35
  }
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
  }
@@ -1,4 +1,3 @@
1
- 'use strict';
2
1
  /*global react:true CbTask:true VContext:true */
3
2
 
4
3
  if (typeof(chai) === 'undefined') {
@@ -18,6 +17,7 @@ if (typeof(VContext) === 'undefined') {
18
17
  }
19
18
 
20
19
  (function () {
20
+ 'use strict';
21
21
 
22
22
  var t = chai.assert;
23
23
 
@@ -66,7 +66,7 @@ if (typeof(VContext) === 'undefined') {
66
66
  t.equal(task.isReady(vCon, tasksByName), false);
67
67
  task.status = null;
68
68
  t.equal(task.isReady(vCon, tasksByName), true);
69
- done();
69
+ done();
70
70
  });
71
71
 
72
72
  test('no args defined, no after -> not ready', function (done) {
@@ -82,39 +82,39 @@ if (typeof(VContext) === 'undefined') {
82
82
  var vCon = VContext.create([1, {}], ['b', 'c']);
83
83
  var tasksByName = { foo: task };
84
84
  t.equal(task.isReady(vCon, tasksByName), false);
85
- done();
85
+ done();
86
86
  });
87
87
 
88
88
  test('all args defined, no after, out no obj parent -> NOT ready', function (done) {
89
89
  var task = new CbTask({ type: 'cb', f: foo, a: ['b', 'c'], out: ['d.e'] });
90
90
  var vCon = VContext.create([1, null], ['b', 'c']);
91
91
  var tasksByName = { foo: task };
92
- t.equal(task.isReady(vCon, tasksByName), false, 'false if out objparent undef');
93
- done();
92
+ t.equal(task.isReady(vCon, tasksByName), false, 'false if out objparent undef');
93
+ done();
94
94
  });
95
95
 
96
96
  test('all args defined, no after, out no obj.par.par -> NOT ready', function (done) {
97
97
  var task = new CbTask({ type: 'cb', f: foo, a: ['b', 'c'], out: ['c.e.f'] });
98
98
  var vCon = VContext.create([1, { }], ['b', 'c']);
99
99
  var tasksByName = { foo: task };
100
- t.equal(task.isReady(vCon, tasksByName), false, 'false if out objparent undef');
101
- done();
100
+ t.equal(task.isReady(vCon, tasksByName), false, 'false if out objparent undef');
101
+ done();
102
102
  });
103
103
 
104
104
  test('all args defined, no after, out null obj parent -> NOT ready', function (done) {
105
105
  var task = new CbTask({ type: 'cb', f: foo, a: ['b', 'c'], out: ['c.e'] });
106
106
  var vCon = VContext.create([1, null], ['b', 'c']);
107
107
  var tasksByName = { foo: task };
108
- t.equal(task.isReady(vCon, tasksByName), false, 'false if out objparent null');
109
- done();
108
+ t.equal(task.isReady(vCon, tasksByName), false, 'false if out objparent null');
109
+ done();
110
110
  });
111
111
 
112
112
  test('all args defined, no after, out null obj.par.par -> NOT ready', function (done) {
113
113
  var task = new CbTask({ type: 'cb', f: foo, a: ['b', 'c'], out: ['c.e.f'] });
114
114
  var vCon = VContext.create([1, { e: null }], ['b', 'c']);
115
115
  var tasksByName = { foo: task };
116
- t.equal(task.isReady(vCon, tasksByName), false, 'false if out objparent null');
117
- done();
116
+ t.equal(task.isReady(vCon, tasksByName), false, 'false if out objparent null');
117
+ done();
118
118
  });
119
119
 
120
120
  test('all args defined, no after -> ready', function (done) {
@@ -122,7 +122,7 @@ if (typeof(VContext) === 'undefined') {
122
122
  var vCon = VContext.create([1, null], ['b', 'c']);
123
123
  var tasksByName = { foo: task };
124
124
  t.equal(task.isReady(vCon, tasksByName), true);
125
- done();
125
+ done();
126
126
  });
127
127
 
128
128
  test('all args defined, objprop null, no after -> ready', function (done) {
@@ -130,7 +130,7 @@ if (typeof(VContext) === 'undefined') {
130
130
  var vCon = VContext.create([1, { prop: null }], ['b', 'c']);
131
131
  var tasksByName = { foo: task };
132
132
  t.equal(task.isReady(vCon, tasksByName), true);
133
- done();
133
+ done();
134
134
  });
135
135
 
136
136
  test('all args defined, after not complete -> NOT ready', function (done) {
@@ -140,8 +140,8 @@ if (typeof(VContext) === 'undefined') {
140
140
  { type: 'cb', f: foo, a: ['b', 'c'], out: [], after: ['cat', 'bar']});
141
141
  var vCon = VContext.create([1, 2], ['b', 'c']);
142
142
  var tasksByName = { foo: task, bar: tbar, cat: tcat };
143
- t.equal(task.isReady(vCon, tasksByName), false);
144
- done();
143
+ t.equal(task.isReady(vCon, tasksByName), false);
144
+ done();
145
145
  });
146
146
 
147
147
  test('all args defined, after all complete -> ready', function (done) {
@@ -151,8 +151,8 @@ if (typeof(VContext) === 'undefined') {
151
151
  { type: 'cb', f: foo, a: ['b', 'c'], out: [], after: ['cat', 'bar']});
152
152
  var vCon = VContext.create([1, 2], ['b', 'c']);
153
153
  var tasksByName = { foo: task, bar: tbar, cat: tcat };
154
- t.equal(task.isReady(vCon, tasksByName), true);
155
- done();
154
+ t.equal(task.isReady(vCon, tasksByName), true);
155
+ done();
156
156
  });
157
157
 
158
158
  test('string without . is not method call', function (done) {
@@ -1,4 +1,3 @@
1
- 'use strict';
2
1
  /*global react:true Deferred:true */
3
2
 
4
3
  if (typeof(chai) === 'undefined') {
@@ -14,6 +13,7 @@ if (typeof(Deferred) === 'undefined') {
14
13
  }
15
14
 
16
15
  (function () {
16
+ 'use strict';
17
17
 
18
18
  var t = chai.assert;
19
19
 
@@ -55,7 +55,7 @@ if (typeof(Deferred) === 'undefined') {
55
55
  var fn = react();
56
56
  var errors = fn.setAndValidateAST({
57
57
  inParams: ['a', 'b'],
58
- tasks: [
58
+ tasks: [
59
59
  { f: multiply, a: ['a', 'b'], out: ['c'], type: 'promise' },
60
60
  { f: add, a: ['c', 'b'], out: ['d'], type: 'promise' }
61
61
  ],
@@ -69,7 +69,7 @@ if (typeof(Deferred) === 'undefined') {
69
69
  t.equal(d, 9);
70
70
  done();
71
71
  });
72
- });
72
+ });
73
73
 
74
74
  test('using "this" in a cb function', function (done) {
75
75
  function getA(cb) {
@@ -81,11 +81,11 @@ if (typeof(Deferred) === 'undefined') {
81
81
  }, 10);
82
82
  return deferred.promise();
83
83
  }
84
-
84
+
85
85
  var fn = react();
86
86
  var errors = fn.setAndValidateAST({
87
87
  inParams: [],
88
- tasks: [
88
+ tasks: [
89
89
  { f: getA, a: [], out: ['a'], type: 'promise' }
90
90
  ],
91
91
  outTask: { a: ['a'] }
@@ -108,7 +108,7 @@ if (typeof(Deferred) === 'undefined') {
108
108
  var fn = react();
109
109
  var errors = fn.setAndValidateAST({
110
110
  inParams: ['a', 'b'],
111
- tasks: [
111
+ tasks: [
112
112
  { f: badFunc, a: ['a', 'b'], out: ['c'], type: 'promise' },
113
113
  { f: add, a: ['c', 'b'], out: ['d'], type: 'promise' }
114
114
  ],
@@ -126,7 +126,7 @@ if (typeof(Deferred) === 'undefined') {
126
126
  var fn = react();
127
127
  var errors = fn.setAndValidateAST({
128
128
  inParams: ['a', 'b'],
129
- tasks: [
129
+ tasks: [
130
130
  { f: badF2, a: ['a', 'b'], out: ['c'], type: 'promise' },
131
131
  { f: add, a: ['c', 'b'], out: ['d'], type: 'promise' }
132
132
  ],
@@ -140,4 +140,4 @@ if (typeof(Deferred) === 'undefined') {
140
140
  });
141
141
  });
142
142
 
143
- }());
143
+ }());