loada 0.1.4 → 0.2.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: 930b1abd61336921ae85869405c33ad95b350909
4
- data.tar.gz: 6eac1a436bf9df8bf817edc24151544ffd423029
3
+ metadata.gz: e46e048066887349e82593374bd8e01be9939074
4
+ data.tar.gz: c2e315a44219740081edad7d28b5527454638597
5
5
  SHA512:
6
- metadata.gz: 4d3ba4805f0b6359fd8bd9a612d7c2b1b33121b879c4bcb26d78b913637cf759939a9c92276ebf285d3f9619e8949d8ff71b0437ef6d1263f422417292af77f9
7
- data.tar.gz: 2e7814bb23ec815245a9251cfddac17795a39f66688a5be87c37ced3b4b380b49a8c52c54c8894134d53ab45640d327f567bda6efaf01dfbc5ce7dc17f9f99ce
6
+ metadata.gz: d80029578b98744380e519d132ad776c5a458dc70fe7db6630d735d5aee1ea9eaabebc837fcc42d1c0141ac4e73a4dc44326c14915afa588dda0b12d28ddca48
7
+ data.tar.gz: 41c455b41631f59aa046009ef4eccef8a19f8443551324618f73212b02ba40a27bb19efd6452f819bc5cbd23bbea6665cac9334fe0b8a6a734551586cd5aebae
data/bower.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "loada",
3
- "version": "0.1.4",
3
+ "version": "0.2.0",
4
4
  "main": "lib/loada.min.js",
5
5
  "ignore": [
6
6
  "Gruntfile.coffee",
@@ -71,15 +71,49 @@
71
71
  if (typeof this.storage === 'string') {
72
72
  return this.storage = JSON.parse(localStorage[this.key]);
73
73
  }
74
+ } else {
75
+ return this.storage = {};
76
+ }
77
+ };
78
+
79
+ Loada.prototype.expire = function() {
80
+ var byDate, byExistance, byRevision, key, library, now, _ref, _results,
81
+ _this = this;
82
+ if (this.options.localStorage) {
83
+ now = new Date;
84
+ byDate = function(library) {
85
+ return library.expirationDate && new Date(library.expirationDate) <= now;
86
+ };
87
+ byExistance = function(library) {
88
+ return !_this.requires.set[key];
89
+ };
90
+ byRevision = function(library) {
91
+ return _this.requires.set[key].revision !== library.revision;
92
+ };
93
+ _ref = this.storage;
94
+ _results = [];
95
+ for (key in _ref) {
96
+ library = _ref[key];
97
+ if (byDate(library) || byExistance(library) || byRevision(library)) {
98
+ _results.push(delete this.storage[key]);
99
+ } else {
100
+ _results.push(void 0);
101
+ }
102
+ }
103
+ return _results;
74
104
  }
75
105
  };
76
106
 
77
107
  Loada.prototype.save = function() {
78
- return localStorage[this.key] = JSON.stringify(this.storage);
108
+ if (this.options.localStorage) {
109
+ return localStorage[this.key] = JSON.stringify(this.storage);
110
+ }
79
111
  };
80
112
 
81
113
  Loada.prototype.clear = function() {
82
- return delete localStorage[this.key];
114
+ if (this.options.localStorage) {
115
+ return delete localStorage[this.key];
116
+ }
83
117
  };
84
118
 
85
119
  Loada.prototype.get = function(key) {
@@ -87,32 +121,6 @@
87
121
  return (_ref = this.storage[key]) != null ? _ref.source : void 0;
88
122
  };
89
123
 
90
- Loada.prototype.expire = function() {
91
- var byDate, byExistance, byRevision, key, library, now, _ref, _results,
92
- _this = this;
93
- now = new Date;
94
- byDate = function(library) {
95
- return library.expirationDate && new Date(library.expirationDate) <= now;
96
- };
97
- byExistance = function(library) {
98
- return !_this.requires.set[key];
99
- };
100
- byRevision = function(library) {
101
- return _this.requires.set[key].revision !== library.revision;
102
- };
103
- _ref = this.storage;
104
- _results = [];
105
- for (key in _ref) {
106
- library = _ref[key];
107
- if (byDate(library) || byExistance(library) || byRevision(library)) {
108
- _results.push(delete this.storage[key]);
109
- } else {
110
- _results.push(void 0);
111
- }
112
- }
113
- return _results;
114
- };
115
-
116
124
  Loada.prototype.require = function() {
117
125
  var libraries, library, now, _i, _len, _ref;
118
126
  libraries = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
@@ -120,8 +128,8 @@
120
128
  library = libraries[_i];
121
129
  library.key || (library.key = library.url);
122
130
  library.type || (library.type = (_ref = library.url) != null ? _ref.split('.').pop() : void 0);
123
- if (library.localStorage == null) {
124
- library.localStorage = true;
131
+ if (library.cache == null) {
132
+ library.cache = true;
125
133
  }
126
134
  if (library.require == null) {
127
135
  library.require = true;
@@ -144,9 +152,7 @@
144
152
  var loaders, progress,
145
153
  _this = this;
146
154
  callbacks || (callbacks = {});
147
- if (this.options.localStorage) {
148
- this.expire();
149
- }
155
+ this.expire();
150
156
  progress = new this.Progress(this.requires.length, callbacks.progress);
151
157
  loaders = 0;
152
158
  return this._ensureSizes(callbacks.progress != null, function() {
@@ -206,31 +212,30 @@
206
212
  };
207
213
 
208
214
  Loada.prototype._loadGroup = function(group, progress, callback) {
209
- var library, method,
215
+ var library, method, results, _i, _len,
210
216
  _this = this;
211
- library = group.shift();
212
- if (!library) {
213
- return callback();
214
- }
215
- if (this.options.localStorage && this.storage[library.key] && library.localStorage) {
216
- if (progress != null) {
217
- progress.set(library.key, 100);
218
- }
219
- if (this.storage[library.key].require) {
220
- this._inject(this.storage[library.key]);
221
- }
222
- return this._loadGroup(group, progress, callback);
223
- } else {
224
- method = this.options.localStorage ? "_loadAJAX" : "_loadInline";
225
- return this[method](library, progress, function() {
226
- if (_this.options.localStorage) {
227
- _this.storage[library.key] = library;
228
- }
229
- if (library.require) {
230
- _this._inject(library);
217
+ results = [];
218
+ for (_i = 0, _len = group.length; _i < _len; _i++) {
219
+ library = group[_i];
220
+ if (this.storage[library.key] && library.cache) {
221
+ if (progress != null) {
222
+ progress.set(library.key, 100);
231
223
  }
232
- return _this._loadGroup(group, progress, callback);
233
- });
224
+ results.push(this.storage[library.key]);
225
+ } else {
226
+ method = this.options.localStorage || !library.require ? "_loadAJAX" : "_loadInline";
227
+ this[method](library, progress, function() {
228
+ results.push(library);
229
+ if (results.length === group.length) {
230
+ _this._inject(results);
231
+ return callback();
232
+ }
233
+ });
234
+ }
235
+ }
236
+ if (results.length === group.length) {
237
+ this._inject(results);
238
+ return callback();
234
239
  }
235
240
  };
236
241
 
@@ -238,6 +243,9 @@
238
243
  var poller, xhr,
239
244
  _this = this;
240
245
  xhr = this._ajax('GET', library.url, function(xhr) {
246
+ if (library.cache) {
247
+ _this.storage[library.key] = library;
248
+ }
241
249
  library.source = xhr.responseText;
242
250
  clearInterval(poller);
243
251
  if (progress != null) {
@@ -283,18 +291,28 @@
283
291
  return $head.appendChild(script);
284
292
  };
285
293
 
286
- Loada.prototype._inject = function(library) {
287
- var script, style;
288
- if (library.type === 'js') {
289
- script = document.createElement("script");
290
- script.defer = true;
291
- script.text = library.source;
292
- return $head.appendChild(script);
293
- } else if (library.type === 'css') {
294
- style = document.createElement("style");
295
- style.innerHTML = library.source;
296
- return $head.appendChild(style);
294
+ Loada.prototype._inject = function(libraries) {
295
+ var library, script, style, _i, _len, _results;
296
+ libraries = [].concat(libraries);
297
+ _results = [];
298
+ for (_i = 0, _len = libraries.length; _i < _len; _i++) {
299
+ library = libraries[_i];
300
+ if (library.require && library.source) {
301
+ if (library.type === 'js') {
302
+ script = document.createElement("script");
303
+ script.defer = true;
304
+ script.text = library.source;
305
+ _results.push($head.appendChild(script));
306
+ } else if (library.type === 'css') {
307
+ style = document.createElement("style");
308
+ style.innerHTML = library.source;
309
+ _results.push($head.appendChild(style));
310
+ } else {
311
+ _results.push(void 0);
312
+ }
313
+ }
297
314
  }
315
+ return _results;
298
316
  };
299
317
 
300
318
  Loada.prototype._ajax = function(method, url, callback) {
@@ -304,12 +322,12 @@
304
322
  } else {
305
323
  xhr = new ActiveXObject('Microsoft.XMLHTTP');
306
324
  }
307
- xhr.open(method, url, 1);
308
325
  xhr.onreadystatechange = function() {
309
326
  if (xhr.readyState > 3) {
310
327
  return typeof callback === "function" ? callback(xhr) : void 0;
311
328
  }
312
329
  };
330
+ xhr.open(method, url, 1);
313
331
  xhr.send();
314
332
  return xhr;
315
333
  };
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "loada",
3
- "version": "0.1.4",
3
+ "version": "0.2.0",
4
4
  "description": "Browser assets preloader with the support of localStorage-based caching and progress tracking",
5
5
  "repository": "",
6
6
  "keywords": [
@@ -1,10 +1,17 @@
1
1
  describe "Loada", ->
2
2
 
3
+ beforeEach ->
4
+ Loada.debug = false
5
+ window.sandbox = {}
6
+
7
+ afterEach ->
8
+ delete window.sandbox
9
+
3
10
  it "initializes properly", ->
4
11
  set = Loada.set(undefined, localStorage: false)
5
12
  expect(set.set).toEqual '*'
6
13
  expect(set.options.localStorage).toBeFalsy()
7
- expect(set.storage).toBeUndefined()
14
+ expect(set.storage).toEqual {}
8
15
 
9
16
  localStorage['loada.foo'] = JSON.stringify('foo': 'bar')
10
17
 
@@ -74,6 +81,10 @@ describe "Loada", ->
74
81
  @set.require url: 'foo.js', size: 100
75
82
  @set.require url: 'bar.js'
76
83
  @set.require url: 'baz.js'
84
+ @server = sinon.fakeServer.create()
85
+
86
+ afterEach ->
87
+ @server.restore()
77
88
 
78
89
  it "zerofills with no progress tracking", ->
79
90
  callback = sinon.spy()
@@ -83,18 +94,16 @@ describe "Loada", ->
83
94
 
84
95
  it "gets sizes with progress tracking", ->
85
96
  callback = sinon.spy()
86
- server = sinon.fakeServer.create()
87
97
  @set._ensureSizes true, callback
88
98
 
89
99
  waits 0
90
100
 
91
101
  runs ->
92
- expect(server.requests[0].url).toEqual 'bar.js'
93
- expect(server.requests[1].url).toEqual 'baz.js'
102
+ expect(@server.requests[0].url).toEqual 'bar.js'
103
+ expect(@server.requests[1].url).toEqual 'baz.js'
94
104
 
95
- server.requests[0].respond 200, {'Content-Length': '100'}, ''
96
- server.requests[1].respond 200, {}, ''
97
- server.restore()
105
+ @server.requests[0].respond 200, {'Content-Length': '100'}, ''
106
+ @server.requests[1].respond 200, {}, ''
98
107
 
99
108
  waits 0
100
109
 
@@ -111,7 +120,6 @@ describe "Loada", ->
111
120
  sinon.stub @set, '_inject'
112
121
 
113
122
  afterEach ->
114
- @set._inject.restore()
115
123
  @server.restore()
116
124
 
117
125
  it "gets single from cache", ->
@@ -130,7 +138,7 @@ describe "Loada", ->
130
138
  expect(@server.requests.length).toEqual 0
131
139
  expect(callback.callCount).toEqual 1
132
140
  expect(@set._inject.callCount).toEqual 1
133
- expect(@set._inject.args[0][0]).toEqual {require: true}
141
+ expect(@set._inject.args[0][0]).toEqual [{require: true}]
134
142
 
135
143
  it "gets single from net", ->
136
144
  callback = sinon.spy()
@@ -151,14 +159,14 @@ describe "Loada", ->
151
159
  key: 'foo.js'
152
160
  type: 'js'
153
161
  source: 'foobar'
154
- localStorage: true
162
+ cache: true
155
163
  require: true
156
164
 
157
165
  expect(@server.requests.length).toEqual 1
158
166
  expect(@set.storage['foo.js']).toEqual library
159
167
  expect(callback.callCount).toEqual 1
160
168
  expect(@set._inject.callCount).toEqual 1
161
- expect(@set._inject.args[0][0]).toEqual library
169
+ expect(@set._inject.args[0][0]).toEqual [library]
162
170
 
163
171
  it "orders properly", ->
164
172
  @set.require(
@@ -166,23 +174,32 @@ describe "Loada", ->
166
174
  { url: 'bar.js' }
167
175
  )
168
176
  @set.require url: 'baz.js'
177
+ @set._inject.restore()
169
178
 
170
- @set._loadGroup @set.requires.input[0], null, ->
171
- @set._loadGroup @set.requires.input[1], null, ->
179
+ @set._loadGroup @set.requires.input[0], null, firstGroup = sinon.spy()
180
+ @set._loadGroup @set.requires.input[1], null, secondGroup = sinon.spy()
172
181
 
173
182
  waits 0
174
183
 
175
184
  runs ->
176
- @server.requests[0].respond 200, {}, 'foobar'
177
- @server.requests[1].respond 200, {}, 'foobar'
178
- @server.requests[2].respond 200, {}, 'foobar'
185
+ @server.requests[0].respond 200, {}, 'window.sandbox.TEST1 = 1'
186
+ @server.requests[2].respond 200, {}, 'window.sandbox.TEST2 = 1'
179
187
 
180
188
  waits 0
181
189
 
182
190
  runs ->
183
- expect(@server.requests[0].url).toEqual 'foo.js'
184
- expect(@server.requests[1].url).toEqual 'baz.js'
185
- expect(@server.requests[2].url).toEqual 'bar.js'
191
+ expect(firstGroup.callCount).toEqual 0
192
+ expect(secondGroup.callCount).toEqual 1
193
+ expect(window.sandbox.TEST1).toBeUndefined()
194
+ expect(window.sandbox.TEST2).toEqual 1
195
+ @server.requests[1].respond 200, {}, 'window.sandbox.TEST1 = 2'
196
+
197
+ waits 0
198
+
199
+ runs ->
200
+ expect(firstGroup.callCount).toEqual 1
201
+ expect(secondGroup.callCount).toEqual 1
202
+ expect(window.sandbox.TEST1).toEqual 2
186
203
 
187
204
  describe "progress", ->
188
205
  it "tracks with cache", ->
@@ -227,30 +244,23 @@ describe "Loada", ->
227
244
  expect(progress.set.args[0]).toEqual ['foo.js', 100]
228
245
  expect(progress.set.args[1]).toEqual ['bar.js', 100]
229
246
 
230
- it "loads through inlining", ->
231
- window.TEST = 0
232
-
247
+ it "inlines", ->
233
248
  set = Loada.set()
234
- server = sinon.fakeServer.create()
235
249
  callback = sinon.spy()
236
250
 
237
- set._loadInline {url: 'spec/support/test.js', key: 'test.js', type: 'js'}, null, callback
251
+ set._loadInline {url: 'spec/support/test1_1.js', key: 'test.js', type: 'js'}, null, callback
238
252
 
239
253
  waits 100
240
254
 
241
255
  runs ->
242
256
  expect(callback.callCount).toEqual 1
243
- expect(window.TEST).toEqual 1
244
- delete window.TEST
257
+ expect(window.sandbox.TEST).toEqual 1
245
258
 
246
259
  it "injects", ->
247
- window.TEST = 0
248
-
249
260
  set = Loada.set()
250
- set._inject source: 'window.TEST = 1', type: 'js'
261
+ set._inject source: 'window.sandbox.TEST = 1', type: 'js', require: true
251
262
 
252
- expect(window.TEST).toEqual 1
253
- delete window.TEST
263
+ expect(window.sandbox.TEST).toEqual 1
254
264
 
255
265
  it "caches", ->
256
266
  set = Loada.set()
@@ -281,13 +291,11 @@ describe "Loada", ->
281
291
  set._inject.restore()
282
292
 
283
293
  it "loads", ->
284
- window.TEST = 0
285
-
286
294
  progress = sinon.spy()
287
295
  success = sinon.spy()
288
296
 
289
297
  set = Loada.set()
290
- set.require url: 'spec/support/test.js'
298
+ set.require url: 'spec/support/test1_1.js'
291
299
  set.load
292
300
  progress: progress
293
301
  success: success
@@ -298,21 +306,73 @@ describe "Loada", ->
298
306
  expect(progress.callCount).toEqual 1
299
307
  expect(progress.args[0][0]).toEqual 100
300
308
  expect(success.callCount).toEqual 1
301
- expect(window.TEST).toEqual 1
302
-
303
- delete window.TEST
309
+ expect(window.sandbox.TEST).toEqual 1
304
310
 
305
311
  it "loads text", ->
306
312
  set = Loada.set()
307
- server = sinon.fakeServer.create()
308
- set.require url: 'foo', type: 'text'
309
-
313
+ set.require url: 'spec/support/text', key: 'foo', type: 'text'
310
314
  set.load()
311
315
 
312
- waits 0
316
+ waits 100
313
317
 
314
318
  runs ->
315
- expect(server.requests.length).toEqual 1
316
- server.requests[0].respond 200, {}, 'foobar'
319
+ expect(set.get 'foo').toEqual 'foobar'
320
+
321
+ describe "collisions", ->
322
+
323
+ it "loads in correct order with localStorage", ->
324
+ progress = sinon.spy()
325
+ success = sinon.spy()
326
+
327
+ set = Loada.set()
328
+ set.require {url: 'spec/support/test1_1.js'}, {url: 'spec/support/test1_2.js'}
329
+ set.load
330
+ progress: progress
331
+ success: success
332
+
333
+ waits 100
334
+
335
+ runs ->
336
+ expect(progress.callCount).toEqual 2
337
+ expect(progress.args[0][0]).toEqual 50
338
+ expect(progress.args[1][0]).toEqual 100
339
+ expect(success.callCount).toEqual 1
340
+ expect(window.sandbox.TEST).toEqual 2
341
+
342
+ it "loads in correct order with inlining", ->
343
+ progress = sinon.spy()
344
+ success = sinon.spy()
345
+
346
+ set = Loada.set('*', localStorage: false)
347
+ set.require {url: 'spec/support/test1_1.js'}, {url: 'spec/support/test1_2.js'}
348
+ set.load
349
+ progress: progress
350
+ success: success
351
+
352
+ waits 100
353
+
354
+ runs ->
355
+ expect(progress.callCount).toEqual 2
356
+ expect(progress.args[0][0]).toEqual 50
357
+ expect(progress.args[1][0]).toEqual 100
358
+ expect(success.callCount).toEqual 1
359
+ expect(window.sandbox.TEST).toEqual 2
360
+
361
+ it "loads in correct order when mixed", ->
362
+ progress = sinon.spy()
363
+ success = sinon.spy()
364
+
365
+ set = Loada.set('*')
366
+ set.require {url: 'spec/support/test1_1.js'}, {url: 'spec/support/test1_2.js', cache: false}
367
+ set.load
368
+ progress: progress
369
+ success: success
317
370
 
318
- expect(set.get 'foo').toEqual 'foobar'
371
+ waits 100
372
+
373
+ runs ->
374
+ expect(progress.callCount).toEqual 2
375
+ expect(progress.args[0][0]).toEqual 50
376
+ expect(progress.args[1][0]).toEqual 100
377
+ expect(success.callCount).toEqual 1
378
+ expect(window.sandbox.TEST).toEqual 2
@@ -0,0 +1 @@
1
+ window.sandbox.TEST = 1
@@ -0,0 +1 @@
1
+ window.sandbox.TEST = 2
@@ -0,0 +1 @@
1
+ window.sandbox.TEST2 = 1
@@ -0,0 +1 @@
1
+ foobar
@@ -55,17 +55,48 @@ class @Loada
55
55
 
56
56
  if typeof(@storage) == 'string'
57
57
  @storage = JSON.parse(localStorage[@key])
58
+ else
59
+ @storage = {}
60
+
61
+ #
62
+ # Cleans up current state
63
+ #
64
+ # Removes entries that are:
65
+ # * expired by date (`expires` option)
66
+ # * got new revision (`revision` option)
67
+ # * not found in the current requires list
68
+ #
69
+ expire: ->
70
+ if @options.localStorage
71
+ now = new Date
72
+
73
+ byDate = (library) =>
74
+ library.expirationDate && new Date(library.expirationDate) <= now
75
+
76
+ byExistance = (library) =>
77
+ !@requires.set[key]
78
+
79
+ byRevision = (library) =>
80
+ @requires.set[key].revision != library.revision
81
+
82
+ for key, library of @storage
83
+
84
+ if byDate(library) || byExistance(library) || byRevision(library)
85
+ delete @storage[key]
58
86
 
59
87
  #
60
88
  # Saves current set state to localStorage
61
89
  #
62
90
  save: ->
63
- localStorage[@key] = JSON.stringify @storage
91
+ if @options.localStorage
92
+ localStorage[@key] = JSON.stringify @storage
64
93
 
65
94
  #
66
95
  # Removes localStorage entry bound to current set
67
96
  #
68
- clear: -> delete localStorage[@key]
97
+ clear: ->
98
+ if @options.localStorage
99
+ delete localStorage[@key]
69
100
 
70
101
  #
71
102
  # Gets raw source of an asset
@@ -75,30 +106,7 @@ class @Loada
75
106
  get: (key) ->
76
107
  @storage[key]?.source
77
108
 
78
- #
79
- # Cleans up current state
80
- #
81
- # Removes entries that are:
82
- # * expired by date (`expires` option)
83
- # * got new revision (`revision` option)
84
- # * not found in the current requires list
85
- #
86
- expire: ->
87
- now = new Date
88
-
89
- byDate = (library) =>
90
- library.expirationDate && new Date(library.expirationDate) <= now
91
-
92
- byExistance = (library) =>
93
- !@requires.set[key]
94
-
95
- byRevision = (library) =>
96
- @requires.set[key].revision != library.revision
97
109
 
98
- for key, library of @storage
99
-
100
- if byDate(library) || byExistance(library) || byRevision(library)
101
- delete @storage[key]
102
110
 
103
111
  #
104
112
  # Adds library that should be loaded
@@ -121,7 +129,7 @@ class @Loada
121
129
  for library in libraries
122
130
  library.key ||= library.url
123
131
  library.type ||= library.url?.split('.').pop()
124
- library.localStorage = true unless library.localStorage?
132
+ library.cache = true unless library.cache?
125
133
  library.require = true unless library.require?
126
134
 
127
135
  if library.expires
@@ -147,7 +155,7 @@ class @Loada
147
155
  #
148
156
  load: (callbacks) ->
149
157
  callbacks ||= {}
150
- @expire() if @options.localStorage
158
+ @expire()
151
159
 
152
160
  progress = new @Progress(@requires.length, callbacks.progress)
153
161
  loaders = 0
@@ -195,24 +203,27 @@ class @Loada
195
203
  # @private
196
204
  #
197
205
  _loadGroup: (group, progress, callback) =>
198
- library = group.shift()
199
-
200
- return callback() unless library
206
+ results = []
201
207
 
202
- if @options.localStorage && @storage[library.key] && library.localStorage
203
- progress?.set library.key, 100
204
- @_inject @storage[library.key] if @storage[library.key].require
205
- @_loadGroup group, progress, callback
206
- else
207
- method = if @options.localStorage
208
- "_loadAJAX"
208
+ for library in group
209
+ if @storage[library.key] && library.cache
210
+ progress?.set library.key, 100
211
+ results.push @storage[library.key]
209
212
  else
210
- "_loadInline"
211
-
212
- @[method] library, progress, =>
213
- @storage[library.key] = library if @options.localStorage
214
- @_inject library if library.require
215
- @_loadGroup group, progress, callback
213
+ method = if @options.localStorage || !library.require
214
+ "_loadAJAX"
215
+ else
216
+ "_loadInline"
217
+
218
+ @[method] library, progress, =>
219
+ results.push library
220
+ if results.length == group.length
221
+ @_inject results
222
+ callback()
223
+
224
+ if results.length == group.length
225
+ @_inject results
226
+ callback()
216
227
 
217
228
  #
218
229
  # Loads one asset by AJAX query and stores it into instance
@@ -221,6 +232,7 @@ class @Loada
221
232
  #
222
233
  _loadAJAX: (library, progress, callback) ->
223
234
  xhr = @_ajax 'GET', library.url, (xhr) =>
235
+ @storage[library.key] = library if library.cache
224
236
  library.source = xhr.responseText
225
237
  clearInterval poller
226
238
  progress?.set library.key, 100
@@ -265,16 +277,19 @@ class @Loada
265
277
  #
266
278
  # @private
267
279
  #
268
- _inject: (library) ->
269
- if library.type == 'js'
270
- script = document.createElement "script"
271
- script.defer = true
272
- script.text = library.source
273
- $head.appendChild script
274
- else if library.type == 'css'
275
- style = document.createElement "style"
276
- style.innerHTML = library.source
277
- $head.appendChild style
280
+ _inject: (libraries) ->
281
+ libraries = [].concat(libraries)
282
+
283
+ for library in libraries when library.require && library.source
284
+ if library.type == 'js'
285
+ script = document.createElement "script"
286
+ script.defer = true
287
+ script.text = library.source
288
+ $head.appendChild script
289
+ else if library.type == 'css'
290
+ style = document.createElement "style"
291
+ style.innerHTML = library.source
292
+ $head.appendChild style
278
293
 
279
294
  #
280
295
  # Starring custom XHR wrapper!
@@ -287,8 +302,8 @@ class @Loada
287
302
  else
288
303
  xhr = new ActiveXObject 'Microsoft.XMLHTTP'
289
304
 
290
- xhr.open method, url, 1
291
305
  xhr.onreadystatechange = -> callback?(xhr) if xhr.readyState > 3
306
+ xhr.open method, url, 1
292
307
  xhr.send()
293
308
 
294
309
  xhr
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: loada
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Boris Staal
@@ -29,7 +29,10 @@ files:
29
29
  - package.json
30
30
  - spec/helpers/spec_helper.coffee
31
31
  - spec/loada_spec.coffee
32
- - spec/support/test.js
32
+ - spec/support/test1_1.js
33
+ - spec/support/test1_2.js
34
+ - spec/support/test2_1.js
35
+ - spec/support/text
33
36
  - src/loada.coffee
34
37
  homepage: http://github.com/joosy/loada
35
38
  licenses: []
@@ -1 +0,0 @@
1
- window.TEST = 1