|
1 | 1 | ;(function(undefined) { |
2 | 2 | 'use strict'; |
3 | 3 | /** |
4 | | - * BottleJS v1.5.0 - 2016-10-14 |
| 4 | + * BottleJS v1.6.0 - 2017-02-22 |
5 | 5 | * A powerful dependency injection micro container |
6 | 6 | * |
7 | | - * Copyright (c) 2016 Stephen Young |
| 7 | + * Copyright (c) 2017 Stephen Young |
8 | 8 | * Licensed MIT |
9 | 9 | */ |
10 | 10 |
|
|
166 | 166 | * A filter function for removing bottle container methods and providers from a list of keys |
167 | 167 | */ |
168 | 168 | var byMethod = function byMethod(name) { |
169 | | - return !/^\$(?:register|list)$|Provider$/.test(name); |
| 169 | + return !/^\$(?:decorator|register|list)$|Provider$/.test(name); |
170 | 170 | }; |
171 | 171 |
|
172 | 172 | /** |
|
262 | 262 | */ |
263 | 263 | var pop = function pop(name) { |
264 | 264 | var instance; |
265 | | - if (name) { |
| 265 | + if (typeof name === 'string') { |
266 | 266 | instance = bottles[name]; |
267 | 267 | if (!instance) { |
268 | 268 | bottles[name] = instance = new Bottle(); |
|
277 | 277 | * Clear all named bottles. |
278 | 278 | */ |
279 | 279 | var clear = function clear(name) { |
280 | | - if (name) { |
| 280 | + if (typeof name === 'string') { |
281 | 281 | delete bottles[name]; |
282 | 282 | } else { |
283 | 283 | bottles = {}; |
|
308 | 308 | if (this.providerMap[fullname] && parts.length === 1 && !this.container[fullname + 'Provider']) { |
309 | 309 | return console.error(fullname + ' provider already instantiated.'); |
310 | 310 | } |
| 311 | + this.originalProviders[fullname] = Provider; |
311 | 312 | this.providerMap[fullname] = true; |
312 | 313 |
|
313 | 314 | name = parts.shift(); |
|
331 | 332 | /** |
332 | 333 | * Create the provider properties on the container |
333 | 334 | * |
334 | | - * @param String fullname |
335 | 335 | * @param String name |
336 | 336 | * @param Function Provider |
337 | 337 | * @return Bottle |
|
417 | 417 | return this[Obj.$type || 'service'].apply(this, [Obj.$name, value].concat(Obj.$inject || [])); |
418 | 418 | }; |
419 | 419 |
|
| 420 | + /** |
| 421 | + * Deletes providers from the map and container. |
| 422 | + * |
| 423 | + * @param String name |
| 424 | + * @return void |
| 425 | + */ |
| 426 | + var removeProviderMap = function resetProvider(name) { |
| 427 | + delete this.providerMap[name]; |
| 428 | + delete this.container[name]; |
| 429 | + delete this.container[name + 'Provider']; |
| 430 | + }; |
| 431 | + |
| 432 | + /** |
| 433 | + * Resets all providers on a bottle instance. |
| 434 | + * |
| 435 | + * @return void |
| 436 | + */ |
| 437 | + var resetProviders = function resetProviders() { |
| 438 | + var providers = this.originalProviders; |
| 439 | + Object.keys(this.originalProviders).forEach(function resetPrvider(provider) { |
| 440 | + var parts = provider.split('.'); |
| 441 | + if (parts.length > 1) { |
| 442 | + removeProviderMap.call(this, parts[0]); |
| 443 | + parts.forEach(removeProviderMap, getNestedBottle.call(this, parts[0])); |
| 444 | + } |
| 445 | + removeProviderMap.call(this, provider); |
| 446 | + this.provider(provider, providers[provider]); |
| 447 | + }, this); |
| 448 | + }; |
| 449 | + |
420 | 450 |
|
421 | 451 | /** |
422 | 452 | * Execute any deferred functions |
|
516 | 546 | this.middlewares = {}; |
517 | 547 | this.nested = {}; |
518 | 548 | this.providerMap = {}; |
| 549 | + this.originalProviders = {}; |
519 | 550 | this.deferred = []; |
520 | 551 | this.container = { |
| 552 | + $decorator : decorator.bind(this), |
521 | 553 | $register : register.bind(this), |
522 | 554 | $list : list.bind(this) |
523 | 555 | }; |
|
536 | 568 | list : list, |
537 | 569 | middleware : middleware, |
538 | 570 | provider : provider, |
| 571 | + resetProviders : resetProviders, |
539 | 572 | register : register, |
540 | 573 | resolve : resolve, |
541 | 574 | service : service, |
|
0 commit comments