js_stack 1.6.0 → 1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 109a21b1d4dbcac6bc91e568c3bce32477405e38
4
- data.tar.gz: 064f5b1736ef2ac8c4f6a0ae072f211bdeb93749
3
+ metadata.gz: c72c85f96ee87d9d966db874e1f2b2c2e889c6b3
4
+ data.tar.gz: 7c36f630ad50d5a53336c4fa8d2703c056434cd7
5
5
  SHA512:
6
- metadata.gz: d60ef1d9ff3db827d27b746d19f4dcb0e63f20fb0eeeb2cd24338ae519d7e0193e31dfd7059535243aba873ee7d569d458c9004a9846b7dfc700b18d7b345d0f
7
- data.tar.gz: faf2447bcb752361755b4ddcc7aeba9bcba99ae776f8ab1dbff1c7b6769f602aef4a19c97a720c54d085f6557cce35a0e82064a3f7f6abc971c367b0c959e547
6
+ metadata.gz: bd00f069a5ce891eeb5b1a7c12b2973f5481e2ad61580b71d02098421df310705c63b3efc84dc36e11f145a86aa66a2f0bddd0496cba803980c5bde370783560
7
+ data.tar.gz: f1106d0662a634bf9a533beb4c99a2439d4f57f10764733e8204d47a2ac98d3eef1a3ab3a051d84da3fca78901e3fae12172d8fa656e09a3676ce2c6f6c8c394
data/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ # 1.7.0
4
+
5
+ * update marionette 2.3.1 -> 2.3.2 [@gvl]
6
+ * update backbone.validation 0.9.1 -> 0.9.2 -> 0.11.3 [@gvl]
7
+ * update backbone.virtualcollection 0.6.0 -> 0.6.1 [@gvl]
8
+ * update cocktail 0.5.8 -> 0.5.10 [@gvl]
9
+ * update underscore.string 3.0.1 -> 3.0.3 [@gvl]
10
+
3
11
  # 1.6.0
4
12
 
5
13
  * update marionette 2.3.0 -> 2.3.1 [@gvl]
data/README.md CHANGED
@@ -48,7 +48,7 @@ Examples:
48
48
  | Library | Versions | Changelog | Homepage |
49
49
  | :-----: | :------: | :-------: | :------: |
50
50
  | backbone | **1.1.2**, 1.0.0 | [changelog](http://backbonejs.org/#changelog) | [homepage](http://backbonejs.org/) |
51
- | marionette | **2.3.1**, 2.2.2, 2.1.0, 2.0.3, 1.8.8, 1.7.4, 1.6.4, 1.5.1, 1.4.1, 1.1.0 | [changelog](https://github.com/marionettejs/backbone.marionette/blob/master/changelog.md) | [homepage](http://marionettejs.com/) |
51
+ | marionette | **2.3.2**, 2.2.2, 2.1.0, 2.0.3, 1.8.8, 1.7.4, 1.6.4, 1.5.1, 1.4.1, 1.1.0 | [changelog](https://github.com/marionettejs/backbone.marionette/blob/master/changelog.md) | [homepage](http://marionettejs.com/) |
52
52
  | underscore | **1.7.0**, 1.6.0, 1.5.2 | [changelog](http://underscorejs.org/#changelog) | [homepage](http://underscorejs.org/) |
53
53
  | hamlcoffee | **1.16** | [changelog](https://github.com/netzpirat/haml_coffee_assets/blob/master/CHANGELOG.md) | [homepage](https://github.com/netzpirat/haml_coffee_assets) |
54
54
  | js-routes | **1.0.0** | [changelog](https://github.com/railsware/js-routes/blob/master/CHANGELOG.md) | [homepage](https://github.com/railsware/js-routes) |
@@ -64,12 +64,12 @@ Examples:
64
64
  | backbone paginator | **2.0.2** | [changelog](https://github.com/backbone-paginator/backbone.paginator/wiki/Changelog) | [homepage](https://github.com/backbone-paginator/backbone.paginator) |
65
65
  | backbone routefilter | **0.2.1** | [changelog](https://github.com/boazsender/backbone.routefilter#release-history) | [homepage](https://github.com/boazsender/backbone.routefilter) |
66
66
  | backbone stickit | **0.8.0**, 0.7.0, 0.6.3 | [changelog](http://nytimes.github.io/backbone.stickit/#change-log) | [homepage](http://nytimes.github.io/backbone.stickit/) |
67
- | backbone validation | **0.9.1**, 0.8.1 | [changelog](https://github.com/thedersen/backbone.validation#release-notes) | [homepage](https://github.com/thedersen/backbone.validation) |
68
- | backbone virtualcollection | **0.6.0**, 0.5.3, 0.4.15 | [changelog](https://github.com/p3drosola/Backbone.VirtualCollection/wiki/Changelog) | [homepage](https://github.com/p3drosola/Backbone.VirtualCollection) |
69
- | cocktail | **0.5.8** | None | [homepage](https://github.com/onsi/cocktail) |
67
+ | backbone validation | **0.11.3**, 0.9.2, 0.8.1 | [changelog](https://github.com/thedersen/backbone.validation#release-notes) | [homepage](https://github.com/thedersen/backbone.validation) |
68
+ | backbone virtualcollection | **0.6.1**, 0.5.3, 0.4.15 | [changelog](https://github.com/p3drosola/Backbone.VirtualCollection/wiki/Changelog) | [homepage](https://github.com/p3drosola/Backbone.VirtualCollection) |
69
+ | cocktail | **0.5.10** | None | [homepage](https://github.com/onsi/cocktail) |
70
70
  | momentjs | **2.9.0** | [changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md) | [homepage](https://github.com/derekprior/momentjs-rails) |
71
71
  | underscore inflections | **0.2.1** | None | [homepage](https://github.com/geetarista/underscore.inflections) |
72
- | underscore string | **3.0.1**, 2.4.0, 2.3.2 | [changelog](https://github.com/epeli/underscore.string/blob/master/CHANGELOG.markdown) | [homepage](http://epeli.github.io/underscore.string/) |
72
+ | underscore string | **3.0.3**, 2.4.0, 2.3.2 | [changelog](https://github.com/epeli/underscore.string/blob/master/CHANGELOG.markdown) | [homepage](http://epeli.github.io/underscore.string/) |
73
73
 
74
74
  ## Contributing
75
75
 
@@ -1,3 +1,3 @@
1
1
  module JsStack
2
- VERSION = '1.6.0'
2
+ VERSION = '1.7.0'
3
3
  end
@@ -1,6 +1,6 @@
1
1
  // MarionetteJS (Backbone.Marionette)
2
2
  // ----------------------------------
3
- // v2.3.1
3
+ // v2.3.2
4
4
  //
5
5
  // Copyright (c)2015 Derick Bailey, Muted Solutions, LLC.
6
6
  // Distributed under MIT license
@@ -493,7 +493,7 @@
493
493
 
494
494
  var Marionette = Backbone.Marionette = {};
495
495
 
496
- Marionette.VERSION = '2.3.1';
496
+ Marionette.VERSION = '2.3.2';
497
497
 
498
498
  Marionette.noConflict = function() {
499
499
  root.Marionette = previousMarionette;
@@ -550,6 +550,10 @@
550
550
  // undefined return a default value
551
551
  Marionette._getValue = function(value, context, params) {
552
552
  if (_.isFunction(value)) {
553
+ // We need to ensure that params is not undefined
554
+ // to prevent `apply` from failing in ie8
555
+ params = params || [];
556
+
553
557
  value = value.apply(context, params);
554
558
  }
555
559
  return value;
@@ -753,14 +757,13 @@
753
757
  // Bind Entity Events & Unbind Entity Events
754
758
  // -----------------------------------------
755
759
  //
756
- // These methods are used to bind/unbind a backbone "entity" (collection/model)
760
+ // These methods are used to bind/unbind a backbone "entity" (e.g. collection/model)
757
761
  // to methods on a target object.
758
762
  //
759
- // The first parameter, `target`, must have a `listenTo` method from the
760
- // EventBinder object.
763
+ // The first parameter, `target`, must have the Backbone.Events module mixed in.
761
764
  //
762
- // The second parameter is the entity (Backbone.Model or Backbone.Collection)
763
- // to bind the events from.
765
+ // The second parameter is the `entity` (Backbone.Model, Backbone.Collection or
766
+ // any object that has Backbone.Events mixed in) to bind the events from.
764
767
  //
765
768
  // The third parameter is a hash of { "event:name": "eventHandler" }
766
769
  // configuration. Multiple handlers can be separated by a space. A
@@ -2244,7 +2247,7 @@
2244
2247
  },
2245
2248
 
2246
2249
  // Render and show the emptyView. Similar to addChild method
2247
- // but "child:added" events are not fired, and the event from
2250
+ // but "add:child" events are not fired, and the event from
2248
2251
  // emptyView are not forwarded
2249
2252
  addEmptyView: function(child, EmptyView) {
2250
2253
 
@@ -1 +1 @@
1
- //= require js_stack/base/marionette/2.3.1
1
+ //= require js_stack/base/marionette/2.3.2
@@ -0,0 +1,704 @@
1
+ // Backbone.Validation v0.11.3
2
+ //
3
+ // Copyright (c) 2011-2015 Thomas Pedersen
4
+ // Distributed under MIT License
5
+ //
6
+ // Documentation and full license available at:
7
+ // http://thedersen.com/projects/backbone-validation
8
+ Backbone.Validation = (function(_){
9
+ 'use strict';
10
+
11
+ // Default options
12
+ // ---------------
13
+
14
+ var defaultOptions = {
15
+ forceUpdate: false,
16
+ selector: 'name',
17
+ labelFormatter: 'sentenceCase',
18
+ valid: Function.prototype,
19
+ invalid: Function.prototype
20
+ };
21
+
22
+
23
+ // Helper functions
24
+ // ----------------
25
+
26
+ // Formatting functions used for formatting error messages
27
+ var formatFunctions = {
28
+ // Uses the configured label formatter to format the attribute name
29
+ // to make it more readable for the user
30
+ formatLabel: function(attrName, model) {
31
+ return defaultLabelFormatters[defaultOptions.labelFormatter](attrName, model);
32
+ },
33
+
34
+ // Replaces nummeric placeholders like {0} in a string with arguments
35
+ // passed to the function
36
+ format: function() {
37
+ var args = Array.prototype.slice.call(arguments),
38
+ text = args.shift();
39
+ return text.replace(/\{(\d+)\}/g, function(match, number) {
40
+ return typeof args[number] !== 'undefined' ? args[number] : match;
41
+ });
42
+ }
43
+ };
44
+
45
+ // Flattens an object
46
+ // eg:
47
+ //
48
+ // var o = {
49
+ // owner: {
50
+ // name: 'Backbone',
51
+ // address: {
52
+ // street: 'Street',
53
+ // zip: 1234
54
+ // }
55
+ // }
56
+ // };
57
+ //
58
+ // becomes:
59
+ //
60
+ // var o = {
61
+ // 'owner': {
62
+ // name: 'Backbone',
63
+ // address: {
64
+ // street: 'Street',
65
+ // zip: 1234
66
+ // }
67
+ // },
68
+ // 'owner.name': 'Backbone',
69
+ // 'owner.address': {
70
+ // street: 'Street',
71
+ // zip: 1234
72
+ // },
73
+ // 'owner.address.street': 'Street',
74
+ // 'owner.address.zip': 1234
75
+ // };
76
+ // This may seem redundant, but it allows for maximum flexibility
77
+ // in validation rules.
78
+ var flatten = function (obj, into, prefix) {
79
+ into = into || {};
80
+ prefix = prefix || '';
81
+
82
+ _.each(obj, function(val, key) {
83
+ if(obj.hasOwnProperty(key)) {
84
+ if (!!val && typeof val === 'object' && val.constructor === Object) {
85
+ flatten(val, into, prefix + key + '.');
86
+ }
87
+
88
+ // Register the current level object as well
89
+ into[prefix + key] = val;
90
+ }
91
+ });
92
+
93
+ return into;
94
+ };
95
+
96
+ // Validation
97
+ // ----------
98
+
99
+ var Validation = (function(){
100
+
101
+ // Returns an object with undefined properties for all
102
+ // attributes on the model that has defined one or more
103
+ // validation rules.
104
+ var getValidatedAttrs = function(model, attrs) {
105
+ attrs = attrs || _.keys(_.result(model, 'validation') || {});
106
+ return _.reduce(attrs, function(memo, key) {
107
+ memo[key] = void 0;
108
+ return memo;
109
+ }, {});
110
+ };
111
+
112
+ // Returns an array with attributes passed through options
113
+ var getOptionsAttrs = function(options, view) {
114
+ var attrs = options.attributes;
115
+ if (_.isFunction(attrs)) {
116
+ attrs = attrs(view);
117
+ } else if (_.isString(attrs) && (_.isFunction(defaultAttributeLoaders[attrs]))) {
118
+ attrs = defaultAttributeLoaders[attrs](view);
119
+ }
120
+ if (_.isArray(attrs)) {
121
+ return attrs;
122
+ }
123
+ };
124
+
125
+
126
+ // Looks on the model for validations for a specified
127
+ // attribute. Returns an array of any validators defined,
128
+ // or an empty array if none is defined.
129
+ var getValidators = function(model, attr) {
130
+ var attrValidationSet = model.validation ? _.result(model, 'validation')[attr] || {} : {};
131
+
132
+ // If the validator is a function or a string, wrap it in a function validator
133
+ if (_.isFunction(attrValidationSet) || _.isString(attrValidationSet)) {
134
+ attrValidationSet = {
135
+ fn: attrValidationSet
136
+ };
137
+ }
138
+
139
+ // Stick the validator object into an array
140
+ if(!_.isArray(attrValidationSet)) {
141
+ attrValidationSet = [attrValidationSet];
142
+ }
143
+
144
+ // Reduces the array of validators into a new array with objects
145
+ // with a validation method to call, the value to validate against
146
+ // and the specified error message, if any
147
+ return _.reduce(attrValidationSet, function(memo, attrValidation) {
148
+ _.each(_.without(_.keys(attrValidation), 'msg'), function(validator) {
149
+ memo.push({
150
+ fn: defaultValidators[validator],
151
+ val: attrValidation[validator],
152
+ msg: attrValidation.msg
153
+ });
154
+ });
155
+ return memo;
156
+ }, []);
157
+ };
158
+
159
+ // Validates an attribute against all validators defined
160
+ // for that attribute. If one or more errors are found,
161
+ // the first error message is returned.
162
+ // If the attribute is valid, an empty string is returned.
163
+ var validateAttr = function(model, attr, value, computed) {
164
+ // Reduces the array of validators to an error message by
165
+ // applying all the validators and returning the first error
166
+ // message, if any.
167
+ return _.reduce(getValidators(model, attr), function(memo, validator){
168
+ // Pass the format functions plus the default
169
+ // validators as the context to the validator
170
+ var ctx = _.extend({}, formatFunctions, defaultValidators),
171
+ result = validator.fn.call(ctx, value, attr, validator.val, model, computed);
172
+
173
+ if(result === false || memo === false) {
174
+ return false;
175
+ }
176
+ if (result && !memo) {
177
+ return _.result(validator, 'msg') || result;
178
+ }
179
+ return memo;
180
+ }, '');
181
+ };
182
+
183
+ // Loops through the model's attributes and validates the specified attrs.
184
+ // Returns and object containing names of invalid attributes
185
+ // as well as error messages.
186
+ var validateModel = function(model, attrs, validatedAttrs) {
187
+ var error,
188
+ invalidAttrs = {},
189
+ isValid = true,
190
+ computed = _.clone(attrs);
191
+
192
+ _.each(validatedAttrs, function(val, attr) {
193
+ error = validateAttr(model, attr, val, computed);
194
+ if (error) {
195
+ invalidAttrs[attr] = error;
196
+ isValid = false;
197
+ }
198
+ });
199
+
200
+ return {
201
+ invalidAttrs: invalidAttrs,
202
+ isValid: isValid
203
+ };
204
+ };
205
+
206
+ // Contains the methods that are mixed in on the model when binding
207
+ var mixin = function(view, options) {
208
+ return {
209
+
210
+ // Check whether or not a value, or a hash of values
211
+ // passes validation without updating the model
212
+ preValidate: function(attr, value) {
213
+ var self = this,
214
+ result = {},
215
+ error;
216
+
217
+ if(_.isObject(attr)){
218
+ _.each(attr, function(value, key) {
219
+ error = self.preValidate(key, value);
220
+ if(error){
221
+ result[key] = error;
222
+ }
223
+ });
224
+
225
+ return _.isEmpty(result) ? undefined : result;
226
+ }
227
+ else {
228
+ return validateAttr(this, attr, value, _.extend({}, this.attributes));
229
+ }
230
+ },
231
+
232
+ // Check to see if an attribute, an array of attributes or the
233
+ // entire model is valid. Passing true will force a validation
234
+ // of the model.
235
+ isValid: function(option) {
236
+ var flattened, attrs, error, invalidAttrs;
237
+
238
+ option = option || getOptionsAttrs(options, view);
239
+
240
+ if(_.isString(option)){
241
+ attrs = [option];
242
+ } else if(_.isArray(option)) {
243
+ attrs = option;
244
+ }
245
+ if (attrs) {
246
+ flattened = flatten(this.attributes);
247
+ //Loop through all associated views
248
+ _.each(this.associatedViews, function(view) {
249
+ _.each(attrs, function (attr) {
250
+ error = validateAttr(this, attr, flattened[attr], _.extend({}, this.attributes));
251
+ if (error) {
252
+ options.invalid(view, attr, error, options.selector);
253
+ invalidAttrs = invalidAttrs || {};
254
+ invalidAttrs[attr] = error;
255
+ } else {
256
+ options.valid(view, attr, options.selector);
257
+ }
258
+ }, this);
259
+ }, this);
260
+ }
261
+
262
+ if(option === true) {
263
+ invalidAttrs = this.validate();
264
+ }
265
+ if (invalidAttrs) {
266
+ this.trigger('invalid', this, invalidAttrs, {validationError: invalidAttrs});
267
+ }
268
+ return attrs ? !invalidAttrs : this.validation ? this._isValid : true;
269
+ },
270
+
271
+ // This is called by Backbone when it needs to perform validation.
272
+ // You can call it manually without any parameters to validate the
273
+ // entire model.
274
+ validate: function(attrs, setOptions){
275
+ var model = this,
276
+ validateAll = !attrs,
277
+ opt = _.extend({}, options, setOptions),
278
+ validatedAttrs = getValidatedAttrs(model, getOptionsAttrs(options, view)),
279
+ allAttrs = _.extend({}, validatedAttrs, model.attributes, attrs),
280
+ flattened = flatten(allAttrs),
281
+ changedAttrs = attrs ? flatten(attrs) : flattened,
282
+ result = validateModel(model, allAttrs, _.pick(flattened, _.keys(validatedAttrs)));
283
+
284
+ model._isValid = result.isValid;
285
+
286
+ //After validation is performed, loop through all associated views
287
+ _.each(model.associatedViews, function(view){
288
+
289
+ // After validation is performed, loop through all validated and changed attributes
290
+ // and call the valid and invalid callbacks so the view is updated.
291
+ _.each(validatedAttrs, function(val, attr){
292
+ var invalid = result.invalidAttrs.hasOwnProperty(attr),
293
+ changed = changedAttrs.hasOwnProperty(attr);
294
+
295
+ if(!invalid){
296
+ opt.valid(view, attr, opt.selector);
297
+ }
298
+ if(invalid && (changed || validateAll)){
299
+ opt.invalid(view, attr, result.invalidAttrs[attr], opt.selector);
300
+ }
301
+ });
302
+ });
303
+
304
+ // Trigger validated events.
305
+ // Need to defer this so the model is actually updated before
306
+ // the event is triggered.
307
+ _.defer(function() {
308
+ model.trigger('validated', model._isValid, model, result.invalidAttrs);
309
+ model.trigger('validated:' + (model._isValid ? 'valid' : 'invalid'), model, result.invalidAttrs);
310
+ });
311
+
312
+ // Return any error messages to Backbone, unless the forceUpdate flag is set.
313
+ // Then we do not return anything and fools Backbone to believe the validation was
314
+ // a success. That way Backbone will update the model regardless.
315
+ if (!opt.forceUpdate && _.intersection(_.keys(result.invalidAttrs), _.keys(changedAttrs)).length > 0) {
316
+ return result.invalidAttrs;
317
+ }
318
+ }
319
+ };
320
+ };
321
+
322
+ // Helper to mix in validation on a model. Stores the view in the associated views array.
323
+ var bindModel = function(view, model, options) {
324
+ if (model.associatedViews) {
325
+ model.associatedViews.push(view);
326
+ } else {
327
+ model.associatedViews = [view];
328
+ }
329
+ _.extend(model, mixin(view, options));
330
+ };
331
+
332
+ // Removes view from associated views of the model or the methods
333
+ // added to a model if no view or single view provided
334
+ var unbindModel = function(model, view) {
335
+ if (view && model.associatedViews.length > 1){
336
+ model.associatedViews = _.without(model.associatedViews, view);
337
+ } else {
338
+ delete model.validate;
339
+ delete model.preValidate;
340
+ delete model.isValid;
341
+ delete model.associatedViews;
342
+ }
343
+ };
344
+
345
+ // Mix in validation on a model whenever a model is
346
+ // added to a collection
347
+ var collectionAdd = function(model) {
348
+ bindModel(this.view, model, this.options);
349
+ };
350
+
351
+ // Remove validation from a model whenever a model is
352
+ // removed from a collection
353
+ var collectionRemove = function(model) {
354
+ unbindModel(model);
355
+ };
356
+
357
+ // Returns the public methods on Backbone.Validation
358
+ return {
359
+
360
+ // Current version of the library
361
+ version: '0.11.3',
362
+
363
+ // Called to configure the default options
364
+ configure: function(options) {
365
+ _.extend(defaultOptions, options);
366
+ },
367
+
368
+ // Hooks up validation on a view with a model
369
+ // or collection
370
+ bind: function(view, options) {
371
+ options = _.extend({}, defaultOptions, defaultCallbacks, options);
372
+
373
+ var model = options.model || view.model,
374
+ collection = options.collection || view.collection;
375
+
376
+ if(typeof model === 'undefined' && typeof collection === 'undefined'){
377
+ throw 'Before you execute the binding your view must have a model or a collection.\n' +
378
+ 'See http://thedersen.com/projects/backbone-validation/#using-form-model-validation for more information.';
379
+ }
380
+
381
+ if(model) {
382
+ bindModel(view, model, options);
383
+ }
384
+ else if(collection) {
385
+ collection.each(function(model){
386
+ bindModel(view, model, options);
387
+ });
388
+ collection.bind('add', collectionAdd, {view: view, options: options});
389
+ collection.bind('remove', collectionRemove);
390
+ }
391
+ },
392
+
393
+ // Removes validation from a view with a model
394
+ // or collection
395
+ unbind: function(view, options) {
396
+ options = _.extend({}, options);
397
+ var model = options.model || view.model,
398
+ collection = options.collection || view.collection;
399
+
400
+ if(model) {
401
+ unbindModel(model, view);
402
+ }
403
+ else if(collection) {
404
+ collection.each(function(model){
405
+ unbindModel(model, view);
406
+ });
407
+ collection.unbind('add', collectionAdd);
408
+ collection.unbind('remove', collectionRemove);
409
+ }
410
+ },
411
+
412
+ // Used to extend the Backbone.Model.prototype
413
+ // with validation
414
+ mixin: mixin(null, defaultOptions)
415
+ };
416
+ }());
417
+
418
+
419
+ // Callbacks
420
+ // ---------
421
+
422
+ var defaultCallbacks = Validation.callbacks = {
423
+
424
+ // Gets called when a previously invalid field in the
425
+ // view becomes valid. Removes any error message.
426
+ // Should be overridden with custom functionality.
427
+ valid: function(view, attr, selector) {
428
+ view.$('[' + selector + '~="' + attr + '"]')
429
+ .removeClass('invalid')
430
+ .removeAttr('data-error');
431
+ },
432
+
433
+ // Gets called when a field in the view becomes invalid.
434
+ // Adds a error message.
435
+ // Should be overridden with custom functionality.
436
+ invalid: function(view, attr, error, selector) {
437
+ view.$('[' + selector + '~="' + attr + '"]')
438
+ .addClass('invalid')
439
+ .attr('data-error', error);
440
+ }
441
+ };
442
+
443
+
444
+ // Patterns
445
+ // --------
446
+
447
+ var defaultPatterns = Validation.patterns = {
448
+ // Matches any digit(s) (i.e. 0-9)
449
+ digits: /^\d+$/,
450
+
451
+ // Matches any number (e.g. 100.000)
452
+ number: /^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/,
453
+
454
+ // Matches a valid email address (e.g. mail@example.com)
455
+ email: /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i,
456
+
457
+ // Mathes any valid url (e.g. http://www.xample.com)
458
+ url: /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i
459
+ };
460
+
461
+
462
+ // Error messages
463
+ // --------------
464
+
465
+ // Error message for the build in validators.
466
+ // {x} gets swapped out with arguments form the validator.
467
+ var defaultMessages = Validation.messages = {
468
+ required: '{0} is required',
469
+ acceptance: '{0} must be accepted',
470
+ min: '{0} must be greater than or equal to {1}',
471
+ max: '{0} must be less than or equal to {1}',
472
+ range: '{0} must be between {1} and {2}',
473
+ length: '{0} must be {1} characters',
474
+ minLength: '{0} must be at least {1} characters',
475
+ maxLength: '{0} must be at most {1} characters',
476
+ rangeLength: '{0} must be between {1} and {2} characters',
477
+ oneOf: '{0} must be one of: {1}',
478
+ equalTo: '{0} must be the same as {1}',
479
+ digits: '{0} must only contain digits',
480
+ number: '{0} must be a number',
481
+ email: '{0} must be a valid email',
482
+ url: '{0} must be a valid url',
483
+ inlinePattern: '{0} is invalid'
484
+ };
485
+
486
+ // Label formatters
487
+ // ----------------
488
+
489
+ // Label formatters are used to convert the attribute name
490
+ // to a more human friendly label when using the built in
491
+ // error messages.
492
+ // Configure which one to use with a call to
493
+ //
494
+ // Backbone.Validation.configure({
495
+ // labelFormatter: 'label'
496
+ // });
497
+ var defaultLabelFormatters = Validation.labelFormatters = {
498
+
499
+ // Returns the attribute name with applying any formatting
500
+ none: function(attrName) {
501
+ return attrName;
502
+ },
503
+
504
+ // Converts attributeName or attribute_name to Attribute name
505
+ sentenceCase: function(attrName) {
506
+ return attrName.replace(/(?:^\w|[A-Z]|\b\w)/g, function(match, index) {
507
+ return index === 0 ? match.toUpperCase() : ' ' + match.toLowerCase();
508
+ }).replace(/_/g, ' ');
509
+ },
510
+
511
+ // Looks for a label configured on the model and returns it
512
+ //
513
+ // var Model = Backbone.Model.extend({
514
+ // validation: {
515
+ // someAttribute: {
516
+ // required: true
517
+ // }
518
+ // },
519
+ //
520
+ // labels: {
521
+ // someAttribute: 'Custom label'
522
+ // }
523
+ // });
524
+ label: function(attrName, model) {
525
+ return (model.labels && model.labels[attrName]) || defaultLabelFormatters.sentenceCase(attrName, model);
526
+ }
527
+ };
528
+
529
+ // AttributeLoaders
530
+
531
+ var defaultAttributeLoaders = Validation.attributeLoaders = {
532
+ inputNames: function (view) {
533
+ var attrs = [];
534
+ if (view) {
535
+ view.$('form [name]').each(function () {
536
+ if (/^(?:input|select|textarea)$/i.test(this.nodeName) && this.name &&
537
+ this.type !== 'submit' && attrs.indexOf(this.name) === -1) {
538
+ attrs.push(this.name);
539
+ }
540
+ });
541
+ }
542
+ return attrs;
543
+ }
544
+ };
545
+
546
+
547
+ // Built in validators
548
+ // -------------------
549
+
550
+ var defaultValidators = Validation.validators = (function(){
551
+ // Use native trim when defined
552
+ var trim = String.prototype.trim ?
553
+ function(text) {
554
+ return text === null ? '' : String.prototype.trim.call(text);
555
+ } :
556
+ function(text) {
557
+ var trimLeft = /^\s+/,
558
+ trimRight = /\s+$/;
559
+
560
+ return text === null ? '' : text.toString().replace(trimLeft, '').replace(trimRight, '');
561
+ };
562
+
563
+ // Determines whether or not a value is a number
564
+ var isNumber = function(value){
565
+ return _.isNumber(value) || (_.isString(value) && value.match(defaultPatterns.number));
566
+ };
567
+
568
+ // Determines whether or not a value is empty
569
+ var hasValue = function(value) {
570
+ return !(_.isNull(value) || _.isUndefined(value) || (_.isString(value) && trim(value) === '') || (_.isArray(value) && _.isEmpty(value)));
571
+ };
572
+
573
+ return {
574
+ // Function validator
575
+ // Lets you implement a custom function used for validation
576
+ fn: function(value, attr, fn, model, computed) {
577
+ if(_.isString(fn)){
578
+ fn = model[fn];
579
+ }
580
+ return fn.call(model, value, attr, computed);
581
+ },
582
+
583
+ // Required validator
584
+ // Validates if the attribute is required or not
585
+ // This can be specified as either a boolean value or a function that returns a boolean value
586
+ required: function(value, attr, required, model, computed) {
587
+ var isRequired = _.isFunction(required) ? required.call(model, value, attr, computed) : required;
588
+ if(!isRequired && !hasValue(value)) {
589
+ return false; // overrides all other validators
590
+ }
591
+ if (isRequired && !hasValue(value)) {
592
+ return this.format(defaultMessages.required, this.formatLabel(attr, model));
593
+ }
594
+ },
595
+
596
+ // Acceptance validator
597
+ // Validates that something has to be accepted, e.g. terms of use
598
+ // `true` or 'true' are valid
599
+ acceptance: function(value, attr, accept, model) {
600
+ if(value !== 'true' && (!_.isBoolean(value) || value === false)) {
601
+ return this.format(defaultMessages.acceptance, this.formatLabel(attr, model));
602
+ }
603
+ },
604
+
605
+ // Min validator
606
+ // Validates that the value has to be a number and equal to or greater than
607
+ // the min value specified
608
+ min: function(value, attr, minValue, model) {
609
+ if (!isNumber(value) || value < minValue) {
610
+ return this.format(defaultMessages.min, this.formatLabel(attr, model), minValue);
611
+ }
612
+ },
613
+
614
+ // Max validator
615
+ // Validates that the value has to be a number and equal to or less than
616
+ // the max value specified
617
+ max: function(value, attr, maxValue, model) {
618
+ if (!isNumber(value) || value > maxValue) {
619
+ return this.format(defaultMessages.max, this.formatLabel(attr, model), maxValue);
620
+ }
621
+ },
622
+
623
+ // Range validator
624
+ // Validates that the value has to be a number and equal to or between
625
+ // the two numbers specified
626
+ range: function(value, attr, range, model) {
627
+ if(!isNumber(value) || value < range[0] || value > range[1]) {
628
+ return this.format(defaultMessages.range, this.formatLabel(attr, model), range[0], range[1]);
629
+ }
630
+ },
631
+
632
+ // Length validator
633
+ // Validates that the value has to be a string with length equal to
634
+ // the length value specified
635
+ length: function(value, attr, length, model) {
636
+ if (!_.isString(value) || value.length !== length) {
637
+ return this.format(defaultMessages.length, this.formatLabel(attr, model), length);
638
+ }
639
+ },
640
+
641
+ // Min length validator
642
+ // Validates that the value has to be a string with length equal to or greater than
643
+ // the min length value specified
644
+ minLength: function(value, attr, minLength, model) {
645
+ if (!_.isString(value) || value.length < minLength) {
646
+ return this.format(defaultMessages.minLength, this.formatLabel(attr, model), minLength);
647
+ }
648
+ },
649
+
650
+ // Max length validator
651
+ // Validates that the value has to be a string with length equal to or less than
652
+ // the max length value specified
653
+ maxLength: function(value, attr, maxLength, model) {
654
+ if (!_.isString(value) || value.length > maxLength) {
655
+ return this.format(defaultMessages.maxLength, this.formatLabel(attr, model), maxLength);
656
+ }
657
+ },
658
+
659
+ // Range length validator
660
+ // Validates that the value has to be a string and equal to or between
661
+ // the two numbers specified
662
+ rangeLength: function(value, attr, range, model) {
663
+ if (!_.isString(value) || value.length < range[0] || value.length > range[1]) {
664
+ return this.format(defaultMessages.rangeLength, this.formatLabel(attr, model), range[0], range[1]);
665
+ }
666
+ },
667
+
668
+ // One of validator
669
+ // Validates that the value has to be equal to one of the elements in
670
+ // the specified array. Case sensitive matching
671
+ oneOf: function(value, attr, values, model) {
672
+ if(!_.include(values, value)){
673
+ return this.format(defaultMessages.oneOf, this.formatLabel(attr, model), values.join(', '));
674
+ }
675
+ },
676
+
677
+ // Equal to validator
678
+ // Validates that the value has to be equal to the value of the attribute
679
+ // with the name specified
680
+ equalTo: function(value, attr, equalTo, model, computed) {
681
+ if(value !== computed[equalTo]) {
682
+ return this.format(defaultMessages.equalTo, this.formatLabel(attr, model), this.formatLabel(equalTo, model));
683
+ }
684
+ },
685
+
686
+ // Pattern validator
687
+ // Validates that the value has to match the pattern specified.
688
+ // Can be a regular expression or the name of one of the built in patterns
689
+ pattern: function(value, attr, pattern, model) {
690
+ if (!hasValue(value) || !value.toString().match(defaultPatterns[pattern] || pattern)) {
691
+ return this.format(defaultMessages[pattern] || defaultMessages.inlinePattern, this.formatLabel(attr, model), pattern);
692
+ }
693
+ }
694
+ };
695
+ }());
696
+
697
+ // Set the correct context for all validators
698
+ // when used from within a method validator
699
+ _.each(defaultValidators, function(validator, key){
700
+ defaultValidators[key] = _.bind(defaultValidators[key], _.extend({}, formatFunctions, defaultValidators));
701
+ });
702
+
703
+ return Validation;
704
+ }(_));
@@ -1,6 +1,6 @@
1
- // Backbone.Validation v0.9.1
1
+ // Backbone.Validation v0.9.2
2
2
  //
3
- // Copyright (c) 2011-2014 Thomas Pedersen
3
+ // Copyright (c) 2011-2015 Thomas Pedersen
4
4
  // Distributed under MIT License
5
5
  //
6
6
  // Documentation and full license available at:
@@ -64,13 +64,7 @@ Backbone.Validation = (function(_){
64
64
 
65
65
  _.each(obj, function(val, key) {
66
66
  if(obj.hasOwnProperty(key)) {
67
- if (val && typeof val === 'object' && !(
68
- val instanceof Array ||
69
- val instanceof Date ||
70
- val instanceof RegExp ||
71
- val instanceof Backbone.Model ||
72
- val instanceof Backbone.Collection)
73
- ) {
67
+ if (!!val && typeof val === 'object' && val.constructor === Object) {
74
68
  flatten(val, into, prefix + key + '.');
75
69
  }
76
70
  else {
@@ -1,3 +1,4 @@
1
+
1
2
  // Available under the MIT License (MIT)
2
3
 
3
4
  var VirtualCollection,
@@ -41,12 +42,12 @@ VirtualCollection = Backbone.Collection.extend({
41
42
 
42
43
  _rebuildIndex: function () {
43
44
  for(idx in this.models) {
44
- this.models[idx].off('all', this._onModelEvent, this);
45
+ this.models[idx].off('all', this._onAllEvent, this);
45
46
  }
46
47
  this._reset();
47
48
  this.collection.each(function (model, i) {
48
49
  if (this.accepts(model, i)) {
49
- model.on('all', this._onModelEvent, this);
50
+ model.on('all', this._onAllEvent, this);
50
51
  this.models.push(model);
51
52
  this._byId[model.cid] = model;
52
53
  if (model.id) this._byId[model.id] = model;
@@ -73,7 +74,7 @@ VirtualCollection = Backbone.Collection.extend({
73
74
  var already_here = this.get(model);
74
75
  if (!already_here && this.accepts(model, options.index)) {
75
76
  this._indexAdd(model);
76
- model.on('all', this._onModelEvent, this);
77
+ model.on('all', this._onAllEvent, this);
77
78
  this.trigger('add', model, this, options);
78
79
  }
79
80
  },
@@ -84,7 +85,7 @@ VirtualCollection = Backbone.Collection.extend({
84
85
  var i = this._indexRemove(model)
85
86
  , options_clone = _.clone(options);
86
87
  options_clone.index = i;
87
- model.off('all', this._onModelEvent, this);
88
+ model.off('all', this._onAllEvent, this);
88
89
  this.trigger('remove', model, this, options_clone);
89
90
  },
90
91
 
@@ -147,7 +148,7 @@ VirtualCollection = Backbone.Collection.extend({
147
148
  },
148
149
 
149
150
  _indexRemove: function (model) {
150
- model.off('all', this._onModelEvent, this);
151
+ model.off('all', this._onAllEvent, this);
151
152
  var i = this.indexOf(model);
152
153
  if (i === -1) return i;
153
154
  this.models.splice(i, 1);
@@ -155,6 +156,13 @@ VirtualCollection = Backbone.Collection.extend({
155
156
  if (model.id) delete this._byId[model.id];
156
157
  this.length -= 1;
157
158
  return i;
159
+ },
160
+
161
+ _onAllEvent: function (eventName) {
162
+ var explicitlyHandledEvents = ['add', 'remove', 'change', 'reset', 'sort'];
163
+ if (!_.contains(explicitlyHandledEvents, eventName)) {
164
+ this.trigger.apply(this, arguments);
165
+ }
158
166
  }
159
167
 
160
168
  }, { // static props
@@ -1 +1 @@
1
- //= require js_stack/plugins/backbone/validation/0.9.1
1
+ //= require js_stack/plugins/backbone/validation/0.11.3
@@ -1 +1 @@
1
- //= require js_stack/plugins/backbone/virtualcollection/0.6.0
1
+ //= require js_stack/plugins/backbone/virtualcollection/0.6.1
@@ -1,4 +1,3 @@
1
- // Cocktail.js 0.5.8
2
1
  // (c) 2012 Onsi Fakhouri
3
2
  // Cocktail.js may be freely distributed under the MIT license.
4
3
  // http://github.com/onsi/cocktail
@@ -23,11 +22,11 @@
23
22
 
24
23
  var collisions = {};
25
24
 
26
- _(mixins).each(function(mixin) {
25
+ _.each(mixins, function(mixin) {
27
26
  if (_.isString(mixin)) {
28
27
  mixin = Cocktail.mixins[mixin];
29
28
  }
30
- _(mixin).each(function(value, key) {
29
+ _.each(mixin, function(value, key) {
31
30
  if (_.isFunction(value)) {
32
31
  // If the mixer already has that exact function reference
33
32
  // Note: this would occur on an accidental mixin of the same base
@@ -49,13 +48,13 @@
49
48
  });
50
49
  });
51
50
 
52
- _(collisions).each(function(propertyValues, propertyName) {
51
+ _.each(collisions, function(propertyValues, propertyName) {
53
52
  obj[propertyName] = function() {
54
53
  var that = this,
55
54
  args = arguments,
56
55
  returnValue;
57
56
 
58
- _(propertyValues).each(function(value) {
57
+ _.each(propertyValues, function(value) {
59
58
  var returnedValue = _.isFunction(value) ? value.apply(that, args) : value;
60
59
  returnValue = (typeof returnedValue === 'undefined' ? returnValue : returnedValue);
61
60
  });
@@ -83,7 +82,7 @@
83
82
  return klass;
84
83
  };
85
84
 
86
- _([Backbone.Model, Backbone.Collection, Backbone.Router, Backbone.View]).each(function(klass) {
85
+ _.each([Backbone.Model, Backbone.Collection, Backbone.Router, Backbone.View], function(klass) {
87
86
  klass.mixin = function mixin() {
88
87
  Cocktail.mixin(this, _.toArray(arguments));
89
88
  };
@@ -93,7 +92,7 @@
93
92
  };
94
93
 
95
94
  Cocktail.unpatch = function unpatch(Backbone) {
96
- _([Backbone.Model, Backbone.Collection, Backbone.Router, Backbone.View]).each(function(klass) {
95
+ _.each([Backbone.Model, Backbone.Collection, Backbone.Router, Backbone.View], function(klass) {
97
96
  klass.mixin = undefined;
98
97
  klass.extend = originalExtend;
99
98
  });
@@ -1 +1 @@
1
- //= require js_stack/plugins/cocktail/0.5.8
1
+ //= require js_stack/plugins/cocktail/0.5.10
@@ -169,7 +169,7 @@ module.exports = function() {
169
169
  // Underscore.string is freely distributable under the terms of the MIT license.
170
170
  // Documentation: https://github.com/epeli/underscore.string
171
171
  // Some code is borrowed from MooTools and Alexandru Marasteanu.
172
- // Version '3.0.1'
172
+ // Version '3.0.3'
173
173
 
174
174
  'use strict';
175
175
 
@@ -179,7 +179,7 @@ function s(value) {
179
179
  this._wrapped = value;
180
180
  }
181
181
 
182
- s.VERSION = '3.0.1';
182
+ s.VERSION = '3.0.3';
183
183
 
184
184
  s.isBlank = _dereq_('./isBlank');
185
185
  s.stripTags = _dereq_('./stripTags');
@@ -1 +1 @@
1
- //= require js_stack/plugins/underscore/string/3.0.1
1
+ //= require js_stack/plugins/underscore/string/3.0.3
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: js_stack
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.0
4
+ version: 1.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tomasz Pewiński
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-01-23 00:00:00.000000000 Z
12
+ date: 2015-02-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: haml_coffee_assets
@@ -115,7 +115,7 @@ files:
115
115
  - vendor/assets/javascripts/js_stack/base/marionette/2.0.3.js
116
116
  - vendor/assets/javascripts/js_stack/base/marionette/2.1.0.js
117
117
  - vendor/assets/javascripts/js_stack/base/marionette/2.2.2.js
118
- - vendor/assets/javascripts/js_stack/base/marionette/2.3.1.js
118
+ - vendor/assets/javascripts/js_stack/base/marionette/2.3.2.js
119
119
  - vendor/assets/javascripts/js_stack/base/underscore.js
120
120
  - vendor/assets/javascripts/js_stack/base/underscore/1.5.2.js
121
121
  - vendor/assets/javascripts/js_stack/base/underscore/1.6.0.js
@@ -140,20 +140,21 @@ files:
140
140
  - vendor/assets/javascripts/js_stack/plugins/backbone/stickit/0.6.3.js
141
141
  - vendor/assets/javascripts/js_stack/plugins/backbone/stickit/0.7.0.js
142
142
  - vendor/assets/javascripts/js_stack/plugins/backbone/stickit/0.8.0.js
143
+ - vendor/assets/javascripts/js_stack/plugins/backbone/validation/0.11.3.js
143
144
  - vendor/assets/javascripts/js_stack/plugins/backbone/validation/0.8.1.js
144
- - vendor/assets/javascripts/js_stack/plugins/backbone/validation/0.9.1.js
145
+ - vendor/assets/javascripts/js_stack/plugins/backbone/validation/0.9.2.js
145
146
  - vendor/assets/javascripts/js_stack/plugins/backbone/virtualcollection/0.4.15.js
146
147
  - vendor/assets/javascripts/js_stack/plugins/backbone/virtualcollection/0.5.3.js
147
- - vendor/assets/javascripts/js_stack/plugins/backbone/virtualcollection/0.6.0.js
148
+ - vendor/assets/javascripts/js_stack/plugins/backbone/virtualcollection/0.6.1.js
148
149
  - vendor/assets/javascripts/js_stack/plugins/cocktail.js
149
- - vendor/assets/javascripts/js_stack/plugins/cocktail/0.5.8.js
150
+ - vendor/assets/javascripts/js_stack/plugins/cocktail/0.5.10.js
150
151
  - vendor/assets/javascripts/js_stack/plugins/moment.js
151
152
  - vendor/assets/javascripts/js_stack/plugins/underscore.inflections.js
152
153
  - vendor/assets/javascripts/js_stack/plugins/underscore.string.js
153
154
  - vendor/assets/javascripts/js_stack/plugins/underscore/inflections/0.2.1.js
154
155
  - vendor/assets/javascripts/js_stack/plugins/underscore/string/2.3.2.js
155
156
  - vendor/assets/javascripts/js_stack/plugins/underscore/string/2.4.0.js
156
- - vendor/assets/javascripts/js_stack/plugins/underscore/string/3.0.1.js
157
+ - vendor/assets/javascripts/js_stack/plugins/underscore/string/3.0.3.js
157
158
  homepage: https://github.com/netguru/js_stack
158
159
  licenses:
159
160
  - MIT