reflux-rails 0.1.15
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.
- checksums.yaml +7 -0
- data/.gitignore +14 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +63 -0
- data/Rakefile +2 -0
- data/lib/reflux/rails.rb +11 -0
- data/lib/reflux/rails/engine.rb +6 -0
- data/lib/reflux/rails/railtie.rb +6 -0
- data/lib/reflux/rails/version.rb +5 -0
- data/reflux-rails.gemspec +23 -0
- data/vendor/assets/javascripts/reflux.js +876 -0
- data/vendor/assets/javascripts/reflux.min.js +1 -0
- metadata +84 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: acc3c6e3b1fbc5d0551a060c85e722cde5bcf946
|
4
|
+
data.tar.gz: 4fd46fe6d97292e14b716c214fd05750ada7c78d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c657503581c01d6accd1aaa05e49e4a05d7fef0aead83e72b94737857536b0bb1b9776af70fadebc2672b97954aaafbdcb74fb94182157bf12bd5372e97ebc3b
|
7
|
+
data.tar.gz: 12e964a167e4ecb7193c34c55d2de345d9d2fbbb17166397f9396385d0b3673a55688aa6fde3ed7a35d5ceee40dcafb6d0b342bf92a47b35743d1fcf52a0e503
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Wontae Yang
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
# Reflux::Rails
|
2
|
+
|
3
|
+
TODO: Write a gem description
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'reflux-rails'
|
11
|
+
```
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install reflux-rails
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
This gem depends on browserify to load the javascript file
|
24
|
+
add browserify gem in your Gemfile
|
25
|
+
|
26
|
+
```ruby
|
27
|
+
gem "browserify-rails"
|
28
|
+
```
|
29
|
+
|
30
|
+
Create package.json in your Rails root:
|
31
|
+
|
32
|
+
```javascipt
|
33
|
+
{
|
34
|
+
"name": "something",
|
35
|
+
"devDependencies" : {
|
36
|
+
"browserify": "~> 4.1"
|
37
|
+
},
|
38
|
+
"license": "MIT",
|
39
|
+
"engines": {
|
40
|
+
"node": ">= 0.10"
|
41
|
+
}
|
42
|
+
}
|
43
|
+
```
|
44
|
+
|
45
|
+
Then run:
|
46
|
+
|
47
|
+
```
|
48
|
+
npm install
|
49
|
+
```
|
50
|
+
|
51
|
+
Include reflux in your app/assets/javascripts/application.js
|
52
|
+
|
53
|
+
```javascript
|
54
|
+
var Reflux = require('./reflux');
|
55
|
+
```
|
56
|
+
|
57
|
+
## Contributing
|
58
|
+
|
59
|
+
1. Fork it ( https://github.com/[my-github-username]/reflux-rails/fork )
|
60
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
61
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
62
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
63
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
data/lib/reflux/rails.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'reflux/rails/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "reflux-rails"
|
8
|
+
spec.version = Reflux::Rails::VERSION
|
9
|
+
spec.authors = ["Wontae Yang"]
|
10
|
+
spec.email = ["wontaeyang@gmail.com"]
|
11
|
+
spec.summary = "refluxjs gem for rails"
|
12
|
+
spec.description = "this is a Ruby gem for building reflux application"
|
13
|
+
spec.homepage = "https://github.com/wontaeyang/reflux-rails"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
# spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
# spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.7"
|
22
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
23
|
+
end
|
@@ -0,0 +1,876 @@
|
|
1
|
+
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.Reflux=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
|
2
|
+
'use strict';
|
3
|
+
|
4
|
+
/**
|
5
|
+
* Representation of a single EventEmitter function.
|
6
|
+
*
|
7
|
+
* @param {Function} fn Event handler to be called.
|
8
|
+
* @param {Mixed} context Context for function execution.
|
9
|
+
* @param {Boolean} once Only emit once
|
10
|
+
* @api private
|
11
|
+
*/
|
12
|
+
function EE(fn, context, once) {
|
13
|
+
this.fn = fn;
|
14
|
+
this.context = context;
|
15
|
+
this.once = once || false;
|
16
|
+
}
|
17
|
+
|
18
|
+
/**
|
19
|
+
* Minimal EventEmitter interface that is molded against the Node.js
|
20
|
+
* EventEmitter interface.
|
21
|
+
*
|
22
|
+
* @constructor
|
23
|
+
* @api public
|
24
|
+
*/
|
25
|
+
function EventEmitter() { /* Nothing to set */ }
|
26
|
+
|
27
|
+
/**
|
28
|
+
* Holds the assigned EventEmitters by name.
|
29
|
+
*
|
30
|
+
* @type {Object}
|
31
|
+
* @private
|
32
|
+
*/
|
33
|
+
EventEmitter.prototype._events = undefined;
|
34
|
+
|
35
|
+
/**
|
36
|
+
* Return a list of assigned event listeners.
|
37
|
+
*
|
38
|
+
* @param {String} event The events that should be listed.
|
39
|
+
* @returns {Array}
|
40
|
+
* @api public
|
41
|
+
*/
|
42
|
+
EventEmitter.prototype.listeners = function listeners(event) {
|
43
|
+
if (!this._events || !this._events[event]) return [];
|
44
|
+
|
45
|
+
for (var i = 0, l = this._events[event].length, ee = []; i < l; i++) {
|
46
|
+
ee.push(this._events[event][i].fn);
|
47
|
+
}
|
48
|
+
|
49
|
+
return ee;
|
50
|
+
};
|
51
|
+
|
52
|
+
/**
|
53
|
+
* Emit an event to all registered event listeners.
|
54
|
+
*
|
55
|
+
* @param {String} event The name of the event.
|
56
|
+
* @returns {Boolean} Indication if we've emitted an event.
|
57
|
+
* @api public
|
58
|
+
*/
|
59
|
+
EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
|
60
|
+
if (!this._events || !this._events[event]) return false;
|
61
|
+
|
62
|
+
var listeners = this._events[event]
|
63
|
+
, length = listeners.length
|
64
|
+
, len = arguments.length
|
65
|
+
, ee = listeners[0]
|
66
|
+
, args
|
67
|
+
, i, j;
|
68
|
+
|
69
|
+
if (1 === length) {
|
70
|
+
if (ee.once) this.removeListener(event, ee.fn, true);
|
71
|
+
|
72
|
+
switch (len) {
|
73
|
+
case 1: return ee.fn.call(ee.context), true;
|
74
|
+
case 2: return ee.fn.call(ee.context, a1), true;
|
75
|
+
case 3: return ee.fn.call(ee.context, a1, a2), true;
|
76
|
+
case 4: return ee.fn.call(ee.context, a1, a2, a3), true;
|
77
|
+
case 5: return ee.fn.call(ee.context, a1, a2, a3, a4), true;
|
78
|
+
case 6: return ee.fn.call(ee.context, a1, a2, a3, a4, a5), true;
|
79
|
+
}
|
80
|
+
|
81
|
+
for (i = 1, args = new Array(len -1); i < len; i++) {
|
82
|
+
args[i - 1] = arguments[i];
|
83
|
+
}
|
84
|
+
|
85
|
+
ee.fn.apply(ee.context, args);
|
86
|
+
} else {
|
87
|
+
for (i = 0; i < length; i++) {
|
88
|
+
if (listeners[i].once) this.removeListener(event, listeners[i].fn, true);
|
89
|
+
|
90
|
+
switch (len) {
|
91
|
+
case 1: listeners[i].fn.call(listeners[i].context); break;
|
92
|
+
case 2: listeners[i].fn.call(listeners[i].context, a1); break;
|
93
|
+
case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;
|
94
|
+
default:
|
95
|
+
if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {
|
96
|
+
args[j - 1] = arguments[j];
|
97
|
+
}
|
98
|
+
|
99
|
+
listeners[i].fn.apply(listeners[i].context, args);
|
100
|
+
}
|
101
|
+
}
|
102
|
+
}
|
103
|
+
|
104
|
+
return true;
|
105
|
+
};
|
106
|
+
|
107
|
+
/**
|
108
|
+
* Register a new EventListener for the given event.
|
109
|
+
*
|
110
|
+
* @param {String} event Name of the event.
|
111
|
+
* @param {Functon} fn Callback function.
|
112
|
+
* @param {Mixed} context The context of the function.
|
113
|
+
* @api public
|
114
|
+
*/
|
115
|
+
EventEmitter.prototype.on = function on(event, fn, context) {
|
116
|
+
if (!this._events) this._events = {};
|
117
|
+
if (!this._events[event]) this._events[event] = [];
|
118
|
+
this._events[event].push(new EE( fn, context || this ));
|
119
|
+
|
120
|
+
return this;
|
121
|
+
};
|
122
|
+
|
123
|
+
/**
|
124
|
+
* Add an EventListener that's only called once.
|
125
|
+
*
|
126
|
+
* @param {String} event Name of the event.
|
127
|
+
* @param {Function} fn Callback function.
|
128
|
+
* @param {Mixed} context The context of the function.
|
129
|
+
* @api public
|
130
|
+
*/
|
131
|
+
EventEmitter.prototype.once = function once(event, fn, context) {
|
132
|
+
if (!this._events) this._events = {};
|
133
|
+
if (!this._events[event]) this._events[event] = [];
|
134
|
+
this._events[event].push(new EE(fn, context || this, true ));
|
135
|
+
|
136
|
+
return this;
|
137
|
+
};
|
138
|
+
|
139
|
+
/**
|
140
|
+
* Remove event listeners.
|
141
|
+
*
|
142
|
+
* @param {String} event The event we want to remove.
|
143
|
+
* @param {Function} fn The listener that we need to find.
|
144
|
+
* @param {Boolean} once Only remove once listeners.
|
145
|
+
* @api public
|
146
|
+
*/
|
147
|
+
EventEmitter.prototype.removeListener = function removeListener(event, fn, once) {
|
148
|
+
if (!this._events || !this._events[event]) return this;
|
149
|
+
|
150
|
+
var listeners = this._events[event]
|
151
|
+
, events = [];
|
152
|
+
|
153
|
+
if (fn) for (var i = 0, length = listeners.length; i < length; i++) {
|
154
|
+
if (listeners[i].fn !== fn && listeners[i].once !== once) {
|
155
|
+
events.push(listeners[i]);
|
156
|
+
}
|
157
|
+
}
|
158
|
+
|
159
|
+
//
|
160
|
+
// Reset the array, or remove it completely if we have no more listeners.
|
161
|
+
//
|
162
|
+
if (events.length) this._events[event] = events;
|
163
|
+
else this._events[event] = null;
|
164
|
+
|
165
|
+
return this;
|
166
|
+
};
|
167
|
+
|
168
|
+
/**
|
169
|
+
* Remove all listeners or only the listeners for the specified event.
|
170
|
+
*
|
171
|
+
* @param {String} event The event want to remove all listeners for.
|
172
|
+
* @api public
|
173
|
+
*/
|
174
|
+
EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {
|
175
|
+
if (!this._events) return this;
|
176
|
+
|
177
|
+
if (event) this._events[event] = null;
|
178
|
+
else this._events = {};
|
179
|
+
|
180
|
+
return this;
|
181
|
+
};
|
182
|
+
|
183
|
+
//
|
184
|
+
// Alias methods names because people roll like that.
|
185
|
+
//
|
186
|
+
EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
|
187
|
+
EventEmitter.prototype.addListener = EventEmitter.prototype.on;
|
188
|
+
|
189
|
+
//
|
190
|
+
// This function doesn't apply anymore.
|
191
|
+
//
|
192
|
+
EventEmitter.prototype.setMaxListeners = function setMaxListeners() {
|
193
|
+
return this;
|
194
|
+
};
|
195
|
+
|
196
|
+
//
|
197
|
+
// Expose the module.
|
198
|
+
//
|
199
|
+
EventEmitter.EventEmitter = EventEmitter;
|
200
|
+
EventEmitter.EventEmitter2 = EventEmitter;
|
201
|
+
EventEmitter.EventEmitter3 = EventEmitter;
|
202
|
+
|
203
|
+
if ('object' === typeof module && module.exports) {
|
204
|
+
module.exports = EventEmitter;
|
205
|
+
}
|
206
|
+
|
207
|
+
},{}],2:[function(_dereq_,module,exports){
|
208
|
+
exports.createdStores = [];
|
209
|
+
|
210
|
+
exports.createdActions = [];
|
211
|
+
|
212
|
+
exports.reset = function() {
|
213
|
+
while(exports.createdStores.length) {
|
214
|
+
exports.createdStores.pop();
|
215
|
+
}
|
216
|
+
while(exports.createdActions.length) {
|
217
|
+
exports.createdActions.pop();
|
218
|
+
}
|
219
|
+
};
|
220
|
+
|
221
|
+
},{}],3:[function(_dereq_,module,exports){
|
222
|
+
var _ = _dereq_('./utils'),
|
223
|
+
maker = _dereq_('./joins').instanceJoinCreator;
|
224
|
+
|
225
|
+
/**
|
226
|
+
* A module of methods related to listening.
|
227
|
+
*/
|
228
|
+
module.exports = {
|
229
|
+
|
230
|
+
/**
|
231
|
+
* An internal utility function used by `validateListening`
|
232
|
+
*
|
233
|
+
* @param {Action|Store} listenable The listenable we want to search for
|
234
|
+
* @returns {Boolean} The result of a recursive search among `this.subscriptions`
|
235
|
+
*/
|
236
|
+
hasListener: function(listenable) {
|
237
|
+
var i = 0,
|
238
|
+
listener;
|
239
|
+
for (;i < (this.subscriptions||[]).length; ++i) {
|
240
|
+
listener = this.subscriptions[i].listenable;
|
241
|
+
if (listener === listenable || listener.hasListener && listener.hasListener(listenable)) {
|
242
|
+
return true;
|
243
|
+
}
|
244
|
+
}
|
245
|
+
return false;
|
246
|
+
},
|
247
|
+
|
248
|
+
/**
|
249
|
+
* A convenience method that listens to all listenables in the given object.
|
250
|
+
*
|
251
|
+
* @param {Object} listenables An object of listenables. Keys will be used as callback method names.
|
252
|
+
*/
|
253
|
+
listenToMany: function(listenables){
|
254
|
+
for(var key in listenables){
|
255
|
+
var cbname = _.callbackName(key),
|
256
|
+
localname = this[cbname] ? cbname : this[key] ? key : undefined;
|
257
|
+
if (localname){
|
258
|
+
this.listenTo(listenables[key],localname,this[cbname+"Default"]||this[localname+"Default"]||localname);
|
259
|
+
}
|
260
|
+
}
|
261
|
+
},
|
262
|
+
|
263
|
+
/**
|
264
|
+
* Checks if the current context can listen to the supplied listenable
|
265
|
+
*
|
266
|
+
* @param {Action|Store} listenable An Action or Store that should be
|
267
|
+
* listened to.
|
268
|
+
* @returns {String|Undefined} An error message, or undefined if there was no problem.
|
269
|
+
*/
|
270
|
+
validateListening: function(listenable){
|
271
|
+
if (listenable === this) {
|
272
|
+
return "Listener is not able to listen to itself";
|
273
|
+
}
|
274
|
+
if (!_.isFunction(listenable.listen)) {
|
275
|
+
return listenable + " is missing a listen method";
|
276
|
+
}
|
277
|
+
if (listenable.hasListener && listenable.hasListener(this)) {
|
278
|
+
return "Listener cannot listen to this listenable because of circular loop";
|
279
|
+
}
|
280
|
+
},
|
281
|
+
|
282
|
+
/**
|
283
|
+
* Sets up a subscription to the given listenable for the context object
|
284
|
+
*
|
285
|
+
* @param {Action|Store} listenable An Action or Store that should be
|
286
|
+
* listened to.
|
287
|
+
* @param {Function|String} callback The callback to register as event handler
|
288
|
+
* @param {Function|String} defaultCallback The callback to register as default handler
|
289
|
+
* @returns {Object} A subscription obj where `stop` is an unsub function and `listenable` is the object being listened to
|
290
|
+
*/
|
291
|
+
listenTo: function(listenable, callback, defaultCallback) {
|
292
|
+
var desub, unsubscriber, subscriptionobj, subs = this.subscriptions = this.subscriptions || [];
|
293
|
+
_.throwIf(this.validateListening(listenable));
|
294
|
+
this.fetchDefaultData(listenable, defaultCallback);
|
295
|
+
desub = listenable.listen(this[callback]||callback, this);
|
296
|
+
unsubscriber = function() {
|
297
|
+
var index = subs.indexOf(subscriptionobj);
|
298
|
+
_.throwIf(index === -1,'Tried to remove listen already gone from subscriptions list!');
|
299
|
+
subs.splice(index, 1);
|
300
|
+
desub();
|
301
|
+
};
|
302
|
+
subscriptionobj = {
|
303
|
+
stop: unsubscriber,
|
304
|
+
listenable: listenable
|
305
|
+
};
|
306
|
+
subs.push(subscriptionobj);
|
307
|
+
return subscriptionobj;
|
308
|
+
},
|
309
|
+
|
310
|
+
/**
|
311
|
+
* Stops listening to a single listenable
|
312
|
+
*
|
313
|
+
* @param {Action|Store} listenable The action or store we no longer want to listen to
|
314
|
+
* @returns {Boolean} True if a subscription was found and removed, otherwise false.
|
315
|
+
*/
|
316
|
+
stopListeningTo: function(listenable){
|
317
|
+
var sub, i = 0, subs = this.subscriptions || [];
|
318
|
+
for(;i < subs.length; i++){
|
319
|
+
sub = subs[i];
|
320
|
+
if (sub.listenable === listenable){
|
321
|
+
sub.stop();
|
322
|
+
_.throwIf(subs.indexOf(sub)!==-1,'Failed to remove listen from subscriptions list!');
|
323
|
+
return true;
|
324
|
+
}
|
325
|
+
}
|
326
|
+
return false;
|
327
|
+
},
|
328
|
+
|
329
|
+
/**
|
330
|
+
* Stops all subscriptions and empties subscriptions array
|
331
|
+
*/
|
332
|
+
stopListeningToAll: function(){
|
333
|
+
var remaining, subs = this.subscriptions || [];
|
334
|
+
while((remaining=subs.length)){
|
335
|
+
subs[0].stop();
|
336
|
+
_.throwIf(subs.length!==remaining-1,'Failed to remove listen from subscriptions list!');
|
337
|
+
}
|
338
|
+
},
|
339
|
+
|
340
|
+
/**
|
341
|
+
* Used in `listenTo`. Fetches initial data from a publisher if it has a `getDefaultData` method.
|
342
|
+
* @param {Action|Store} listenable The publisher we want to get default data from
|
343
|
+
* @param {Function|String} defaultCallback The method to receive the data
|
344
|
+
*/
|
345
|
+
fetchDefaultData: function (listenable, defaultCallback) {
|
346
|
+
defaultCallback = (defaultCallback && this[defaultCallback]) || defaultCallback;
|
347
|
+
var me = this;
|
348
|
+
if (_.isFunction(defaultCallback) && _.isFunction(listenable.getDefaultData)) {
|
349
|
+
data = listenable.getDefaultData();
|
350
|
+
if (data && _.isFunction(data.then)) {
|
351
|
+
data.then(function() {
|
352
|
+
defaultCallback.apply(me, arguments);
|
353
|
+
});
|
354
|
+
} else {
|
355
|
+
defaultCallback.call(this, data);
|
356
|
+
}
|
357
|
+
}
|
358
|
+
},
|
359
|
+
|
360
|
+
/**
|
361
|
+
* The callback will be called once all listenables have triggered at least once.
|
362
|
+
* It will be invoked with the last emission from each listenable.
|
363
|
+
* @param {...Publishers} publishers Publishers that should be tracked.
|
364
|
+
* @param {Function|String} callback The method to call when all publishers have emitted
|
365
|
+
*/
|
366
|
+
joinTrailing: maker("last"),
|
367
|
+
|
368
|
+
/**
|
369
|
+
* The callback will be called once all listenables have triggered at least once.
|
370
|
+
* It will be invoked with the first emission from each listenable.
|
371
|
+
* @param {...Publishers} publishers Publishers that should be tracked.
|
372
|
+
* @param {Function|String} callback The method to call when all publishers have emitted
|
373
|
+
*/
|
374
|
+
joinLeading: maker("first"),
|
375
|
+
|
376
|
+
/**
|
377
|
+
* The callback will be called once all listenables have triggered at least once.
|
378
|
+
* It will be invoked with all emission from each listenable.
|
379
|
+
* @param {...Publishers} publishers Publishers that should be tracked.
|
380
|
+
* @param {Function|String} callback The method to call when all publishers have emitted
|
381
|
+
*/
|
382
|
+
joinConcat: maker("all"),
|
383
|
+
|
384
|
+
/**
|
385
|
+
* The callback will be called once all listenables have triggered.
|
386
|
+
* If a callback triggers twice before that happens, an error is thrown.
|
387
|
+
* @param {...Publishers} publishers Publishers that should be tracked.
|
388
|
+
* @param {Function|String} callback The method to call when all publishers have emitted
|
389
|
+
*/
|
390
|
+
joinStrict: maker("strict"),
|
391
|
+
};
|
392
|
+
|
393
|
+
|
394
|
+
},{"./joins":10,"./utils":13}],4:[function(_dereq_,module,exports){
|
395
|
+
var _ = _dereq_('./utils'),
|
396
|
+
ListenerMethods = _dereq_('./ListenerMethods');
|
397
|
+
|
398
|
+
/**
|
399
|
+
* A module meant to be consumed as a mixin by a React component. Supplies the methods from
|
400
|
+
* `ListenerMethods` mixin and takes care of teardown of subscriptions.
|
401
|
+
*/
|
402
|
+
module.exports = _.extend({
|
403
|
+
|
404
|
+
/**
|
405
|
+
* Cleans up all listener previously registered.
|
406
|
+
*/
|
407
|
+
componentWillUnmount: ListenerMethods.stopListeningToAll
|
408
|
+
|
409
|
+
}, ListenerMethods);
|
410
|
+
|
411
|
+
},{"./ListenerMethods":3,"./utils":13}],5:[function(_dereq_,module,exports){
|
412
|
+
var _ = _dereq_('./utils');
|
413
|
+
|
414
|
+
/**
|
415
|
+
* A module of methods for object that you want to be able to listen to.
|
416
|
+
* This module is consumed by `createStore` and `createAction`
|
417
|
+
*/
|
418
|
+
module.exports = {
|
419
|
+
|
420
|
+
/**
|
421
|
+
* Hook used by the publisher that is invoked before emitting
|
422
|
+
* and before `shouldEmit`. The arguments are the ones that the action
|
423
|
+
* is invoked with. If this function returns something other than
|
424
|
+
* undefined, that will be passed on as arguments for shouldEmit and
|
425
|
+
* emission.
|
426
|
+
*/
|
427
|
+
preEmit: function() {},
|
428
|
+
|
429
|
+
/**
|
430
|
+
* Hook used by the publisher after `preEmit` to determine if the
|
431
|
+
* event should be emitted with given arguments. This may be overridden
|
432
|
+
* in your application, default implementation always returns true.
|
433
|
+
*
|
434
|
+
* @returns {Boolean} true if event should be emitted
|
435
|
+
*/
|
436
|
+
shouldEmit: function() { return true; },
|
437
|
+
|
438
|
+
/**
|
439
|
+
* Subscribes the given callback for action triggered
|
440
|
+
*
|
441
|
+
* @param {Function} callback The callback to register as event handler
|
442
|
+
* @param {Mixed} [optional] bindContext The context to bind the callback with
|
443
|
+
* @returns {Function} Callback that unsubscribes the registered event handler
|
444
|
+
*/
|
445
|
+
listen: function(callback, bindContext) {
|
446
|
+
var eventHandler = function(args) {
|
447
|
+
callback.apply(bindContext, args);
|
448
|
+
}, me = this;
|
449
|
+
this.emitter.addListener(this.eventLabel, eventHandler);
|
450
|
+
return function() {
|
451
|
+
me.emitter.removeListener(me.eventLabel, eventHandler);
|
452
|
+
};
|
453
|
+
},
|
454
|
+
|
455
|
+
/**
|
456
|
+
* Publishes an event using `this.emitter` (if `shouldEmit` agrees)
|
457
|
+
*/
|
458
|
+
trigger: function() {
|
459
|
+
var args = arguments,
|
460
|
+
pre = this.preEmit.apply(this, args);
|
461
|
+
args = pre === undefined ? args : _.isArguments(pre) ? pre : [].concat(pre);
|
462
|
+
if (this.shouldEmit.apply(this, args)) {
|
463
|
+
this.emitter.emit(this.eventLabel, args);
|
464
|
+
}
|
465
|
+
},
|
466
|
+
|
467
|
+
/**
|
468
|
+
* Tries to publish the event on the next tick
|
469
|
+
*/
|
470
|
+
triggerAsync: function(){
|
471
|
+
var args = arguments,me = this;
|
472
|
+
_.nextTick(function() {
|
473
|
+
me.trigger.apply(me, args);
|
474
|
+
});
|
475
|
+
}
|
476
|
+
};
|
477
|
+
|
478
|
+
},{"./utils":13}],6:[function(_dereq_,module,exports){
|
479
|
+
var Reflux = _dereq_('../src'),
|
480
|
+
_ = _dereq_('./utils');
|
481
|
+
|
482
|
+
module.exports = function(listenable,key){
|
483
|
+
return {
|
484
|
+
componentDidMount: function(){
|
485
|
+
for(var m in Reflux.ListenerMethods){
|
486
|
+
if (this[m] !== Reflux.ListenerMethods[m]){
|
487
|
+
if (this[m]){
|
488
|
+
throw "Can't have other property '"+m+"' when using Reflux.listenTo!";
|
489
|
+
}
|
490
|
+
this[m] = Reflux.ListenerMethods[m];
|
491
|
+
}
|
492
|
+
}
|
493
|
+
var me = this, cb = (key === undefined ? this.setState : function(v){me.setState(_.object([key],[v]));});
|
494
|
+
this.listenTo(listenable,cb,cb);
|
495
|
+
},
|
496
|
+
componentWillUnmount: Reflux.ListenerMixin.componentWillUnmount
|
497
|
+
};
|
498
|
+
};
|
499
|
+
|
500
|
+
},{"../src":9,"./utils":13}],7:[function(_dereq_,module,exports){
|
501
|
+
var _ = _dereq_('./utils'),
|
502
|
+
Reflux = _dereq_('../src'),
|
503
|
+
Keep = _dereq_('./Keep'),
|
504
|
+
allowed = {preEmit:1,shouldEmit:1};
|
505
|
+
|
506
|
+
/**
|
507
|
+
* Creates an action functor object. It is mixed in with functions
|
508
|
+
* from the `PublisherMethods` mixin. `preEmit` and `shouldEmit` may
|
509
|
+
* be overridden in the definition object.
|
510
|
+
*
|
511
|
+
* @param {Object} definition The action object definition
|
512
|
+
*/
|
513
|
+
module.exports = function(definition) {
|
514
|
+
|
515
|
+
definition = definition || {};
|
516
|
+
|
517
|
+
for(var d in definition){
|
518
|
+
if (!allowed[d] && Reflux.PublisherMethods[d]) {
|
519
|
+
throw new Error("Cannot override API method " + d +
|
520
|
+
" in action creation. Use another method name or override it on Reflux.PublisherMethods instead."
|
521
|
+
);
|
522
|
+
}
|
523
|
+
}
|
524
|
+
|
525
|
+
var context = _.extend({
|
526
|
+
eventLabel: "action",
|
527
|
+
emitter: new _.EventEmitter(),
|
528
|
+
_isAction: true
|
529
|
+
},Reflux.PublisherMethods,definition);
|
530
|
+
|
531
|
+
var functor = function() {
|
532
|
+
functor[functor.sync?"trigger":"triggerAsync"].apply(functor, arguments);
|
533
|
+
};
|
534
|
+
|
535
|
+
_.extend(functor,context);
|
536
|
+
|
537
|
+
Keep.createdActions.push(functor);
|
538
|
+
|
539
|
+
return functor;
|
540
|
+
|
541
|
+
};
|
542
|
+
|
543
|
+
},{"../src":9,"./Keep":2,"./utils":13}],8:[function(_dereq_,module,exports){
|
544
|
+
var _ = _dereq_('./utils'),
|
545
|
+
Reflux = _dereq_('../src'),
|
546
|
+
Keep = _dereq_('./Keep'),
|
547
|
+
allowed = {preEmit:1,shouldEmit:1};
|
548
|
+
|
549
|
+
/**
|
550
|
+
* Creates an event emitting Data Store. It is mixed in with functions
|
551
|
+
* from the `ListenerMethods` and `PublisherMethods` mixins. `preEmit`
|
552
|
+
* and `shouldEmit` may be overridden in the definition object.
|
553
|
+
*
|
554
|
+
* @param {Object} definition The data store object definition
|
555
|
+
* @returns {Store} A data store instance
|
556
|
+
*/
|
557
|
+
module.exports = function(definition) {
|
558
|
+
|
559
|
+
definition = definition || {};
|
560
|
+
|
561
|
+
for(var d in definition){
|
562
|
+
if (!allowed[d] && (Reflux.PublisherMethods[d] || Reflux.ListenerMethods[d])){
|
563
|
+
throw new Error("Cannot override API method " + d +
|
564
|
+
" in store creation. Use another method name or override it on Reflux.PublisherMethods / Reflux.ListenerMethods instead."
|
565
|
+
);
|
566
|
+
}
|
567
|
+
}
|
568
|
+
|
569
|
+
function Store() {
|
570
|
+
var i=0, arr;
|
571
|
+
this.subscriptions = [];
|
572
|
+
this.emitter = new _.EventEmitter();
|
573
|
+
this.eventLabel = "change";
|
574
|
+
if (this.init && _.isFunction(this.init)) {
|
575
|
+
this.init();
|
576
|
+
}
|
577
|
+
if (this.listenables){
|
578
|
+
arr = [].concat(this.listenables);
|
579
|
+
for(;i < arr.length;i++){
|
580
|
+
this.listenToMany(arr[i]);
|
581
|
+
}
|
582
|
+
}
|
583
|
+
}
|
584
|
+
|
585
|
+
_.extend(Store.prototype, Reflux.ListenerMethods, Reflux.PublisherMethods, definition);
|
586
|
+
|
587
|
+
var store = new Store();
|
588
|
+
Keep.createdStores.push(store);
|
589
|
+
|
590
|
+
return store;
|
591
|
+
};
|
592
|
+
|
593
|
+
},{"../src":9,"./Keep":2,"./utils":13}],9:[function(_dereq_,module,exports){
|
594
|
+
exports.ListenerMethods = _dereq_('./ListenerMethods');
|
595
|
+
|
596
|
+
exports.PublisherMethods = _dereq_('./PublisherMethods');
|
597
|
+
|
598
|
+
exports.createAction = _dereq_('./createAction');
|
599
|
+
|
600
|
+
exports.createStore = _dereq_('./createStore');
|
601
|
+
|
602
|
+
exports.connect = _dereq_('./connect');
|
603
|
+
|
604
|
+
exports.ListenerMixin = _dereq_('./ListenerMixin');
|
605
|
+
|
606
|
+
exports.listenTo = _dereq_('./listenTo');
|
607
|
+
|
608
|
+
exports.listenToMany = _dereq_('./listenToMany');
|
609
|
+
|
610
|
+
|
611
|
+
var maker = _dereq_('./joins').staticJoinCreator;
|
612
|
+
|
613
|
+
exports.joinTrailing = exports.all = maker("last"); // Reflux.all alias for backward compatibility
|
614
|
+
|
615
|
+
exports.joinLeading = maker("first");
|
616
|
+
|
617
|
+
exports.joinStrict = maker("strict");
|
618
|
+
|
619
|
+
exports.joinConcat = maker("all");
|
620
|
+
|
621
|
+
|
622
|
+
/**
|
623
|
+
* Convenience function for creating a set of actions
|
624
|
+
*
|
625
|
+
* @param actionNames the names for the actions to be created
|
626
|
+
* @returns an object with actions of corresponding action names
|
627
|
+
*/
|
628
|
+
exports.createActions = function(actionNames) {
|
629
|
+
var i = 0, actions = {};
|
630
|
+
for (; i < actionNames.length; i++) {
|
631
|
+
actions[actionNames[i]] = exports.createAction();
|
632
|
+
}
|
633
|
+
return actions;
|
634
|
+
};
|
635
|
+
|
636
|
+
/**
|
637
|
+
* Sets the eventmitter that Reflux uses
|
638
|
+
*/
|
639
|
+
exports.setEventEmitter = function(ctx) {
|
640
|
+
var _ = _dereq_('./utils');
|
641
|
+
_.EventEmitter = ctx;
|
642
|
+
};
|
643
|
+
|
644
|
+
/**
|
645
|
+
* Sets the method used for deferring actions and stores
|
646
|
+
*/
|
647
|
+
exports.nextTick = function(nextTick) {
|
648
|
+
var _ = _dereq_('./utils');
|
649
|
+
_.nextTick = nextTick;
|
650
|
+
};
|
651
|
+
|
652
|
+
/**
|
653
|
+
* Provides the set of created actions and stores for introspection
|
654
|
+
*/
|
655
|
+
exports.__keep = _dereq_('./Keep');
|
656
|
+
|
657
|
+
},{"./Keep":2,"./ListenerMethods":3,"./ListenerMixin":4,"./PublisherMethods":5,"./connect":6,"./createAction":7,"./createStore":8,"./joins":10,"./listenTo":11,"./listenToMany":12,"./utils":13}],10:[function(_dereq_,module,exports){
|
658
|
+
/**
|
659
|
+
* Internal module used to create static and instance join methods
|
660
|
+
*/
|
661
|
+
|
662
|
+
var slice = Array.prototype.slice,
|
663
|
+
createStore = _dereq_("./createStore"),
|
664
|
+
strategyMethodNames = {
|
665
|
+
strict: "joinStrict",
|
666
|
+
first: "joinLeading",
|
667
|
+
last: "joinTrailing",
|
668
|
+
all: "joinConcat"
|
669
|
+
};
|
670
|
+
|
671
|
+
/**
|
672
|
+
* Used in `index.js` to create the static join methods
|
673
|
+
* @param {String} strategy Which strategy to use when tracking listenable trigger arguments
|
674
|
+
* @returns {Function} A static function which returns a store with a join listen on the given listenables using the given strategy
|
675
|
+
*/
|
676
|
+
exports.staticJoinCreator = function(strategy){
|
677
|
+
return function(/* listenables... */) {
|
678
|
+
var listenables = slice.call(arguments);
|
679
|
+
return createStore({
|
680
|
+
init: function(){
|
681
|
+
this[strategyMethodNames[strategy]].apply(this,listenables.concat("triggerAsync"));
|
682
|
+
}
|
683
|
+
});
|
684
|
+
};
|
685
|
+
};
|
686
|
+
|
687
|
+
/**
|
688
|
+
* Used in `ListenerMethods.js` to create the instance join methods
|
689
|
+
* @param {String} strategy Which strategy to use when tracking listenable trigger arguments
|
690
|
+
* @returns {Function} An instance method which sets up a join listen on the given listenables using the given strategy
|
691
|
+
*/
|
692
|
+
exports.instanceJoinCreator = function(strategy){
|
693
|
+
return function(/* listenables..., callback*/){
|
694
|
+
var listenables = slice.call(arguments),
|
695
|
+
callback = listenables.pop(),
|
696
|
+
numberOfListenables = listenables.length,
|
697
|
+
join = {
|
698
|
+
numberOfListenables: numberOfListenables,
|
699
|
+
callback: this[callback]||callback,
|
700
|
+
listener: this,
|
701
|
+
strategy: strategy
|
702
|
+
};
|
703
|
+
for (var i = 0; i < numberOfListenables; i++) {
|
704
|
+
this.listenTo(listenables[i],newListener(i,join));
|
705
|
+
}
|
706
|
+
reset(join);
|
707
|
+
};
|
708
|
+
};
|
709
|
+
|
710
|
+
// ---- internal join functions ----
|
711
|
+
|
712
|
+
function reset(join) {
|
713
|
+
join.listenablesEmitted = new Array(join.numberOfListenables);
|
714
|
+
join.args = new Array(join.numberOfListenables);
|
715
|
+
}
|
716
|
+
|
717
|
+
function newListener(i,join) {
|
718
|
+
return function() {
|
719
|
+
var callargs = slice.call(arguments);
|
720
|
+
if (join.listenablesEmitted[i]){
|
721
|
+
switch(join.strategy){
|
722
|
+
case "strict": throw new Error("Strict join failed because listener triggered twice.");
|
723
|
+
case "last": join.args[i] = callargs; break;
|
724
|
+
case "all": join.args[i].push(callargs);
|
725
|
+
}
|
726
|
+
} else {
|
727
|
+
join.listenablesEmitted[i] = true;
|
728
|
+
join.args[i] = (join.strategy==="all"?[callargs]:callargs);
|
729
|
+
}
|
730
|
+
emitIfAllListenablesEmitted(join);
|
731
|
+
};
|
732
|
+
}
|
733
|
+
|
734
|
+
function emitIfAllListenablesEmitted(join) {
|
735
|
+
for (var i = 0; i < join.numberOfListenables; i++) {
|
736
|
+
if (!join.listenablesEmitted[i]) {
|
737
|
+
return;
|
738
|
+
}
|
739
|
+
}
|
740
|
+
join.callback.apply(join.listener,join.args);
|
741
|
+
reset(join);
|
742
|
+
}
|
743
|
+
|
744
|
+
},{"./createStore":8}],11:[function(_dereq_,module,exports){
|
745
|
+
var Reflux = _dereq_('../src');
|
746
|
+
|
747
|
+
|
748
|
+
/**
|
749
|
+
* A mixin factory for a React component. Meant as a more convenient way of using the `ListenerMixin`,
|
750
|
+
* without having to manually set listeners in the `componentDidMount` method.
|
751
|
+
*
|
752
|
+
* @param {Action|Store} listenable An Action or Store that should be
|
753
|
+
* listened to.
|
754
|
+
* @param {Function|String} callback The callback to register as event handler
|
755
|
+
* @param {Function|String} defaultCallback The callback to register as default handler
|
756
|
+
* @returns {Object} An object to be used as a mixin, which sets up the listener for the given listenable.
|
757
|
+
*/
|
758
|
+
module.exports = function(listenable,callback,initial){
|
759
|
+
return {
|
760
|
+
/**
|
761
|
+
* Set up the mixin before the initial rendering occurs. Import methods from `ListenerMethods`
|
762
|
+
* and then make the call to `listenTo` with the arguments provided to the factory function
|
763
|
+
*/
|
764
|
+
componentDidMount: function() {
|
765
|
+
for(var m in Reflux.ListenerMethods){
|
766
|
+
if (this[m] !== Reflux.ListenerMethods[m]){
|
767
|
+
if (this[m]){
|
768
|
+
throw "Can't have other property '"+m+"' when using Reflux.listenTo!";
|
769
|
+
}
|
770
|
+
this[m] = Reflux.ListenerMethods[m];
|
771
|
+
}
|
772
|
+
}
|
773
|
+
this.listenTo(listenable,callback,initial);
|
774
|
+
},
|
775
|
+
/**
|
776
|
+
* Cleans up all listener previously registered.
|
777
|
+
*/
|
778
|
+
componentWillUnmount: Reflux.ListenerMethods.stopListeningToAll
|
779
|
+
};
|
780
|
+
};
|
781
|
+
|
782
|
+
},{"../src":9}],12:[function(_dereq_,module,exports){
|
783
|
+
var Reflux = _dereq_('../src');
|
784
|
+
|
785
|
+
/**
|
786
|
+
* A mixin factory for a React component. Meant as a more convenient way of using the `listenerMixin`,
|
787
|
+
* without having to manually set listeners in the `componentDidMount` method. This version is used
|
788
|
+
* to automatically set up a `listenToMany` call.
|
789
|
+
*
|
790
|
+
* @param {Object} listenables An object of listenables
|
791
|
+
* @returns {Object} An object to be used as a mixin, which sets up the listeners for the given listenables.
|
792
|
+
*/
|
793
|
+
module.exports = function(listenables){
|
794
|
+
return {
|
795
|
+
/**
|
796
|
+
* Set up the mixin before the initial rendering occurs. Import methods from `ListenerMethods`
|
797
|
+
* and then make the call to `listenTo` with the arguments provided to the factory function
|
798
|
+
*/
|
799
|
+
componentDidMount: function() {
|
800
|
+
for(var m in Reflux.ListenerMethods){
|
801
|
+
if (this[m] !== Reflux.ListenerMethods[m]){
|
802
|
+
if (this[m]){
|
803
|
+
throw "Can't have other property '"+m+"' when using Reflux.listenToMany!";
|
804
|
+
}
|
805
|
+
this[m] = Reflux.ListenerMethods[m];
|
806
|
+
}
|
807
|
+
}
|
808
|
+
this.listenToMany(listenables);
|
809
|
+
},
|
810
|
+
/**
|
811
|
+
* Cleans up all listener previously registered.
|
812
|
+
*/
|
813
|
+
componentWillUnmount: Reflux.ListenerMethods.stopListeningToAll
|
814
|
+
};
|
815
|
+
};
|
816
|
+
|
817
|
+
},{"../src":9}],13:[function(_dereq_,module,exports){
|
818
|
+
/*
|
819
|
+
* isObject, extend, isFunction, isArguments are taken from undescore/lodash in
|
820
|
+
* order to remove the dependency
|
821
|
+
*/
|
822
|
+
var isObject = exports.isObject = function(obj) {
|
823
|
+
var type = typeof obj;
|
824
|
+
return type === 'function' || type === 'object' && !!obj;
|
825
|
+
};
|
826
|
+
|
827
|
+
exports.extend = function(obj) {
|
828
|
+
if (!isObject(obj)) {
|
829
|
+
return obj;
|
830
|
+
}
|
831
|
+
var source, prop;
|
832
|
+
for (var i = 1, length = arguments.length; i < length; i++) {
|
833
|
+
source = arguments[i];
|
834
|
+
for (prop in source) {
|
835
|
+
obj[prop] = source[prop];
|
836
|
+
}
|
837
|
+
}
|
838
|
+
return obj;
|
839
|
+
};
|
840
|
+
|
841
|
+
exports.isFunction = function(value) {
|
842
|
+
return typeof value === 'function';
|
843
|
+
};
|
844
|
+
|
845
|
+
exports.EventEmitter = _dereq_('eventemitter3');
|
846
|
+
|
847
|
+
exports.nextTick = function(callback) {
|
848
|
+
setTimeout(callback, 0);
|
849
|
+
};
|
850
|
+
|
851
|
+
exports.callbackName = function(string){
|
852
|
+
return "on"+string.charAt(0).toUpperCase()+string.slice(1);
|
853
|
+
};
|
854
|
+
|
855
|
+
exports.object = function(keys,vals){
|
856
|
+
var o={}, i=0;
|
857
|
+
for(;i<keys.length;i++){
|
858
|
+
o[keys[i]] = vals[i];
|
859
|
+
}
|
860
|
+
return o;
|
861
|
+
};
|
862
|
+
|
863
|
+
exports.isArguments = function(value) {
|
864
|
+
return value && typeof value == 'object' && typeof value.length == 'number' &&
|
865
|
+
(toString.call(value) === '[object Arguments]' || (hasOwnProperty.call(value, 'callee' && !propertyIsEnumerable.call(value, 'callee')))) || false;
|
866
|
+
};
|
867
|
+
|
868
|
+
exports.throwIf = function(val,msg){
|
869
|
+
if (val){
|
870
|
+
throw Error(msg||val);
|
871
|
+
}
|
872
|
+
};
|
873
|
+
|
874
|
+
},{"eventemitter3":1}]},{},[9])
|
875
|
+
(9)
|
876
|
+
});
|
@@ -0,0 +1 @@
|
|
1
|
+
!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;"undefined"!=typeof window?b=window:"undefined"!=typeof global?b=global:"undefined"!=typeof self&&(b=self),b.Reflux=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);throw new Error("Cannot find module '"+g+"'")}var j=c[g]={exports:{}};b[g][0].call(j.exports,function(a){var c=b[g][1][a];return e(c?c:a)},j,j.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b){"use strict";function c(a,b,c){this.fn=a,this.context=b,this.once=c||!1}function d(){}d.prototype._events=void 0,d.prototype.listeners=function(a){if(!this._events||!this._events[a])return[];for(var b=0,c=this._events[a].length,d=[];c>b;b++)d.push(this._events[a][b].fn);return d},d.prototype.emit=function(a,b,c,d,e,f){if(!this._events||!this._events[a])return!1;var g,h,i,j=this._events[a],k=j.length,l=arguments.length,m=j[0];if(1===k){switch(m.once&&this.removeListener(a,m.fn,!0),l){case 1:return m.fn.call(m.context),!0;case 2:return m.fn.call(m.context,b),!0;case 3:return m.fn.call(m.context,b,c),!0;case 4:return m.fn.call(m.context,b,c,d),!0;case 5:return m.fn.call(m.context,b,c,d,e),!0;case 6:return m.fn.call(m.context,b,c,d,e,f),!0}for(h=1,g=new Array(l-1);l>h;h++)g[h-1]=arguments[h];m.fn.apply(m.context,g)}else for(h=0;k>h;h++)switch(j[h].once&&this.removeListener(a,j[h].fn,!0),l){case 1:j[h].fn.call(j[h].context);break;case 2:j[h].fn.call(j[h].context,b);break;case 3:j[h].fn.call(j[h].context,b,c);break;default:if(!g)for(i=1,g=new Array(l-1);l>i;i++)g[i-1]=arguments[i];j[h].fn.apply(j[h].context,g)}return!0},d.prototype.on=function(a,b,d){return this._events||(this._events={}),this._events[a]||(this._events[a]=[]),this._events[a].push(new c(b,d||this)),this},d.prototype.once=function(a,b,d){return this._events||(this._events={}),this._events[a]||(this._events[a]=[]),this._events[a].push(new c(b,d||this,!0)),this},d.prototype.removeListener=function(a,b,c){if(!this._events||!this._events[a])return this;var d=this._events[a],e=[];if(b)for(var f=0,g=d.length;g>f;f++)d[f].fn!==b&&d[f].once!==c&&e.push(d[f]);return this._events[a]=e.length?e:null,this},d.prototype.removeAllListeners=function(a){return this._events?(a?this._events[a]=null:this._events={},this):this},d.prototype.off=d.prototype.removeListener,d.prototype.addListener=d.prototype.on,d.prototype.setMaxListeners=function(){return this},d.EventEmitter=d,d.EventEmitter2=d,d.EventEmitter3=d,"object"==typeof b&&b.exports&&(b.exports=d)},{}],2:[function(a,b,c){c.createdStores=[],c.createdActions=[],c.reset=function(){for(;c.createdStores.length;)c.createdStores.pop();for(;c.createdActions.length;)c.createdActions.pop()}},{}],3:[function(a,b){var c=a("./utils"),d=a("./joins").instanceJoinCreator;b.exports={hasListener:function(a){for(var b,c=0;c<(this.subscriptions||[]).length;++c)if(b=this.subscriptions[c].listenable,b===a||b.hasListener&&b.hasListener(a))return!0;return!1},listenToMany:function(a){for(var b in a){var d=c.callbackName(b),e=this[d]?d:this[b]?b:void 0;e&&this.listenTo(a[b],e,this[d+"Default"]||this[e+"Default"]||e)}},validateListening:function(a){return a===this?"Listener is not able to listen to itself":c.isFunction(a.listen)?a.hasListener&&a.hasListener(this)?"Listener cannot listen to this listenable because of circular loop":void 0:a+" is missing a listen method"},listenTo:function(a,b,d){var e,f,g,h=this.subscriptions=this.subscriptions||[];return c.throwIf(this.validateListening(a)),this.fetchDefaultData(a,d),e=a.listen(this[b]||b,this),f=function(){var a=h.indexOf(g);c.throwIf(-1===a,"Tried to remove listen already gone from subscriptions list!"),h.splice(a,1),e()},g={stop:f,listenable:a},h.push(g),g},stopListeningTo:function(a){for(var b,d=0,e=this.subscriptions||[];d<e.length;d++)if(b=e[d],b.listenable===a)return b.stop(),c.throwIf(-1!==e.indexOf(b),"Failed to remove listen from subscriptions list!"),!0;return!1},stopListeningToAll:function(){for(var a,b=this.subscriptions||[];a=b.length;)b[0].stop(),c.throwIf(b.length!==a-1,"Failed to remove listen from subscriptions list!")},fetchDefaultData:function(a,b){b=b&&this[b]||b;var d=this;c.isFunction(b)&&c.isFunction(a.getDefaultData)&&(data=a.getDefaultData(),data&&c.isFunction(data.then)?data.then(function(){b.apply(d,arguments)}):b.call(this,data))},joinTrailing:d("last"),joinLeading:d("first"),joinConcat:d("all"),joinStrict:d("strict")}},{"./joins":10,"./utils":13}],4:[function(a,b){var c=a("./utils"),d=a("./ListenerMethods");b.exports=c.extend({componentWillUnmount:d.stopListeningToAll},d)},{"./ListenerMethods":3,"./utils":13}],5:[function(a,b){var c=a("./utils");b.exports={preEmit:function(){},shouldEmit:function(){return!0},listen:function(a,b){var c=function(c){a.apply(b,c)},d=this;return this.emitter.addListener(this.eventLabel,c),function(){d.emitter.removeListener(d.eventLabel,c)}},trigger:function(){var a=arguments,b=this.preEmit.apply(this,a);a=void 0===b?a:c.isArguments(b)?b:[].concat(b),this.shouldEmit.apply(this,a)&&this.emitter.emit(this.eventLabel,a)},triggerAsync:function(){var a=arguments,b=this;c.nextTick(function(){b.trigger.apply(b,a)})}}},{"./utils":13}],6:[function(a,b){var c=a("../src"),d=a("./utils");b.exports=function(a,b){return{componentDidMount:function(){for(var e in c.ListenerMethods)if(this[e]!==c.ListenerMethods[e]){if(this[e])throw"Can't have other property '"+e+"' when using Reflux.listenTo!";this[e]=c.ListenerMethods[e]}var f=this,g=void 0===b?this.setState:function(a){f.setState(d.object([b],[a]))};this.listenTo(a,g,g)},componentWillUnmount:c.ListenerMixin.componentWillUnmount}}},{"../src":9,"./utils":13}],7:[function(a,b){var c=a("./utils"),d=a("../src"),e=a("./Keep"),f={preEmit:1,shouldEmit:1};b.exports=function(a){a=a||{};for(var b in a)if(!f[b]&&d.PublisherMethods[b])throw new Error("Cannot override API method "+b+" in action creation. Use another method name or override it on Reflux.PublisherMethods instead.");var g=c.extend({eventLabel:"action",emitter:new c.EventEmitter,_isAction:!0},d.PublisherMethods,a),h=function(){h[h.sync?"trigger":"triggerAsync"].apply(h,arguments)};return c.extend(h,g),e.createdActions.push(h),h}},{"../src":9,"./Keep":2,"./utils":13}],8:[function(a,b){var c=a("./utils"),d=a("../src"),e=a("./Keep"),f={preEmit:1,shouldEmit:1};b.exports=function(a){function b(){var a,b=0;if(this.subscriptions=[],this.emitter=new c.EventEmitter,this.eventLabel="change",this.init&&c.isFunction(this.init)&&this.init(),this.listenables)for(a=[].concat(this.listenables);b<a.length;b++)this.listenToMany(a[b])}a=a||{};for(var g in a)if(!f[g]&&(d.PublisherMethods[g]||d.ListenerMethods[g]))throw new Error("Cannot override API method "+g+" in store creation. Use another method name or override it on Reflux.PublisherMethods / Reflux.ListenerMethods instead.");c.extend(b.prototype,d.ListenerMethods,d.PublisherMethods,a);var h=new b;return e.createdStores.push(h),h}},{"../src":9,"./Keep":2,"./utils":13}],9:[function(a,b,c){c.ListenerMethods=a("./ListenerMethods"),c.PublisherMethods=a("./PublisherMethods"),c.createAction=a("./createAction"),c.createStore=a("./createStore"),c.connect=a("./connect"),c.ListenerMixin=a("./ListenerMixin"),c.listenTo=a("./listenTo"),c.listenToMany=a("./listenToMany");var d=a("./joins").staticJoinCreator;c.joinTrailing=c.all=d("last"),c.joinLeading=d("first"),c.joinStrict=d("strict"),c.joinConcat=d("all"),c.createActions=function(a){for(var b=0,d={};b<a.length;b++)d[a[b]]=c.createAction();return d},c.setEventEmitter=function(b){var c=a("./utils");c.EventEmitter=b},c.nextTick=function(b){var c=a("./utils");c.nextTick=b},c.__keep=a("./Keep")},{"./Keep":2,"./ListenerMethods":3,"./ListenerMixin":4,"./PublisherMethods":5,"./connect":6,"./createAction":7,"./createStore":8,"./joins":10,"./listenTo":11,"./listenToMany":12,"./utils":13}],10:[function(a,b,c){function d(a){a.listenablesEmitted=new Array(a.numberOfListenables),a.args=new Array(a.numberOfListenables)}function e(a,b){return function(){var c=g.call(arguments);if(b.listenablesEmitted[a])switch(b.strategy){case"strict":throw new Error("Strict join failed because listener triggered twice.");case"last":b.args[a]=c;break;case"all":b.args[a].push(c)}else b.listenablesEmitted[a]=!0,b.args[a]="all"===b.strategy?[c]:c;f(b)}}function f(a){for(var b=0;b<a.numberOfListenables;b++)if(!a.listenablesEmitted[b])return;a.callback.apply(a.listener,a.args),d(a)}var g=Array.prototype.slice,h=a("./createStore"),i={strict:"joinStrict",first:"joinLeading",last:"joinTrailing",all:"joinConcat"};c.staticJoinCreator=function(a){return function(){var b=g.call(arguments);return h({init:function(){this[i[a]].apply(this,b.concat("triggerAsync"))}})}},c.instanceJoinCreator=function(a){return function(){for(var b=g.call(arguments),c=b.pop(),f=b.length,h={numberOfListenables:f,callback:this[c]||c,listener:this,strategy:a},i=0;f>i;i++)this.listenTo(b[i],e(i,h));d(h)}}},{"./createStore":8}],11:[function(a,b){var c=a("../src");b.exports=function(a,b,d){return{componentDidMount:function(){for(var e in c.ListenerMethods)if(this[e]!==c.ListenerMethods[e]){if(this[e])throw"Can't have other property '"+e+"' when using Reflux.listenTo!";this[e]=c.ListenerMethods[e]}this.listenTo(a,b,d)},componentWillUnmount:c.ListenerMethods.stopListeningToAll}}},{"../src":9}],12:[function(a,b){var c=a("../src");b.exports=function(a){return{componentDidMount:function(){for(var b in c.ListenerMethods)if(this[b]!==c.ListenerMethods[b]){if(this[b])throw"Can't have other property '"+b+"' when using Reflux.listenToMany!";this[b]=c.ListenerMethods[b]}this.listenToMany(a)},componentWillUnmount:c.ListenerMethods.stopListeningToAll}}},{"../src":9}],13:[function(a,b,c){var d=c.isObject=function(a){var b=typeof a;return"function"===b||"object"===b&&!!a};c.extend=function(a){if(!d(a))return a;for(var b,c,e=1,f=arguments.length;f>e;e++){b=arguments[e];for(c in b)a[c]=b[c]}return a},c.isFunction=function(a){return"function"==typeof a},c.EventEmitter=a("eventemitter3"),c.nextTick=function(a){setTimeout(a,0)},c.callbackName=function(a){return"on"+a.charAt(0).toUpperCase()+a.slice(1)},c.object=function(a,b){for(var c={},d=0;d<a.length;d++)c[a[d]]=b[d];return c},c.isArguments=function(a){return a&&"object"==typeof a&&"number"==typeof a.length&&("[object Arguments]"===toString.call(a)||hasOwnProperty.call(a,"callee"&&!propertyIsEnumerable.call(a,"callee")))||!1},c.throwIf=function(a,b){if(a)throw Error(b||a)}},{eventemitter3:1}]},{},[9])(9)});
|
metadata
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: reflux-rails
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.15
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Wontae Yang
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-11-05 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.7'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.7'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
description: this is a Ruby gem for building reflux application
|
42
|
+
email:
|
43
|
+
- wontaeyang@gmail.com
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- .gitignore
|
49
|
+
- Gemfile
|
50
|
+
- LICENSE.txt
|
51
|
+
- README.md
|
52
|
+
- Rakefile
|
53
|
+
- lib/reflux/rails.rb
|
54
|
+
- lib/reflux/rails/engine.rb
|
55
|
+
- lib/reflux/rails/railtie.rb
|
56
|
+
- lib/reflux/rails/version.rb
|
57
|
+
- reflux-rails.gemspec
|
58
|
+
- vendor/assets/javascripts/reflux.js
|
59
|
+
- vendor/assets/javascripts/reflux.min.js
|
60
|
+
homepage: https://github.com/wontaeyang/reflux-rails
|
61
|
+
licenses:
|
62
|
+
- MIT
|
63
|
+
metadata: {}
|
64
|
+
post_install_message:
|
65
|
+
rdoc_options: []
|
66
|
+
require_paths:
|
67
|
+
- lib
|
68
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - '>='
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '0'
|
73
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
requirements: []
|
79
|
+
rubyforge_project:
|
80
|
+
rubygems_version: 2.4.2
|
81
|
+
signing_key:
|
82
|
+
specification_version: 4
|
83
|
+
summary: refluxjs gem for rails
|
84
|
+
test_files: []
|